clang 22.0.0git
Sema.h
Go to the documentation of this file.
1//===--- Sema.h - Semantic Analysis & AST Building --------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the Sema class, which performs semantic analysis and
10// builds ASTs.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SEMA_SEMA_H
15#define LLVM_CLANG_SEMA_SEMA_H
16
18#include "clang/AST/ASTFwd.h"
19#include "clang/AST/ASTLambda.h"
20#include "clang/AST/Attr.h"
22#include "clang/AST/CharUnits.h"
23#include "clang/AST/DeclBase.h"
24#include "clang/AST/DeclCXX.h"
27#include "clang/AST/Expr.h"
28#include "clang/AST/ExprCXX.h"
33#include "clang/AST/StmtCXX.h"
34#include "clang/AST/Type.h"
35#include "clang/AST/TypeLoc.h"
39#include "clang/Basic/Cuda.h"
43#include "clang/Basic/LLVM.h"
44#include "clang/Basic/Lambda.h"
46#include "clang/Basic/Module.h"
58#include "clang/Sema/Attr.h"
60#include "clang/Sema/DeclSpec.h"
66#include "clang/Sema/Scope.h"
67#include "clang/Sema/SemaBase.h"
71#include "clang/Sema/Weak.h"
72#include "llvm/ADT/APInt.h"
73#include "llvm/ADT/ArrayRef.h"
74#include "llvm/ADT/BitmaskEnum.h"
75#include "llvm/ADT/DenseMap.h"
76#include "llvm/ADT/DenseSet.h"
77#include "llvm/ADT/FloatingPointMode.h"
78#include "llvm/ADT/FoldingSet.h"
79#include "llvm/ADT/MapVector.h"
80#include "llvm/ADT/PointerIntPair.h"
81#include "llvm/ADT/PointerUnion.h"
82#include "llvm/ADT/STLExtras.h"
83#include "llvm/ADT/STLForwardCompat.h"
84#include "llvm/ADT/STLFunctionalExtras.h"
85#include "llvm/ADT/SetVector.h"
86#include "llvm/ADT/SmallBitVector.h"
87#include "llvm/ADT/SmallPtrSet.h"
88#include "llvm/ADT/SmallSet.h"
89#include "llvm/ADT/SmallVector.h"
90#include "llvm/ADT/StringExtras.h"
91#include "llvm/ADT/StringMap.h"
92#include "llvm/ADT/TinyPtrVector.h"
93#include "llvm/Support/Allocator.h"
94#include "llvm/Support/Compiler.h"
95#include "llvm/Support/Error.h"
96#include "llvm/Support/ErrorHandling.h"
97#include <cassert>
98#include <climits>
99#include <cstddef>
100#include <cstdint>
101#include <deque>
102#include <functional>
103#include <iterator>
104#include <memory>
105#include <optional>
106#include <string>
107#include <tuple>
108#include <type_traits>
109#include <utility>
110#include <vector>
111
112namespace llvm {
113struct InlineAsmIdentifierInfo;
114} // namespace llvm
115
116namespace clang {
117class ADLResult;
118class APValue;
120class ASTConsumer;
121class ASTContext;
122class ASTDeclReader;
124class ASTReader;
125class ASTWriter;
126class CXXBasePath;
127class CXXBasePaths;
130enum class ComparisonCategoryType : unsigned char;
132class DarwinSDKInfo;
133class DeclGroupRef;
137class Designation;
138class IdentifierInfo;
144enum class LangAS : unsigned int;
146class LookupResult;
149class ModuleLoader;
153class ObjCMethodDecl;
154struct OverloadCandidate;
155enum class OverloadCandidateParamOrder : char;
156enum OverloadCandidateRewriteKind : unsigned;
158class Preprocessor;
159class SemaAMDGPU;
160class SemaARM;
161class SemaAVR;
162class SemaBPF;
164class SemaCUDA;
165class SemaDirectX;
166class SemaHLSL;
167class SemaHexagon;
168class SemaLoongArch;
169class SemaM68k;
170class SemaMIPS;
171class SemaMSP430;
172class SemaNVPTX;
173class SemaObjC;
174class SemaOpenACC;
175class SemaOpenCL;
176class SemaOpenMP;
177class SemaPPC;
178class SemaPseudoObject;
179class SemaRISCV;
180class SemaSPIRV;
181class SemaSYCL;
182class SemaSwift;
183class SemaSystemZ;
184class SemaWasm;
185class SemaX86;
187class TemplateArgument;
192class Token;
193class TypeConstraint;
198
199namespace sema {
200class BlockScopeInfo;
201class Capture;
208class LambdaScopeInfo;
209class SemaPPCallbacks;
211} // namespace sema
212
213// AssignmentAction - This is used by all the assignment diagnostic functions
214// to represent what is actually causing the operation
225
226namespace threadSafety {
227class BeforeSet;
228void threadSafetyCleanup(BeforeSet *Cache);
229} // namespace threadSafety
230
231// FIXME: No way to easily map from TemplateTypeParmTypes to
232// TemplateTypeParmDecls, so we have this horrible PointerUnion.
233typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *,
234 const TemplateSpecializationType *,
235 const SubstBuiltinTemplatePackType *>,
238
239/// Describes whether we've seen any nullability information for the given
240/// file.
242 /// The first pointer declarator (of any pointer kind) in the file that does
243 /// not have a corresponding nullability annotation.
245
246 /// The end location for the first pointer declarator in the file. Used for
247 /// placing fix-its.
249
250 /// Which kind of pointer declarator we saw.
251 uint8_t PointerKind;
252
253 /// Whether we saw any type nullability annotations in the given file.
254 bool SawTypeNullability = false;
255};
256
257/// A mapping from file IDs to a record of whether we've seen nullability
258/// information in that file.
260 /// A mapping from file IDs to the nullability information for each file ID.
261 llvm::DenseMap<FileID, FileNullability> Map;
262
263 /// A single-element cache based on the file ID.
264 struct {
267 } Cache;
268
269public:
271 // Check the single-element cache.
272 if (file == Cache.File)
273 return Cache.Nullability;
274
275 // It's not in the single-element cache; flush the cache if we have one.
276 if (!Cache.File.isInvalid()) {
277 Map[Cache.File] = Cache.Nullability;
278 }
279
280 // Pull this entry into the cache.
281 Cache.File = file;
282 Cache.Nullability = Map[file];
283 return Cache.Nullability;
284 }
285};
286
287/// Tracks expected type during expression parsing, for use in code completion.
288/// The type is tied to a particular token, all functions that update or consume
289/// the type take a start location of the token they are looking at as a
290/// parameter. This avoids updating the type on hot paths in the parser.
292public:
294 : Ctx(Ctx), Enabled(Enabled) {}
295
299 /// Handles e.g. BaseType{ .D = Tok...
301 const Designation &D);
302 /// Computing a type for the function argument may require running
303 /// overloading, so we postpone its computation until it is actually needed.
304 ///
305 /// Clients should be very careful when using this function, as it stores a
306 /// function_ref, clients should make sure all calls to get() with the same
307 /// location happen while function_ref is alive.
308 ///
309 /// The callback should also emit signature help as a side-effect, but only
310 /// if the completion point has been reached.
312 llvm::function_ref<QualType()> ComputeType);
313
316 SourceLocation OpLoc);
319 void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS);
320 /// Handles all type casts, including C-style cast, C++ casts, etc.
322
323 /// Get the expected type associated with this location, if any.
324 ///
325 /// If the location is a function argument, determining the expected type
326 /// involves considering all function overloads and the arguments so far.
327 /// In this case, signature help for these function overloads will be reported
328 /// as a side-effect (only if the completion point has been reached).
330 if (!Enabled || Tok != ExpectedLoc)
331 return QualType();
332 if (!Type.isNull())
333 return Type;
334 if (ComputeType)
335 return ComputeType();
336 return QualType();
337 }
338
339private:
340 ASTContext *Ctx;
341 bool Enabled;
342 /// Start position of a token for which we store expected type.
343 SourceLocation ExpectedLoc;
344 /// Expected type for a token starting at ExpectedLoc.
346 /// A function to compute expected type at ExpectedLoc. It is only considered
347 /// if Type is null.
348 llvm::function_ref<QualType()> ComputeType;
349};
350
352 SkipBodyInfo() = default;
353 bool ShouldSkip = false;
355 NamedDecl *Previous = nullptr;
356 NamedDecl *New = nullptr;
357};
358
359/// Describes the result of template argument deduction.
360///
361/// The TemplateDeductionResult enumeration describes the result of
362/// template argument deduction, as returned from
363/// DeduceTemplateArguments(). The separate TemplateDeductionInfo
364/// structure provides additional information about the results of
365/// template argument deduction, e.g., the deduced template argument
366/// list (if successful) or the specific template parameters or
367/// deduced arguments that were involved in the failure.
369 /// Template argument deduction was successful.
371 /// The declaration was invalid; do nothing.
373 /// Template argument deduction exceeded the maximum template
374 /// instantiation depth (which has already been diagnosed).
376 /// Template argument deduction did not deduce a value
377 /// for every template parameter.
379 /// Template argument deduction did not deduce a value for every
380 /// expansion of an expanded template parameter pack.
382 /// Template argument deduction produced inconsistent
383 /// deduced values for the given template parameter.
385 /// Template argument deduction failed due to inconsistent
386 /// cv-qualifiers on a template parameter type that would
387 /// otherwise be deduced, e.g., we tried to deduce T in "const T"
388 /// but were given a non-const "X".
390 /// Substitution of the deduced template argument values
391 /// resulted in an error.
393 /// After substituting deduced template arguments, a dependent
394 /// parameter type did not match the corresponding argument.
396 /// After substituting deduced template arguments, an element of
397 /// a dependent parameter type did not match the corresponding element
398 /// of the corresponding argument (when deducing from an initializer list).
400 /// A non-depnedent component of the parameter did not match the
401 /// corresponding component of the argument.
403 /// When performing template argument deduction for a function
404 /// template, there were too many call arguments.
406 /// When performing template argument deduction for a function
407 /// template, there were too few call arguments.
409 /// The explicitly-specified template arguments were not valid
410 /// template arguments for the given template.
412 /// Checking non-dependent argument conversions failed.
414 /// The deduced arguments did not satisfy the constraints associated
415 /// with the template.
417 /// Deduction failed; that's all we know.
419 /// CUDA Target attributes do not match.
421 /// Some error which was already diagnosed.
423};
424
425/// Kinds of C++ special members.
435
436/// The kind of conversion being performed.
438 /// An implicit conversion.
440 /// A C-style cast.
442 /// A functional-style cast.
444 /// A cast other than a C-style cast.
446 /// A conversion for an operand of a builtin overloaded operator.
448};
449
450enum class TagUseKind {
451 Reference, // Reference to a tag: 'struct foo *X;'
452 Declaration, // Fwd decl of a tag: 'struct foo;'
453 Definition, // Definition of a tag: 'struct foo { int X; } Y;'
454 Friend // Friend declaration: 'friend struct foo;'
455};
456
457/// Used with attributes/effects with a boolean condition, e.g. `nonblocking`.
458enum class FunctionEffectMode : uint8_t {
459 None, // effect is not present.
460 False, // effect(false).
461 True, // effect(true).
462 Dependent // effect(expr) where expr is dependent.
463};
464
465/// pragma clang section kind
468 BSS = 1,
469 Data = 2,
471 Text = 4,
473};
474
475enum class PragmaClangSectionAction { Set = 0, Clear = 1 };
476
478 Native, // #pragma options align=native
479 Natural, // #pragma options align=natural
480 Packed, // #pragma options align=packed
481 Power, // #pragma options align=power
482 Mac68k, // #pragma options align=mac68k
483 Reset // #pragma options align=reset
484};
485
486enum class TUFragmentKind {
487 /// The global module fragment, between 'module;' and a module-declaration.
489 /// A normal translation unit fragment. For a non-module unit, this is the
490 /// entire translation unit. Otherwise, it runs from the module-declaration
491 /// to the private-module-fragment (if any) or the end of the TU (if not).
493 /// The private module fragment, between 'module :private;' and the end of
494 /// the translation unit.
496};
497
510
511// Used for emitting the right warning by DefaultVariadicArgumentPromotion
519
528
529// Contexts where using non-trivial C union types can be disallowed. This is
530// passed to err_non_trivial_c_union_in_invalid_context.
532 // Function parameter.
534 // Function return.
536 // Default-initialized object.
538 // Variable with automatic storage duration.
540 // Initializer expression that might copy from another object.
542 // Assignment.
544 // Compound literal.
546 // Block capture.
548 // lvalue-to-rvalue conversion of volatile type.
550};
551
552/// Describes the result of the name lookup and resolution performed
553/// by \c Sema::ClassifyName().
555 /// This name is not a type or template in this context, but might be
556 /// something else.
558 /// Classification failed; an error has been produced.
560 /// The name has been typo-corrected to a keyword.
562 /// The name was classified as a type.
564 /// The name was classified as a specific non-type, non-template
565 /// declaration. ActOnNameClassifiedAsNonType should be called to
566 /// convert the declaration to an expression.
568 /// The name was classified as an ADL-only function name.
569 /// ActOnNameClassifiedAsUndeclaredNonType should be called to convert the
570 /// result to an expression.
572 /// The name denotes a member of a dependent type that could not be
573 /// resolved. ActOnNameClassifiedAsDependentNonType should be called to
574 /// convert the result to an expression.
576 /// The name was classified as an overload set, and an expression
577 /// representing that overload set has been formed.
578 /// ActOnNameClassifiedAsOverloadSet should be called to form a suitable
579 /// expression referencing the overload set.
581 /// The name was classified as a template whose specializations are types.
583 /// The name was classified as a variable template name.
585 /// The name was classified as a function template name.
587 /// The name was classified as an ADL-only function template name.
589 /// The name was classified as a concept name.
591};
592
594 // Address discrimination argument of __ptrauth.
596
597 // Extra discriminator argument of __ptrauth.
599};
600
601/// Common ways to introduce type names without a tag for use in diagnostics.
602/// Keep in sync with err_tag_reference_non_tag.
614
615enum class OffsetOfKind {
616 // Not parsing a type within __builtin_offsetof.
618 // Parsing a type within __builtin_offsetof.
620 // Parsing a type within macro "offsetof", defined in __buitin_offsetof
621 // To improve our diagnostic message.
623};
624
625/// Describes the kind of merge to perform for availability
626/// attributes (including "deprecated", "unavailable", and "availability").
628 /// Don't merge availability attributes at all.
630 /// Merge availability attributes for a redeclaration, which requires
631 /// an exact match.
633 /// Merge availability attributes for an override, which requires
634 /// an exact match or a weakening of constraints.
636 /// Merge availability attributes for an implementation of
637 /// a protocol requirement.
639 /// Merge availability attributes for an implementation of
640 /// an optional protocol requirement.
642};
643
645 /// The triviality of a method unaffected by "trivial_abi".
647
648 /// The triviality of a method affected by "trivial_abi".
650};
651
653
654enum class AllowFoldKind {
657};
658
659/// Context in which we're performing a usual arithmetic conversion.
660enum class ArithConvKind {
661 /// An arithmetic operation.
663 /// A bitwise operation.
665 /// A comparison.
667 /// A conditional (?:) operator.
669 /// A compound assignment expression.
671};
672
673// Used for determining in which context a type is allowed to be passed to a
674// vararg function.
682
683/// AssignConvertType - All of the 'assignment' semantic checks return this
684/// enum to indicate whether the assignment was allowed. These checks are
685/// done for simple assignments, as well as initialization, return from
686/// function, argument passing, etc. The query is phrased in terms of a
687/// source and destination type.
689 /// Compatible - the types are compatible according to the standard.
691
692 /// CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because
693 /// a void * can implicitly convert to another pointer type, which we
694 /// differentiate for better diagnostic behavior.
696
697 /// PointerToInt - The assignment converts a pointer to an int, which we
698 /// accept as an extension.
700
701 /// IntToPointer - The assignment converts an int to a pointer, which we
702 /// accept as an extension.
704
705 /// FunctionVoidPointer - The assignment is between a function pointer and
706 /// void*, which the standard doesn't allow, but we accept as an extension.
708
709 /// IncompatiblePointer - The assignment is between two pointers types that
710 /// are not compatible, but we accept them as an extension.
712
713 /// IncompatibleFunctionPointer - The assignment is between two function
714 /// pointers types that are not compatible, but we accept them as an
715 /// extension.
717
718 /// IncompatibleFunctionPointerStrict - The assignment is between two
719 /// function pointer types that are not identical, but are compatible,
720 /// unless compiled with -fsanitize=cfi, in which case the type mismatch
721 /// may trip an indirect call runtime check.
723
724 /// IncompatiblePointerSign - The assignment is between two pointers types
725 /// which point to integers which have a different sign, but are otherwise
726 /// identical. This is a subset of the above, but broken out because it's by
727 /// far the most common case of incompatible pointers.
729
730 /// CompatiblePointerDiscardsQualifiers - The assignment discards
731 /// c/v/r qualifiers, which we accept as an extension.
733
734 /// IncompatiblePointerDiscardsQualifiers - The assignment
735 /// discards qualifiers that we don't permit to be discarded,
736 /// like address spaces.
738
739 /// IncompatibleNestedPointerAddressSpaceMismatch - The assignment
740 /// changes address spaces in nested pointer types which is not allowed.
741 /// For instance, converting __private int ** to __generic int ** is
742 /// illegal even though __private could be converted to __generic.
744
745 /// IncompatibleNestedPointerQualifiers - The assignment is between two
746 /// nested pointer types, and the qualifiers other than the first two
747 /// levels differ e.g. char ** -> const char **, but we accept them as an
748 /// extension.
750
751 /// IncompatibleVectors - The assignment is between two vector types that
752 /// have the same size, which we accept as an extension.
754
755 /// IntToBlockPointer - The assignment converts an int to a block
756 /// pointer. We disallow this.
758
759 /// IncompatibleBlockPointer - The assignment is between two block
760 /// pointers types that are not compatible.
762
763 /// IncompatibleObjCQualifiedId - The assignment is between a qualified
764 /// id type and something else (that is incompatible with it). For example,
765 /// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
767
768 /// IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an
769 /// object with __weak qualifier.
771
772 /// Incompatible - We reject this conversion outright, it is invalid to
773 /// represent it in the AST.
775};
776
777/// The scope in which to find allocation functions.
779 /// Only look for allocation functions in the global scope.
781 /// Only look for allocation functions in the scope of the
782 /// allocated class.
784 /// Look for allocation functions in both the global scope
785 /// and in the scope of the allocated class.
787};
788
789/// Describes the result of an "if-exists" condition check.
790enum class IfExistsResult {
791 /// The symbol exists.
793
794 /// The symbol does not exist.
796
797 /// The name is a dependent name, so the results will differ
798 /// from one instantiation to the next.
800
801 /// An error occurred.
803};
804
805enum class CorrectTypoKind {
806 NonError, // CorrectTypo used in a non error recovery situation.
807 ErrorRecovery // CorrectTypo used in normal error recovery.
808};
809
810enum class OverloadKind {
811 /// This is a legitimate overload: the existing declarations are
812 /// functions or function templates with different signatures.
814
815 /// This is not an overload because the signature exactly matches
816 /// an existing declaration.
818
819 /// This is not an overload because the lookup results contain a
820 /// non-function.
822};
823
824/// Contexts in which a converted constant expression is required.
825enum class CCEKind {
826 CaseValue, ///< Expression in a case label.
827 Enumerator, ///< Enumerator value with fixed underlying type.
828 TemplateArg, ///< Value of a non-type template parameter.
829 TempArgStrict, ///< As above, but applies strict template checking
830 ///< rules.
831 ArrayBound, ///< Array bound in array declarator or new-expression.
832 ExplicitBool, ///< Condition in an explicit(bool) specifier.
833 Noexcept, ///< Condition in a noexcept(bool) specifier.
834 StaticAssertMessageSize, ///< Call to size() in a static assert
835 ///< message.
836 StaticAssertMessageData, ///< Call to data() in a static assert
837 ///< message.
838};
839
840/// Enums for the diagnostics of target, target_version and target_clones.
841namespace DiagAttrParams {
845} // end namespace DiagAttrParams
846
847void inferNoReturnAttr(Sema &S, Decl *D);
848
849#ifdef __GNUC__
850#pragma GCC diagnostic push
851#pragma GCC diagnostic ignored "-Wattributes"
852#endif
853/// Sema - This implements semantic analysis and AST building for C.
854/// \nosubgrouping
855class Sema final : public SemaBase {
856#ifdef __GNUC__
857#pragma GCC diagnostic pop
858#endif
859 // Table of Contents
860 // -----------------
861 // 1. Semantic Analysis (Sema.cpp)
862 // 2. API Notes (SemaAPINotes.cpp)
863 // 3. C++ Access Control (SemaAccess.cpp)
864 // 4. Attributes (SemaAttr.cpp)
865 // 5. Availability Attribute Handling (SemaAvailability.cpp)
866 // 6. Bounds Safety (SemaBoundsSafety.cpp)
867 // 7. Casts (SemaCast.cpp)
868 // 8. Extra Semantic Checking (SemaChecking.cpp)
869 // 9. C++ Coroutines (SemaCoroutine.cpp)
870 // 10. C++ Scope Specifiers (SemaCXXScopeSpec.cpp)
871 // 11. Declarations (SemaDecl.cpp)
872 // 12. Declaration Attribute Handling (SemaDeclAttr.cpp)
873 // 13. C++ Declarations (SemaDeclCXX.cpp)
874 // 14. C++ Exception Specifications (SemaExceptionSpec.cpp)
875 // 15. Expressions (SemaExpr.cpp)
876 // 16. C++ Expressions (SemaExprCXX.cpp)
877 // 17. Member Access Expressions (SemaExprMember.cpp)
878 // 18. Initializers (SemaInit.cpp)
879 // 19. C++ Lambda Expressions (SemaLambda.cpp)
880 // 20. Name Lookup (SemaLookup.cpp)
881 // 21. Modules (SemaModule.cpp)
882 // 22. C++ Overloading (SemaOverload.cpp)
883 // 23. Statements (SemaStmt.cpp)
884 // 24. `inline asm` Statement (SemaStmtAsm.cpp)
885 // 25. Statement Attribute Handling (SemaStmtAttr.cpp)
886 // 26. C++ Templates (SemaTemplate.cpp)
887 // 27. C++ Template Argument Deduction (SemaTemplateDeduction.cpp)
888 // 28. C++ Template Deduction Guide (SemaTemplateDeductionGuide.cpp)
889 // 29. C++ Template Instantiation (SemaTemplateInstantiate.cpp)
890 // 30. C++ Template Declaration Instantiation
891 // (SemaTemplateInstantiateDecl.cpp)
892 // 31. C++ Variadic Templates (SemaTemplateVariadic.cpp)
893 // 32. Constraints and Concepts (SemaConcept.cpp)
894 // 33. Types (SemaType.cpp)
895 // 34. FixIt Helpers (SemaFixItUtils.cpp)
896 // 35. Function Effects (SemaFunctionEffects.cpp)
897
898 /// \name Semantic Analysis
899 /// Implementations are in Sema.cpp
900 ///@{
901
902public:
903 Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
905 CodeCompleteConsumer *CompletionConsumer = nullptr);
906 ~Sema();
907
908 /// Perform initialization that occurs after the parser has been
909 /// initialized but before it parses anything.
910 void Initialize();
911
912 /// This virtual key function only exists to limit the emission of debug info
913 /// describing the Sema class. GCC and Clang only emit debug info for a class
914 /// with a vtable when the vtable is emitted. Sema is final and not
915 /// polymorphic, but the debug info size savings are so significant that it is
916 /// worth adding a vtable just to take advantage of this optimization.
918
919 const LangOptions &getLangOpts() const { return LangOpts; }
922
925 Preprocessor &getPreprocessor() const { return PP; }
926 ASTContext &getASTContext() const { return Context; }
930
932 StringRef Platform);
934
935 /// Registers an external source. If an external source already exists,
936 /// creates a multiplex external source and appends to it.
937 ///
938 ///\param[in] E - A non-null external sema source.
939 ///
941
942 /// Print out statistics about the semantic analysis.
943 void PrintStats() const;
944
945 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
946 /// guaranteed). Produces a warning if we're low on stack space and allocates
947 /// more in that case. Use this in code that may recurse deeply (for example,
948 /// in template instantiation) to avoid stack overflow.
950 llvm::function_ref<void()> Fn);
951
952 /// Returns default addr space for method qualifiers.
954
955 /// Load weak undeclared identifiers from the external source.
957
958 /// Determine if VD, which must be a variable or function, is an external
959 /// symbol that nonetheless can't be referenced from outside this translation
960 /// unit because its type has no linkage and it's not extern "C".
961 bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
962
963 /// Obtain a sorted list of functions that are undefined but ODR-used.
965 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation>> &Undefined);
966
967 typedef std::pair<SourceLocation, bool> DeleteExprLoc;
969 /// Retrieves list of suspicious delete-expressions that will be checked at
970 /// the end of translation unit.
971 const llvm::MapVector<FieldDecl *, DeleteLocs> &
973
974 /// Cause the built diagnostic to be emitted on the DiagosticsEngine.
975 /// This is closely coupled to the SemaDiagnosticBuilder class and
976 /// should not be used elsewhere.
977 void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB);
978
979 void addImplicitTypedef(StringRef Name, QualType T);
980
981 /// Whether uncompilable error has occurred. This includes error happens
982 /// in deferred diagnostics.
983 bool hasUncompilableErrorOccurred() const;
984
985 /// Looks through the macro-expansion chain for the given
986 /// location, looking for a macro expansion with the given name.
987 /// If one is found, returns true and sets the location to that
988 /// expansion loc.
989 bool findMacroSpelling(SourceLocation &loc, StringRef name);
990
991 /// Calls \c Lexer::getLocForEndOfToken()
992 SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset = 0);
993
994 /// Calls \c Lexer::findNextToken() to find the next token, and if the
995 /// locations of both ends of the token can be resolved it return that
996 /// range; Otherwise it returns an invalid SourceRange.
998 SourceLocation Loc, bool IncludeMacros, bool IncludeComments,
999 std::optional<tok::TokenKind> ExpectedToken = std::nullopt);
1000
1001 /// Retrieve the module loader associated with the preprocessor.
1003
1004 /// Invent a new identifier for parameters of abbreviated templates.
1007 unsigned Index);
1008
1010
1011 // Emit all deferred diagnostics.
1012 void emitDeferredDiags();
1013
1014 /// This is called before the very first declaration in the translation unit
1015 /// is parsed. Note that the ASTContext may have already injected some
1016 /// declarations.
1018 /// ActOnEndOfTranslationUnit - This is called at the very end of the
1019 /// translation unit when EOF is reached and all but the top-level scope is
1020 /// popped.
1023
1024 /// Determines the active Scope associated with the given declaration
1025 /// context.
1026 ///
1027 /// This routine maps a declaration context to the active Scope object that
1028 /// represents that declaration context in the parser. It is typically used
1029 /// from "scope-less" code (e.g., template instantiation, lazy creation of
1030 /// declarations) that injects a name for name-lookup purposes and, therefore,
1031 /// must update the Scope.
1032 ///
1033 /// \returns The scope corresponding to the given declaraion context, or NULL
1034 /// if no such scope is open.
1036
1037 void PushFunctionScope();
1038 void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
1040
1041 /// This is used to inform Sema what the current TemplateParameterDepth
1042 /// is during Parsing. Currently it is used to pass on the depth
1043 /// when parsing generic lambda 'auto' parameters.
1044 void RecordParsingTemplateParameterDepth(unsigned Depth);
1045
1046 void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
1048 unsigned OpenMPCaptureLevel = 0);
1049
1050 /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
1051 /// time after they've been popped.
1053 Sema *Self;
1054
1055 public:
1056 explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
1058 };
1059
1061 std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
1062
1063 /// Pop a function (or block or lambda or captured region) scope from the
1064 /// stack.
1065 ///
1066 /// \param WP The warning policy to use for CFG-based warnings, or null if
1067 /// such warnings should not be produced.
1068 /// \param D The declaration corresponding to this function scope, if
1069 /// producing CFG-based warnings.
1070 /// \param BlockType The type of the block expression, if D is a BlockDecl.
1073 Decl *D = nullptr, QualType BlockType = QualType());
1074
1076
1081
1082 void PushCompoundScope(bool IsStmtExpr);
1083 void PopCompoundScope();
1084
1085 /// Determine whether any errors occurred within this function/method/
1086 /// block.
1088
1089 /// Retrieve the current block, if any.
1091
1092 /// Get the innermost lambda or block enclosing the current location, if any.
1093 /// This looks through intervening non-lambda, non-block scopes such as local
1094 /// functions.
1096
1097 /// Retrieve the current lambda scope info, if any.
1098 /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
1099 /// lambda scope info ignoring all inner capturing scopes that are not
1100 /// lambda scopes.
1102 getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
1103
1104 /// Retrieve the current generic lambda info, if any.
1106
1107 /// Retrieve the current captured region, if any.
1109
1110 void ActOnComment(SourceRange Comment);
1111
1112 /// Retrieve the parser's current scope.
1113 ///
1114 /// This routine must only be used when it is certain that semantic analysis
1115 /// and the parser are in precisely the same context, which is not the case
1116 /// when, e.g., we are performing any kind of template instantiation.
1117 /// Therefore, the only safe places to use this scope are in the parser
1118 /// itself and in routines directly invoked from the parser and *never* from
1119 /// template substitution or instantiation.
1120 Scope *getCurScope() const { return CurScope; }
1121
1123
1127
1128 SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
1129 const FunctionDecl *FD = nullptr);
1131 const PartialDiagnostic &PD,
1132 const FunctionDecl *FD = nullptr) {
1133 return targetDiag(Loc, PD.getDiagID(), FD) << PD;
1134 }
1135
1136 /// Check if the type is allowed to be used for the current target.
1138 ValueDecl *D = nullptr);
1139
1140 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
1141 /// cast. If there is already an implicit cast, merge into the existing one.
1142 /// If isLvalue, the result of the cast is an lvalue.
1145 const CXXCastPath *BasePath = nullptr,
1147
1148 /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
1149 /// to the conversion from scalar type ScalarTy to the Boolean type.
1151
1152 /// If \p AllowLambda is true, treat lambda as function.
1153 DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
1154
1155 /// Returns a pointer to the innermost enclosing function, or nullptr if the
1156 /// current context is not inside a function. If \p AllowLambda is true,
1157 /// this can return the call operator of an enclosing lambda, otherwise
1158 /// lambdas are skipped when looking for an enclosing function.
1159 FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
1160
1161 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
1162 /// the method decl for the method being parsed. If we're currently
1163 /// in a 'block', this returns the containing context.
1165
1166 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
1167 /// or C function we're in, otherwise return null. If we're currently
1168 /// in a 'block', this returns the containing context.
1170
1171 /// Warn if we're implicitly casting from a _Nullable pointer type to a
1172 /// _Nonnull one.
1174 SourceLocation Loc);
1175
1176 /// Warn when implicitly casting 0 to nullptr.
1177 void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E);
1178
1179 /// Warn when implicitly changing function effects.
1181 SourceLocation Loc);
1182
1183 /// makeUnavailableInSystemHeader - There is an error in the current
1184 /// context. If we're still in a system header, and we can plausibly
1185 /// make the relevant declaration unavailable instead of erroring, do
1186 /// so and return true.
1188 UnavailableAttr::ImplicitReason reason);
1189
1190 /// Retrieve a suitable printing policy for diagnostics.
1194
1195 /// Retrieve a suitable printing policy for diagnostics.
1197 const Preprocessor &PP);
1198
1199 /// Scope actions.
1201
1202 /// Determine whether \param D is function like (function or function
1203 /// template) for parsing.
1205
1206 /// The maximum alignment, same as in llvm::Value. We duplicate them here
1207 /// because that allows us not to duplicate the constants in clang code,
1208 /// which we must to since we can't directly use the llvm constants.
1209 /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
1210 ///
1211 /// This is the greatest alignment value supported by load, store, and alloca
1212 /// instructions, and global values.
1213 static const unsigned MaxAlignmentExponent = 32;
1214 static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
1215
1216 /// Flag indicating whether or not to collect detailed statistics.
1218
1219 std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
1220
1221 /// Stack containing information about each of the nested
1222 /// function, block, and method scopes that are currently active.
1224
1225 /// The index of the first FunctionScope that corresponds to the current
1226 /// context.
1228
1229 /// Track the number of currently active capturing scopes.
1231
1232 llvm::BumpPtrAllocator BumpAlloc;
1233
1234 /// The kind of translation unit we are processing.
1235 ///
1236 /// When we're processing a complete translation unit, Sema will perform
1237 /// end-of-translation-unit semantic tasks (such as creating
1238 /// initializers for tentative definitions in C) once parsing has
1239 /// completed. Modules and precompiled headers perform different kinds of
1240 /// checks.
1242
1243 /// Translation Unit Scope - useful to Objective-C actions that need
1244 /// to lookup file scope declarations in the "ordinary" C decl namespace.
1245 /// For example, user-defined classes, built-in "id" type, etc.
1247
1249 return CurScope->incrementMSManglingNumber();
1250 }
1251
1252 /// Try to recover by turning the given expression into a
1253 /// call. Returns true if recovery was attempted or an error was
1254 /// emitted; this may also leave the ExprResult invalid.
1256 bool ForceComplain = false,
1257 bool (*IsPlausibleResult)(QualType) = nullptr);
1258
1259 /// Figure out if an expression could be turned into a call.
1260 ///
1261 /// Use this when trying to recover from an error where the programmer may
1262 /// have written just the name of a function instead of actually calling it.
1263 ///
1264 /// \param E - The expression to examine.
1265 /// \param ZeroArgCallReturnTy - If the expression can be turned into a call
1266 /// with no arguments, this parameter is set to the type returned by such a
1267 /// call; otherwise, it is set to an empty QualType.
1268 /// \param OverloadSet - If the expression is an overloaded function
1269 /// name, this parameter is populated with the decls of the various
1270 /// overloads.
1271 bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
1272 UnresolvedSetImpl &NonTemplateOverloads);
1273
1277
1280
1288
1289 /// A RAII object to enter scope of a compound statement.
1291 public:
1292 CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
1293 S.ActOnStartOfCompoundStmt(IsStmtExpr);
1294 }
1295
1296 ~CompoundScopeRAII() { S.ActOnFinishOfCompoundStmt(); }
1299
1300 private:
1301 Sema &S;
1302 };
1303
1304 /// An RAII helper that pops function a function scope on exit.
1310 if (Active)
1311 S.PopFunctionScopeInfo();
1312 }
1313 void disable() { Active = false; }
1314 };
1315
1317 return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
1318 }
1319
1320 /// Worker object for performing CFG-based warnings.
1323
1324 /// Callback to the parser to parse templated functions when needed.
1325 typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
1328
1330 LateTemplateParser = LTP;
1331 OpaqueParser = P;
1332 }
1333
1334 /// Callback to the parser to parse a type expressed as a string.
1335 std::function<TypeResult(StringRef, StringRef, SourceLocation)>
1337
1338 /// VAListTagName - The declaration name corresponding to __va_list_tag.
1339 /// This is used as part of a hack to omit that class from ADL results.
1341
1342 /// Is the last error level diagnostic immediate. This is used to determined
1343 /// whether the next info diagnostic should be immediate.
1345
1346 class DelayedDiagnostics;
1347
1349 sema::DelayedDiagnosticPool *SavedPool = nullptr;
1351 };
1354
1355 /// A class which encapsulates the logic for delaying diagnostics
1356 /// during parsing and other processing.
1358 /// The current pool of diagnostics into which delayed
1359 /// diagnostics should go.
1360 sema::DelayedDiagnosticPool *CurPool = nullptr;
1361
1362 public:
1364
1365 /// Adds a delayed diagnostic.
1366 void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
1367
1368 /// Determines whether diagnostics should be delayed.
1369 bool shouldDelayDiagnostics() { return CurPool != nullptr; }
1370
1371 /// Returns the current delayed-diagnostics pool.
1372 sema::DelayedDiagnosticPool *getCurrentPool() const { return CurPool; }
1373
1374 /// Enter a new scope. Access and deprecation diagnostics will be
1375 /// collected in this pool.
1378 state.SavedPool = CurPool;
1379 CurPool = &pool;
1380 return state;
1381 }
1382
1383 /// Leave a delayed-diagnostic state that was previously pushed.
1384 /// Do not emit any of the diagnostics. This is performed as part
1385 /// of the bookkeeping of popping a pool "properly".
1387 CurPool = state.SavedPool;
1388 }
1389
1390 /// Enter a new scope where access and deprecation diagnostics are
1391 /// not delayed.
1394 state.SavedPool = CurPool;
1395 CurPool = nullptr;
1396 return state;
1397 }
1398
1399 /// Undo a previous pushUndelayed().
1401 assert(CurPool == nullptr);
1402 CurPool = state.SavedPool;
1403 }
1405
1409
1410 /// Diagnostics that are emitted only if we discover that the given function
1411 /// must be codegen'ed. Because handling these correctly adds overhead to
1412 /// compilation, this is currently only enabled for CUDA compilations.
1413 SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags;
1414
1415 /// CurContext - This is the current declaration context of parsing.
1417
1419 assert(AMDGPUPtr);
1420 return *AMDGPUPtr;
1421 }
1422
1424 assert(ARMPtr);
1425 return *ARMPtr;
1426 }
1427
1429 assert(AVRPtr);
1430 return *AVRPtr;
1431 }
1432
1434 assert(BPFPtr);
1435 return *BPFPtr;
1436 }
1437
1439 assert(CodeCompletionPtr);
1440 return *CodeCompletionPtr;
1441 }
1442
1444 assert(CUDAPtr);
1445 return *CUDAPtr;
1446 }
1447
1449 assert(DirectXPtr);
1450 return *DirectXPtr;
1451 }
1452
1454 assert(HLSLPtr);
1455 return *HLSLPtr;
1456 }
1457
1459 assert(HexagonPtr);
1460 return *HexagonPtr;
1461 }
1462
1464 assert(LoongArchPtr);
1465 return *LoongArchPtr;
1466 }
1467
1469 assert(M68kPtr);
1470 return *M68kPtr;
1471 }
1472
1474 assert(MIPSPtr);
1475 return *MIPSPtr;
1476 }
1477
1479 assert(MSP430Ptr);
1480 return *MSP430Ptr;
1481 }
1482
1484 assert(NVPTXPtr);
1485 return *NVPTXPtr;
1486 }
1487
1489 assert(ObjCPtr);
1490 return *ObjCPtr;
1491 }
1492
1494 assert(OpenACCPtr);
1495 return *OpenACCPtr;
1496 }
1497
1499 assert(OpenCLPtr);
1500 return *OpenCLPtr;
1501 }
1502
1504 assert(OpenMPPtr && "SemaOpenMP is dead");
1505 return *OpenMPPtr;
1506 }
1507
1509 assert(PPCPtr);
1510 return *PPCPtr;
1511 }
1512
1514 assert(PseudoObjectPtr);
1515 return *PseudoObjectPtr;
1516 }
1517
1519 assert(RISCVPtr);
1520 return *RISCVPtr;
1521 }
1522
1524 assert(SPIRVPtr);
1525 return *SPIRVPtr;
1526 }
1527
1529 assert(SYCLPtr);
1530 return *SYCLPtr;
1531 }
1532
1534 assert(SwiftPtr);
1535 return *SwiftPtr;
1536 }
1537
1539 assert(SystemZPtr);
1540 return *SystemZPtr;
1541 }
1542
1544 assert(WasmPtr);
1545 return *WasmPtr;
1546 }
1547
1549 assert(X86Ptr);
1550 return *X86Ptr;
1551 }
1552
1553 /// Source of additional semantic information.
1555
1556protected:
1557 friend class Parser;
1559 friend class ASTReader;
1560 friend class ASTDeclReader;
1561 friend class ASTWriter;
1562
1563private:
1564 std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1565 bool WarnedDarwinSDKInfoMissing = false;
1566
1567 StackExhaustionHandler StackHandler;
1568
1569 Sema(const Sema &) = delete;
1570 void operator=(const Sema &) = delete;
1571
1572 /// The handler for the FileChanged preprocessor events.
1573 ///
1574 /// Used for diagnostics that implement custom semantic analysis for #include
1575 /// directives, like -Wpragma-pack.
1576 sema::SemaPPCallbacks *SemaPPCallbackHandler;
1577
1578 /// The parser's current scope.
1579 ///
1580 /// The parser maintains this state here.
1581 Scope *CurScope;
1582
1583 mutable IdentifierInfo *Ident_super;
1584
1585 std::unique_ptr<SemaAMDGPU> AMDGPUPtr;
1586 std::unique_ptr<SemaARM> ARMPtr;
1587 std::unique_ptr<SemaAVR> AVRPtr;
1588 std::unique_ptr<SemaBPF> BPFPtr;
1589 std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
1590 std::unique_ptr<SemaCUDA> CUDAPtr;
1591 std::unique_ptr<SemaDirectX> DirectXPtr;
1592 std::unique_ptr<SemaHLSL> HLSLPtr;
1593 std::unique_ptr<SemaHexagon> HexagonPtr;
1594 std::unique_ptr<SemaLoongArch> LoongArchPtr;
1595 std::unique_ptr<SemaM68k> M68kPtr;
1596 std::unique_ptr<SemaMIPS> MIPSPtr;
1597 std::unique_ptr<SemaMSP430> MSP430Ptr;
1598 std::unique_ptr<SemaNVPTX> NVPTXPtr;
1599 std::unique_ptr<SemaObjC> ObjCPtr;
1600 std::unique_ptr<SemaOpenACC> OpenACCPtr;
1601 std::unique_ptr<SemaOpenCL> OpenCLPtr;
1602 std::unique_ptr<SemaOpenMP> OpenMPPtr;
1603 std::unique_ptr<SemaPPC> PPCPtr;
1604 std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
1605 std::unique_ptr<SemaRISCV> RISCVPtr;
1606 std::unique_ptr<SemaSPIRV> SPIRVPtr;
1607 std::unique_ptr<SemaSYCL> SYCLPtr;
1608 std::unique_ptr<SemaSwift> SwiftPtr;
1609 std::unique_ptr<SemaSystemZ> SystemZPtr;
1610 std::unique_ptr<SemaWasm> WasmPtr;
1611 std::unique_ptr<SemaX86> X86Ptr;
1612
1613 ///@}
1614
1615 //
1616 //
1617 // -------------------------------------------------------------------------
1618 //
1619 //
1620
1621 /// \name API Notes
1622 /// Implementations are in SemaAPINotes.cpp
1623 ///@{
1624
1625public:
1626 /// Map any API notes provided for this declaration to attributes on the
1627 /// declaration.
1628 ///
1629 /// Triggered by declaration-attribute processing.
1630 void ProcessAPINotes(Decl *D);
1631 /// Apply the 'Nullability:' annotation to the specified declaration
1632 void ApplyNullability(Decl *D, NullabilityKind Nullability);
1633 /// Apply the 'Type:' annotation to the specified declaration
1634 void ApplyAPINotesType(Decl *D, StringRef TypeString);
1635
1636 /// Whether APINotes should be gathered for all applicable Swift language
1637 /// versions, without being applied. Leaving clients of the current module
1638 /// to select and apply the correct version.
1640 return APINotes.captureVersionIndependentSwift();
1641 }
1642 ///@}
1643
1644 //
1645 //
1646 // -------------------------------------------------------------------------
1647 //
1648 //
1649
1650 /// \name C++ Access Control
1651 /// Implementations are in SemaAccess.cpp
1652 ///@{
1653
1654public:
1661
1662 /// SetMemberAccessSpecifier - Set the access specifier of a member.
1663 /// Returns true on error (when the previous member decl access specifier
1664 /// is different from the new member decl access specifier).
1665 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1666 NamedDecl *PrevMemberDecl,
1667 AccessSpecifier LexicalAS);
1668
1669 /// Perform access-control checking on a previously-unresolved member
1670 /// access which has now been resolved to a member.
1672 DeclAccessPair FoundDecl);
1674 DeclAccessPair FoundDecl);
1675
1676 /// Checks access to an overloaded operator new or delete.
1678 SourceRange PlacementRange,
1679 CXXRecordDecl *NamingClass,
1680 DeclAccessPair FoundDecl,
1681 bool Diagnose = true);
1682
1683 /// Checks access to a constructor.
1685 DeclAccessPair FoundDecl,
1686 const InitializedEntity &Entity,
1687 bool IsCopyBindingRefToTemp = false);
1688
1689 /// Checks access to a constructor.
1691 DeclAccessPair FoundDecl,
1692 const InitializedEntity &Entity,
1693 const PartialDiagnostic &PDiag);
1695 CXXDestructorDecl *Dtor,
1696 const PartialDiagnostic &PDiag,
1697 QualType objectType = QualType());
1698
1699 /// Checks access to the target of a friend declaration.
1701
1702 /// Checks access to a member.
1704 CXXRecordDecl *NamingClass,
1706
1707 /// Checks implicit access to a member in a structured binding.
1710 CXXRecordDecl *DecomposedClass,
1711 DeclAccessPair Field);
1713 const SourceRange &,
1714 DeclAccessPair FoundDecl);
1715
1716 /// Checks access to an overloaded member operator, including
1717 /// conversion operators.
1719 Expr *ArgExpr,
1720 DeclAccessPair FoundDecl);
1722 ArrayRef<Expr *> ArgExprs,
1723 DeclAccessPair FoundDecl);
1725 DeclAccessPair FoundDecl);
1726
1727 /// Checks access for a hierarchy conversion.
1728 ///
1729 /// \param ForceCheck true if this check should be performed even if access
1730 /// control is disabled; some things rely on this for semantics
1731 /// \param ForceUnprivileged true if this check should proceed as if the
1732 /// context had no special privileges
1734 QualType Derived, const CXXBasePath &Path,
1735 unsigned DiagID, bool ForceCheck = false,
1736 bool ForceUnprivileged = false);
1737
1739 SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived,
1740 const CXXBasePath &Path, unsigned DiagID,
1741 llvm::function_ref<void(PartialDiagnostic &PD)> SetupPDiag,
1742 bool ForceCheck = false, bool ForceUnprivileged = false);
1743
1744 /// Checks access to all the declarations in the given result set.
1745 void CheckLookupAccess(const LookupResult &R);
1746
1747 /// Checks access to Target from the given class. The check will take access
1748 /// specifiers into account, but no member access expressions and such.
1749 ///
1750 /// \param Target the declaration to check if it can be accessed
1751 /// \param NamingClass the class in which the lookup was started.
1752 /// \param BaseType type of the left side of member access expression.
1753 /// \p BaseType and \p NamingClass are used for C++ access control.
1754 /// Depending on the lookup case, they should be set to the following:
1755 /// - lhs.target (member access without a qualifier):
1756 /// \p BaseType and \p NamingClass are both the type of 'lhs'.
1757 /// - lhs.X::target (member access with a qualifier):
1758 /// BaseType is the type of 'lhs', NamingClass is 'X'
1759 /// - X::target (qualified lookup without member access):
1760 /// BaseType is null, NamingClass is 'X'.
1761 /// - target (unqualified lookup).
1762 /// BaseType is null, NamingClass is the parent class of 'target'.
1763 /// \return true if the Target is accessible from the Class, false otherwise.
1764 bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
1765 QualType BaseType);
1766
1767 /// Is the given member accessible for the purposes of deciding whether to
1768 /// define a special member function as deleted?
1770 DeclAccessPair Found, QualType ObjectType,
1771 SourceLocation Loc,
1772 const PartialDiagnostic &Diag);
1775 QualType ObjectType) {
1776 return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
1777 SourceLocation(), PDiag());
1778 }
1779
1781 const DependentDiagnostic &DD,
1782 const MultiLevelTemplateArgumentList &TemplateArgs);
1784
1785 ///@}
1786
1787 //
1788 //
1789 // -------------------------------------------------------------------------
1790 //
1791 //
1792
1793 /// \name Attributes
1794 /// Implementations are in SemaAttr.cpp
1795 ///@{
1796
1797public:
1798 /// Controls member pointer representation format under the MS ABI.
1801
1802 bool MSStructPragmaOn; // True when \#pragma ms_struct on
1803
1804 /// Source location for newly created implicit MSInheritanceAttrs
1806
1812
1818
1820 PSK_Reset = 0x0, // #pragma ()
1821 PSK_Set = 0x1, // #pragma (value)
1822 PSK_Push = 0x2, // #pragma (push[, id])
1823 PSK_Pop = 0x4, // #pragma (pop[, id])
1824 PSK_Show = 0x8, // #pragma (show) -- only for "pack"!
1825 PSK_Push_Set = PSK_Push | PSK_Set, // #pragma (push[, id], value)
1826 PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value)
1827 };
1828
1834
1835 // #pragma pack and align.
1837 public:
1838 // `Native` represents default align mode, which may vary based on the
1839 // platform.
1840 enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
1841
1842 // #pragma pack info constructor
1843 AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
1844 : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
1845 assert(Num == PackNumber && "The pack number has been truncated.");
1846 }
1847
1848 // #pragma align info constructor
1850 : PackAttr(false), AlignMode(M),
1851 PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
1852
1853 explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
1854
1856
1857 // When a AlignPackInfo itself cannot be used, this returns an 32-bit
1858 // integer encoding for it. This should only be passed to
1859 // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
1860 static uint32_t getRawEncoding(const AlignPackInfo &Info) {
1861 std::uint32_t Encoding{};
1862 if (Info.IsXLStack())
1863 Encoding |= IsXLMask;
1864
1865 Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
1866
1867 if (Info.IsPackAttr())
1868 Encoding |= PackAttrMask;
1869
1870 Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
1871
1872 return Encoding;
1873 }
1874
1875 static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
1876 bool IsXL = static_cast<bool>(Encoding & IsXLMask);
1878 static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
1879 int PackNumber = (Encoding & PackNumMask) >> 4;
1880
1881 if (Encoding & PackAttrMask)
1882 return AlignPackInfo(M, PackNumber, IsXL);
1883
1884 return AlignPackInfo(M, IsXL);
1885 }
1886
1887 bool IsPackAttr() const { return PackAttr; }
1888
1889 bool IsAlignAttr() const { return !PackAttr; }
1890
1891 Mode getAlignMode() const { return AlignMode; }
1892
1893 unsigned getPackNumber() const { return PackNumber; }
1894
1895 bool IsPackSet() const {
1896 // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
1897 // attriute on a decl.
1898 return PackNumber != UninitPackVal && PackNumber != 0;
1899 }
1900
1901 bool IsXLStack() const { return XLStack; }
1902
1903 bool operator==(const AlignPackInfo &Info) const {
1904 return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
1905 std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
1906 Info.XLStack);
1907 }
1908
1909 bool operator!=(const AlignPackInfo &Info) const {
1910 return !(*this == Info);
1911 }
1912
1913 private:
1914 /// \brief True if this is a pragma pack attribute,
1915 /// not a pragma align attribute.
1916 bool PackAttr;
1917
1918 /// \brief The alignment mode that is in effect.
1919 Mode AlignMode;
1920
1921 /// \brief The pack number of the stack.
1922 unsigned char PackNumber;
1923
1924 /// \brief True if it is a XL #pragma align/pack stack.
1925 bool XLStack;
1926
1927 /// \brief Uninitialized pack value.
1928 static constexpr unsigned char UninitPackVal = -1;
1929
1930 // Masks to encode and decode an AlignPackInfo.
1931 static constexpr uint32_t IsXLMask{0x0000'0001};
1932 static constexpr uint32_t AlignModeMask{0x0000'0006};
1933 static constexpr uint32_t PackAttrMask{0x00000'0008};
1934 static constexpr uint32_t PackNumMask{0x0000'01F0};
1935 };
1936
1937 template <typename ValueType> struct PragmaStack {
1949
1950 void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
1951 llvm::StringRef StackSlotLabel, ValueType Value) {
1952 if (Action == PSK_Reset) {
1954 CurrentPragmaLocation = PragmaLocation;
1955 return;
1956 }
1957 if (Action & PSK_Push)
1958 Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
1959 PragmaLocation);
1960 else if (Action & PSK_Pop) {
1961 if (!StackSlotLabel.empty()) {
1962 // If we've got a label, try to find it and jump there.
1963 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
1964 return x.StackSlotLabel == StackSlotLabel;
1965 });
1966 // If we found the label so pop from there.
1967 if (I != Stack.rend()) {
1968 CurrentValue = I->Value;
1969 CurrentPragmaLocation = I->PragmaLocation;
1970 Stack.erase(std::prev(I.base()), Stack.end());
1971 }
1972 } else if (!Stack.empty()) {
1973 // We do not have a label, just pop the last entry.
1974 CurrentValue = Stack.back().Value;
1975 CurrentPragmaLocation = Stack.back().PragmaLocation;
1976 Stack.pop_back();
1977 }
1978 }
1979 if (Action & PSK_Set) {
1981 CurrentPragmaLocation = PragmaLocation;
1982 }
1983 }
1984
1985 // MSVC seems to add artificial slots to #pragma stacks on entering a C++
1986 // method body to restore the stacks on exit, so it works like this:
1987 //
1988 // struct S {
1989 // #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
1990 // void Method {}
1991 // #pragma <name>(pop, InternalPragmaSlot)
1992 // };
1993 //
1994 // It works even with #pragma vtordisp, although MSVC doesn't support
1995 // #pragma vtordisp(push [, id], n)
1996 // syntax.
1997 //
1998 // Push / pop a named sentinel slot.
1999 void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
2000 assert((Action == PSK_Push || Action == PSK_Pop) &&
2001 "Can only push / pop #pragma stack sentinels!");
2002 Act(CurrentPragmaLocation, Action, Label, CurrentValue);
2003 }
2004
2005 // Constructors.
2006 explicit PragmaStack(const ValueType &Default)
2008
2009 bool hasValue() const { return CurrentValue != DefaultValue; }
2010
2012 ValueType DefaultValue; // Value used for PSK_Reset action.
2013 ValueType CurrentValue;
2015 };
2016 // FIXME: We should serialize / deserialize these if they occur in a PCH (but
2017 // we shouldn't do so if they're in a module).
2018
2019 /// Whether to insert vtordisps prior to virtual bases in the Microsoft
2020 /// C++ ABI. Possible values are 0, 1, and 2, which mean:
2021 ///
2022 /// 0: Suppress all vtordisps
2023 /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
2024 /// structors
2025 /// 2: Always insert vtordisps to support RTTI on partially constructed
2026 /// objects
2029 // The current #pragma align/pack values and locations at each #include.
2036 // Segment #pragmas.
2041
2042 // #pragma strict_gs_check.
2044
2045 // This stack tracks the current state of Sema.CurFPFeatures.
2048 FPOptionsOverride result;
2049 if (!FpPragmaStack.hasValue()) {
2050 result = FPOptionsOverride();
2051 } else {
2052 result = FpPragmaStack.CurrentValue;
2053 }
2054 return result;
2055 }
2056
2063
2064 // RAII object to push / pop sentinel slots for all MS #pragma stacks.
2065 // Actions should be performed only if we enter / exit a C++ method body.
2067 public:
2068 PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
2073
2074 private:
2075 Sema &S;
2076 StringRef SlotLabel;
2077 bool ShouldAct;
2078 };
2079
2080 /// Last section used with #pragma init_seg.
2083
2084 /// Sections used with #pragma alloc_text.
2085 llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
2086
2087 /// VisContext - Manages the stack for \#pragma GCC visibility.
2088 void *VisContext; // Really a "PragmaVisStack*"
2089
2090 /// This an attribute introduced by \#pragma clang attribute.
2097
2098 /// A push'd group of PragmaAttributeEntries.
2100 /// The location of the push attribute.
2102 /// The namespace of this push group.
2105 };
2106
2108
2109 /// The declaration that is currently receiving an attribute from the
2110 /// #pragma attribute stack.
2112
2113 /// This represents the last location of a "#pragma clang optimize off"
2114 /// directive if such a directive has not been closed by an "on" yet. If
2115 /// optimizations are currently "on", this is set to an invalid location.
2117
2118 /// Get the location for the currently active "\#pragma clang optimize
2119 /// off". If this location is invalid, then the state of the pragma is "on".
2123
2124 /// The "on" or "off" argument passed by \#pragma optimize, that denotes
2125 /// whether the optimizations in the list passed to the pragma should be
2126 /// turned off or on. This boolean is true by default because command line
2127 /// options are honored when `#pragma optimize("", on)`.
2128 /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
2130
2131 /// Set of no-builtin functions listed by \#pragma function.
2133
2134 /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
2135 /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
2137
2138 /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
2140
2141 /// Add gsl::Pointer attribute to std::container::iterator
2142 /// \param ND The declaration that introduces the name
2143 /// std::container::iterator. \param UnderlyingRecord The record named by ND.
2144 void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
2145
2146 /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
2148
2149 /// Add [[clang:::lifetimebound]] attr for std:: functions and methods.
2151
2152 /// Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
2154
2155 /// Add [[gsl::Pointer]] attributes for std:: types.
2157
2158 LifetimeCaptureByAttr *ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
2159 StringRef ParamName);
2160 // Processes the argument 'X' in [[clang::lifetime_capture_by(X)]]. Since 'X'
2161 // can be the name of a function parameter, we need to parse the function
2162 // declaration and rest of the parameters before processesing 'X'. Therefore
2163 // do this lazily instead of processing while parsing the annotation itself.
2165
2166 /// Add _Nullable attributes for std:: types.
2168
2169 /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
2172 PragmaClangSectionKind SecKind,
2173 StringRef SecName);
2174
2175 /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
2177 SourceLocation PragmaLoc);
2178
2179 /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
2180 void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
2181 StringRef SlotLabel, Expr *Alignment);
2182
2183 /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
2184 /// (unless they are value dependent or type dependent). Returns false
2185 /// and emits a diagnostic if one or more of the arguments could not be
2186 /// folded into a constant.
2189
2194
2196 SourceLocation IncludeLoc);
2198
2199 /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
2201
2202 /// ActOnPragmaMSComment - Called on well formed
2203 /// \#pragma comment(kind, "arg").
2205 StringRef Arg);
2206
2207 /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
2208 void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
2209 StringRef Value);
2210
2211 /// Are precise floating point semantics currently enabled?
2213 return !CurFPFeatures.getAllowFPReassociate() &&
2214 !CurFPFeatures.getNoSignedZero() &&
2215 !CurFPFeatures.getAllowReciprocal() &&
2216 !CurFPFeatures.getAllowApproxFunc();
2217 }
2218
2221
2222 /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
2223 void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action,
2225
2226 /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
2227 /// pointers_to_members(representation method[, general purpose
2228 /// representation]).
2231 SourceLocation PragmaLoc);
2232
2233 /// Called on well formed \#pragma vtordisp().
2234 void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action,
2236
2237 bool UnifySection(StringRef SectionName, int SectionFlags,
2238 NamedDecl *TheDecl);
2239 bool UnifySection(StringRef SectionName, int SectionFlags,
2240 SourceLocation PragmaSectionLocation);
2241
2242 /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
2243 void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
2244 PragmaMsStackAction Action,
2245 llvm::StringRef StackSlotLabel,
2246 StringLiteral *SegmentName, llvm::StringRef PragmaName);
2247
2248 /// Called on well formed \#pragma section().
2249 void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags,
2250 StringLiteral *SegmentName);
2251
2252 /// Called on well-formed \#pragma init_seg().
2253 void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
2254 StringLiteral *SegmentName);
2255
2256 /// Called on well-formed \#pragma alloc_text().
2258 SourceLocation PragmaLocation, StringRef Section,
2259 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
2260 &Functions);
2261
2262 /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
2263 /// strict_gs_check.
2265 PragmaMsStackAction Action,
2266 bool Value);
2267
2268 /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
2269 void ActOnPragmaUnused(const Token &Identifier, Scope *curScope,
2270 SourceLocation PragmaLoc);
2271
2273 SourceLocation PragmaLoc,
2276 const IdentifierInfo *Namespace);
2277
2278 /// Called on well-formed '\#pragma clang attribute pop'.
2280 const IdentifierInfo *Namespace);
2281
2282 /// Adds the attributes that have been specified using the
2283 /// '\#pragma clang attribute push' directives to the given declaration.
2284 void AddPragmaAttributes(Scope *S, Decl *D);
2285
2287 llvm::function_ref<void(SourceLocation, PartialDiagnostic)>;
2289 return [this](SourceLocation Loc, PartialDiagnostic PD) {
2290 // This bypasses a lot of the filters in the diag engine, as it's
2291 // to be used to attach notes to diagnostics which have already
2292 // been filtered through.
2293 DiagnosticBuilder Builder(Diags.Report(Loc, PD.getDiagID()));
2294 PD.Emit(Builder);
2295 };
2296 }
2297
2303
2305
2306 /// Called on well formed \#pragma clang optimize.
2307 void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
2308
2309 /// #pragma optimize("[optimization-list]", on | off).
2310 void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
2311
2312 /// Call on well formed \#pragma function.
2313 void
2315 const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
2316
2317 /// Only called on function definitions; if there is a pragma in scope
2318 /// with the effect of a range-based optnone, consider marking the function
2319 /// with attribute optnone.
2321
2322 /// Only called on function definitions; if there is a `#pragma alloc_text`
2323 /// that decides which code section the function should be in, add
2324 /// attribute section to the function.
2326
2327 /// Adds the 'optnone' attribute to the function declaration if there
2328 /// are no conflicts; Loc represents the location causing the 'optnone'
2329 /// attribute to be added (usually because of a pragma).
2331
2332 /// Only called on function definitions; if there is a MSVC #pragma optimize
2333 /// in scope, consider changing the function's attributes based on the
2334 /// optimization list passed to the pragma.
2336
2337 /// Only called on function definitions; if there is a pragma in scope
2338 /// with the effect of a range-based no_builtin, consider marking the function
2339 /// with attribute no_builtin.
2341
2342 /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
2343 /// add an appropriate visibility attribute.
2345
2346 /// FreeVisContext - Deallocate and null out VisContext.
2347 void FreeVisContext();
2348
2349 /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
2350 void ActOnPragmaVisibility(const IdentifierInfo *VisType,
2351 SourceLocation PragmaLoc);
2352
2353 /// ActOnPragmaFPContract - Called on well formed
2354 /// \#pragma {STDC,OPENCL} FP_CONTRACT and
2355 /// \#pragma clang fp contract
2357
2358 /// Called on well formed
2359 /// \#pragma clang fp reassociate
2360 /// or
2361 /// \#pragma clang fp reciprocal
2363 bool IsEnabled);
2364
2365 /// ActOnPragmaFenvAccess - Called on well formed
2366 /// \#pragma STDC FENV_ACCESS
2367 void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
2368
2369 /// ActOnPragmaCXLimitedRange - Called on well formed
2370 /// \#pragma STDC CX_LIMITED_RANGE
2373
2374 /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
2377
2378 /// Called to set constant rounding mode for floating point operations.
2379 void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
2380
2381 /// Called to set exception behavior for floating point operations.
2383
2384 /// PushNamespaceVisibilityAttr - Note that we've entered a
2385 /// namespace with a visibility attribute.
2386 void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
2387 SourceLocation Loc);
2388
2389 /// PopPragmaVisibility - Pop the top element of the visibility stack; used
2390 /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
2391 void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
2392
2393 /// Handles semantic checking for features that are common to all attributes,
2394 /// such as checking whether a parameter was properly specified, or the
2395 /// correct number of arguments were passed, etc. Returns true if the
2396 /// attribute has been diagnosed.
2397 bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
2398 bool SkipArgCountCheck = false);
2399 bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
2400 bool SkipArgCountCheck = false);
2401
2402 ///@}
2403
2404 //
2405 //
2406 // -------------------------------------------------------------------------
2407 //
2408 //
2409
2410 /// \name Availability Attribute Handling
2411 /// Implementations are in SemaAvailability.cpp
2412 ///@{
2413
2414public:
2415 /// Issue any -Wunguarded-availability warnings in \c FD
2417
2419
2420 /// Retrieve the current function, if any, that should be analyzed for
2421 /// potential availability violations.
2423
2425 const ObjCInterfaceDecl *UnknownObjCClass,
2426 bool ObjCPropertyAccess,
2427 bool AvoidPartialAvailabilityChecks,
2428 ObjCInterfaceDecl *ClassReceiver);
2429
2431
2432 std::pair<AvailabilityResult, const NamedDecl *>
2433 ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message,
2434 ObjCInterfaceDecl *ClassReceiver);
2435 ///@}
2436
2437 //
2438 //
2439 // -------------------------------------------------------------------------
2440 //
2441 //
2442
2443 /// \name Bounds Safety
2444 /// Implementations are in SemaBoundsSafety.cpp
2445 ///@{
2446public:
2447 /// Check if applying the specified attribute variant from the "counted by"
2448 /// family of attributes to FieldDecl \p FD is semantically valid. If
2449 /// semantically invalid diagnostics will be emitted explaining the problems.
2450 ///
2451 /// \param FD The FieldDecl to apply the attribute to
2452 /// \param E The count expression on the attribute
2453 /// \param CountInBytes If true the attribute is from the "sized_by" family of
2454 /// attributes. If the false the attribute is from
2455 /// "counted_by" family of attributes.
2456 /// \param OrNull If true the attribute is from the "_or_null" suffixed family
2457 /// of attributes. If false the attribute does not have the
2458 /// suffix.
2459 ///
2460 /// Together \p CountInBytes and \p OrNull decide the attribute variant. E.g.
2461 /// \p CountInBytes and \p OrNull both being true indicates the
2462 /// `counted_by_or_null` attribute.
2463 ///
2464 /// \returns false iff semantically valid.
2465 bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
2466 bool OrNull);
2467
2468 /// Perform Bounds Safety Semantic checks for assigning to a `__counted_by` or
2469 /// `__counted_by_or_null` pointer type \param LHSTy.
2470 ///
2471 /// \param LHSTy The type being assigned to. Checks will only be performed if
2472 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2473 /// \param RHSExpr The expression being assigned from.
2474 /// \param Action The type assignment being performed
2475 /// \param Loc The SourceLocation to use for error diagnostics
2476 /// \param Assignee The ValueDecl being assigned. This is used to compute
2477 /// the name of the assignee. If the assignee isn't known this can
2478 /// be set to nullptr.
2479 /// \param ShowFullyQualifiedAssigneeName If set to true when using \p
2480 /// Assignee to compute the name of the assignee use the fully
2481 /// qualified name, otherwise use the unqualified name.
2482 ///
2483 /// \returns True iff no diagnostic where emitted, false otherwise.
2485 QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
2486 SourceLocation Loc, const ValueDecl *Assignee,
2487 bool ShowFullyQualifiedAssigneeName);
2488
2489 /// Perform Bounds Safety Semantic checks for initializing a Bounds Safety
2490 /// pointer.
2491 ///
2492 /// \param Entity The entity being initialized
2493 /// \param Kind The kind of initialization being performed
2494 /// \param Action The type assignment being performed
2495 /// \param LHSTy The type being assigned to. Checks will only be performed if
2496 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2497 /// \param RHSExpr The expression being used for initialization.
2498 ///
2499 /// \returns True iff no diagnostic where emitted, false otherwise.
2501 const InitializationKind &Kind,
2502 AssignmentAction Action,
2503 QualType LHSType, Expr *RHSExpr);
2504
2505 /// Perform Bounds Safety semantic checks for uses of invalid uses counted_by
2506 /// or counted_by_or_null pointers in \param E.
2507 ///
2508 /// \param E the expression to check
2509 ///
2510 /// \returns True iff no diagnostic where emitted, false otherwise.
2512 ///@}
2513
2514 //
2515 //
2516 // -------------------------------------------------------------------------
2517 //
2518 //
2519
2520 /// \name Casts
2521 /// Implementations are in SemaCast.cpp
2522 ///@{
2523
2524public:
2530
2531 /// ActOnCXXNamedCast - Parse
2532 /// {dynamic,static,reinterpret,const,addrspace}_cast's.
2534 SourceLocation LAngleBracketLoc, Declarator &D,
2535 SourceLocation RAngleBracketLoc,
2536 SourceLocation LParenLoc, Expr *E,
2537 SourceLocation RParenLoc);
2538
2540 TypeSourceInfo *Ty, Expr *E,
2541 SourceRange AngleBrackets, SourceRange Parens);
2542
2544 ExprResult Operand,
2545 SourceLocation RParenLoc);
2546
2548 Expr *Operand, SourceLocation RParenLoc);
2549
2550 // Checks that reinterpret casts don't have undefined behavior.
2551 void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2552 bool IsDereference, SourceRange Range);
2553
2554 // Checks that the vector type should be initialized from a scalar
2555 // by splatting the value rather than populating a single element.
2556 // This is the case for AltiVecVector types as well as with
2557 // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
2558 bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
2559
2560 // Checks if the -faltivec-src-compat=gcc option is specified.
2561 // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
2562 // treated the same way as they are when trying to initialize
2563 // these vectors on gcc (an error is emitted).
2565 QualType SrcTy);
2566
2568 SourceLocation RParenLoc, Expr *Op);
2569
2571 SourceLocation LParenLoc,
2572 Expr *CastExpr,
2573 SourceLocation RParenLoc);
2574
2575 ///@}
2576
2577 //
2578 //
2579 // -------------------------------------------------------------------------
2580 //
2581 //
2582
2583 /// \name Extra Semantic Checking
2584 /// Implementations are in SemaChecking.cpp
2585 ///@{
2586
2587public:
2588 /// Used to change context to isConstantEvaluated without pushing a heavy
2589 /// ExpressionEvaluationContextRecord object.
2591
2596
2598 unsigned ByteNo) const;
2599
2601 FAPK_Fixed, // values to format are fixed (no C-style variadic arguments)
2602 FAPK_Variadic, // values to format are passed as variadic arguments
2603 FAPK_VAList, // values to format are passed in a va_list
2604 FAPK_Elsewhere, // values to format are not passed to this function
2605 };
2606
2607 // Used to grab the relevant information from a FormatAttr and a
2608 // FunctionDeclaration.
2614
2615 /// Given a function and its FormatAttr or FormatMatchesAttr info, attempts to
2616 /// populate the FormatStringInfo parameter with the attribute's correct
2617 /// format_idx and firstDataArg. Returns true when the format fits the
2618 /// function and the FormatStringInfo has been populated.
2619 static bool getFormatStringInfo(const Decl *Function, unsigned FormatIdx,
2620 unsigned FirstArg, FormatStringInfo *FSI);
2621 static bool getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg,
2622 bool HasImplicitThisParam, bool IsVariadic,
2623 FormatStringInfo *FSI);
2624
2625 // Used by C++ template instantiation.
2627
2628 /// ConvertVectorExpr - Handle __builtin_convertvector
2630 SourceLocation BuiltinLoc,
2631 SourceLocation RParenLoc);
2632
2633 static StringRef GetFormatStringTypeName(FormatStringType FST);
2634 static FormatStringType GetFormatStringType(StringRef FormatFlavor);
2635 static FormatStringType GetFormatStringType(const FormatAttr *Format);
2636 static FormatStringType GetFormatStringType(const FormatMatchesAttr *Format);
2637
2638 bool FormatStringHasSArg(const StringLiteral *FExpr);
2639
2640 /// Check for comparisons of floating-point values using == and !=. Issue a
2641 /// warning if the comparison is not likely to do what the programmer
2642 /// intended.
2643 void CheckFloatComparison(SourceLocation Loc, const Expr *LHS,
2644 const Expr *RHS, BinaryOperatorKind Opcode);
2645
2646 /// Register a magic integral constant to be used as a type tag.
2647 void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
2648 uint64_t MagicValue, QualType Type,
2649 bool LayoutCompatible, bool MustBeNull);
2650
2653
2657
2659
2660 /// If true, \c Type should be compared with other expression's types for
2661 /// layout-compatibility.
2662 LLVM_PREFERRED_TYPE(bool)
2664 LLVM_PREFERRED_TYPE(bool)
2665 unsigned MustBeNull : 1;
2666 };
2667
2668 /// A pair of ArgumentKind identifier and magic value. This uniquely
2669 /// identifies the magic value.
2670 typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
2671
2672 /// Diagnoses the current set of gathered accesses. This happens at the end of
2673 /// each expression evaluation context. Diagnostics are emitted only for
2674 /// accesses gathered in the current evaluation context.
2676
2677 /// This function checks if the expression is in the sef of potentially
2678 /// misaligned members and it is converted to some pointer type T with lower
2679 /// or equal alignment requirements. If so it removes it. This is used when
2680 /// we do not want to diagnose such misaligned access (e.g. in conversions to
2681 /// void*).
2682 void DiscardMisalignedMemberAddress(const Type *T, Expr *E);
2683
2684 /// Returns true if `From` is a function or pointer to a function with the
2685 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2686 /// function without this attribute.
2687 bool DiscardingCFIUncheckedCallee(QualType From, QualType To) const;
2688
2689 /// This function calls Action when it determines that E designates a
2690 /// misaligned member due to the packed attribute. This is used to emit
2691 /// local diagnostics like in reference binding.
2693 Expr *E,
2694 llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
2695 Action);
2696
2697 enum class AtomicArgumentOrder { API, AST };
2699 BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
2700 SourceLocation RParenLoc, MultiExprArg Args,
2703
2704 /// Check to see if a given expression could have '.c_str()' called on it.
2705 bool hasCStrMethod(const Expr *E);
2706
2707 /// Diagnose pointers that are always non-null.
2708 /// \param E the expression containing the pointer
2709 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
2710 /// compared to a null pointer
2711 /// \param IsEqual True when the comparison is equal to a null pointer
2712 /// \param Range Extra SourceRange to highlight in the diagnostic
2715 bool IsEqual, SourceRange Range);
2716
2717 /// CheckParmsForFunctionDef - Check that the parameters of the given
2718 /// function are appropriate for the definition of a function. This
2719 /// takes care of any checks that cannot be performed on the
2720 /// declaration itself, e.g., that the types of each of the function
2721 /// parameters are complete.
2723 bool CheckParameterNames);
2724
2725 /// CheckCastAlign - Implements -Wcast-align, which warns when a
2726 /// pointer cast increases the alignment requirements.
2727 void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2728
2729 /// checkUnsafeAssigns - Check whether +1 expr is being assigned
2730 /// to weak/__unsafe_unretained type.
2731 bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS);
2732
2733 /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
2734 /// to weak/__unsafe_unretained expression.
2735 void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS);
2736
2737 /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
2738 /// statement as a \p Body, and it is located on the same line.
2739 ///
2740 /// This helps prevent bugs due to typos, such as:
2741 /// if (condition);
2742 /// do_stuff();
2743 void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body,
2744 unsigned DiagID);
2745
2746 /// Warn if a for/while loop statement \p S, which is followed by
2747 /// \p PossibleBody, has a suspicious null statement as a body.
2748 void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody);
2749
2750 /// DiagnoseSelfMove - Emits a warning if a value is moved to itself.
2751 void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
2752 SourceLocation OpLoc);
2753
2754 bool IsLayoutCompatible(QualType T1, QualType T2) const;
2756 const TypeSourceInfo *Derived);
2757
2758 /// CheckFunctionCall - Check a direct function call for various correctness
2759 /// and safety properties not strictly enforced by the C type system.
2760 bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
2761 const FunctionProtoType *Proto);
2762
2769
2770 /// \param FPOnly restricts the arguments to floating-point types.
2771 std::optional<QualType>
2772 BuiltinVectorMath(CallExpr *TheCall,
2775 bool BuiltinVectorToScalarMath(CallExpr *TheCall);
2776
2777 void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction,
2778 const Expr *ThisArg, ArrayRef<const Expr *> Args);
2779
2780 /// Handles the checks for format strings, non-POD arguments to vararg
2781 /// functions, NULL arguments passed to non-NULL parameters, diagnose_if
2782 /// attributes and AArch64 SME attributes.
2783 void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
2784 const Expr *ThisArg, ArrayRef<const Expr *> Args,
2785 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
2786 VariadicCallType CallType);
2787
2788 /// Verify that two format strings (as understood by attribute(format) and
2789 /// attribute(format_matches) are compatible. If they are incompatible,
2790 /// diagnostics are emitted with the assumption that \c
2791 /// AuthoritativeFormatString is correct and
2792 /// \c TestedFormatString is wrong. If \c FunctionCallArg is provided,
2793 /// diagnostics will point to it and a note will refer to \c
2794 /// TestedFormatString or \c AuthoritativeFormatString as appropriate.
2795 bool
2797 const StringLiteral *AuthoritativeFormatString,
2798 const StringLiteral *TestedFormatString,
2799 const Expr *FunctionCallArg = nullptr);
2800
2801 /// Verify that one format string (as understood by attribute(format)) is
2802 /// self-consistent; for instance, that it doesn't have multiple positional
2803 /// arguments referring to the same argument in incompatible ways. Diagnose
2804 /// if it isn't.
2806
2807 /// \brief Enforce the bounds of a TCB
2808 /// CheckTCBEnforcement - Enforces that every function in a named TCB only
2809 /// directly calls other functions in the same TCB as marked by the
2810 /// enforce_tcb and enforce_tcb_leaf attributes.
2811 void CheckTCBEnforcement(const SourceLocation CallExprLoc,
2812 const NamedDecl *Callee);
2813
2814 void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
2815
2816 /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr
2817 /// TheCall is a constant expression.
2818 bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum,
2819 llvm::APSInt &Result);
2820
2821 /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr
2822 /// TheCall is a constant expression in the range [Low, High].
2823 bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low,
2824 int High, bool RangeIsError = true);
2825
2826 /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr
2827 /// TheCall is a constant expression is a multiple of Num..
2828 bool BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum,
2829 unsigned Multiple);
2830
2831 /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a
2832 /// constant expression representing a power of 2.
2833 bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum);
2834
2835 /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is
2836 /// a constant expression representing an arbitrary byte value shifted left by
2837 /// a multiple of 8 bits.
2838 bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum,
2839 unsigned ArgBits);
2840
2841 /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of
2842 /// TheCall is a constant expression representing either a shifted byte value,
2843 /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression
2844 /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some
2845 /// Arm MVE intrinsics.
2846 bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum,
2847 unsigned ArgBits);
2848
2849 /// Checks that a call expression's argument count is at least the desired
2850 /// number. This is useful when doing custom type-checking on a variadic
2851 /// function. Returns true on error.
2852 bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
2853
2854 /// Checks that a call expression's argument count is at most the desired
2855 /// number. This is useful when doing custom type-checking on a variadic
2856 /// function. Returns true on error.
2857 bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
2858
2859 /// Checks that a call expression's argument count is in the desired range.
2860 /// This is useful when doing custom type-checking on a variadic function.
2861 /// Returns true on error.
2862 bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
2863 unsigned MaxArgCount);
2864
2865 /// Checks that a call expression's argument count is the desired number.
2866 /// This is useful when doing custom type-checking. Returns true on error.
2867 bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
2868
2869 /// Returns true if the argument consists of one contiguous run of 1s with any
2870 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2871 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2872 /// since all 1s are not contiguous.
2873 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2874
2876 bool *ICContext = nullptr,
2877 bool IsListInit = false);
2878
2879 bool
2884 CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr =
2886
2887private:
2888 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2889 const ArraySubscriptExpr *ASE = nullptr,
2890 bool AllowOnePastEnd = true, bool IndexNegated = false);
2891 void CheckArrayAccess(const Expr *E);
2892
2893 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2894 const FunctionProtoType *Proto);
2895
2896 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2897 /// such as function pointers returned from functions.
2898 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2899
2900 /// CheckConstructorCall - Check a constructor call for correctness and safety
2901 /// properties not enforced by the C type system.
2902 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2904 const FunctionProtoType *Proto, SourceLocation Loc);
2905
2906 /// Warn if a pointer or reference argument passed to a function points to an
2907 /// object that is less aligned than the parameter. This can happen when
2908 /// creating a typedef with a lower alignment than the original type and then
2909 /// calling functions defined in terms of the original type.
2910 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2911 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2912
2913 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2914
2915 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2916 CallExpr *TheCall);
2917
2918 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2919 CallExpr *TheCall);
2920
2921 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2922
2923 /// Check the arguments to '__builtin_va_start', '__builtin_ms_va_start',
2924 /// or '__builtin_c23_va_start' for validity. Emit an error and return true
2925 /// on failure; return false on success.
2926 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2927 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2928
2929 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2930 /// friends. This is declared to take (...), so we have to check everything.
2931 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2932
2933 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2934 /// __builtin_isnan and friends. This is declared to take (...), so we have
2935 /// to check everything.
2936 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2937 unsigned BuiltinID);
2938
2939 /// Perform semantic analysis for a call to __builtin_complex.
2940 bool BuiltinComplex(CallExpr *TheCall);
2941 bool BuiltinOSLogFormat(CallExpr *TheCall);
2942
2943 /// BuiltinPrefetch - Handle __builtin_prefetch.
2944 /// This is declared to take (const void*, ...) and can take two
2945 /// optional constant int args.
2946 bool BuiltinPrefetch(CallExpr *TheCall);
2947
2948 /// Handle __builtin_alloca_with_align. This is declared
2949 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
2950 /// than 8.
2951 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
2952
2953 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
2954 bool BuiltinArithmeticFence(CallExpr *TheCall);
2955
2956 /// BuiltinAssume - Handle __assume (MS Extension).
2957 /// __assume does not evaluate its arguments, and should warn if its argument
2958 /// has side effects.
2959 bool BuiltinAssume(CallExpr *TheCall);
2960
2961 /// Handle __builtin_assume_aligned. This is declared
2962 /// as (const void*, size_t, ...) and can take one optional constant int arg.
2963 bool BuiltinAssumeAligned(CallExpr *TheCall);
2964
2965 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
2966 /// This checks that the target supports __builtin_longjmp and
2967 /// that val is a constant 1.
2968 bool BuiltinLongjmp(CallExpr *TheCall);
2969
2970 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
2971 /// This checks that the target supports __builtin_setjmp.
2972 bool BuiltinSetjmp(CallExpr *TheCall);
2973
2974 /// We have a call to a function like __sync_fetch_and_add, which is an
2975 /// overloaded function based on the pointer type of its first argument.
2976 /// The main BuildCallExpr routines have already promoted the types of
2977 /// arguments because all of these calls are prototyped as void(...).
2978 ///
2979 /// This function goes through and does final semantic checking for these
2980 /// builtins, as well as generating any warnings.
2981 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
2982
2983 /// BuiltinNontemporalOverloaded - We have a call to
2984 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
2985 /// overloaded function based on the pointer type of its last argument.
2986 ///
2987 /// This function goes through and does final semantic checking for these
2988 /// builtins.
2989 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
2990 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
2992
2993 /// \param FPOnly restricts the arguments to floating-point types.
2994 bool BuiltinElementwiseMath(CallExpr *TheCall,
2997 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
2998
2999 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
3000
3001 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
3003 bool BuiltinCountedByRef(CallExpr *TheCall);
3004
3005 // Matrix builtin handling.
3006 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
3007 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
3008 ExprResult CallResult);
3009 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
3010 ExprResult CallResult);
3011
3012 /// CheckFormatArguments - Check calls to printf and scanf (and similar
3013 /// functions) for correct use of format strings.
3014 /// Returns true if a format string has been fully checked.
3015 bool CheckFormatArguments(const FormatAttr *Format,
3016 ArrayRef<const Expr *> Args, bool IsCXXMember,
3017 VariadicCallType CallType, SourceLocation Loc,
3018 SourceRange Range,
3019 llvm::SmallBitVector &CheckedVarArgs);
3020 bool CheckFormatString(const FormatMatchesAttr *Format,
3021 ArrayRef<const Expr *> Args, bool IsCXXMember,
3022 VariadicCallType CallType, SourceLocation Loc,
3023 SourceRange Range,
3024 llvm::SmallBitVector &CheckedVarArgs);
3025 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
3026 FormatArgumentPassingKind FAPK,
3027 StringLiteral *ReferenceFormatString,
3028 unsigned format_idx, unsigned firstDataArg,
3030 SourceLocation Loc, SourceRange range,
3031 llvm::SmallBitVector &CheckedVarArgs);
3032
3033 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
3034
3035 /// Warn when using the wrong abs() function.
3036 void CheckAbsoluteValueFunction(const CallExpr *Call,
3037 const FunctionDecl *FDecl);
3038
3039 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
3040
3041 /// Check for dangerous or invalid arguments to memset().
3042 ///
3043 /// This issues warnings on known problematic, dangerous or unspecified
3044 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
3045 /// function calls.
3046 ///
3047 /// \param Call The call expression to diagnose.
3048 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
3049 IdentifierInfo *FnName);
3050
3051 // Warn if the user has made the 'size' argument to strlcpy or strlcat
3052 // be the size of the source, instead of the destination.
3053 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
3054
3055 // Warn on anti-patterns as the 'size' argument to strncat.
3056 // The correct size argument should look like following:
3057 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
3058 void CheckStrncatArguments(const CallExpr *Call,
3059 const IdentifierInfo *FnName);
3060
3061 /// Alerts the user that they are attempting to free a non-malloc'd object.
3062 void CheckFreeArguments(const CallExpr *E);
3063
3064 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
3065 SourceLocation ReturnLoc, bool isObjCMethod = false,
3066 const AttrVec *Attrs = nullptr,
3067 const FunctionDecl *FD = nullptr);
3068
3069 /// Diagnoses "dangerous" implicit conversions within the given
3070 /// expression (which is a full expression). Implements -Wconversion
3071 /// and -Wsign-compare.
3072 ///
3073 /// \param CC the "context" location of the implicit conversion, i.e.
3074 /// the most location of the syntactic entity requiring the implicit
3075 /// conversion
3076 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
3077
3078 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
3079 /// Input argument E is a logical expression.
3081
3082 /// Diagnose when expression is an integer constant expression and its
3083 /// evaluation results in integer overflow
3084 void CheckForIntOverflow(const Expr *E);
3085 void CheckUnsequencedOperations(const Expr *E);
3086
3087 /// Perform semantic checks on a completed expression. This will either
3088 /// be a full-expression or a default argument expression.
3089 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
3090 bool IsConstexpr = false);
3091
3092 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
3093 Expr *Init);
3094
3095 /// A map from magic value to type information.
3096 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
3097 TypeTagForDatatypeMagicValues;
3098
3099 /// Peform checks on a call of a function with argument_with_type_tag
3100 /// or pointer_with_type_tag attributes.
3101 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
3102 const ArrayRef<const Expr *> ExprArgs,
3103 SourceLocation CallSiteLoc);
3104
3105 /// Check if we are taking the address of a packed field
3106 /// as this may be a problem if the pointer value is dereferenced.
3107 void CheckAddressOfPackedMember(Expr *rhs);
3108
3109 /// Helper class that collects misaligned member designations and
3110 /// their location info for delayed diagnostics.
3111 struct MisalignedMember {
3112 Expr *E;
3113 RecordDecl *RD;
3114 ValueDecl *MD;
3115 CharUnits Alignment;
3116
3117 MisalignedMember() : E(), RD(), MD() {}
3118 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
3119 CharUnits Alignment)
3120 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
3121 explicit MisalignedMember(Expr *E)
3122 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
3123
3124 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
3125 };
3126
3127 /// Adds an expression to the set of gathered misaligned members.
3128 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
3129 CharUnits Alignment);
3130 ///@}
3131
3132 //
3133 //
3134 // -------------------------------------------------------------------------
3135 //
3136 //
3137
3138 /// \name C++ Coroutines
3139 /// Implementations are in SemaCoroutine.cpp
3140 ///@{
3141
3142public:
3143 /// The C++ "std::coroutine_traits" template, which is defined in
3144 /// <coroutine_traits>
3146
3148 StringRef Keyword);
3152
3155 UnresolvedLookupExpr *Lookup);
3157 Expr *Awaiter, bool IsImplicit = false);
3159 UnresolvedLookupExpr *Lookup);
3162 bool IsImplicit = false);
3167
3168 // As a clang extension, enforces that a non-coroutine function must be marked
3169 // with [[clang::coro_wrapper]] if it returns a type marked with
3170 // [[clang::coro_return_type]].
3171 // Expects that FD is not a coroutine.
3173 /// Lookup 'coroutine_traits' in std namespace and std::experimental
3174 /// namespace. The namespace found is recorded in Namespace.
3176 SourceLocation FuncLoc);
3177 /// Check that the expression co_await promise.final_suspend() shall not be
3178 /// potentially-throwing.
3179 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
3180
3181 ///@}
3182
3183 //
3184 //
3185 // -------------------------------------------------------------------------
3186 //
3187 //
3188
3189 /// \name C++ Scope Specifiers
3190 /// Implementations are in SemaCXXScopeSpec.cpp
3191 ///@{
3192
3193public:
3194 // Marks SS invalid if it represents an incomplete type.
3196 // Complete an enum decl, maybe without a scope spec.
3198 CXXScopeSpec *SS = nullptr);
3199
3200 /// Compute the DeclContext that is associated with the given type.
3201 ///
3202 /// \param T the type for which we are attempting to find a DeclContext.
3203 ///
3204 /// \returns the declaration context represented by the type T,
3205 /// or NULL if the declaration context cannot be computed (e.g., because it is
3206 /// dependent and not the current instantiation).
3208
3209 /// Compute the DeclContext that is associated with the given
3210 /// scope specifier.
3211 ///
3212 /// \param SS the C++ scope specifier as it appears in the source
3213 ///
3214 /// \param EnteringContext when true, we will be entering the context of
3215 /// this scope specifier, so we can retrieve the declaration context of a
3216 /// class template or class template partial specialization even if it is
3217 /// not the current instantiation.
3218 ///
3219 /// \returns the declaration context represented by the scope specifier @p SS,
3220 /// or NULL if the declaration context cannot be computed (e.g., because it is
3221 /// dependent and not the current instantiation).
3223 bool EnteringContext = false);
3225
3226 /// If the given nested name specifier refers to the current
3227 /// instantiation, return the declaration that corresponds to that
3228 /// current instantiation (C++0x [temp.dep.type]p1).
3229 ///
3230 /// \param NNS a dependent nested name specifier.
3232
3233 /// The parser has parsed a global nested-name-specifier '::'.
3234 ///
3235 /// \param CCLoc The location of the '::'.
3236 ///
3237 /// \param SS The nested-name-specifier, which will be updated in-place
3238 /// to reflect the parsed nested-name-specifier.
3239 ///
3240 /// \returns true if an error occurred, false otherwise.
3242
3243 /// The parser has parsed a '__super' nested-name-specifier.
3244 ///
3245 /// \param SuperLoc The location of the '__super' keyword.
3246 ///
3247 /// \param ColonColonLoc The location of the '::'.
3248 ///
3249 /// \param SS The nested-name-specifier, which will be updated in-place
3250 /// to reflect the parsed nested-name-specifier.
3251 ///
3252 /// \returns true if an error occurred, false otherwise.
3254 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
3255
3256 /// Determines whether the given declaration is an valid acceptable
3257 /// result for name lookup of a nested-name-specifier.
3258 /// \param SD Declaration checked for nested-name-specifier.
3259 /// \param IsExtension If not null and the declaration is accepted as an
3260 /// extension, the pointed variable is assigned true.
3262 bool *CanCorrect = nullptr);
3263
3264 /// If the given nested-name-specifier begins with a bare identifier
3265 /// (e.g., Base::), perform name lookup for that identifier as a
3266 /// nested-name-specifier within the given scope, and return the result of
3267 /// that name lookup.
3269
3270 /// Keeps information about an identifier in a nested-name-spec.
3271 ///
3273 /// The type of the object, if we're parsing nested-name-specifier in
3274 /// a member access expression.
3276
3277 /// The identifier preceding the '::'.
3279
3280 /// The location of the identifier.
3282
3283 /// The location of the '::'.
3285
3286 /// Creates info object for the most typical case.
3288 SourceLocation ColonColonLoc,
3291 CCLoc(ColonColonLoc) {}
3292
3294 SourceLocation ColonColonLoc, QualType ObjectType)
3296 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
3297 };
3298
3299 /// Build a new nested-name-specifier for "identifier::", as described
3300 /// by ActOnCXXNestedNameSpecifier.
3301 ///
3302 /// \param S Scope in which the nested-name-specifier occurs.
3303 /// \param IdInfo Parser information about an identifier in the
3304 /// nested-name-spec.
3305 /// \param EnteringContext If true, enter the context specified by the
3306 /// nested-name-specifier.
3307 /// \param SS Optional nested name specifier preceding the identifier.
3308 /// \param ScopeLookupResult Provides the result of name lookup within the
3309 /// scope of the nested-name-specifier that was computed at template
3310 /// definition time.
3311 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
3312 /// error recovery and what kind of recovery is performed.
3313 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
3314 /// are allowed. The bool value pointed by this parameter is set to
3315 /// 'true' if the identifier is treated as if it was followed by ':',
3316 /// not '::'.
3317 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3318 ///
3319 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
3320 /// that it contains an extra parameter \p ScopeLookupResult, which provides
3321 /// the result of name lookup within the scope of the nested-name-specifier
3322 /// that was computed at template definition time.
3323 ///
3324 /// If ErrorRecoveryLookup is true, then this call is used to improve error
3325 /// recovery. This means that it should not emit diagnostics, it should
3326 /// just return true on failure. It also means it should only return a valid
3327 /// scope if it *knows* that the result is correct. It should not return in a
3328 /// dependent context, for example. Nor will it extend \p SS with the scope
3329 /// specifier.
3330 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3331 bool EnteringContext, CXXScopeSpec &SS,
3332 NamedDecl *ScopeLookupResult,
3333 bool ErrorRecoveryLookup,
3334 bool *IsCorrectedToColon = nullptr,
3335 bool OnlyNamespace = false);
3336
3337 /// The parser has parsed a nested-name-specifier 'identifier::'.
3338 ///
3339 /// \param S The scope in which this nested-name-specifier occurs.
3340 ///
3341 /// \param IdInfo Parser information about an identifier in the
3342 /// nested-name-spec.
3343 ///
3344 /// \param EnteringContext Whether we're entering the context nominated by
3345 /// this nested-name-specifier.
3346 ///
3347 /// \param SS The nested-name-specifier, which is both an input
3348 /// parameter (the nested-name-specifier before this type) and an
3349 /// output parameter (containing the full nested-name-specifier,
3350 /// including this new type).
3351 ///
3352 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
3353 /// are allowed. The bool value pointed by this parameter is set to 'true'
3354 /// if the identifier is treated as if it was followed by ':', not '::'.
3355 ///
3356 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3357 ///
3358 /// \returns true if an error occurred, false otherwise.
3359 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3360 bool EnteringContext, CXXScopeSpec &SS,
3361 bool *IsCorrectedToColon = nullptr,
3362 bool OnlyNamespace = false);
3363
3364 /// The parser has parsed a nested-name-specifier
3365 /// 'template[opt] template-name < template-args >::'.
3366 ///
3367 /// \param S The scope in which this nested-name-specifier occurs.
3368 ///
3369 /// \param SS The nested-name-specifier, which is both an input
3370 /// parameter (the nested-name-specifier before this type) and an
3371 /// output parameter (containing the full nested-name-specifier,
3372 /// including this new type).
3373 ///
3374 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
3375 /// \param TemplateName the template name.
3376 /// \param TemplateNameLoc The location of the template name.
3377 /// \param LAngleLoc The location of the opening angle bracket ('<').
3378 /// \param TemplateArgs The template arguments.
3379 /// \param RAngleLoc The location of the closing angle bracket ('>').
3380 /// \param CCLoc The location of the '::'.
3381 ///
3382 /// \param EnteringContext Whether we're entering the context of the
3383 /// nested-name-specifier.
3384 ///
3385 ///
3386 /// \returns true if an error occurred, false otherwise.
3388 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
3389 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
3390 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
3391 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
3392
3394 SourceLocation ColonColonLoc);
3395
3397 const DeclSpec &DS,
3398 SourceLocation ColonColonLoc,
3399 QualType Type);
3400
3401 /// IsInvalidUnlessNestedName - This method is used for error recovery
3402 /// purposes to determine whether the specified identifier is only valid as
3403 /// a nested name specifier, for example a namespace name. It is
3404 /// conservatively correct to always return false from this method.
3405 ///
3406 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
3408 NestedNameSpecInfo &IdInfo,
3409 bool EnteringContext);
3410
3411 /// Given a C++ nested-name-specifier, produce an annotation value
3412 /// that the parser can use later to reconstruct the given
3413 /// nested-name-specifier.
3414 ///
3415 /// \param SS A nested-name-specifier.
3416 ///
3417 /// \returns A pointer containing all of the information in the
3418 /// nested-name-specifier \p SS.
3420
3421 /// Given an annotation pointer for a nested-name-specifier, restore
3422 /// the nested-name-specifier structure.
3423 ///
3424 /// \param Annotation The annotation pointer, produced by
3425 /// \c SaveNestedNameSpecifierAnnotation().
3426 ///
3427 /// \param AnnotationRange The source range corresponding to the annotation.
3428 ///
3429 /// \param SS The nested-name-specifier that will be updated with the contents
3430 /// of the annotation pointer.
3431 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
3432 SourceRange AnnotationRange,
3433 CXXScopeSpec &SS);
3434
3435 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
3436
3437 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
3438 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
3439 /// After this method is called, according to [C++ 3.4.3p3], names should be
3440 /// looked up in the declarator-id's scope, until the declarator is parsed and
3441 /// ActOnCXXExitDeclaratorScope is called.
3442 /// The 'SS' should be a non-empty valid CXXScopeSpec.
3444
3445 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
3446 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
3447 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
3448 /// Used to indicate that names should revert to being looked up in the
3449 /// defining scope.
3451
3452 ///@}
3453
3454 //
3455 //
3456 // -------------------------------------------------------------------------
3457 //
3458 //
3459
3460 /// \name Declarations
3461 /// Implementations are in SemaDecl.cpp
3462 ///@{
3463
3464public:
3466
3467 /// The index of the first InventedParameterInfo that refers to the current
3468 /// context.
3470
3471 /// A RAII object to temporarily push a declaration context.
3473 private:
3474 Sema &S;
3475 DeclContext *SavedContext;
3476 ProcessingContextState SavedContextState;
3477 QualType SavedCXXThisTypeOverride;
3478 unsigned SavedFunctionScopesStart;
3479 unsigned SavedInventedParameterInfosStart;
3480
3481 public:
3482 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3483 : S(S), SavedContext(S.CurContext),
3484 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3485 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3486 SavedFunctionScopesStart(S.FunctionScopesStart),
3487 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3488 assert(ContextToPush && "pushing null context");
3489 S.CurContext = ContextToPush;
3490 if (NewThisContext)
3491 S.CXXThisTypeOverride = QualType();
3492 // Any saved FunctionScopes do not refer to this context.
3493 S.FunctionScopesStart = S.FunctionScopes.size();
3494 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3495 }
3496
3497 void pop() {
3498 if (!SavedContext)
3499 return;
3500 S.CurContext = SavedContext;
3501 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3502 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3503 S.FunctionScopesStart = SavedFunctionScopesStart;
3504 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3505 SavedContext = nullptr;
3506 }
3507
3509 ContextRAII(const ContextRAII &) = delete;
3511 };
3512
3513 void DiagnoseInvalidJumps(Stmt *Body);
3514
3515 /// The function definitions which were renamed as part of typo-correction
3516 /// to match their respective declarations. We want to keep track of them
3517 /// to ensure that we don't emit a "redefinition" error if we encounter a
3518 /// correctly named definition after the renamed definition.
3520
3521 /// A cache of the flags available in enumerations with the flag_bits
3522 /// attribute.
3523 mutable llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3524
3525 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3526 /// declared. Rare. May alias another identifier, declared or undeclared.
3527 ///
3528 /// For aliases, the target identifier is used as a key for eventual
3529 /// processing when the target is declared. For the single-identifier form,
3530 /// the sole identifier is used as the key. Each entry is a `SetVector`
3531 /// (ordered by parse order) of aliases (identified by the alias name) in case
3532 /// of multiple aliases to the same undeclared identifier.
3533 llvm::MapVector<
3535 llvm::SetVector<
3537 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3539
3540 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3541 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3542 /// to define functions that occur in multiple standards to call the version
3543 /// in the currently selected standard.
3544 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *> ExtnameUndeclaredIdentifiers;
3545
3546 /// Set containing all typedefs that are likely unused.
3549
3553
3554 /// The set of file scoped decls seen so far that have not been used
3555 /// and must warn if not used. Only contains the first declaration.
3557
3561
3562 /// All the tentative definitions encountered in the TU.
3564
3565 /// All the external declarations encoutered and used in the TU.
3567
3568 /// Generally null except when we temporarily switch decl contexts,
3569 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3571
3572 /// Is the module scope we are in a C++ Header Unit?
3574 return ModuleScopes.empty() ? false
3575 : ModuleScopes.back().Module->isHeaderUnit();
3576 }
3577
3578 /// Get the module owning an entity.
3579 Module *getOwningModule(const Decl *Entity) {
3580 return Entity->getOwningModule();
3581 }
3582
3583 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3584
3586 /// Returns the TypeDeclType for the given type declaration,
3587 /// as ASTContext::getTypeDeclType would, but
3588 /// performs the required semantic checks for name lookup of said entity.
3589 void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD,
3590 SourceLocation NameLoc);
3591
3592 /// If the identifier refers to a type name within this scope,
3593 /// return the declaration of that type.
3594 ///
3595 /// This routine performs ordinary name lookup of the identifier II
3596 /// within the given scope, with optional C++ scope specifier SS, to
3597 /// determine whether the name refers to a type. If so, returns an
3598 /// opaque pointer (actually a QualType) corresponding to that
3599 /// type. Otherwise, returns NULL.
3601 Scope *S, CXXScopeSpec *SS = nullptr,
3602 bool isClassName = false, bool HasTrailingDot = false,
3603 ParsedType ObjectType = nullptr,
3604 bool IsCtorOrDtorName = false,
3605 bool WantNontrivialTypeSourceInfo = false,
3606 bool IsClassTemplateDeductionContext = true,
3607 ImplicitTypenameContext AllowImplicitTypename =
3609 IdentifierInfo **CorrectedII = nullptr);
3610
3611 /// isTagName() - This method is called *for error recovery purposes only*
3612 /// to determine if the specified name is a valid tag name ("struct foo"). If
3613 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3614 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3615 /// diagnose cases in C where the user forgot to specify the tag.
3617
3618 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3619 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3620 /// then downgrade the missing typename error to a warning.
3621 /// This is needed for MSVC compatibility; Example:
3622 /// @code
3623 /// template<class T> class A {
3624 /// public:
3625 /// typedef int TYPE;
3626 /// };
3627 /// template<class T> class B : public A<T> {
3628 /// public:
3629 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3630 /// };
3631 /// @endcode
3632 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3634 Scope *S, CXXScopeSpec *SS,
3635 ParsedType &SuggestedType,
3636 bool IsTemplateName = false);
3637
3638 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3639 /// type name has failed in a dependent context. In these situations, we
3640 /// automatically form a DependentTypeName that will retry lookup in a related
3641 /// scope during instantiation.
3643 SourceLocation NameLoc,
3644 bool IsTemplateTypeArg);
3645
3646 class NameClassification {
3648 union {
3653 };
3654
3655 explicit NameClassification(NameClassificationKind Kind) : Kind(Kind) {}
3656
3657 public:
3660
3663
3664 static NameClassification Error() {
3665 return NameClassification(NameClassificationKind::Error);
3666 }
3667
3668 static NameClassification Unknown() {
3669 return NameClassification(NameClassificationKind::Unknown);
3670 }
3671
3672 static NameClassification OverloadSet(ExprResult E) {
3673 NameClassification Result(NameClassificationKind::OverloadSet);
3674 Result.Expr = E;
3675 return Result;
3676 }
3677
3678 static NameClassification NonType(NamedDecl *D) {
3679 NameClassification Result(NameClassificationKind::NonType);
3680 Result.NonTypeDecl = D;
3681 return Result;
3682 }
3683
3684 static NameClassification UndeclaredNonType() {
3685 return NameClassification(NameClassificationKind::UndeclaredNonType);
3686 }
3687
3688 static NameClassification DependentNonType() {
3689 return NameClassification(NameClassificationKind::DependentNonType);
3690 }
3691
3692 static NameClassification TypeTemplate(TemplateName Name) {
3693 NameClassification Result(NameClassificationKind::TypeTemplate);
3694 Result.Template = Name;
3695 return Result;
3696 }
3697
3698 static NameClassification VarTemplate(TemplateName Name) {
3699 NameClassification Result(NameClassificationKind::VarTemplate);
3700 Result.Template = Name;
3701 return Result;
3702 }
3703
3704 static NameClassification FunctionTemplate(TemplateName Name) {
3706 Result.Template = Name;
3707 return Result;
3708 }
3709
3710 static NameClassification Concept(TemplateName Name) {
3711 NameClassification Result(NameClassificationKind::Concept);
3712 Result.Template = Name;
3713 return Result;
3714 }
3715
3716 static NameClassification UndeclaredTemplate(TemplateName Name) {
3718 Result.Template = Name;
3719 return Result;
3720 }
3721
3722 NameClassificationKind getKind() const { return Kind; }
3723
3726 return Expr;
3727 }
3728
3730 assert(Kind == NameClassificationKind::Type);
3731 return Type;
3732 }
3733
3735 assert(Kind == NameClassificationKind::NonType);
3736 return NonTypeDecl;
3737 }
3738
3747
3749 switch (Kind) {
3751 return TNK_Type_template;
3753 return TNK_Function_template;
3755 return TNK_Var_template;
3757 return TNK_Concept_template;
3760 default:
3761 llvm_unreachable("unsupported name classification.");
3762 }
3763 }
3764 };
3765
3766 /// Perform name lookup on the given name, classifying it based on
3767 /// the results of name lookup and the following token.
3768 ///
3769 /// This routine is used by the parser to resolve identifiers and help direct
3770 /// parsing. When the identifier cannot be found, this routine will attempt
3771 /// to correct the typo and classify based on the resulting name.
3772 ///
3773 /// \param S The scope in which we're performing name lookup.
3774 ///
3775 /// \param SS The nested-name-specifier that precedes the name.
3776 ///
3777 /// \param Name The identifier. If typo correction finds an alternative name,
3778 /// this pointer parameter will be updated accordingly.
3779 ///
3780 /// \param NameLoc The location of the identifier.
3781 ///
3782 /// \param NextToken The token following the identifier. Used to help
3783 /// disambiguate the name.
3784 ///
3785 /// \param CCC The correction callback, if typo correction is desired.
3786 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3787 IdentifierInfo *&Name, SourceLocation NameLoc,
3788 const Token &NextToken,
3789 CorrectionCandidateCallback *CCC = nullptr);
3790
3791 /// Act on the result of classifying a name as an undeclared (ADL-only)
3792 /// non-type declaration.
3794 SourceLocation NameLoc);
3795 /// Act on the result of classifying a name as an undeclared member of a
3796 /// dependent base class.
3798 IdentifierInfo *Name,
3799 SourceLocation NameLoc,
3800 bool IsAddressOfOperand);
3801 /// Act on the result of classifying a name as a specific non-type
3802 /// declaration.
3805 SourceLocation NameLoc,
3806 const Token &NextToken);
3807 /// Act on the result of classifying a name as an overload set.
3809
3810 /// Describes the detailed kind of a template name. Used in diagnostics.
3822
3823 /// Determine whether it's plausible that E was intended to be a
3824 /// template-name.
3826 if (!getLangOpts().CPlusPlus || E.isInvalid())
3827 return false;
3828 Dependent = false;
3829 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3830 return !DRE->hasExplicitTemplateArgs();
3831 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3832 return !ME->hasExplicitTemplateArgs();
3833 Dependent = true;
3834 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3835 return !DSDRE->hasExplicitTemplateArgs();
3836 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3837 return !DSME->hasExplicitTemplateArgs();
3838 // Any additional cases recognized here should also be handled by
3839 // diagnoseExprIntendedAsTemplateName.
3840 return false;
3841 }
3842
3843 void warnOnReservedIdentifier(const NamedDecl *D);
3845
3847
3849 MultiTemplateParamsArg TemplateParameterLists);
3850
3851 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3852 /// true if we were successful.
3854 SourceLocation Loc,
3855 unsigned FailedFoldDiagID);
3856
3857 /// Register the given locally-scoped extern "C" declaration so
3858 /// that it can be found later for redeclarations. We include any extern "C"
3859 /// declaration that is not visible in the translation unit here, not just
3860 /// function-scope declarations.
3862
3863 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3864 /// If T is the name of a class, then each of the following shall have a
3865 /// name different from T:
3866 /// - every static data member of class T;
3867 /// - every member function of class T
3868 /// - every member of class T that is itself a type;
3869 /// \returns true if the declaration name violates these rules.
3871
3872 /// Diagnose a declaration whose declarator-id has the given
3873 /// nested-name-specifier.
3874 ///
3875 /// \param SS The nested-name-specifier of the declarator-id.
3876 ///
3877 /// \param DC The declaration context to which the nested-name-specifier
3878 /// resolves.
3879 ///
3880 /// \param Name The name of the entity being declared.
3881 ///
3882 /// \param Loc The location of the name of the entity being declared.
3883 ///
3884 /// \param IsMemberSpecialization Whether we are declaring a member
3885 /// specialization.
3886 ///
3887 /// \param TemplateId The template-id, if any.
3888 ///
3889 /// \returns true if we cannot safely recover from this error, false
3890 /// otherwise.
3893 TemplateIdAnnotation *TemplateId,
3894 bool IsMemberSpecialization);
3895
3897
3898 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3899
3901 unsigned &IntVal);
3902
3903 /// Diagnose function specifiers on a declaration of an identifier that
3904 /// does not identify a function.
3905 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3906
3907 /// Return the declaration shadowed by the given typedef \p D, or null
3908 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3910 const LookupResult &R);
3911
3912 /// Return the declaration shadowed by the given variable \p D, or null
3913 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3915
3916 /// Return the declaration shadowed by the given variable \p D, or null
3917 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3919 const LookupResult &R);
3920 /// Diagnose variable or built-in function shadowing. Implements
3921 /// -Wshadow.
3922 ///
3923 /// This method is called whenever a VarDecl is added to a "useful"
3924 /// scope.
3925 ///
3926 /// \param ShadowedDecl the declaration that is shadowed by the given variable
3927 /// \param R the lookup of the name
3928 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
3929 const LookupResult &R);
3930
3931 /// Check -Wshadow without the advantage of a previous lookup.
3932 void CheckShadow(Scope *S, VarDecl *D);
3933
3934 /// Warn if 'E', which is an expression that is about to be modified, refers
3935 /// to a shadowing declaration.
3937
3938 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
3939 /// when these variables are captured by the lambda.
3941
3942 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
3943 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
3944 TypedefNameDecl *NewTD);
3947 TypeSourceInfo *TInfo,
3949
3950 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
3951 /// declares a typedef-name, either using the 'typedef' type specifier or via
3952 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
3956 TypeSourceInfo *TInfo,
3958 MultiTemplateParamsArg TemplateParamLists,
3959 bool &AddToScope,
3961
3962private:
3963 // Perform a check on an AsmLabel to verify its consistency and emit
3964 // diagnostics in case of an error.
3965 void CheckAsmLabel(Scope *S, Expr *AsmLabelExpr, StorageClass SC,
3966 TypeSourceInfo *TInfo, VarDecl *);
3967
3968public:
3969 /// Perform semantic checking on a newly-created variable
3970 /// declaration.
3971 ///
3972 /// This routine performs all of the type-checking required for a
3973 /// variable declaration once it has been built. It is used both to
3974 /// check variables after they have been parsed and their declarators
3975 /// have been translated into a declaration, and to check variables
3976 /// that have been instantiated from a template.
3977 ///
3978 /// Sets NewVD->isInvalidDecl() if an error was encountered.
3979 ///
3980 /// Returns true if the variable declaration is a redeclaration.
3981 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
3982 void CheckVariableDeclarationType(VarDecl *NewVD);
3983 void CheckCompleteVariableDeclaration(VarDecl *VD);
3984
3985 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
3986 TypeSourceInfo *TInfo,
3987 LookupResult &Previous,
3988 MultiTemplateParamsArg TemplateParamLists,
3989 bool &AddToScope);
3990
3991 /// AddOverriddenMethods - See if a method overrides any in the base classes,
3992 /// and if so, check that it's a valid override and remember it.
3993 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
3994
3995 /// Perform semantic checking of a new function declaration.
3996 ///
3997 /// Performs semantic analysis of the new function declaration
3998 /// NewFD. This routine performs all semantic checking that does not
3999 /// require the actual declarator involved in the declaration, and is
4000 /// used both for the declaration of functions as they are parsed
4001 /// (called via ActOnDeclarator) and for the declaration of functions
4002 /// that have been instantiated via C++ template instantiation (called
4003 /// via InstantiateDecl).
4004 ///
4005 /// \param IsMemberSpecialization whether this new function declaration is
4006 /// a member specialization (that replaces any definition provided by the
4007 /// previous declaration).
4008 ///
4009 /// This sets NewFD->isInvalidDecl() to true if there was an error.
4010 ///
4011 /// \returns true if the function declaration is a redeclaration.
4012 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
4013 LookupResult &Previous,
4014 bool IsMemberSpecialization, bool DeclIsDefn);
4015
4016 /// Checks if the new declaration declared in dependent context must be
4017 /// put in the same redeclaration chain as the specified declaration.
4018 ///
4019 /// \param D Declaration that is checked.
4020 /// \param PrevDecl Previous declaration found with proper lookup method for
4021 /// the same declaration name.
4022 /// \returns True if D must be added to the redeclaration chain which PrevDecl
4023 /// belongs to.
4024 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
4025
4026 /// Determines if we can perform a correct type check for \p D as a
4027 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
4028 /// best-effort check.
4029 ///
4030 /// \param NewD The new declaration.
4031 /// \param OldD The old declaration.
4032 /// \param NewT The portion of the type of the new declaration to check.
4033 /// \param OldT The portion of the type of the old declaration to check.
4034 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
4035 QualType NewT, QualType OldT);
4036 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
4037 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
4038
4039 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
4040 /// containing class. Otherwise it will return implicit SectionAttr if the
4041 /// function is a definition and there is an active value on CodeSegStack
4042 /// (from the current #pragma code-seg value).
4043 ///
4044 /// \param FD Function being declared.
4045 /// \param IsDefinition Whether it is a definition or just a declaration.
4046 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
4047 /// nullptr if no attribute should be added.
4048 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
4049 bool IsDefinition);
4050
4051 /// Common checks for a parameter-declaration that should apply to both
4052 /// function parameters and non-type template parameters.
4053 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
4054
4055 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
4056 /// to introduce parameters into function prototype scope.
4057 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
4058 SourceLocation ExplicitThisLoc = {});
4059
4060 /// Synthesizes a variable for a parameter arising from a
4061 /// typedef.
4062 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
4063 QualType T);
4064 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
4065 SourceLocation NameLoc,
4066 const IdentifierInfo *Name, QualType T,
4067 TypeSourceInfo *TSInfo, StorageClass SC);
4068
4069 /// Emit diagnostics if the initializer or any of its explicit or
4070 /// implicitly-generated subexpressions require copying or
4071 /// default-initializing a type that is or contains a C union type that is
4072 /// non-trivial to copy or default-initialize.
4073 void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
4074
4075 // These flags are passed to checkNonTrivialCUnion.
4081
4082 /// Emit diagnostics if a non-trivial C union type or a struct that contains
4083 /// a non-trivial C union is used in an invalid context.
4085 NonTrivialCUnionContext UseContext,
4086 unsigned NonTrivialKind);
4087
4088 /// Certain globally-unique variables might be accidentally duplicated if
4089 /// built into multiple shared libraries with hidden visibility. This can
4090 /// cause problems if the variable is mutable, its initialization is
4091 /// effectful, or its address is taken.
4094
4095 /// AddInitializerToDecl - Adds the initializer Init to the
4096 /// declaration dcl. If DirectInit is true, this is C++ direct
4097 /// initialization rather than copy initialization.
4098 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
4099 void ActOnUninitializedDecl(Decl *dcl);
4100
4101 /// ActOnInitializerError - Given that there was an error parsing an
4102 /// initializer for the given declaration, try to at least re-establish
4103 /// invariants such as whether a variable's type is either dependent or
4104 /// complete.
4105 void ActOnInitializerError(Decl *Dcl);
4106
4107 void ActOnCXXForRangeDecl(Decl *D);
4109 IdentifierInfo *Ident,
4110 ParsedAttributes &Attrs);
4111
4112 /// Check if VD needs to be dllexport/dllimport due to being in a
4113 /// dllexport/import function.
4116
4117 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
4118 /// any semantic actions necessary after any initializer has been attached.
4119 void FinalizeDeclaration(Decl *D);
4121 ArrayRef<Decl *> Group);
4122
4123 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
4124 /// group, performing any necessary semantic checking.
4126
4127 /// Should be called on all declarations that might have attached
4128 /// documentation comments.
4129 void ActOnDocumentableDecl(Decl *D);
4131
4132 enum class FnBodyKind {
4133 /// C++26 [dcl.fct.def.general]p1
4134 /// function-body:
4135 /// ctor-initializer[opt] compound-statement
4136 /// function-try-block
4138 /// = default ;
4140 /// deleted-function-body
4141 ///
4142 /// deleted-function-body:
4143 /// = delete ;
4144 /// = delete ( unevaluated-string ) ;
4146 };
4147
4149 SourceLocation LocAfterDecls);
4151 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
4152 SkipBodyInfo *SkipBody = nullptr);
4154 MultiTemplateParamsArg TemplateParamLists,
4155 SkipBodyInfo *SkipBody = nullptr,
4156 FnBodyKind BodyKind = FnBodyKind::Other);
4158 SkipBodyInfo *SkipBody = nullptr,
4159 FnBodyKind BodyKind = FnBodyKind::Other);
4161
4162 /// Determine whether we can delay parsing the body of a function or
4163 /// function template until it is used, assuming we don't care about emitting
4164 /// code for that function.
4165 ///
4166 /// This will be \c false if we may need the body of the function in the
4167 /// middle of parsing an expression (where it's impractical to switch to
4168 /// parsing a different function), for instance, if it's constexpr in C++11
4169 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
4170 bool canDelayFunctionBody(const Declarator &D);
4171
4172 /// Determine whether we can skip parsing the body of a function
4173 /// definition, assuming we don't care about analyzing its body or emitting
4174 /// code for that function.
4175 ///
4176 /// This will be \c false only if we may need the body of the function in
4177 /// order to parse the rest of the program (for instance, if it is
4178 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
4179 bool canSkipFunctionBody(Decl *D);
4180
4181 /// Given the set of return statements within a function body,
4182 /// compute the variables that are subject to the named return value
4183 /// optimization.
4184 ///
4185 /// Each of the variables that is subject to the named return value
4186 /// optimization will be marked as NRVO variables in the AST, and any
4187 /// return statement that has a marked NRVO variable as its NRVO candidate can
4188 /// use the named return value optimization.
4189 ///
4190 /// This function applies a very simplistic algorithm for NRVO: if every
4191 /// return statement in the scope of a variable has the same NRVO candidate,
4192 /// that candidate is an NRVO variable.
4194
4195 /// Performs semantic analysis at the end of a function body.
4196 ///
4197 /// \param RetainFunctionScopeInfo If \c true, the client is responsible for
4198 /// releasing the associated \p FunctionScopeInfo. This is useful when
4199 /// building e.g. LambdaExprs.
4201 bool IsInstantiation = false,
4202 bool RetainFunctionScopeInfo = false);
4205
4206 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
4207 /// attribute for which parsing is delayed.
4209
4210 /// Diagnose any unused parameters in the given sequence of
4211 /// ParmVarDecl pointers.
4213
4214 /// Diagnose whether the size of parameters or return value of a
4215 /// function or obj-c method definition is pass-by-value and larger than a
4216 /// specified threshold.
4217 void
4219 QualType ReturnTy, NamedDecl *D);
4220
4222 SourceLocation RParenLoc);
4223
4226
4227 void ActOnPopScope(SourceLocation Loc, Scope *S);
4228
4229 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4230 /// no declarator (e.g. "struct foo;") is parsed.
4232 const ParsedAttributesView &DeclAttrs,
4233 RecordDecl *&AnonRecord);
4234
4235 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4236 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
4237 /// parameters to cope with template friend declarations.
4239 const ParsedAttributesView &DeclAttrs,
4240 MultiTemplateParamsArg TemplateParams,
4241 bool IsExplicitInstantiation,
4242 RecordDecl *&AnonRecord,
4243 SourceLocation EllipsisLoc = {});
4244
4245 /// BuildAnonymousStructOrUnion - Handle the declaration of an
4246 /// anonymous structure or union. Anonymous unions are a C++ feature
4247 /// (C++ [class.union]) and a C11 feature; anonymous structures
4248 /// are a C11 feature and GNU C++ extension.
4249 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
4250 RecordDecl *Record,
4251 const PrintingPolicy &Policy);
4252
4253 /// Called once it is known whether
4254 /// a tag declaration is an anonymous union or struct.
4256
4257 /// Emit diagnostic warnings for placeholder members.
4258 /// We can only do that after the class is fully constructed,
4259 /// as anonymous union/structs can insert placeholders
4260 /// in their parent scope (which might be a Record).
4262
4263 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
4264 /// Microsoft C anonymous structure.
4265 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
4266 /// Example:
4267 ///
4268 /// struct A { int a; };
4269 /// struct B { struct A; int b; };
4270 ///
4271 /// void foo() {
4272 /// B var;
4273 /// var.a = 3;
4274 /// }
4275 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
4276 RecordDecl *Record);
4277
4278 /// Given a non-tag type declaration, returns an enum useful for indicating
4279 /// what kind of non-tag type this is.
4280 NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK);
4281
4282 /// Determine whether a tag with a given kind is acceptable
4283 /// as a redeclaration of the given tag declaration.
4284 ///
4285 /// \returns true if the new tag kind is acceptable, false otherwise.
4287 bool isDefinition, SourceLocation NewTagLoc,
4288 const IdentifierInfo *Name);
4289
4290 /// This is invoked when we see 'struct foo' or 'struct {'. In the
4291 /// former case, Name will be non-null. In the later case, Name will be null.
4292 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
4293 /// a reference/declaration/definition of a tag.
4294 ///
4295 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
4296 /// trailing-type-specifier) other than one in an alias-declaration.
4297 ///
4298 /// \param SkipBody If non-null, will be set to indicate if the caller should
4299 /// skip the definition of this tag and treat it as if it were a declaration.
4300 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
4301 SourceLocation KWLoc, CXXScopeSpec &SS,
4302 IdentifierInfo *Name, SourceLocation NameLoc,
4303 const ParsedAttributesView &Attr, AccessSpecifier AS,
4304 SourceLocation ModulePrivateLoc,
4305 MultiTemplateParamsArg TemplateParameterLists,
4306 bool &OwnedDecl, bool &IsDependent,
4307 SourceLocation ScopedEnumKWLoc,
4308 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
4309 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
4310 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
4311
4312 /// ActOnField - Each field of a C struct/union is passed into this in order
4313 /// to create a FieldDecl object for it.
4314 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
4315 Declarator &D, Expr *BitfieldWidth);
4316
4317 /// HandleField - Analyze a field of a C struct or a C++ data member.
4318 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
4319 Declarator &D, Expr *BitfieldWidth,
4320 InClassInitStyle InitStyle, AccessSpecifier AS);
4321
4322 /// Build a new FieldDecl and check its well-formedness.
4323 ///
4324 /// This routine builds a new FieldDecl given the fields name, type,
4325 /// record, etc. \p PrevDecl should refer to any previous declaration
4326 /// with the same name and in the same scope as the field to be
4327 /// created.
4328 ///
4329 /// \returns a new FieldDecl.
4330 ///
4331 /// \todo The Declarator argument is a hack. It will be removed once
4332 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
4333 TypeSourceInfo *TInfo, RecordDecl *Record,
4334 SourceLocation Loc, bool Mutable,
4335 Expr *BitfieldWidth, InClassInitStyle InitStyle,
4336 SourceLocation TSSL, AccessSpecifier AS,
4337 NamedDecl *PrevDecl, Declarator *D = nullptr);
4338
4340
4341 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
4342 /// class and class extensions. For every class \@interface and class
4343 /// extension \@interface, if the last ivar is a bitfield of any type,
4344 /// then add an implicit `char :0` ivar to the end of that interface.
4345 void ActOnLastBitfield(SourceLocation DeclStart,
4346 SmallVectorImpl<Decl *> &AllIvarDecls);
4347
4348 // This is used for both record definitions and ObjC interface declarations.
4349 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
4350 ArrayRef<Decl *> Fields, SourceLocation LBrac,
4351 SourceLocation RBrac, const ParsedAttributesView &AttrList);
4352
4353 /// ActOnTagStartDefinition - Invoked when we have entered the
4354 /// scope of a tag's definition (e.g., for an enumeration, class,
4355 /// struct, or union).
4356 void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
4357
4358 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
4359 /// Differently from C++, actually parse the body and reject / error out
4360 /// in case of a structural mismatch.
4361 bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody);
4362
4364
4365 /// Invoked when we enter a tag definition that we're skipping.
4367
4368 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
4369 /// C++ record definition's base-specifiers clause and are starting its
4370 /// member declarations.
4372 SourceLocation FinalLoc,
4373 bool IsFinalSpelledSealed,
4374 bool IsAbstract,
4375 SourceLocation TriviallyRelocatable,
4376 SourceLocation LBraceLoc);
4377
4378 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
4379 /// the definition of a tag (enumeration, class, struct, or union).
4381 SourceRange BraceRange);
4382
4385
4387
4388 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
4389 /// error parsing the definition of a tag.
4391
4393 EnumConstantDecl *LastEnumConst,
4394 SourceLocation IdLoc, IdentifierInfo *Id,
4395 Expr *val);
4396
4397 /// Check that this is a valid underlying type for an enum declaration.
4399
4400 /// Check whether this is a valid redeclaration of a previous enumeration.
4401 /// \return true if the redeclaration was invalid.
4402 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
4403 QualType EnumUnderlyingTy, bool IsFixed,
4404 const EnumDecl *Prev);
4405
4406 /// Determine whether the body of an anonymous enumeration should be skipped.
4407 /// \param II The name of the first enumerator.
4409 SourceLocation IILoc);
4410
4411 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
4412 SourceLocation IdLoc, IdentifierInfo *Id,
4413 const ParsedAttributesView &Attrs,
4414 SourceLocation EqualLoc, Expr *Val,
4415 SkipBodyInfo *SkipBody = nullptr);
4416 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
4417 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
4418 const ParsedAttributesView &Attr);
4419
4420 /// Set the current declaration context until it gets popped.
4421 void PushDeclContext(Scope *S, DeclContext *DC);
4422 void PopDeclContext();
4423
4424 /// EnterDeclaratorContext - Used when we must lookup names in the context
4425 /// of a declarator's nested name specifier.
4428
4429 /// Enter a template parameter scope, after it's been associated with a
4430 /// particular DeclContext. Causes lookup within the scope to chain through
4431 /// enclosing contexts in the correct order.
4433
4434 /// Push the parameters of D, which must be a function, into scope.
4437
4438 /// Add this decl to the scope shadowed decl chains.
4439 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4440
4441 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4442 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4443 /// true if 'D' belongs to the given declaration context.
4444 ///
4445 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4446 /// enclosing namespace set of the context, rather than contained
4447 /// directly within it.
4448 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4449 bool AllowInlineNamespace = false) const;
4450
4451 /// Finds the scope corresponding to the given decl context, if it
4452 /// happens to be an enclosing scope. Otherwise return NULL.
4454
4455 /// Subroutines of ActOnDeclarator().
4457 TypeSourceInfo *TInfo);
4459
4460 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4462 NamedDecl *New, Decl *Old,
4464
4465 /// CheckAttributesOnDeducedType - Calls Sema functions for attributes that
4466 /// requires the type to be deduced.
4468
4469 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4470 /// same name and scope as a previous declaration 'Old'. Figure out
4471 /// how to resolve this situation, merging decls or emitting
4472 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4474 LookupResult &OldDecls);
4475
4476 /// CleanupMergedEnum - We have just merged the decl 'New' by making another
4477 /// definition visible.
4478 /// This method performs any necessary cleanup on the parser state to discard
4479 /// child nodes from newly parsed decl we are retiring.
4480 void CleanupMergedEnum(Scope *S, Decl *New);
4481
4482 /// MergeFunctionDecl - We just parsed a function 'New' from
4483 /// declarator D which has the same name and scope as a previous
4484 /// declaration 'Old'. Figure out how to resolve this situation,
4485 /// merging decls or emitting diagnostics as appropriate.
4486 ///
4487 /// In C++, New and Old must be declarations that are not
4488 /// overloaded. Use IsOverload to determine whether New and Old are
4489 /// overloaded, and to select the Old declaration that New should be
4490 /// merged with.
4491 ///
4492 /// Returns true if there was an error, false otherwise.
4494 bool MergeTypeWithOld, bool NewDeclIsDefn);
4495
4496 /// Completes the merge of two function declarations that are
4497 /// known to be compatible.
4498 ///
4499 /// This routine handles the merging of attributes and other
4500 /// properties of function declarations from the old declaration to
4501 /// the new declaration, once we know that New is in fact a
4502 /// redeclaration of Old.
4503 ///
4504 /// \returns false
4506 Scope *S, bool MergeTypeWithOld);
4508
4509 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4510 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4511 /// situation, merging decls or emitting diagnostics as appropriate.
4512 ///
4513 /// Tentative definition rules (C99 6.9.2p2) are checked by
4514 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4515 /// definitions here, since the initializer hasn't been attached.
4517
4518 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4519 /// scope as a previous declaration 'Old'. Figure out how to merge their
4520 /// types, emitting diagnostics as appropriate.
4521 ///
4522 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4523 /// back to here in AddInitializerToDecl. We can't check them before the
4524 /// initializer is attached.
4525 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4526
4527 /// We've just determined that \p Old and \p New both appear to be definitions
4528 /// of the same variable. Either diagnose or fix the problem.
4529 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4531
4532 /// Filters out lookup results that don't fall within the given scope
4533 /// as determined by isDeclInScope.
4535 bool ConsiderLinkage, bool AllowInlineNamespace);
4536
4537 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4538 /// have compatible owning modules.
4540
4541 /// [module.interface]p6:
4542 /// A redeclaration of an entity X is implicitly exported if X was introduced
4543 /// by an exported declaration; otherwise it shall not be exported.
4545
4546 /// A wrapper function for checking the semantic restrictions of
4547 /// a redeclaration within a module.
4549
4550 /// Check the redefinition in C++20 Modules.
4551 ///
4552 /// [basic.def.odr]p14:
4553 /// For any definable item D with definitions in multiple translation units,
4554 /// - if D is a non-inline non-templated function or variable, or
4555 /// - if the definitions in different translation units do not satisfy the
4556 /// following requirements,
4557 /// the program is ill-formed; a diagnostic is required only if the
4558 /// definable item is attached to a named module and a prior definition is
4559 /// reachable at the point where a later definition occurs.
4560 /// - Each such definition shall not be attached to a named module
4561 /// ([module.unit]).
4562 /// - Each such definition shall consist of the same sequence of tokens, ...
4563 /// ...
4564 ///
4565 /// Return true if the redefinition is not allowed. Return false otherwise.
4566 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4567
4569
4570 /// If it's a file scoped decl that must warn if not used, keep track
4571 /// of it.
4573
4574 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4576
4579 DiagReceiverTy DiagReceiver);
4580 void DiagnoseUnusedDecl(const NamedDecl *ND);
4581
4582 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4583 /// unless they are marked attr(unused).
4584 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4585
4586 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4587 /// variable.
4588 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4589
4590 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4591 /// from S, where a non-field would be declared. This routine copes
4592 /// with the difference between C and C++ scoping rules in structs and
4593 /// unions. For example, the following code is well-formed in C but
4594 /// ill-formed in C++:
4595 /// @code
4596 /// struct S6 {
4597 /// enum { BAR } e;
4598 /// };
4599 ///
4600 /// void test_S6() {
4601 /// struct S6 a;
4602 /// a.e = BAR;
4603 /// }
4604 /// @endcode
4605 /// For the declaration of BAR, this routine will return a different
4606 /// scope. The scope S will be the scope of the unnamed enumeration
4607 /// within S6. In C++, this routine will return the scope associated
4608 /// with S6, because the enumeration's scope is a transparent
4609 /// context but structures can contain non-field names. In C, this
4610 /// routine will return the translation unit scope, since the
4611 /// enumeration's scope is a transparent context and structures cannot
4612 /// contain non-field names.
4614
4616 SourceLocation Loc);
4617
4618 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4619 /// file scope. lazily create a decl for it. ForRedeclaration is true
4620 /// if we're creating this built-in in anticipation of redeclaring the
4621 /// built-in.
4622 NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S,
4623 bool ForRedeclaration, SourceLocation Loc);
4624
4625 /// Get the outermost AttributedType node that sets a calling convention.
4626 /// Valid types should not have multiple attributes with different CCs.
4627 const AttributedType *getCallingConvAttributedType(QualType T) const;
4628
4629 /// GetNameForDeclarator - Determine the full declaration name for the
4630 /// given Declarator.
4632
4633 /// Retrieves the declaration name from a parsed unqualified-id.
4635
4636 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4637 /// we are currently parsing the initializer.
4639
4640 /// Look for a locally scoped extern "C" declaration by the given name.
4642
4645
4646 /// Adjust the \c DeclContext for a function or variable that might be a
4647 /// function-local external declaration.
4649
4651
4652 /// Checks if the variant/multiversion functions are compatible.
4654 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4655 const PartialDiagnostic &NoProtoDiagID,
4656 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4657 const PartialDiagnosticAt &NoSupportDiagIDAt,
4658 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4659 bool ConstexprSupported, bool CLinkageMayDiffer);
4660
4661 /// type checking declaration initializers (C99 6.7.8)
4663 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4664
4667 SourceRange Range, bool DirectInit,
4668 Expr *Init);
4669
4671 Expr *Init);
4672
4674
4675 // Heuristically tells if the function is `get_return_object` member of a
4676 // coroutine promise_type by matching the function name.
4677 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4678 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4679
4680 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4681 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4683 Scope *S);
4684
4685 /// If this function is a C++ replaceable global allocation function
4686 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4687 /// adds any function attributes that we know a priori based on the standard.
4688 ///
4689 /// We need to check for duplicate attributes both here and where user-written
4690 /// attributes are applied to declarations.
4692 FunctionDecl *FD);
4693
4694 /// Adds any function attributes that we know a priori based on
4695 /// the declaration of this function.
4696 ///
4697 /// These attributes can apply both to implicitly-declared builtins
4698 /// (like __builtin___printf_chk) or to library-declared functions
4699 /// like NSLog or printf.
4700 ///
4701 /// We need to check for duplicate attributes both here and where user-written
4702 /// attributes are applied to declarations.
4704
4705 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4706 /// the correct width, and that the field type is valid.
4707 /// Returns false on success.
4709 const IdentifierInfo *FieldName, QualType FieldTy,
4710 bool IsMsStruct, Expr *BitWidth);
4711
4712 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4713 /// enum. If AllowMask is true, then we also allow the complement of a valid
4714 /// value, to be used as a mask.
4715 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4716 bool AllowMask) const;
4717
4718 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4719 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4720 SourceLocation WeakNameLoc);
4721
4722 /// ActOnPragmaRedefineExtname - Called on well formed
4723 /// \#pragma redefine_extname oldname newname.
4725 IdentifierInfo *AliasName,
4726 SourceLocation PragmaLoc,
4727 SourceLocation WeakNameLoc,
4728 SourceLocation AliasNameLoc);
4729
4730 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4731 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4732 SourceLocation PragmaLoc,
4733 SourceLocation WeakNameLoc,
4734 SourceLocation AliasNameLoc);
4735
4736 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4739 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4740 OMPDiscarded, // Discarded due to OpenMP hostness
4741 TemplateDiscarded, // Discarded due to uninstantiated templates
4743 };
4744 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4745 bool Final = false);
4746
4747 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4749
4750 /// Function or variable declarations to be checked for whether the deferred
4751 /// diagnostics should be emitted.
4753
4754private:
4755 /// Map of current shadowing declarations to shadowed declarations. Warn if
4756 /// it looks like the user is trying to modify the shadowing declaration.
4757 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4758
4759 // We need this to handle
4760 //
4761 // typedef struct {
4762 // void *foo() { return 0; }
4763 // } A;
4764 //
4765 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4766 // for example. If 'A', foo will have external linkage. If we have '*A',
4767 // foo will have no linkage. Since we can't know until we get to the end
4768 // of the typedef, this function finds out if D might have non-external
4769 // linkage. Callers should verify at the end of the TU if it D has external
4770 // linkage or not.
4771 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4772
4773#include "clang/Sema/AttrIsTypeDependent.inc"
4774
4775 ///@}
4776
4777 //
4778 //
4779 // -------------------------------------------------------------------------
4780 //
4781 //
4782
4783 /// \name Declaration Attribute Handling
4784 /// Implementations are in SemaDeclAttr.cpp
4785 ///@{
4786
4787public:
4788 /// Describes the kind of priority given to an availability attribute.
4789 ///
4790 /// The sum of priorities deteremines the final priority of the attribute.
4791 /// The final priority determines how the attribute will be merged.
4792 /// An attribute with a lower priority will always remove higher priority
4793 /// attributes for the specified platform when it is being applied. An
4794 /// attribute with a higher priority will not be applied if the declaration
4795 /// already has an availability attribute with a lower priority for the
4796 /// specified platform. The final prirority values are not expected to match
4797 /// the values in this enumeration, but instead should be treated as a plain
4798 /// integer value. This enumeration just names the priority weights that are
4799 /// used to calculate that final vaue.
4801 /// The availability attribute was specified explicitly next to the
4802 /// declaration.
4804
4805 /// The availability attribute was applied using '#pragma clang attribute'.
4807
4808 /// The availability attribute for a specific platform was inferred from
4809 /// an availability attribute for another platform.
4811 };
4812
4813 /// Describes the reason a calling convention specification was ignored, used
4814 /// for diagnostics.
4821
4822 /// A helper function to provide Attribute Location for the Attr types
4823 /// AND the ParsedAttr.
4824 template <typename AttrInfo>
4825 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4826 getAttrLoc(const AttrInfo &AL) {
4827 return AL.getLocation();
4828 }
4830
4831 /// If Expr is a valid integer constant, get the value of the integer
4832 /// expression and return success or failure. May output an error.
4833 ///
4834 /// Negative argument is implicitly converted to unsigned, unless
4835 /// \p StrictlyUnsigned is true.
4836 template <typename AttrInfo>
4837 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4838 unsigned Idx = UINT_MAX,
4839 bool StrictlyUnsigned = false) {
4840 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4841 if (Expr->isTypeDependent() ||
4843 if (Idx != UINT_MAX)
4844 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4845 << &AI << Idx << AANT_ArgumentIntegerConstant
4846 << Expr->getSourceRange();
4847 else
4848 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4850 return false;
4851 }
4852
4853 if (!I->isIntN(32)) {
4854 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4855 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4856 return false;
4857 }
4858
4859 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4860 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4861 << &AI << /*non-negative*/ 1;
4862 return false;
4863 }
4864
4865 Val = (uint32_t)I->getZExtValue();
4866 return true;
4867 }
4868
4869 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4870 /// \#pragma weak during processing of other Decls.
4871 /// I couldn't figure out a clean way to generate these in-line, so
4872 /// we store them here and handle separately -- which is a hack.
4873 /// It would be best to refactor this.
4875
4876 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4878
4882
4883 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4884 /// us to associate a raw vector type with one of the ext_vector type names.
4885 /// This is only necessary for issuing pretty diagnostics.
4887
4888 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4889 /// and return false, otherwise set \p Str to the value of the string literal
4890 /// and return true.
4892 const Expr *E, StringRef &Str,
4893 SourceLocation *ArgLocation = nullptr);
4894
4895 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4896 /// If not emit an error and return false. If the argument is an identifier it
4897 /// will emit an error with a fixit hint and treat it as if it was a string
4898 /// literal.
4899 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4900 StringRef &Str,
4901 SourceLocation *ArgLocation = nullptr);
4902
4903 /// Determine if type T is a valid subject for a nonnull and similar
4904 /// attributes. Dependent types are considered valid so they can be checked
4905 /// during instantiation time. By default, we look through references (the
4906 /// behavior used by nonnull), but if the second parameter is true, then we
4907 /// treat a reference type as valid.
4908 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
4909
4910 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
4911 /// declaration.
4912 void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4913 Expr *OE);
4914
4915 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
4916 /// declaration.
4917 void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI,
4918 Expr *ParamExpr);
4919
4920 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
4921 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
4922
4923 AvailabilityAttr *
4925 const IdentifierInfo *Platform, bool Implicit,
4926 VersionTuple Introduced, VersionTuple Deprecated,
4927 VersionTuple Obsoleted, bool IsUnavailable,
4928 StringRef Message, bool IsStrict, StringRef Replacement,
4929 AvailabilityMergeKind AMK, int Priority,
4930 const IdentifierInfo *IIEnvironment);
4931
4932 TypeVisibilityAttr *
4934 TypeVisibilityAttr::VisibilityType Vis);
4935 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
4936 VisibilityAttr::VisibilityType Vis);
4937 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
4938 StringRef Name);
4939
4940 /// Used to implement to perform semantic checking on
4941 /// attribute((section("foo"))) specifiers.
4942 ///
4943 /// In this case, "foo" is passed in to be checked. If the section
4944 /// specifier is invalid, return an Error that indicates the problem.
4945 ///
4946 /// This is a simple quality of implementation feature to catch errors
4947 /// and give good diagnostics in cases when the assembler or code generator
4948 /// would otherwise reject the section specifier.
4949 llvm::Error isValidSectionSpecifier(StringRef Str);
4950 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
4951 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
4952 StringRef Name);
4953
4954 // Check for things we'd like to warn about. Multiversioning issues are
4955 // handled later in the process, once we know how many exist.
4956 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
4957
4958 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
4959 StringRef NewUserDiagnostic);
4960 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
4961 const IdentifierInfo *Format, int FormatIdx,
4962 int FirstArg);
4963 FormatMatchesAttr *mergeFormatMatchesAttr(Decl *D,
4964 const AttributeCommonInfo &CI,
4965 const IdentifierInfo *Format,
4966 int FormatIdx,
4967 StringLiteral *FormatStr);
4968 ModularFormatAttr *mergeModularFormatAttr(Decl *D,
4969 const AttributeCommonInfo &CI,
4970 const IdentifierInfo *ModularImplFn,
4971 StringRef ImplName,
4973
4974 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
4975 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4976 bool IsPackExpansion);
4978 bool IsPackExpansion);
4979
4980 /// AddAlignValueAttr - Adds an align_value attribute to a particular
4981 /// declaration.
4982 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
4983
4984 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
4985 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
4988
4990 bool BestCase,
4991 MSInheritanceModel SemanticSpelling);
4992
4994
4995 /// AddModeAttr - Adds a mode attribute to a particular declaration.
4996 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI,
4997 const IdentifierInfo *Name, bool InInstantiation = false);
4998 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
4999 const AttributeCommonInfo &CI,
5000 const IdentifierInfo *Ident);
5001 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
5002 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
5003 const AttributeCommonInfo &CI);
5004 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
5005 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
5006 const InternalLinkageAttr &AL);
5007
5008 /// Check validaty of calling convention attribute \p attr. If \p FD
5009 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
5010 /// target. Otherwise, it is specified by \p CFT.
5012 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
5014
5015 /// Checks a regparm attribute, returning true if it is ill-formed and
5016 /// otherwise setting numParams to the appropriate value.
5017 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
5018
5019 /// Create an CUDALaunchBoundsAttr attribute.
5020 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
5021 Expr *MaxThreads,
5022 Expr *MinBlocks,
5023 Expr *MaxBlocks);
5024
5025 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
5026 /// declaration.
5027 void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI,
5028 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
5029
5030 /// Add a cluster_dims attribute to a particular declaration.
5031 CUDAClusterDimsAttr *createClusterDimsAttr(const AttributeCommonInfo &CI,
5032 Expr *X, Expr *Y, Expr *Z);
5033 void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X,
5034 Expr *Y, Expr *Z);
5035 /// Add a no_cluster attribute to a particular declaration.
5036 void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI);
5037
5038 enum class RetainOwnershipKind { NS, CF, OS };
5039
5040 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
5041 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
5042
5043 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
5044
5045 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
5046 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
5047 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
5048 const AttributeCommonInfo &CI,
5049 bool BestCase,
5050 MSInheritanceModel Model);
5051
5052 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
5053 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
5054 const EnforceTCBLeafAttr &AL);
5055
5056 /// Helper for delayed processing TransparentUnion or
5057 /// BPFPreserveAccessIndexAttr attribute.
5059 const ParsedAttributesView &AttrList);
5060
5061 // Options for ProcessDeclAttributeList().
5065
5068 Result.IncludeCXX11Attributes = Val;
5069 return Result;
5070 }
5071
5074 Result.IgnoreTypeAttributes = Val;
5075 return Result;
5076 }
5077
5078 // Should C++11 attributes be processed?
5080
5081 // Should any type attributes encountered be ignored?
5082 // If this option is false, a diagnostic will be emitted for any type
5083 // attributes of a kind that does not "slide" from the declaration to
5084 // the decl-specifier-seq.
5086 };
5087
5088 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
5089 /// attribute list to the specified decl, ignoring any type attributes.
5091 const ParsedAttributesView &AttrList,
5092 const ProcessDeclAttributeOptions &Options =
5094
5095 /// Annotation attributes are the only attributes allowed after an access
5096 /// specifier.
5098 const ParsedAttributesView &AttrList);
5099
5100 /// checkUnusedDeclAttributes - Given a declarator which is not being
5101 /// used to build a declaration, complain about any decl attributes
5102 /// which might be lying around on it.
5104
5105 void DiagnoseUnknownAttribute(const ParsedAttr &AL);
5106
5107 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
5108 /// \#pragma weak needs a non-definition decl and source may not have one.
5110 SourceLocation Loc);
5111
5112 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5113 /// applied to it, possibly with an alias.
5114 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
5115
5116 void ProcessPragmaWeak(Scope *S, Decl *D);
5117 // Decl attributes - this routine is the top level dispatcher.
5118 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
5119
5121
5122 /// Given a set of delayed diagnostics, re-emit them as if they had
5123 /// been delayed in the current context instead of in the given pool.
5124 /// Essentially, this just moves them to the current pool.
5126
5127 /// Check that the type is a plain record with one field being a pointer
5128 /// type and the other field being an integer. This matches the common
5129 /// implementation of std::span or sized_allocation_t in P0901R11.
5130 bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty);
5131
5132 /// Check if IdxExpr is a valid parameter index for a function or
5133 /// instance method D. May output an error.
5134 ///
5135 /// \returns true if IdxExpr is a valid index.
5136 template <typename AttrInfo>
5138 const Decl *D, const AttrInfo &AI, unsigned AttrArgNum,
5139 const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis = false,
5140 bool CanIndexVariadicArguments = false) {
5142
5143 // In C++ the implicit 'this' function parameter also counts.
5144 // Parameters are counted from one.
5145 bool HP = hasFunctionProto(D);
5146 bool HasImplicitThisParam = hasImplicitObjectParameter(D);
5147 bool IV = HP && isFunctionOrMethodVariadic(D);
5148 unsigned NumParams =
5149 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
5150
5151 std::optional<llvm::APSInt> IdxInt;
5152 if (IdxExpr->isTypeDependent() ||
5153 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
5154 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
5155 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
5156 << IdxExpr->getSourceRange();
5157 return false;
5158 }
5159
5160 unsigned IdxSource = IdxInt->getLimitedValue(UINT_MAX);
5161 if (IdxSource < 1 ||
5162 ((!IV || !CanIndexVariadicArguments) && IdxSource > NumParams)) {
5163 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
5164 << &AI << AttrArgNum << IdxExpr->getSourceRange();
5165 return false;
5166 }
5167 if (HasImplicitThisParam && !CanIndexImplicitThis) {
5168 if (IdxSource == 1) {
5169 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
5170 << &AI << IdxExpr->getSourceRange();
5171 return false;
5172 }
5173 }
5174
5175 Idx = ParamIdx(IdxSource, D);
5176 return true;
5177 }
5178
5179 ///@}
5180
5181 //
5182 //
5183 // -------------------------------------------------------------------------
5184 //
5185 //
5186
5187 /// \name C++ Declarations
5188 /// Implementations are in SemaDeclCXX.cpp
5189 ///@{
5190
5191public:
5193
5194 /// Called before parsing a function declarator belonging to a function
5195 /// declaration.
5197 unsigned TemplateParameterDepth);
5198
5199 /// Called after parsing a function declarator belonging to a function
5200 /// declaration.
5202
5203 // Act on C++ namespaces
5205 SourceLocation NamespaceLoc,
5206 SourceLocation IdentLoc, IdentifierInfo *Ident,
5207 SourceLocation LBrace,
5208 const ParsedAttributesView &AttrList,
5209 UsingDirectiveDecl *&UsingDecl, bool IsNested);
5210
5211 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
5212 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
5213 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
5214
5216
5217 /// Retrieve the special "std" namespace, which may require us to
5218 /// implicitly define the namespace.
5220
5222 EnumDecl *getStdAlignValT() const;
5223
5226 QualType AllocType, SourceLocation);
5227
5229 const IdentifierInfo *MemberOrBase);
5230
5232 /// The '<=>' operator was used in an expression and a builtin operator
5233 /// was selected.
5235 /// A defaulted 'operator<=>' needed the comparison category. This
5236 /// typically only applies to 'std::strong_ordering', due to the implicit
5237 /// fallback return value.
5239 };
5240
5241 /// Lookup the specified comparison category types in the standard
5242 /// library, an check the VarDecls possibly returned by the operator<=>
5243 /// builtins for that type.
5244 ///
5245 /// \return The type of the comparison category type corresponding to the
5246 /// specified Kind, or a null type if an error occurs
5248 SourceLocation Loc,
5250
5251 /// Tests whether Ty is an instance of std::initializer_list and, if
5252 /// it is and Element is not NULL, assigns the element type to Element.
5253 bool isStdInitializerList(QualType Ty, QualType *Element);
5254
5255 /// Tests whether Ty is an instance of std::type_identity and, if
5256 /// it is and TypeArgument is not NULL, assigns the element type to Element.
5257 /// If MalformedDecl is not null, and type_identity was ruled out due to being
5258 /// incorrectly structured despite having the correct name, the faulty Decl
5259 /// will be assigned to MalformedDecl.
5260 bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument,
5261 const Decl **MalformedDecl = nullptr);
5262
5263 /// Looks for the std::initializer_list template and instantiates it
5264 /// with Element, or emits an error if it's not found.
5265 ///
5266 /// \returns The instantiated template, or null on error.
5268
5269 /// Looks for the std::type_identity template and instantiates it
5270 /// with Type, or returns a null type if type_identity has not been declared
5271 ///
5272 /// \returns The instantiated template, or null if std::type_identity is not
5273 /// declared
5275
5276 /// Determine whether Ctor is an initializer-list constructor, as
5277 /// defined in [dcl.init.list]p2.
5278 bool isInitListConstructor(const FunctionDecl *Ctor);
5279
5280 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
5281 SourceLocation NamespcLoc, CXXScopeSpec &SS,
5282 SourceLocation IdentLoc,
5283 IdentifierInfo *NamespcName,
5284 const ParsedAttributesView &AttrList);
5285
5287
5288 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
5289 SourceLocation AliasLoc, IdentifierInfo *Alias,
5290 CXXScopeSpec &SS, SourceLocation IdentLoc,
5291 IdentifierInfo *Ident);
5292
5293 /// Remove decls we can't actually see from a lookup being used to declare
5294 /// shadow using decls.
5295 ///
5296 /// \param S - The scope of the potential shadow decl
5297 /// \param Previous - The lookup of a potential shadow decl's name.
5298 void FilterUsingLookup(Scope *S, LookupResult &lookup);
5299
5300 /// Hides a using shadow declaration. This is required by the current
5301 /// using-decl implementation when a resolvable using declaration in a
5302 /// class is followed by a declaration which would hide or override
5303 /// one or more of the using decl's targets; for example:
5304 ///
5305 /// struct Base { void foo(int); };
5306 /// struct Derived : Base {
5307 /// using Base::foo;
5308 /// void foo(int);
5309 /// };
5310 ///
5311 /// The governing language is C++03 [namespace.udecl]p12:
5312 ///
5313 /// When a using-declaration brings names from a base class into a
5314 /// derived class scope, member functions in the derived class
5315 /// override and/or hide member functions with the same name and
5316 /// parameter types in a base class (rather than conflicting).
5317 ///
5318 /// There are two ways to implement this:
5319 /// (1) optimistically create shadow decls when they're not hidden
5320 /// by existing declarations, or
5321 /// (2) don't create any shadow decls (or at least don't make them
5322 /// visible) until we've fully parsed/instantiated the class.
5323 /// The problem with (1) is that we might have to retroactively remove
5324 /// a shadow decl, which requires several O(n) operations because the
5325 /// decl structures are (very reasonably) not designed for removal.
5326 /// (2) avoids this but is very fiddly and phase-dependent.
5327 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
5328
5329 /// Determines whether to create a using shadow decl for a particular
5330 /// decl, given the set of decls existing prior to this using lookup.
5332 const LookupResult &PreviousDecls,
5333 UsingShadowDecl *&PrevShadow);
5334
5335 /// Builds a shadow declaration corresponding to a 'using' declaration.
5338 UsingShadowDecl *PrevDecl);
5339
5340 /// Checks that the given using declaration is not an invalid
5341 /// redeclaration. Note that this is checking only for the using decl
5342 /// itself, not for any ill-formedness among the UsingShadowDecls.
5344 bool HasTypenameKeyword,
5345 const CXXScopeSpec &SS,
5346 SourceLocation NameLoc,
5347 const LookupResult &Previous);
5348
5349 /// Checks that the given nested-name qualifier used in a using decl
5350 /// in the current context is appropriately related to the current
5351 /// scope. If an error is found, diagnoses it and returns true.
5352 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
5353 /// the result of that lookup. UD is likewise nullptr, except when we have an
5354 /// already-populated UsingDecl whose shadow decls contain the same
5355 /// information (i.e. we're instantiating a UsingDecl with non-dependent
5356 /// scope).
5357 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
5358 const CXXScopeSpec &SS,
5359 const DeclarationNameInfo &NameInfo,
5360 SourceLocation NameLoc,
5361 const LookupResult *R = nullptr,
5362 const UsingDecl *UD = nullptr);
5363
5364 /// Builds a using declaration.
5365 ///
5366 /// \param IsInstantiation - Whether this call arises from an
5367 /// instantiation of an unresolved using declaration. We treat
5368 /// the lookup differently for these declarations.
5370 SourceLocation UsingLoc,
5371 bool HasTypenameKeyword,
5372 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5373 DeclarationNameInfo NameInfo,
5374 SourceLocation EllipsisLoc,
5375 const ParsedAttributesView &AttrList,
5376 bool IsInstantiation, bool IsUsingIfExists);
5378 SourceLocation UsingLoc,
5379 SourceLocation EnumLoc,
5380 SourceLocation NameLoc,
5381 TypeSourceInfo *EnumType, EnumDecl *ED);
5382 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
5383 ArrayRef<NamedDecl *> Expansions);
5384
5385 /// Additional checks for a using declaration referring to a constructor name.
5387
5388 /// Given a derived-class using shadow declaration for a constructor and the
5389 /// correspnding base class constructor, find or create the implicit
5390 /// synthesized derived class constructor to use for this initialization.
5393 ConstructorUsingShadowDecl *DerivedShadow);
5394
5396 SourceLocation UsingLoc,
5397 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5398 UnqualifiedId &Name, SourceLocation EllipsisLoc,
5399 const ParsedAttributesView &AttrList);
5401 SourceLocation UsingLoc,
5402 SourceLocation EnumLoc, SourceRange TyLoc,
5403 const IdentifierInfo &II, ParsedType Ty,
5404 const CXXScopeSpec &SS);
5406 MultiTemplateParamsArg TemplateParams,
5407 SourceLocation UsingLoc, UnqualifiedId &Name,
5408 const ParsedAttributesView &AttrList,
5409 TypeResult Type, Decl *DeclFromDeclSpec);
5410
5411 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
5412 /// including handling of its default argument expressions.
5413 ///
5414 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
5416 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5418 bool HadMultipleCandidates, bool IsListInitialization,
5419 bool IsStdInitListInitialization, bool RequiresZeroInit,
5420 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5421
5422 /// Build a CXXConstructExpr whose constructor has already been resolved if
5423 /// it denotes an inherited constructor.
5425 SourceLocation ConstructLoc, QualType DeclInitType,
5426 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5427 bool HadMultipleCandidates, bool IsListInitialization,
5428 bool IsStdInitListInitialization, bool RequiresZeroInit,
5429 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5430
5431 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
5432 // the constructor can be elidable?
5434 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5435 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5436 bool HadMultipleCandidates, bool IsListInitialization,
5437 bool IsStdInitListInitialization, bool RequiresZeroInit,
5438 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5439
5441 SourceLocation InitLoc);
5442
5443 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
5444 /// constructed variable.
5445 void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit);
5446
5447 /// Helper class that collects exception specifications for
5448 /// implicitly-declared special member functions.
5450 // Pointer to allow copying
5451 Sema *Self;
5452 // We order exception specifications thus:
5453 // noexcept is the most restrictive, but is only used in C++11.
5454 // throw() comes next.
5455 // Then a throw(collected exceptions)
5456 // Finally no specification, which is expressed as noexcept(false).
5457 // throw(...) is used instead if any called function uses it.
5458 ExceptionSpecificationType ComputedEST;
5459 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5460 SmallVector<QualType, 4> Exceptions;
5461
5462 void ClearExceptions() {
5463 ExceptionsSeen.clear();
5464 Exceptions.clear();
5465 }
5466
5467 public:
5469 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5470 if (!Self.getLangOpts().CPlusPlus11)
5471 ComputedEST = EST_DynamicNone;
5472 }
5473
5474 /// Get the computed exception specification type.
5476 assert(!isComputedNoexcept(ComputedEST) &&
5477 "noexcept(expr) should not be a possible result");
5478 return ComputedEST;
5479 }
5480
5481 /// The number of exceptions in the exception specification.
5482 unsigned size() const { return Exceptions.size(); }
5483
5484 /// The set of exceptions in the exception specification.
5485 const QualType *data() const { return Exceptions.data(); }
5486
5487 /// Integrate another called method into the collected data.
5488 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5489
5490 /// Integrate an invoked expression into the collected data.
5491 void CalledExpr(Expr *E) { CalledStmt(E); }
5492
5493 /// Integrate an invoked statement into the collected data.
5494 void CalledStmt(Stmt *S);
5495
5496 /// Overwrite an EPI's exception specification with this
5497 /// computed exception specification.
5500 ESI.Type = getExceptionSpecType();
5501 if (ESI.Type == EST_Dynamic) {
5502 ESI.Exceptions = Exceptions;
5503 } else if (ESI.Type == EST_None) {
5504 /// C++11 [except.spec]p14:
5505 /// The exception-specification is noexcept(false) if the set of
5506 /// potential exceptions of the special member function contains "any"
5507 ESI.Type = EST_NoexceptFalse;
5508 ESI.NoexceptExpr =
5509 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5510 }
5511 return ESI;
5512 }
5513 };
5514
5515 /// Evaluate the implicit exception specification for a defaulted
5516 /// special member function.
5518
5519 /// Check the given exception-specification and update the
5520 /// exception specification information with the results.
5521 void checkExceptionSpecification(bool IsTopLevel,
5523 ArrayRef<ParsedType> DynamicExceptions,
5524 ArrayRef<SourceRange> DynamicExceptionRanges,
5525 Expr *NoexceptExpr,
5526 SmallVectorImpl<QualType> &Exceptions,
5528
5529 /// Add an exception-specification to the given member or friend function
5530 /// (or function template). The exception-specification was parsed
5531 /// after the function itself was declared.
5533 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5534 ArrayRef<ParsedType> DynamicExceptions,
5535 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5536
5537 class InheritedConstructorInfo;
5538
5539 /// Determine if a special member function should have a deleted
5540 /// definition when it is defaulted.
5542 InheritedConstructorInfo *ICI = nullptr,
5543 bool Diagnose = false);
5544
5545 /// Produce notes explaining why a defaulted function was defined as deleted.
5547
5548 /// Declare the implicit default constructor for the given class.
5549 ///
5550 /// \param ClassDecl The class declaration into which the implicit
5551 /// default constructor will be added.
5552 ///
5553 /// \returns The implicitly-declared default constructor.
5556
5557 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5558 /// defining this constructor as the default constructor.
5561
5562 /// Declare the implicit destructor for the given class.
5563 ///
5564 /// \param ClassDecl The class declaration into which the implicit
5565 /// destructor will be added.
5566 ///
5567 /// \returns The implicitly-declared destructor.
5569
5570 /// DefineImplicitDestructor - Checks for feasibility of
5571 /// defining this destructor as the default destructor.
5572 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5574
5575 /// Build an exception spec for destructors that don't have one.
5576 ///
5577 /// C++11 says that user-defined destructors with no exception spec get one
5578 /// that looks as if the destructor was implicitly declared.
5580
5581 /// Define the specified inheriting constructor.
5584
5585 /// Declare the implicit copy constructor for the given class.
5586 ///
5587 /// \param ClassDecl The class declaration into which the implicit
5588 /// copy constructor will be added.
5589 ///
5590 /// \returns The implicitly-declared copy constructor.
5592
5593 /// DefineImplicitCopyConstructor - Checks for feasibility of
5594 /// defining this constructor as the copy constructor.
5595 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5597
5598 /// Declare the implicit move constructor for the given class.
5599 ///
5600 /// \param ClassDecl The Class declaration into which the implicit
5601 /// move constructor will be added.
5602 ///
5603 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5604 /// declared.
5606
5607 /// DefineImplicitMoveConstructor - Checks for feasibility of
5608 /// defining this constructor as the move constructor.
5609 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5611
5612 /// Declare the implicit copy assignment operator for the given class.
5613 ///
5614 /// \param ClassDecl The class declaration into which the implicit
5615 /// copy assignment operator will be added.
5616 ///
5617 /// \returns The implicitly-declared copy assignment operator.
5619
5620 /// Defines an implicitly-declared copy assignment operator.
5621 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5622 CXXMethodDecl *MethodDecl);
5623
5624 /// Declare the implicit move assignment operator for the given class.
5625 ///
5626 /// \param ClassDecl The Class declaration into which the implicit
5627 /// move assignment operator will be added.
5628 ///
5629 /// \returns The implicitly-declared move assignment operator, or NULL if it
5630 /// wasn't declared.
5632
5633 /// Defines an implicitly-declared move assignment operator.
5634 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5635 CXXMethodDecl *MethodDecl);
5636
5637 /// Check a completed declaration of an implicit special member.
5639
5640 /// Determine whether the given function is an implicitly-deleted
5641 /// special member function.
5643
5644 /// Check whether 'this' shows up in the type of a static member
5645 /// function after the (naturally empty) cv-qualifier-seq would be.
5646 ///
5647 /// \returns true if an error occurred.
5649
5650 /// Whether this' shows up in the exception specification of a static
5651 /// member function.
5653
5654 /// Check whether 'this' shows up in the attributes of the given
5655 /// static member function.
5656 ///
5657 /// \returns true if an error occurred.
5659
5661 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5662
5664
5665 /// Given a constructor and the set of arguments provided for the
5666 /// constructor, convert the arguments and add any required default arguments
5667 /// to form a proper call to this constructor.
5668 ///
5669 /// \returns true if an error occurred, false otherwise.
5671 QualType DeclInitType, MultiExprArg ArgsPtr,
5672 SourceLocation Loc,
5673 SmallVectorImpl<Expr *> &ConvertedArgs,
5674 bool AllowExplicit = false,
5675 bool IsListInitialization = false);
5676
5677 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5678 /// initializer for the declaration 'Dcl'.
5679 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5680 /// static data member of class X, names should be looked up in the scope of
5681 /// class X.
5683
5684 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5685 /// initializer for the declaration 'Dcl'.
5686 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5687
5688 /// Define the "body" of the conversion from a lambda object to a
5689 /// function pointer.
5690 ///
5691 /// This routine doesn't actually define a sensible body; rather, it fills
5692 /// in the initialization expression needed to copy the lambda object into
5693 /// the block, and IR generation actually generates the real body of the
5694 /// block pointer conversion.
5695 void
5697 CXXConversionDecl *Conv);
5698
5699 /// Define the "body" of the conversion from a lambda object to a
5700 /// block pointer.
5701 ///
5702 /// This routine doesn't actually define a sensible body; rather, it fills
5703 /// in the initialization expression needed to copy the lambda object into
5704 /// the block, and IR generation actually generates the real body of the
5705 /// block pointer conversion.
5707 CXXConversionDecl *Conv);
5708
5709 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5710 /// linkage specification, including the language and (if present)
5711 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5712 /// language string literal. LBraceLoc, if valid, provides the location of
5713 /// the '{' brace. Otherwise, this linkage specification does not
5714 /// have any braces.
5716 Expr *LangStr, SourceLocation LBraceLoc);
5717
5718 /// ActOnFinishLinkageSpecification - Complete the definition of
5719 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5720 /// valid, it's the position of the closing '}' brace in a linkage
5721 /// specification that uses braces.
5723 SourceLocation RBraceLoc);
5724
5725 //===--------------------------------------------------------------------===//
5726 // C++ Classes
5727 //
5728
5729 /// Get the class that is directly named by the current context. This is the
5730 /// class for which an unqualified-id in this scope could name a constructor
5731 /// or destructor.
5732 ///
5733 /// If the scope specifier denotes a class, this will be that class.
5734 /// If the scope specifier is empty, this will be the class whose
5735 /// member-specification we are currently within. Otherwise, there
5736 /// is no such class.
5738
5739 /// isCurrentClassName - Determine whether the identifier II is the
5740 /// name of the class type currently being defined. In the case of
5741 /// nested classes, this will only return true if II is the name of
5742 /// the innermost class.
5743 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5744 const CXXScopeSpec *SS = nullptr);
5745
5746 /// Determine whether the identifier II is a typo for the name of
5747 /// the class type currently being defined. If so, update it to the identifier
5748 /// that should have been used.
5750
5751 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5753 SourceLocation ColonLoc,
5754 const ParsedAttributesView &Attrs);
5755
5756 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5757 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5758 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5759 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5760 /// present (but parsing it has been deferred).
5761 NamedDecl *
5763 MultiTemplateParamsArg TemplateParameterLists,
5764 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5765 InClassInitStyle InitStyle);
5766
5767 /// Enter a new C++ default initializer scope. After calling this, the
5768 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5769 /// parsing or instantiating the initializer failed.
5771
5772 /// This is invoked after parsing an in-class initializer for a
5773 /// non-static C++ class member, and after instantiating an in-class
5774 /// initializer in a class template. Such actions are deferred until the class
5775 /// is complete.
5777 SourceLocation EqualLoc,
5779
5780 /// Handle a C++ member initializer using parentheses syntax.
5782 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5783 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5784 const DeclSpec &DS, SourceLocation IdLoc,
5785 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5786 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5787
5788 /// Handle a C++ member initializer using braced-init-list syntax.
5789 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5790 CXXScopeSpec &SS,
5791 IdentifierInfo *MemberOrBase,
5792 ParsedType TemplateTypeTy,
5793 const DeclSpec &DS, SourceLocation IdLoc,
5794 Expr *InitList, SourceLocation EllipsisLoc);
5795
5796 /// Handle a C++ member initializer.
5797 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5798 CXXScopeSpec &SS,
5799 IdentifierInfo *MemberOrBase,
5800 ParsedType TemplateTypeTy,
5801 const DeclSpec &DS, SourceLocation IdLoc,
5802 Expr *Init, SourceLocation EllipsisLoc);
5803
5805 SourceLocation IdLoc);
5806
5808 TypeSourceInfo *BaseTInfo, Expr *Init,
5809 CXXRecordDecl *ClassDecl,
5810 SourceLocation EllipsisLoc);
5811
5813 CXXRecordDecl *ClassDecl);
5814
5817
5819 ArrayRef<CXXCtorInitializer *> Initializers = {});
5820
5821 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5822 /// mark all the non-trivial destructors of its members and bases as
5823 /// referenced.
5824 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5825 CXXRecordDecl *Record);
5826
5827 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5828 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5829 /// class. In the Microsoft C++ ABI, this is done any time a class's
5830 /// destructor is referenced.
5832 SourceLocation Location, CXXRecordDecl *ClassDecl,
5833 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5834 nullptr);
5835
5836 /// Do semantic checks to allow the complete destructor variant to be emitted
5837 /// when the destructor is defined in another translation unit. In the Itanium
5838 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5839 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5840 /// of the checks performed when emitting a regular destructor.
5841 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5842 CXXDestructorDecl *Dtor);
5843
5844 /// The list of classes whose vtables have been used within
5845 /// this translation unit, and the source locations at which the
5846 /// first use occurred.
5847 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5848
5849 /// The list of vtables that are required but have not yet been
5850 /// materialized.
5852
5853 /// The set of classes whose vtables have been used within
5854 /// this translation unit, and a bit that will be true if the vtable is
5855 /// required to be emitted (otherwise, it should be emitted only if needed
5856 /// by code generation).
5857 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5858
5859 /// Load any externally-stored vtable uses.
5861
5862 /// Note that the vtable for the given class was used at the
5863 /// given location.
5865 bool DefinitionRequired = false);
5866
5867 /// Mark the exception specifications of all virtual member functions
5868 /// in the given class as needed.
5870 const CXXRecordDecl *RD);
5871
5872 /// MarkVirtualMembersReferenced - Will mark all members of the given
5873 /// CXXRecordDecl referenced.
5875 bool ConstexprOnly = false);
5876
5877 /// Define all of the vtables that have been used in this
5878 /// translation unit and reference any virtual members used by those
5879 /// vtables.
5880 ///
5881 /// \returns true if any work was done, false otherwise.
5882 bool DefineUsedVTables();
5883
5884 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
5885 /// special functions, such as the default constructor, copy
5886 /// constructor, or destructor, to the given C++ class (C++
5887 /// [special]p1). This routine can only be executed just before the
5888 /// definition of the class is complete.
5890
5891 /// ActOnMemInitializers - Handle the member initializers for a constructor.
5892 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
5894 bool AnyErrors);
5895
5896 /// Check class-level dllimport/dllexport attribute. The caller must
5897 /// ensure that referenceDLLExportedClassMethods is called some point later
5898 /// when all outer classes of Class are complete.
5901
5903
5904 /// Perform propagation of DLL attributes from a derived class to a
5905 /// templated base class for MS compatibility.
5907 CXXRecordDecl *Class, Attr *ClassAttr,
5908 ClassTemplateSpecializationDecl *BaseTemplateSpec,
5909 SourceLocation BaseLoc);
5910
5911 /// Perform semantic checks on a class definition that has been
5912 /// completing, introducing implicitly-declared members, checking for
5913 /// abstract types, etc.
5914 ///
5915 /// \param S The scope in which the class was parsed. Null if we didn't just
5916 /// parse a class definition.
5917 /// \param Record The completed class.
5919
5920 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
5921 /// conditions that are needed for the attribute to have an effect.
5923
5924 /// Check that VTable Pointer authentication is only being set on the first
5925 /// first instantiation of the vtable
5927
5929 Decl *TagDecl, SourceLocation LBrac,
5930 SourceLocation RBrac,
5931 const ParsedAttributesView &AttrList);
5932
5933 /// Perform any semantic analysis which needs to be delayed until all
5934 /// pending class member declarations have been parsed.
5937
5938 /// This is used to implement the constant expression evaluation part of the
5939 /// attribute enable_if extension. There is nothing in standard C++ which
5940 /// would require reentering parameters.
5943 llvm::function_ref<Scope *()> EnterScope);
5945
5946 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
5947 /// parsing a top-level (non-nested) C++ class, and we are now
5948 /// parsing those parts of the given Method declaration that could
5949 /// not be parsed earlier (C++ [class.mem]p2), such as default
5950 /// arguments. This action should enter the scope of the given
5951 /// Method declaration as if we had just parsed the qualified method
5952 /// name. However, it should not bring the parameters into scope;
5953 /// that will be performed by ActOnDelayedCXXMethodParameter.
5955 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
5957
5958 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
5959 /// processing the delayed method declaration for Method. The method
5960 /// declaration is now considered finished. There may be a separate
5961 /// ActOnStartOfFunctionDef action later (not necessarily
5962 /// immediately!) for this method, if it was also defined inside the
5963 /// class body.
5966
5968
5969 bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
5970 StringEvaluationContext EvalContext,
5971 bool ErrorOnInvalidMessage);
5972 bool EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
5973 StringEvaluationContext EvalContext,
5974 bool ErrorOnInvalidMessage);
5975
5977 Expr *AssertExpr, Expr *AssertMessageExpr,
5978 SourceLocation RParenLoc);
5980 Expr *AssertExpr, Expr *AssertMessageExpr,
5981 SourceLocation RParenLoc, bool Failed);
5982
5983 /// Try to print more useful information about a failed static_assert
5984 /// with expression \E
5985 void DiagnoseStaticAssertDetails(const Expr *E);
5986
5987 /// If E represents a built-in type trait, or a known standard type trait,
5988 /// try to print more information about why the type type-trait failed.
5989 /// This assumes we already evaluated the expression to a false boolean value.
5990 void DiagnoseTypeTraitDetails(const Expr *E);
5991
5992 /// Handle a friend type declaration. This works in tandem with
5993 /// ActOnTag.
5994 ///
5995 /// Notes on friend class templates:
5996 ///
5997 /// We generally treat friend class declarations as if they were
5998 /// declaring a class. So, for example, the elaborated type specifier
5999 /// in a friend declaration is required to obey the restrictions of a
6000 /// class-head (i.e. no typedefs in the scope chain), template
6001 /// parameters are required to match up with simple template-ids, &c.
6002 /// However, unlike when declaring a template specialization, it's
6003 /// okay to refer to a template specialization without an empty
6004 /// template parameter declaration, e.g.
6005 /// friend class A<T>::B<unsigned>;
6006 /// We permit this as a special case; if there are any template
6007 /// parameters present at all, require proper matching, i.e.
6008 /// template <> template <class T> friend class A<int>::B;
6009 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
6010 MultiTemplateParamsArg TemplateParams,
6011 SourceLocation EllipsisLoc);
6013 MultiTemplateParamsArg TemplateParams);
6014
6015 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
6016 /// the well-formedness of the constructor declarator @p D with type @p
6017 /// R. If there are any errors in the declarator, this routine will
6018 /// emit diagnostics and set the invalid bit to true. In any case, the type
6019 /// will be updated to reflect a well-formed type for the constructor and
6020 /// returned.
6022 StorageClass &SC);
6023
6024 /// CheckConstructor - Checks a fully-formed constructor for
6025 /// well-formedness, issuing any diagnostics required. Returns true if
6026 /// the constructor declarator is invalid.
6028
6029 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
6030 /// the well-formednes of the destructor declarator @p D with type @p
6031 /// R. If there are any errors in the declarator, this routine will
6032 /// emit diagnostics and set the declarator to invalid. Even if this happens,
6033 /// will be updated to reflect a well-formed type for the destructor and
6034 /// returned.
6036 StorageClass &SC);
6037
6038 /// CheckDestructor - Checks a fully-formed destructor definition for
6039 /// well-formedness, issuing any diagnostics required. Returns true
6040 /// on error.
6042
6043 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
6044 /// well-formednes of the conversion function declarator @p D with
6045 /// type @p R. If there are any errors in the declarator, this routine
6046 /// will emit diagnostics and return true. Otherwise, it will return
6047 /// false. Either way, the type @p R will be updated to reflect a
6048 /// well-formed type for the conversion operator.
6050
6051 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
6052 /// the declaration of the given C++ conversion function. This routine
6053 /// is responsible for recording the conversion function in the C++
6054 /// class, if possible.
6056
6057 /// Check the validity of a declarator that we parsed for a deduction-guide.
6058 /// These aren't actually declarators in the grammar, so we need to check that
6059 /// the user didn't specify any pieces that are not part of the
6060 /// deduction-guide grammar. Return true on invalid deduction-guide.
6062 StorageClass &SC);
6063
6065
6068 SourceLocation DefaultLoc);
6070
6071 /// Kinds of defaulted comparison operator functions.
6072 enum class DefaultedComparisonKind : unsigned char {
6073 /// This is not a defaultable comparison operator.
6075 /// This is an operator== that should be implemented as a series of
6076 /// subobject comparisons.
6078 /// This is an operator<=> that should be implemented as a series of
6079 /// subobject comparisons.
6081 /// This is an operator!= that should be implemented as a rewrite in terms
6082 /// of a == comparison.
6084 /// This is an <, <=, >, or >= that should be implemented as a rewrite in
6085 /// terms of a <=> comparison.
6087 };
6088
6092 FunctionDecl *Spaceship);
6095
6097 QualType R, bool IsLambda,
6098 DeclContext *DC = nullptr);
6100 DeclarationName Name, QualType R);
6102
6103 //===--------------------------------------------------------------------===//
6104 // C++ Derived Classes
6105 //
6106
6107 /// Check the validity of a C++ base class specifier.
6108 ///
6109 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
6110 /// and returns NULL otherwise.
6112 SourceRange SpecifierRange, bool Virtual,
6113 AccessSpecifier Access,
6114 TypeSourceInfo *TInfo,
6115 SourceLocation EllipsisLoc);
6116
6117 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
6118 /// one entry in the base class list of a class specifier, for
6119 /// example:
6120 /// class foo : public bar, virtual private baz {
6121 /// 'public bar' and 'virtual private baz' are each base-specifiers.
6122 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
6123 const ParsedAttributesView &Attrs, bool Virtual,
6124 AccessSpecifier Access, ParsedType basetype,
6125 SourceLocation BaseLoc,
6126 SourceLocation EllipsisLoc);
6127
6128 /// Performs the actual work of attaching the given base class
6129 /// specifiers to a C++ class.
6132
6133 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
6134 /// class, after checking whether there are any duplicate base
6135 /// classes.
6136 void ActOnBaseSpecifiers(Decl *ClassDecl,
6138
6139 /// Determine whether the type \p Derived is a C++ class that is
6140 /// derived from the type \p Base.
6141 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6143 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6147 CXXBasePaths &Paths);
6148
6149 // FIXME: I don't like this name.
6150 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
6151
6153 SourceLocation Loc, SourceRange Range,
6154 CXXCastPath *BasePath = nullptr,
6155 bool IgnoreAccess = false);
6156
6157 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
6158 /// conversion (where Derived and Base are class types) is
6159 /// well-formed, meaning that the conversion is unambiguous (and
6160 /// that all of the base classes are accessible). Returns true
6161 /// and emits a diagnostic if the code is ill-formed, returns false
6162 /// otherwise. Loc is the location where this routine should point to
6163 /// if there is an error, and Range is the source range to highlight
6164 /// if there is an error.
6165 ///
6166 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
6167 /// diagnostic for the respective type of error will be suppressed, but the
6168 /// check for ill-formed code will still be performed.
6170 unsigned InaccessibleBaseID,
6171 unsigned AmbiguousBaseConvID,
6172 SourceLocation Loc, SourceRange Range,
6173 DeclarationName Name, CXXCastPath *BasePath,
6174 bool IgnoreAccess = false);
6175
6176 /// Builds a string representing ambiguous paths from a
6177 /// specific derived class to different subobjects of the same base
6178 /// class.
6179 ///
6180 /// This function builds a string that can be used in error messages
6181 /// to show the different paths that one can take through the
6182 /// inheritance hierarchy to go from the derived class to different
6183 /// subobjects of a base class. The result looks something like this:
6184 /// @code
6185 /// struct D -> struct B -> struct A
6186 /// struct D -> struct C -> struct A
6187 /// @endcode
6188 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
6189
6191 const CXXMethodDecl *Old);
6192
6193 /// CheckOverridingFunctionReturnType - Checks whether the return types are
6194 /// covariant, according to C++ [class.virtual]p5.
6196 const CXXMethodDecl *Old);
6197
6198 // Check that the overriding method has no explicit object parameter.
6200 const CXXMethodDecl *Old);
6201
6202 /// Mark the given method pure.
6203 ///
6204 /// \param Method the method to be marked pure.
6205 ///
6206 /// \param InitRange the source range that covers the "0" initializer.
6208
6209 /// CheckOverrideControl - Check C++11 override control semantics.
6211
6212 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
6213 /// not used in the declaration of an overriding method.
6215
6216 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
6217 /// function overrides a virtual member function marked 'final', according to
6218 /// C++11 [class.virtual]p4.
6220 const CXXMethodDecl *Old);
6221
6232
6233 struct TypeDiagnoser;
6234
6237 TypeDiagnoser &Diagnoser);
6238 template <typename... Ts>
6240 const Ts &...Args) {
6241 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
6242 return RequireNonAbstractType(Loc, T, Diagnoser);
6243 }
6244
6245 void DiagnoseAbstractType(const CXXRecordDecl *RD);
6246
6247 //===--------------------------------------------------------------------===//
6248 // C++ Overloaded Operators [C++ 13.5]
6249 //
6250
6251 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
6252 /// of this overloaded operator is well-formed. If so, returns false;
6253 /// otherwise, emits appropriate diagnostics and returns true.
6255
6256 /// CheckLiteralOperatorDeclaration - Check whether the declaration
6257 /// of this literal operator function is well-formed. If so, returns
6258 /// false; otherwise, emits appropriate diagnostics and returns true.
6260
6261 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
6262 /// found in an explicit(bool) specifier.
6264
6265 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
6266 /// Returns true if the explicit specifier is now resolved.
6268
6269 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
6270 /// C++ if/switch/while/for statement.
6271 /// e.g: "if (int x = f()) {...}"
6273
6274 // Emitting members of dllexported classes is delayed until the class
6275 // (including field initializers) is fully parsed.
6278
6279 /// Merge the exception specifications of two variable declarations.
6280 ///
6281 /// This is called when there's a redeclaration of a VarDecl. The function
6282 /// checks if the redeclaration might have an exception specification and
6283 /// validates compatibility and merges the specs if necessary.
6285
6286 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
6287 /// function, once we already know that they have the same
6288 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
6289 /// error, false otherwise.
6291
6292 /// Helpers for dealing with blocks and functions.
6294
6295 /// CheckExtraCXXDefaultArguments - Check for any extra default
6296 /// arguments in the declarator, which is not a function declaration
6297 /// or definition and therefore is not permitted to have default
6298 /// arguments. This routine should be invoked for every declarator
6299 /// that is not a function declaration or definition.
6301
6305
6306 /// Perform semantic analysis for the variable declaration that
6307 /// occurs within a C++ catch clause, returning the newly-created
6308 /// variable.
6310 SourceLocation StartLoc,
6311 SourceLocation IdLoc,
6312 const IdentifierInfo *Id);
6313
6314 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
6315 /// handler.
6317
6319
6320 /// Handle a friend tag declaration where the scope specifier was
6321 /// templated.
6323 unsigned TagSpec, SourceLocation TagLoc,
6324 CXXScopeSpec &SS, IdentifierInfo *Name,
6325 SourceLocation NameLoc,
6326 SourceLocation EllipsisLoc,
6328 MultiTemplateParamsArg TempParamLists);
6329
6331 SourceLocation DeclStart, Declarator &D,
6332 Expr *BitfieldWidth,
6333 InClassInitStyle InitStyle,
6334 AccessSpecifier AS,
6335 const ParsedAttr &MSPropertyAttr);
6336
6337 /// Diagnose why the specified class does not have a trivial special member of
6338 /// the given kind.
6341
6342 /// Determine whether a defaulted or deleted special member function is
6343 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
6344 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
6348 bool Diagnose = false);
6349
6350 /// For a defaulted function, the kind of defaulted function that it is.
6352 LLVM_PREFERRED_TYPE(CXXSpecialMemberKind)
6353 unsigned SpecialMember : 8;
6354 unsigned Comparison : 8;
6355
6356 public:
6358 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6359 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6361 : SpecialMember(llvm::to_underlying(CSM)),
6362 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6364 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6365 Comparison(llvm::to_underlying(Comp)) {}
6366
6367 bool isSpecialMember() const {
6368 return static_cast<CXXSpecialMemberKind>(SpecialMember) !=
6370 }
6371 bool isComparison() const {
6372 return static_cast<DefaultedComparisonKind>(Comparison) !=
6374 }
6375
6376 explicit operator bool() const {
6377 return isSpecialMember() || isComparison();
6378 }
6379
6381 return static_cast<CXXSpecialMemberKind>(SpecialMember);
6382 }
6384 return static_cast<DefaultedComparisonKind>(Comparison);
6385 }
6386
6387 /// Get the index of this function kind for use in diagnostics.
6388 unsigned getDiagnosticIndex() const {
6389 static_assert(llvm::to_underlying(CXXSpecialMemberKind::Invalid) >
6390 llvm::to_underlying(CXXSpecialMemberKind::Destructor),
6391 "invalid should have highest index");
6392 static_assert((unsigned)DefaultedComparisonKind::None == 0,
6393 "none should be equal to zero");
6394 return SpecialMember + Comparison;
6395 }
6396 };
6397
6398 /// Determine the kind of defaulting that would be done for a given function.
6399 ///
6400 /// If the function is both a default constructor and a copy / move
6401 /// constructor (due to having a default argument for the first parameter),
6402 /// this picks CXXSpecialMemberKind::DefaultConstructor.
6403 ///
6404 /// FIXME: Check that case is properly handled by all callers.
6405 DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD);
6406
6407 /// Handle a C++11 empty-declaration and attribute-declaration.
6409 SourceLocation SemiLoc);
6410
6412 /// Diagnose issues that are non-constant or that are extensions.
6414 /// Identify whether this function satisfies the formal rules for constexpr
6415 /// functions in the current lanugage mode (with no extensions).
6417 };
6418
6419 // Check whether a function declaration satisfies the requirements of a
6420 // constexpr function definition or a constexpr constructor definition. If so,
6421 // return true. If not, produce appropriate diagnostics (unless asked not to
6422 // by Kind) and return false.
6423 //
6424 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
6426 CheckConstexprKind Kind);
6427
6428 /// Diagnose methods which overload virtual methods in a base class
6429 /// without overriding any.
6431
6432 /// Check if a method overloads virtual methods in a base class without
6433 /// overriding any.
6434 void
6436 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6437 void
6439 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6440
6441 /// ActOnParamDefaultArgument - Check whether the default argument
6442 /// provided for a function parameter is well-formed. If so, attach it
6443 /// to the parameter declaration.
6444 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
6445 Expr *defarg);
6446
6447 /// ActOnParamUnparsedDefaultArgument - We've seen a default
6448 /// argument for a function parameter, but we can't parse it yet
6449 /// because we're inside a class definition. Note that this default
6450 /// argument will be parsed later.
6452 SourceLocation ArgLoc);
6453
6454 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
6455 /// the default argument for the parameter param failed.
6457 Expr *DefaultArg);
6459 SourceLocation EqualLoc);
6460 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6461 SourceLocation EqualLoc);
6462
6463 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6464 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6465 StringLiteral *Message = nullptr);
6466 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6467
6468 void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind,
6469 StringLiteral *DeletedMessage = nullptr);
6473
6474 NamedDecl *
6476 MultiTemplateParamsArg TemplateParamLists);
6479 RecordDecl *ClassDecl,
6480 const IdentifierInfo *Name);
6481
6483 SourceLocation Loc);
6485
6486 /// Stack containing information needed when in C++2a an 'auto' is encountered
6487 /// in a function declaration parameter type specifier in order to invent a
6488 /// corresponding template parameter in the enclosing abbreviated function
6489 /// template. This information is also present in LambdaScopeInfo, stored in
6490 /// the FunctionScopes stack.
6492
6493 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6494 std::unique_ptr<CXXFieldCollector> FieldCollector;
6495
6497 /// Set containing all declared private fields that are not used.
6499
6501
6502 /// PureVirtualClassDiagSet - a set of class declarations which we have
6503 /// emitted a list of pure virtual functions. Used to prevent emitting the
6504 /// same list more than once.
6505 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6506
6510
6511 /// All the delegating constructors seen so far in the file, used for
6512 /// cycle detection at the end of the TU.
6514
6515 /// The C++ "std" namespace, where the standard library resides.
6517
6518 /// The C++ "std::initializer_list" template, which is defined in
6519 /// <initializer_list>.
6521
6522 /// The C++ "std::type_identity" template, which is defined in
6523 /// <type_traits>.
6525
6526 // Contains the locations of the beginning of unparsed default
6527 // argument locations.
6528 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6529
6530 /// UndefinedInternals - all the used, undefined objects which require a
6531 /// definition in this translation unit.
6532 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6533
6534 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6536
6537 /// The C++ special members which we are currently in the process of
6538 /// declaring. If this process recursively triggers the declaration of the
6539 /// same special member, we should act as if it is not yet declared.
6541
6543
6544 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6545
6548 ParsingClassDepth++;
6550 }
6552 ParsingClassDepth--;
6554 }
6555
6557 CXXScopeSpec &SS,
6558 ParsedType TemplateTypeTy,
6559 IdentifierInfo *MemberOrBase);
6560
6561private:
6562 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6563 QualType ResultTy,
6564 ArrayRef<QualType> Args);
6565 // Helper for ActOnFields to check for all function pointer members.
6566 bool EntirelyFunctionPointers(const RecordDecl *Record);
6567
6568 // A cache representing if we've fully checked the various comparison category
6569 // types stored in ASTContext. The bit-index corresponds to the integer value
6570 // of a ComparisonCategoryType enumerator.
6571 llvm::SmallBitVector FullyCheckedComparisonCategories;
6572
6573 /// Check if there is a field shadowing.
6574 void CheckShadowInheritedFields(const SourceLocation &Loc,
6575 DeclarationName FieldName,
6576 const CXXRecordDecl *RD,
6577 bool DeclIsField = true);
6578
6579 ///@}
6580
6581 //
6582 //
6583 // -------------------------------------------------------------------------
6584 //
6585 //
6586
6587 /// \name C++ Exception Specifications
6588 /// Implementations are in SemaExceptionSpec.cpp
6589 ///@{
6590
6591public:
6592 /// All the overriding functions seen during a class definition
6593 /// that had their exception spec checks delayed, plus the overridden
6594 /// function.
6597
6598 /// All the function redeclarations seen during a class definition that had
6599 /// their exception spec checks delayed, plus the prior declaration they
6600 /// should be checked against. Except during error recovery, the new decl
6601 /// should always be a friend declaration, as that's the only valid way to
6602 /// redeclare a special member before its class is complete.
6605
6606 /// Determine if we're in a case where we need to (incorrectly) eagerly
6607 /// parse an exception specification to work around a libstdc++ bug.
6609
6610 /// Check the given noexcept-specifier, convert its expression, and compute
6611 /// the appropriate ExceptionSpecificationType.
6612 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6614
6615 CanThrowResult canThrow(const Stmt *E);
6616 /// Determine whether the callee of a particular function call can throw.
6617 /// E, D and Loc are all optional.
6618 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6621 const FunctionProtoType *FPT);
6624
6625 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6626 /// exception specification. Incomplete types, or pointers to incomplete types
6627 /// other than void are not allowed.
6628 ///
6629 /// \param[in,out] T The exception type. This will be decayed to a pointer
6630 /// type
6631 /// when the input is an array or a function type.
6633
6634 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6635 /// pointer to member to a function with an exception specification. This
6636 /// means that it is invalid to add another level of indirection.
6639
6640 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6641 /// exception specifications. Exception specifications are equivalent if
6642 /// they allow exactly the same set of exception types. It does not matter how
6643 /// that is achieved. See C++ [except.spec]p2.
6645 SourceLocation OldLoc,
6646 const FunctionProtoType *New,
6647 SourceLocation NewLoc);
6649 const PartialDiagnostic &NoteID,
6650 const FunctionProtoType *Old,
6651 SourceLocation OldLoc,
6652 const FunctionProtoType *New,
6653 SourceLocation NewLoc);
6654 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6655
6656 /// CheckExceptionSpecSubset - Check whether the second function type's
6657 /// exception specification is a subset (or equivalent) of the first function
6658 /// type. This is used by override and pointer assignment checks.
6660 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6661 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6662 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6663 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6664 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6665
6666 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6667 /// two functions have equivalent exception specs. This is part of the
6668 /// assignment and override compatibility check. We do not check the
6669 /// parameters of parameter function pointers recursively, as no sane
6670 /// programmer would even be able to write such a function type.
6672 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6673 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6674 SourceLocation TargetLoc, const FunctionProtoType *Source,
6675 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6676
6677 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6678
6679 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6680 /// spec is a subset of base spec.
6682 const CXXMethodDecl *Old);
6683
6684 ///@}
6685
6686 //
6687 //
6688 // -------------------------------------------------------------------------
6689 //
6690 //
6691
6692 /// \name Expressions
6693 /// Implementations are in SemaExpr.cpp
6694 ///@{
6695
6696public:
6697 /// Describes how the expressions currently being parsed are
6698 /// evaluated at run-time, if at all.
6700 /// The current expression and its subexpressions occur within an
6701 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6702 /// \c sizeof, where the type of the expression may be significant but
6703 /// no code will be generated to evaluate the value of the expression at
6704 /// run time.
6706
6707 /// The current expression occurs within a braced-init-list within
6708 /// an unevaluated operand. This is mostly like a regular unevaluated
6709 /// context, except that we still instantiate constexpr functions that are
6710 /// referenced here so that we can perform narrowing checks correctly.
6712
6713 /// The current expression occurs within a discarded statement.
6714 /// This behaves largely similarly to an unevaluated operand in preventing
6715 /// definitions from being required, but not in other ways.
6717
6718 /// The current expression occurs within an unevaluated
6719 /// operand that unconditionally permits abstract references to
6720 /// fields, such as a SIZE operator in MS-style inline assembly.
6722
6723 /// The current context is "potentially evaluated" in C++11 terms,
6724 /// but the expression is evaluated at compile-time (like the values of
6725 /// cases in a switch statement).
6727
6728 /// In addition of being constant evaluated, the current expression
6729 /// occurs in an immediate function context - either a consteval function
6730 /// or a consteval if statement.
6732
6733 /// The current expression is potentially evaluated at run time,
6734 /// which means that code may be generated to evaluate the value of the
6735 /// expression at run time.
6737
6738 /// The current expression is potentially evaluated, but any
6739 /// declarations referenced inside that expression are only used if
6740 /// in fact the current expression is used.
6741 ///
6742 /// This value is used when parsing default function arguments, for which
6743 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6744 /// through varargs) but do not want to mark declarations as "referenced"
6745 /// until the default argument is used.
6747 };
6748
6749 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6750 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6751 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6752 /// have been applied to all subexpressions of the enclosing full expression.
6753 /// This is cleared at the end of each full expression.
6756
6757 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6758
6759 /// Data structure used to record current or nested
6760 /// expression evaluation contexts.
6762 /// The expression evaluation context.
6764
6765 /// Whether the enclosing context needed a cleanup.
6767
6768 /// The number of active cleanup objects when we entered
6769 /// this expression evaluation context.
6771
6773
6774 /// The lambdas that are present within this context, if it
6775 /// is indeed an unevaluated context.
6777
6778 /// The declaration that provides context for lambda expressions
6779 /// and block literals if the normal declaration context does not
6780 /// suffice, e.g., in a default function argument.
6782
6783 /// Declaration for initializer if one is currently being
6784 /// parsed. Used when an expression has a possibly unreachable
6785 /// diagnostic to reference the declaration as a whole.
6787
6788 /// If we are processing a decltype type, a set of call expressions
6789 /// for which we have deferred checking the completeness of the return type.
6791
6792 /// If we are processing a decltype type, a set of temporary binding
6793 /// expressions for which we have deferred checking the destructor.
6795
6797
6798 /// Expressions appearing as the LHS of a volatile assignment in this
6799 /// context. We produce a warning for these when popping the context if
6800 /// they are not discarded-value expressions nor unevaluated operands.
6802
6803 /// Set of candidates for starting an immediate invocation.
6806
6807 /// Set of DeclRefExprs referencing a consteval function when used in a
6808 /// context not already known to be immediately invoked.
6810
6811 /// P2718R0 - Lifetime extension in range-based for loops.
6812 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6813 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6814 /// InLifetimeExtendingContext is true.
6816
6817 /// Small set of gathered accesses to potentially misaligned members
6818 /// due to the packed attribute.
6820
6821 /// \brief Describes whether we are in an expression constext which we have
6822 /// to handle differently.
6830
6831 // A context can be nested in both a discarded statement context and
6832 // an immediate function context, so they need to be tracked independently.
6836
6838
6839 // We are in a constant context, but we also allow
6840 // non constant expressions, for example for array bounds (which may be
6841 // VLAs).
6843
6844 /// Whether we are currently in a context in which all temporaries must be
6845 /// lifetime-extended, even if they're not bound to a reference (for
6846 /// example, in a for-range initializer).
6848
6849 /// Whether evaluating an expression for a switch case label.
6850 bool IsCaseExpr = false;
6851
6852 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6854
6855 // When evaluating immediate functions in the initializer of a default
6856 // argument or default member initializer, this is the declaration whose
6857 // default initializer is being evaluated and the location of the call
6858 // or constructor definition.
6862 : Loc(Loc), Decl(Decl), Context(Context) {
6863 assert(Decl && Context && "invalid initialization context");
6864 }
6865
6867 ValueDecl *Decl = nullptr;
6869 };
6870 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6871
6882
6888
6895
6900
6905 // C++23 [expr.const]p14:
6906 // An expression or conversion is in an immediate function
6907 // context if it is potentially evaluated and either:
6908 // * its innermost enclosing non-block scope is a function
6909 // parameter scope of an immediate function, or
6910 // * its enclosing statement is enclosed by the compound-
6911 // statement of a consteval if statement.
6914 }
6915
6923 };
6924
6926 assert(!ExprEvalContexts.empty() &&
6927 "Must be in an expression evaluation context");
6928 return ExprEvalContexts.back();
6929 }
6930
6932 assert(!ExprEvalContexts.empty() &&
6933 "Must be in an expression evaluation context");
6934 return ExprEvalContexts.back();
6935 }
6936
6938 assert(ExprEvalContexts.size() >= 2 &&
6939 "Must be in an expression evaluation context");
6940 return ExprEvalContexts[ExprEvalContexts.size() - 2];
6941 }
6942
6944 return const_cast<Sema *>(this)->parentEvaluationContext();
6945 }
6946
6951
6952 /// Increment when we find a reference; decrement when we find an ignored
6953 /// assignment. Ultimately the value is 0 if every reference is an ignored
6954 /// assignment.
6955 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
6956
6957 /// Used to control the generation of ExprWithCleanups.
6959
6960 /// ExprCleanupObjects - This is the stack of objects requiring
6961 /// cleanup that are created by the current full expression.
6963
6964 /// Determine whether the use of this declaration is valid, without
6965 /// emitting diagnostics.
6966 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
6967 // A version of DiagnoseUseOfDecl that should be used if overload resolution
6968 // has been used to find this declaration, which means we don't have to bother
6969 // checking the trailing requires clause.
6971 return DiagnoseUseOfDecl(
6972 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
6973 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
6974 /*SkipTrailingRequiresClause=*/true);
6975 }
6976
6977 /// Determine whether the use of this declaration is valid, and
6978 /// emit any corresponding diagnostics.
6979 ///
6980 /// This routine diagnoses various problems with referencing
6981 /// declarations that can occur when using a declaration. For example,
6982 /// it might warn if a deprecated or unavailable declaration is being
6983 /// used, or produce an error (and return true) if a C++0x deleted
6984 /// function is being used.
6985 ///
6986 /// \returns true if there was an error (this declaration cannot be
6987 /// referenced), false otherwise.
6989 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
6990 bool ObjCPropertyAccess = false,
6991 bool AvoidPartialAvailabilityChecks = false,
6992 ObjCInterfaceDecl *ClassReciever = nullptr,
6993 bool SkipTrailingRequiresClause = false);
6994
6995 /// Emit a note explaining that this function is deleted.
6997
6998 /// DiagnoseSentinelCalls - This routine checks whether a call or
6999 /// message-send is to a declaration with the sentinel attribute, and
7000 /// if so, it checks that the requirements of the sentinel are
7001 /// satisfied.
7003 ArrayRef<Expr *> Args);
7004
7006 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
7009
7011 ExpressionEvaluationContext NewContext, FunctionDecl *FD);
7012
7015 ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
7019
7021
7025
7026 /// Check whether E, which is either a discarded-value expression or an
7027 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
7028 /// lvalue, and if so, remove it from the list of volatile-qualified
7029 /// assignments that we are going to warn are deprecated.
7031
7033
7034 // Functions for marking a declaration referenced. These functions also
7035 // contain the relevant logic for marking if a reference to a function or
7036 // variable is an odr-use (in the C++11 sense). There are separate variants
7037 // for expressions referring to a decl; these exist because odr-use marking
7038 // needs to be delayed for some constant variables when we build one of the
7039 // named expressions.
7040 //
7041 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
7042 // should usually be true. This only needs to be set to false if the lack of
7043 // odr-use cannot be determined from the current context (for instance,
7044 // because the name denotes a virtual function and was written without an
7045 // explicit nested-name-specifier).
7046 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
7047
7048 /// Mark a function referenced, and check whether it is odr-used
7049 /// (C++ [basic.def.odr]p2, C99 6.9p3)
7051 bool MightBeOdrUse = true);
7052
7053 /// Mark a variable referenced, and check whether it is odr-used
7054 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
7055 /// used directly for normal expressions referring to VarDecl.
7057
7058 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
7059 ///
7060 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
7061 /// be handled with care if the DeclRefExpr is not newly-created.
7062 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
7063
7064 /// Perform reference-marking and odr-use handling for a MemberExpr.
7066
7067 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
7070 unsigned CapturingScopeIndex);
7071
7073 void CleanupVarDeclMarking();
7074
7075 /// Try to capture the given variable.
7076 ///
7077 /// \param Var The variable to capture.
7078 ///
7079 /// \param Loc The location at which the capture occurs.
7080 ///
7081 /// \param Kind The kind of capture, which may be implicit (for either a
7082 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
7083 ///
7084 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
7085 /// an explicit lambda capture.
7086 ///
7087 /// \param BuildAndDiagnose Whether we are actually supposed to add the
7088 /// captures or diagnose errors. If false, this routine merely check whether
7089 /// the capture can occur without performing the capture itself or complaining
7090 /// if the variable cannot be captured.
7091 ///
7092 /// \param CaptureType Will be set to the type of the field used to capture
7093 /// this variable in the innermost block or lambda. Only valid when the
7094 /// variable can be captured.
7095 ///
7096 /// \param DeclRefType Will be set to the type of a reference to the capture
7097 /// from within the current scope. Only valid when the variable can be
7098 /// captured.
7099 ///
7100 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
7101 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
7102 /// This is useful when enclosing lambdas must speculatively capture
7103 /// variables that may or may not be used in certain specializations of
7104 /// a nested generic lambda.
7105 ///
7106 /// \returns true if an error occurred (i.e., the variable cannot be
7107 /// captured) and false if the capture succeeded.
7109 TryCaptureKind Kind, SourceLocation EllipsisLoc,
7110 bool BuildAndDiagnose, QualType &CaptureType,
7111 QualType &DeclRefType,
7112 const unsigned *const FunctionScopeIndexToStopAt);
7113
7114 /// Try to capture the given variable.
7117 SourceLocation EllipsisLoc = SourceLocation());
7118
7119 /// Checks if the variable must be captured.
7121
7122 /// Given a variable, determine the type that a reference to that
7123 /// variable will have in the given scope.
7125
7126 /// Mark all of the declarations referenced within a particular AST node as
7127 /// referenced. Used when template instantiation instantiates a non-dependent
7128 /// type -- entities referenced by the type are now referenced.
7130
7131 /// Mark any declarations that appear within this expression or any
7132 /// potentially-evaluated subexpressions as "referenced".
7133 ///
7134 /// \param SkipLocalVariables If true, don't mark local variables as
7135 /// 'referenced'.
7136 /// \param StopAt Subexpressions that we shouldn't recurse into.
7138 bool SkipLocalVariables = false,
7139 ArrayRef<const Expr *> StopAt = {});
7140
7141 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
7142 /// conversion.
7143 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
7144
7145 /// Conditionally issue a diagnostic based on the statements's reachability
7146 /// analysis.
7147 ///
7148 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
7149 /// the function body is parsed, and then do a basic reachability analysis to
7150 /// determine if the statement is reachable. If it is unreachable, the
7151 /// diagnostic will not be emitted.
7152 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7153 const PartialDiagnostic &PD);
7154
7155 /// Conditionally issue a diagnostic based on the current
7156 /// evaluation context.
7157 ///
7158 /// \param Statement If Statement is non-null, delay reporting the
7159 /// diagnostic until the function body is parsed, and then do a basic
7160 /// reachability analysis to determine if the statement is reachable.
7161 /// If it is unreachable, the diagnostic will not be emitted.
7162 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
7163 const PartialDiagnostic &PD);
7164 /// Similar, but diagnostic is only produced if all the specified statements
7165 /// are reachable.
7166 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7167 const PartialDiagnostic &PD);
7168
7169 // Primary Expressions.
7170 SourceRange getExprRange(Expr *E) const;
7171
7172 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
7173 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
7174 bool HasTrailingLParen, bool IsAddressOfOperand,
7175 CorrectionCandidateCallback *CCC = nullptr,
7176 bool IsInlineAsmIdentifier = false,
7177 Token *KeywordReplacement = nullptr);
7178
7179 /// Decomposes the given name into a DeclarationNameInfo, its location, and
7180 /// possibly a list of template arguments.
7181 ///
7182 /// If this produces template arguments, it is permitted to call
7183 /// DecomposeTemplateName.
7184 ///
7185 /// This actually loses a lot of source location information for
7186 /// non-standard name kinds; we should consider preserving that in
7187 /// some way.
7188 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
7189 TemplateArgumentListInfo &Buffer,
7190 DeclarationNameInfo &NameInfo,
7191 const TemplateArgumentListInfo *&TemplateArgs);
7192
7193 /// Diagnose a lookup that found results in an enclosing class during error
7194 /// recovery. This usually indicates that the results were found in a
7195 /// dependent base class that could not be searched as part of a template
7196 /// definition. Always issues a diagnostic (though this may be only a warning
7197 /// in MS compatibility mode).
7198 ///
7199 /// Return \c true if the error is unrecoverable, or \c false if the caller
7200 /// should attempt to recover using these lookup results.
7201 bool DiagnoseDependentMemberLookup(const LookupResult &R);
7202
7203 /// Diagnose an empty lookup.
7204 ///
7205 /// \return false if new lookup candidates were found
7206 bool
7207 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
7208 CorrectionCandidateCallback &CCC,
7209 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
7210 ArrayRef<Expr *> Args = {},
7211 DeclContext *LookupCtx = nullptr);
7212
7213 /// If \p D cannot be odr-used in the current expression evaluation context,
7214 /// return a reason explaining why. Otherwise, return NOUR_None.
7216
7217 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7218 SourceLocation Loc,
7219 const CXXScopeSpec *SS = nullptr);
7220 DeclRefExpr *
7221 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7222 const DeclarationNameInfo &NameInfo,
7223 const CXXScopeSpec *SS = nullptr,
7224 NamedDecl *FoundD = nullptr,
7225 SourceLocation TemplateKWLoc = SourceLocation(),
7226 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7227
7228 /// BuildDeclRefExpr - Build an expression that references a
7229 /// declaration that does not require a closure capture.
7230 DeclRefExpr *
7231 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7232 const DeclarationNameInfo &NameInfo,
7233 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
7234 SourceLocation TemplateKWLoc = SourceLocation(),
7235 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7236
7237 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
7238 bool HasTrailingLParen);
7239
7240 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
7241 /// declaration name, generally during template instantiation.
7242 /// There's a large number of things which don't need to be done along
7243 /// this path.
7245 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
7246 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
7247
7248 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
7249 bool NeedsADL,
7250 bool AcceptInvalidDecl = false);
7251
7252 /// Complete semantic analysis for a reference to the given declaration.
7254 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
7255 NamedDecl *FoundD = nullptr,
7256 const TemplateArgumentListInfo *TemplateArgs = nullptr,
7257 bool AcceptInvalidDecl = false);
7258
7259 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
7260 // where Tokens representing function local predefined macros (such as
7261 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
7262 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
7263
7264 ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK);
7265 ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind);
7266 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
7267
7268 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
7269
7270 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
7272 Scope *UDLScope = nullptr);
7273 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
7274 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
7275 MultiExprArg Val);
7276 ExprResult ActOnCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
7277 unsigned NumUserSpecifiedExprs,
7278 SourceLocation InitLoc,
7279 SourceLocation LParenLoc,
7280 SourceLocation RParenLoc);
7281
7282 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
7283 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
7284 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
7285 /// from multiple tokens. However, the common case is that StringToks points
7286 /// to one string.
7287 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
7288 Scope *UDLScope = nullptr);
7289
7290 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
7291
7292 /// ControllingExprOrType is either an opaque pointer coming out of a
7293 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
7294 /// into two so we don't take a void *, but that's awkward because one of
7295 /// the operands is either a ParsedType or an Expr *, which doesn't lend
7296 /// itself to generic code very well.
7297 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
7298 SourceLocation DefaultLoc,
7299 SourceLocation RParenLoc,
7300 bool PredicateIsExpr,
7301 void *ControllingExprOrType,
7302 ArrayRef<ParsedType> ArgTypes,
7303 ArrayRef<Expr *> ArgExprs);
7304 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
7305 /// it'd be better to split this interface into two so we don't take a
7306 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
7307 /// isn't a trivial change.
7308 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
7309 SourceLocation DefaultLoc,
7310 SourceLocation RParenLoc,
7311 bool PredicateIsExpr,
7312 void *ControllingExprOrType,
7313 ArrayRef<TypeSourceInfo *> Types,
7314 ArrayRef<Expr *> Exprs);
7315
7316 // Binary/Unary Operators. 'Tok' is the token for the operator.
7317 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
7318 Expr *InputExpr, bool IsAfterAmp = false);
7319 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
7320 Expr *Input, bool IsAfterAmp = false);
7321
7322 /// Unary Operators. 'Tok' is the token for the operator.
7323 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
7324 Expr *Input, bool IsAfterAmp = false);
7325
7326 /// Determine whether the given expression is a qualified member
7327 /// access expression, of a form that could be turned into a pointer to member
7328 /// with the address-of operator.
7329 bool isQualifiedMemberAccess(Expr *E);
7330 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
7331 const Expr *Op,
7332 const CXXMethodDecl *MD);
7333
7334 /// CheckAddressOfOperand - The operand of & must be either a function
7335 /// designator or an lvalue designating an object. If it is an lvalue, the
7336 /// object cannot be declared with storage class register or be a bit field.
7337 /// Note: The usual conversions are *not* applied to the operand of the &
7338 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
7339 /// In C++, the operand might be an overloaded function name, in which case
7340 /// we allow the '&' but retain the overloaded-function type.
7341 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
7342
7343 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
7344 /// _Alignas(type-name) .
7345 /// [dcl.align] An alignment-specifier of the form
7346 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
7347 ///
7348 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
7349 /// _Alignas(_Alignof(type-name)).
7350 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
7351 SourceLocation OpLoc, SourceRange R);
7352 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
7353 SourceLocation OpLoc, SourceRange R);
7354
7355 /// Build a sizeof or alignof expression given a type operand.
7356 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
7357 SourceLocation OpLoc,
7358 UnaryExprOrTypeTrait ExprKind,
7359 SourceRange R);
7360
7361 /// Build a sizeof or alignof expression given an expression
7362 /// operand.
7363 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
7364 UnaryExprOrTypeTrait ExprKind);
7365
7366 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
7367 /// expr and the same for @c alignof and @c __alignof
7368 /// Note that the ArgRange is invalid if isType is false.
7369 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
7370 UnaryExprOrTypeTrait ExprKind,
7371 bool IsType, void *TyOrEx,
7372 SourceRange ArgRange);
7373
7374 /// Check for operands with placeholder types and complain if found.
7375 /// Returns ExprError() if there was an error and no recovery was possible.
7377 bool CheckVecStepExpr(Expr *E);
7378
7379 /// Check the constraints on expression operands to unary type expression
7380 /// and type traits.
7381 ///
7382 /// Completes any types necessary and validates the constraints on the operand
7383 /// expression. The logic mostly mirrors the type-based overload, but may
7384 /// modify the expression as it completes the type for that expression through
7385 /// template instantiation, etc.
7387
7388 /// Check the constraints on operands to unary expression and type
7389 /// traits.
7390 ///
7391 /// This will complete any types necessary, and validate the various
7392 /// constraints on those operands.
7393 ///
7394 /// The UsualUnaryConversions() function is *not* called by this routine.
7395 /// C99 6.3.2.1p[2-4] all state:
7396 /// Except when it is the operand of the sizeof operator ...
7397 ///
7398 /// C++ [expr.sizeof]p4
7399 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
7400 /// standard conversions are not applied to the operand of sizeof.
7401 ///
7402 /// This policy is followed for all of the unary trait expressions.
7403 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
7404 SourceRange ExprRange,
7405 UnaryExprOrTypeTrait ExprKind,
7406 StringRef KWName);
7407
7408 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
7409 tok::TokenKind Kind, Expr *Input);
7410
7411 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
7412 MultiExprArg ArgExprs,
7413 SourceLocation RLoc);
7414 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
7415 Expr *Idx, SourceLocation RLoc);
7416
7417 ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx,
7418 SourceLocation RBLoc);
7419
7420 ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
7421 Expr *ColumnIdx,
7422 SourceLocation RBLoc);
7423
7424 /// ConvertArgumentsForCall - Converts the arguments specified in
7425 /// Args/NumArgs to the parameter types of the function FDecl with
7426 /// function prototype Proto. Call is the call expression itself, and
7427 /// Fn is the function expression. For a C++ member function, this
7428 /// routine does not attempt to convert the object argument. Returns
7429 /// true if the call is ill-formed.
7430 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
7431 const FunctionProtoType *Proto,
7432 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
7433 bool ExecConfig = false);
7434
7435 /// CheckStaticArrayArgument - If the given argument corresponds to a static
7436 /// array parameter, check that it is non-null, and that if it is formed by
7437 /// array-to-pointer decay, the underlying array is sufficiently large.
7438 ///
7439 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
7440 /// the array type derivation, then for each call to the function, the value
7441 /// of the corresponding actual argument shall provide access to the first
7442 /// element of an array with at least as many elements as specified by the
7443 /// size expression.
7444 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
7445 const Expr *ArgExpr);
7446
7447 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
7448 /// This provides the location of the left/right parens and a list of comma
7449 /// locations.
7450 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7451 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7452 Expr *ExecConfig = nullptr);
7453
7454 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
7455 /// This provides the location of the left/right parens and a list of comma
7456 /// locations.
7457 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7458 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7459 Expr *ExecConfig = nullptr,
7460 bool IsExecConfig = false,
7461 bool AllowRecovery = false);
7462
7463 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
7464 // with the specified CallArgs
7465 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
7466 MultiExprArg CallArgs);
7467
7469
7470 /// BuildResolvedCallExpr - Build a call to a resolved expression,
7471 /// i.e. an expression not of \p OverloadTy. The expression should
7472 /// unary-convert to an expression of function-pointer or
7473 /// block-pointer type.
7474 ///
7475 /// \param NDecl the declaration being called, if available
7477 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
7478 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
7479 Expr *Config = nullptr, bool IsExecConfig = false,
7480 ADLCallKind UsesADL = ADLCallKind::NotADL);
7481
7483 ParsedType &Ty, SourceLocation RParenLoc,
7484 Expr *CastExpr);
7485
7486 /// Prepares for a scalar cast, performing all the necessary stages
7487 /// except the final cast and returning the kind required.
7489
7490 /// Build an altivec or OpenCL literal.
7492 SourceLocation RParenLoc, Expr *E,
7493 TypeSourceInfo *TInfo);
7494
7495 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7496 /// the ParenListExpr into a sequence of comma binary operators.
7498
7500 SourceLocation RParenLoc, Expr *InitExpr);
7501
7503 TypeSourceInfo *TInfo,
7504 SourceLocation RParenLoc,
7505 Expr *LiteralExpr);
7506
7507 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7508 SourceLocation RBraceLoc);
7509
7510 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7511 SourceLocation RBraceLoc);
7512
7513 /// Binary Operators. 'Tok' is the token for the operator.
7515 Expr *LHSExpr, Expr *RHSExpr);
7517 Expr *LHSExpr, Expr *RHSExpr,
7518 bool ForFoldExpression = false);
7519
7520 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7521 /// operator @p Opc at location @c TokLoc. This routine only supports
7522 /// built-in operations; ActOnBinOp handles overloaded operators.
7524 Expr *LHSExpr, Expr *RHSExpr,
7525 bool ForFoldExpression = false);
7527 UnresolvedSetImpl &Functions);
7528
7529 /// Look for instances where it is likely the comma operator is confused with
7530 /// another operator. There is an explicit list of acceptable expressions for
7531 /// the left hand side of the comma operator, otherwise emit a warning.
7532 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7533
7534 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7535 /// in the case of a the GNU conditional expr extension.
7537 SourceLocation ColonLoc, Expr *CondExpr,
7538 Expr *LHSExpr, Expr *RHSExpr);
7539
7540 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7542 LabelDecl *TheDecl);
7543
7544 void ActOnStartStmtExpr();
7545 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7546 SourceLocation RPLoc);
7548 SourceLocation RPLoc, unsigned TemplateDepth);
7549 // Handle the final expression in a statement expression.
7551 void ActOnStmtExprError();
7552
7553 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
7556 bool isBrackets; // true if [expr], false if .ident
7557 union {
7560 } U;
7561 };
7562
7563 /// __builtin_offsetof(type, a.b[123][456].c)
7565 TypeSourceInfo *TInfo,
7566 ArrayRef<OffsetOfComponent> Components,
7567 SourceLocation RParenLoc);
7570 ParsedType ParsedArgTy,
7571 ArrayRef<OffsetOfComponent> Components,
7572 SourceLocation RParenLoc);
7573
7574 // __builtin_choose_expr(constExpr, expr1, expr2)
7575 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7576 Expr *LHSExpr, Expr *RHSExpr,
7577 SourceLocation RPLoc);
7578
7579 // __builtin_va_arg(expr, type)
7581 SourceLocation RPLoc);
7583 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7584
7585 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7586 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7588 SourceLocation BuiltinLoc,
7589 SourceLocation RPLoc);
7590
7591 // #embed
7593 StringLiteral *BinaryData, StringRef FileName);
7594
7595 // Build a potentially resolved SourceLocExpr.
7597 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7598 DeclContext *ParentContext);
7599
7600 // __null
7602
7603 bool CheckCaseExpression(Expr *E);
7604
7605 //===------------------------- "Block" Extension ------------------------===//
7606
7607 /// ActOnBlockStart - This callback is invoked when a block literal is
7608 /// started.
7609 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7610
7611 /// ActOnBlockArguments - This callback allows processing of block arguments.
7612 /// If there are no arguments, this is still invoked.
7613 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7614 Scope *CurScope);
7615
7616 /// ActOnBlockError - If there is an error parsing a block, this callback
7617 /// is invoked to pop the information about the block from the action impl.
7618 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7619
7620 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7621 /// literal was successfully completed. ^(int x){...}
7623 Scope *CurScope);
7624
7625 //===---------------------------- Clang Extensions ----------------------===//
7626
7627 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7628 /// provided arguments.
7629 ///
7630 /// __builtin_convertvector( value, dst type )
7631 ///
7633 SourceLocation BuiltinLoc,
7634 SourceLocation RParenLoc);
7635
7636 //===---------------------------- OpenCL Features -----------------------===//
7637
7638 /// Parse a __builtin_astype expression.
7639 ///
7640 /// __builtin_astype( value, dst type )
7641 ///
7642 ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
7643 SourceLocation BuiltinLoc,
7644 SourceLocation RParenLoc);
7645
7646 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7648 SourceLocation BuiltinLoc,
7649 SourceLocation RParenLoc);
7650
7651 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7653 ArrayRef<Expr *> SubExprs,
7654 QualType T = QualType());
7655
7656 /// Cast a base object to a member's actual type.
7657 ///
7658 /// There are two relevant checks:
7659 ///
7660 /// C++ [class.access.base]p7:
7661 ///
7662 /// If a class member access operator [...] is used to access a non-static
7663 /// data member or non-static member function, the reference is ill-formed
7664 /// if the left operand [...] cannot be implicitly converted to a pointer to
7665 /// the naming class of the right operand.
7666 ///
7667 /// C++ [expr.ref]p7:
7668 ///
7669 /// If E2 is a non-static data member or a non-static member function, the
7670 /// program is ill-formed if the class of which E2 is directly a member is
7671 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7672 ///
7673 /// Note that the latter check does not consider access; the access of the
7674 /// "real" base class is checked as appropriate when checking the access of
7675 /// the member name.
7677 NestedNameSpecifier Qualifier,
7678 NamedDecl *FoundDecl,
7679 NamedDecl *Member);
7680
7681 /// CheckCallReturnType - Checks that a call expression's return type is
7682 /// complete. Returns true on failure. The location passed in is the location
7683 /// that best represents the call.
7684 bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
7685 CallExpr *CE, FunctionDecl *FD);
7686
7687 /// Emit a warning for all pending noderef expressions that we recorded.
7688 void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec);
7689
7691
7692 /// Instantiate or parse a C++ default argument expression as necessary.
7693 /// Return true on error.
7695 ParmVarDecl *Param, Expr *Init = nullptr,
7696 bool SkipImmediateInvocations = true);
7697
7698 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7699 /// the default expr if needed.
7701 ParmVarDecl *Param, Expr *Init = nullptr);
7702
7703 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7704 /// invocation.
7706
7708
7709 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7710 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7711
7712 /// Abstract base class used for diagnosing integer constant
7713 /// expression violations.
7715 public:
7717
7719
7720 virtual SemaDiagnosticBuilder
7721 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7723 SourceLocation Loc) = 0;
7726 };
7727
7728 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7729 /// and reports the appropriate diagnostics. Returns false on success.
7730 /// Can optionally return the value of the expression.
7733 VerifyICEDiagnoser &Diagnoser,
7737 unsigned DiagID,
7740 VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result = nullptr,
7744 AllowFoldKind CanFold = AllowFoldKind::No) {
7745 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7746 }
7747
7748 /// DiagnoseAssignmentAsCondition - Given that an expression is
7749 /// being used as a boolean condition, warn if it's an assignment.
7751
7752 /// Redundant parentheses over an equality comparison can indicate
7753 /// that the user intended an assignment used as condition.
7755
7757 public:
7759 FullExprArg(Sema &actions) : E(nullptr) {}
7760
7761 ExprResult release() { return E; }
7762
7763 Expr *get() const { return E; }
7764
7765 Expr *operator->() { return E; }
7766
7767 private:
7768 // FIXME: No need to make the entire Sema class a friend when it's just
7769 // Sema::MakeFullExpr that needs access to the constructor below.
7770 friend class Sema;
7771
7772 explicit FullExprArg(Expr *expr) : E(expr) {}
7773
7774 Expr *E;
7775 };
7776
7778 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7779 }
7781 return FullExprArg(
7782 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7783 }
7785 ExprResult FE =
7786 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7787 /*DiscardedValue*/ true);
7788 return FullExprArg(FE.get());
7789 }
7790
7791 class ConditionResult {
7792 Decl *ConditionVar;
7793 ExprResult Condition;
7794 bool Invalid;
7795 std::optional<bool> KnownValue;
7796
7797 friend class Sema;
7798 ConditionResult(Sema &S, Decl *ConditionVar, ExprResult Condition,
7799 bool IsConstexpr)
7800 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7801 if (IsConstexpr && Condition.get()) {
7802 if (std::optional<llvm::APSInt> Val =
7803 Condition.get()->getIntegerConstantExpr(S.Context)) {
7804 KnownValue = !!(*Val);
7805 }
7806 }
7807 }
7808 explicit ConditionResult(bool Invalid)
7809 : ConditionVar(nullptr), Condition(Invalid), Invalid(Invalid),
7810 KnownValue(std::nullopt) {}
7811
7812 public:
7813 ConditionResult() : ConditionResult(false) {}
7814 bool isInvalid() const { return Invalid; }
7815 std::pair<VarDecl *, Expr *> get() const {
7816 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7817 Condition.get());
7818 }
7819 std::optional<bool> getKnownValue() const { return KnownValue; }
7820 };
7822
7823 /// CheckBooleanCondition - Diagnose problems involving the use of
7824 /// the given expression as a boolean condition (e.g. in an if
7825 /// statement). Also performs the standard function and array
7826 /// decays, possibly changing the input variable.
7827 ///
7828 /// \param Loc - A location associated with the condition, e.g. the
7829 /// 'if' keyword.
7830 /// \return true iff there were any errors
7832 bool IsConstexpr = false);
7833
7834 enum class ConditionKind {
7835 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7836 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7837 Switch ///< An integral condition for a 'switch' statement.
7838 };
7839
7840 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7841 ConditionKind CK, bool MissingOK = false);
7842
7843 QualType CheckConditionalOperands( // C99 6.5.15
7845 ExprObjectKind &OK, SourceLocation QuestionLoc);
7846
7847 /// Emit a specialized diagnostic when one expression is a null pointer
7848 /// constant and the other is not a pointer. Returns true if a diagnostic is
7849 /// emitted.
7850 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7851 SourceLocation QuestionLoc);
7852
7853 /// type checking for vector binary operators.
7855 SourceLocation Loc, bool IsCompAssign,
7856 bool AllowBothBool, bool AllowBoolConversion,
7857 bool AllowBoolOperation, bool ReportInvalid);
7858
7859 /// Return a signed ext_vector_type that is of identical size and number of
7860 /// elements. For floating point vectors, return an integer type of identical
7861 /// size and number of elements. In the non ext_vector_type case, search from
7862 /// the largest type to the smallest type to avoid cases where long long ==
7863 /// long, where long gets picked over long long.
7866
7867 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7868 /// operates on extended vector types. Instead of producing an IntTy result,
7869 /// like a scalar comparison, a vector comparison produces a vector of integer
7870 /// types.
7872 SourceLocation Loc,
7873 BinaryOperatorKind Opc);
7875 SourceLocation Loc,
7876 BinaryOperatorKind Opc);
7878 SourceLocation Loc,
7879 BinaryOperatorKind Opc);
7881 SourceLocation Loc,
7882 BinaryOperatorKind Opc);
7883 // type checking for sizeless vector binary operators.
7885 SourceLocation Loc, bool IsCompAssign,
7886 ArithConvKind OperationKind);
7887
7888 /// Type checking for matrix binary operators.
7890 SourceLocation Loc,
7891 bool IsCompAssign);
7893 SourceLocation Loc, bool IsCompAssign);
7894
7895 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7896 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7897 /// VLST) allowed?
7898 ///
7899 /// This will also return false if the two given types do not make sense from
7900 /// the perspective of SVE bitcasts.
7901 bool isValidSveBitcast(QualType srcType, QualType destType);
7902
7903 /// Are the two types matrix types and do they have the same dimensions i.e.
7904 /// do they have the same number of rows and the same number of columns?
7906
7907 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7908
7909 /// Are the two types lax-compatible vector types? That is, given
7910 /// that one of them is a vector, do they have equal storage sizes,
7911 /// where the storage size is the number of elements times the element
7912 /// size?
7913 ///
7914 /// This will also return false if either of the types is neither a
7915 /// vector nor a real type.
7916 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
7917
7918 /// Is this a legal conversion between two types, one of which is
7919 /// known to be a vector type?
7920 bool isLaxVectorConversion(QualType srcType, QualType destType);
7921
7922 // This returns true if at least one of the types is an altivec vector.
7923 bool anyAltivecTypes(QualType srcType, QualType destType);
7924
7925 // type checking C++ declaration initializers (C++ [dcl.init]).
7926
7927 /// Check a cast of an unknown-any type. We intentionally only
7928 /// trigger this for C-style casts.
7931 ExprValueKind &VK, CXXCastPath &Path);
7932
7933 /// Force an expression with unknown-type to an expression of the
7934 /// given type.
7936
7937 /// Type-check an expression that's being passed to an
7938 /// __unknown_anytype parameter.
7940 QualType &paramType);
7941
7942 // CheckMatrixCast - Check type constraints for matrix casts.
7943 // We allow casting between matrixes of the same dimensions i.e. when they
7944 // have the same number of rows and column. Returns true if the cast is
7945 // invalid.
7946 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
7947 CastKind &Kind);
7948
7949 // CheckVectorCast - check type constraints for vectors.
7950 // Since vectors are an extension, there are no C standard reference for this.
7951 // We allow casting between vectors and integer datatypes of the same size.
7952 // returns true if the cast is invalid
7953 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
7954 CastKind &Kind);
7955
7956 /// Prepare `SplattedExpr` for a vector splat operation, adding
7957 /// implicit casts if necessary.
7958 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
7959
7960 /// Prepare `SplattedExpr` for a matrix splat operation, adding
7961 /// implicit casts if necessary.
7962 ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr);
7963
7964 // CheckExtVectorCast - check type constraints for extended vectors.
7965 // Since vectors are an extension, there are no C standard reference for this.
7966 // We allow casting between vectors and integer datatypes of the same size,
7967 // or vectors and the element type of that vector.
7968 // returns the cast expr
7970 CastKind &Kind);
7971
7973 return K == ConditionKind::Switch ? Context.IntTy : Context.BoolTy;
7974 }
7975
7976 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2), converts
7977 // functions and arrays to their respective pointers (C99 6.3.2.1), and
7978 // promotes floating-piont types according to the language semantics.
7980
7981 // UsualUnaryFPConversions - promotes floating-point types according to the
7982 // current language semantics.
7984
7985 /// CallExprUnaryConversions - a special case of an unary conversion
7986 /// performed on a function designator of a call expression.
7988
7989 // DefaultFunctionArrayConversion - converts functions and arrays
7990 // to their respective pointers (C99 6.3.2.1).
7992
7993 // DefaultFunctionArrayLvalueConversion - converts functions and
7994 // arrays to their respective pointers and performs the
7995 // lvalue-to-rvalue conversion.
7997 bool Diagnose = true);
7998
7999 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
8000 // the operand. This function is a no-op if the operand has a function type
8001 // or an array type.
8003
8004 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
8005 // do not have a prototype. Integer promotions are performed on each
8006 // argument, and arguments that have type float are promoted to double.
8008
8010 const FunctionProtoType *Proto,
8011 Expr *Fn);
8012
8013 /// Determine the degree of POD-ness for an expression.
8014 /// Incomplete types are considered POD, since this check can be performed
8015 /// when we're in an unevaluated context.
8017
8018 /// Check to see if the given expression is a valid argument to a variadic
8019 /// function, issuing a diagnostic if not.
8020 void checkVariadicArgument(const Expr *E, VariadicCallType CT);
8021
8022 /// GatherArgumentsForCall - Collector argument expressions for various
8023 /// form of call prototypes.
8025 SourceLocation CallLoc, FunctionDecl *FDecl,
8026 const FunctionProtoType *Proto, unsigned FirstParam,
8029 bool AllowExplicit = false, bool IsListInitialization = false);
8030
8031 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
8032 // will create a runtime trap if the resulting type is not a POD type.
8034 FunctionDecl *FDecl);
8035
8036 // Check that the usual arithmetic conversions can be performed on this pair
8037 // of expressions that might be of enumeration type.
8039 ArithConvKind ACK);
8040
8041 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
8042 // operands and then handles various conversions that are common to binary
8043 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
8044 // routine returns the first non-arithmetic type found. The client is
8045 // responsible for emitting appropriate error diagnostics.
8047 SourceLocation Loc, ArithConvKind ACK);
8048
8050 switch (ConvTy) {
8051 default:
8052 return false;
8056 return true;
8057 }
8058 llvm_unreachable("impossible");
8059 }
8060
8061 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
8062 /// assignment conversion type specified by ConvTy. This returns true if the
8063 /// conversion was invalid or false if the conversion was accepted.
8065 QualType DstType, QualType SrcType,
8066 Expr *SrcExpr, AssignmentAction Action,
8067 bool *Complained = nullptr);
8068
8069 /// CheckAssignmentConstraints - Perform type checking for assignment,
8070 /// argument passing, variable initialization, and function return values.
8071 /// C99 6.5.16.
8073 QualType LHSType,
8074 QualType RHSType);
8075
8076 /// Check assignment constraints and optionally prepare for a conversion of
8077 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
8078 /// is true.
8080 ExprResult &RHS, CastKind &Kind,
8081 bool ConvertRHS = true);
8082
8083 /// Check assignment constraints for an assignment of RHS to LHSType.
8084 ///
8085 /// \param LHSType The destination type for the assignment.
8086 /// \param RHS The source expression for the assignment.
8087 /// \param Diagnose If \c true, diagnostics may be produced when checking
8088 /// for assignability. If a diagnostic is produced, \p RHS will be
8089 /// set to ExprError(). Note that this function may still return
8090 /// without producing a diagnostic, even for an invalid assignment.
8091 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
8092 /// in an audited Core Foundation API and does not need to be checked
8093 /// for ARC retain issues.
8094 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
8095 /// conversions necessary to perform the assignment. If \c false,
8096 /// \p Diagnose must also be \c false.
8098 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
8099 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
8100
8101 // If the lhs type is a transparent union, check whether we
8102 // can initialize the transparent union with the given expression.
8104 ExprResult &RHS);
8105
8106 /// the following "Check" methods will return a valid/converted QualType
8107 /// or a null QualType (indicating an error diagnostic was issued).
8108
8109 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
8111 ExprResult &RHS);
8112
8113 /// Diagnose cases where a scalar was implicitly converted to a vector and
8114 /// diagnose the underlying types. Otherwise, diagnose the error
8115 /// as invalid vector logical operands for non-C++ cases.
8117 ExprResult &RHS);
8118
8120 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8121 BinaryOperatorKind Opc);
8122 QualType CheckRemainderOperands( // C99 6.5.5
8123 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8124 bool IsCompAssign = false);
8125 QualType CheckAdditionOperands( // C99 6.5.6
8126 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8127 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8129 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8130 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8131 QualType CheckShiftOperands( // C99 6.5.7
8132 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8133 BinaryOperatorKind Opc, bool IsCompAssign = false);
8135 QualType CheckCompareOperands( // C99 6.5.8/9
8136 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8137 BinaryOperatorKind Opc);
8138 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
8139 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8140 BinaryOperatorKind Opc);
8141 QualType CheckLogicalOperands( // C99 6.5.[13,14]
8142 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8143 BinaryOperatorKind Opc);
8144 // CheckAssignmentOperands is used for both simple and compound assignment.
8145 // For simple assignment, pass both expressions and a null converted type.
8146 // For compound assignment, pass both expressions and the converted type.
8147 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
8148 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
8149 BinaryOperatorKind Opc);
8150
8151 /// To be used for checking whether the arguments being passed to
8152 /// function exceeds the number of parameters expected for it.
8153 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
8154 bool PartialOverloading = false) {
8155 // We check whether we're just after a comma in code-completion.
8156 if (NumArgs > 0 && PartialOverloading)
8157 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
8158 return NumArgs > NumParams;
8159 }
8160
8161 /// Whether the AST is currently being rebuilt to correct immediate
8162 /// invocations. Immediate invocation candidates and references to consteval
8163 /// functions aren't tracked when this is set.
8165
8171
8172 /// Determines whether we are currently in a context that
8173 /// is not evaluated as per C++ [expr] p5.
8176 }
8177
8181
8185
8189
8196
8197 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8199 assert(!ExprEvalContexts.empty() &&
8200 "Must be in an expression evaluation context");
8201 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8203 Ctx.DelayedDefaultInitializationContext)
8204 return Ctx.DelayedDefaultInitializationContext;
8205 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8206 Ctx.isUnevaluated())
8207 break;
8208 }
8209 return std::nullopt;
8210 }
8211
8212 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8214 assert(!ExprEvalContexts.empty() &&
8215 "Must be in an expression evaluation context");
8216 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
8217 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8219 !Ctx.DelayedDefaultInitializationContext && Res)
8220 break;
8221 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8222 Ctx.isUnevaluated())
8223 break;
8224 Res = Ctx.DelayedDefaultInitializationContext;
8225 }
8226 return Res;
8227 }
8228
8232
8233 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
8234 /// SelfAssigned when inside a CXXMethodDecl.
8235 const FieldDecl *
8237
8239
8240 template <typename... Ts>
8242 const Ts &...Args) {
8243 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8244 return RequireCompleteType(Loc, T, CompleteTypeKind::Normal, Diagnoser);
8245 }
8246
8247 template <typename... Ts>
8248 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
8249 const Ts &...Args) {
8250 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8252 }
8253
8254 /// Abstract class used to diagnose incomplete types.
8257
8258 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
8259 virtual ~TypeDiagnoser() {}
8260 };
8261
8262 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
8263 protected:
8264 unsigned DiagID;
8265 std::tuple<const Ts &...> Args;
8266
8267 template <std::size_t... Is>
8269 std::index_sequence<Is...>) const {
8270 // Apply all tuple elements to the builder in order.
8271 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
8272 (void)Dummy;
8273 }
8274
8275 public:
8276 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8277 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
8278 assert(DiagID != 0 && "no diagnostic for type diagnoser");
8279 }
8280
8281 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8282 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
8283 emit(DB, std::index_sequence_for<Ts...>());
8284 DB << T;
8285 }
8286 };
8287
8288 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
8289 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
8290 /// For example, a diagnostic with no other parameters would generally have
8291 /// the form "...%select{incomplete|sizeless}0 type %1...".
8292 template <typename... Ts>
8294 public:
8295 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8296 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
8297
8298 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8299 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
8300 this->emit(DB, std::index_sequence_for<Ts...>());
8301 DB << T->isSizelessType() << T;
8302 }
8303 };
8304
8305 /// Check an argument list for placeholders that we won't try to
8306 /// handle later.
8308
8309 /// The C++ "std::source_location::__impl" struct, defined in
8310 /// <source_location>.
8312
8313 /// A stack of expression evaluation contexts.
8315
8316 // Set of failed immediate invocations to avoid double diagnosing.
8318
8319 /// List of SourceLocations where 'self' is implicitly retained inside a
8320 /// block.
8323
8324 /// Do an explicit extend of the given block pointer if we're in ARC.
8326
8327 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
8330
8331private:
8332 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
8333
8334 /// Methods for marking which expressions involve dereferencing a pointer
8335 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
8336 /// they are parsed, meaning that a noderef pointer may not be accessed. For
8337 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
8338 /// `*p`, but need to check that `address of` is called on it. This requires
8339 /// keeping a container of all pending expressions and checking if the address
8340 /// of them are eventually taken.
8341 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
8342 void CheckAddressOfNoDeref(const Expr *E);
8343
8344 ///@}
8345
8346 //
8347 //
8348 // -------------------------------------------------------------------------
8349 //
8350 //
8351
8352 /// \name C++ Expressions
8353 /// Implementations are in SemaExprCXX.cpp
8354 ///@{
8355
8356public:
8357 /// The C++ "std::bad_alloc" class, which is defined by the C++
8358 /// standard library.
8360
8361 /// The C++ "std::align_val_t" enum class, which is defined by the C++
8362 /// standard library.
8364
8365 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
8367
8368 /// A flag to remember whether the implicit forms of operator new and delete
8369 /// have been declared.
8371
8372 /// Delete-expressions to be analyzed at the end of translation unit
8373 ///
8374 /// This list contains class members, and locations of delete-expressions
8375 /// that could not be proven as to whether they mismatch with new-expression
8376 /// used in initializer of the field.
8377 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
8378
8379 /// Handle the result of the special case name lookup for inheriting
8380 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
8381 /// constructor names in member using declarations, even if 'X' is not the
8382 /// name of the corresponding type.
8384 SourceLocation NameLoc,
8385 const IdentifierInfo &Name);
8386
8388 SourceLocation NameLoc, Scope *S,
8389 CXXScopeSpec &SS, bool EnteringContext);
8391 Scope *S, CXXScopeSpec &SS,
8392 ParsedType ObjectType, bool EnteringContext);
8393
8395 ParsedType ObjectType);
8396
8397 /// Build a C++ typeid expression with a type operand.
8398 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8399 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8400
8401 /// Build a C++ typeid expression with an expression operand.
8402 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8403 Expr *Operand, SourceLocation RParenLoc);
8404
8405 /// ActOnCXXTypeid - Parse typeid( something ).
8407 bool isType, void *TyOrExpr,
8408 SourceLocation RParenLoc);
8409
8410 /// Build a Microsoft __uuidof expression with a type operand.
8411 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8412 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8413
8414 /// Build a Microsoft __uuidof expression with an expression operand.
8415 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8416 Expr *Operand, SourceLocation RParenLoc);
8417
8418 /// ActOnCXXUuidof - Parse __uuidof( something ).
8420 bool isType, void *TyOrExpr,
8421 SourceLocation RParenLoc);
8422
8423 //// ActOnCXXThis - Parse 'this' pointer.
8425
8426 /// Check whether the type of 'this' is valid in the current context.
8428
8429 /// Build a CXXThisExpr and mark it referenced in the current context.
8430 Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
8432
8433 /// Try to retrieve the type of the 'this' pointer.
8434 ///
8435 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8437
8438 /// When non-NULL, the C++ 'this' expression is allowed despite the
8439 /// current context not being a non-static member function. In such cases,
8440 /// this provides the type used for 'this'.
8442
8443 /// RAII object used to temporarily allow the C++ 'this' expression
8444 /// to be used, with the given qualifiers on the current class type.
8446 Sema &S;
8447 QualType OldCXXThisTypeOverride;
8448 bool Enabled;
8449
8450 public:
8451 /// Introduce a new scope where 'this' may be allowed (when enabled),
8452 /// using the given declaration (which is either a class template or a
8453 /// class) along with the given qualifiers.
8454 /// along with the qualifiers placed on '*this'.
8455 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8456 bool Enabled = true);
8457
8461 };
8462
8463 /// Make sure the value of 'this' is actually available in the current
8464 /// context, if it is a potentially evaluated context.
8465 ///
8466 /// \param Loc The location at which the capture of 'this' occurs.
8467 ///
8468 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8469 /// capture list.
8470 ///
8471 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8472 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8473 /// This is useful when enclosing lambdas must speculatively capture
8474 /// 'this' that may or may not be used in certain specializations of
8475 /// a nested generic lambda (depending on whether the name resolves to
8476 /// a non-static member function or a static function).
8477 /// \return returns 'true' if failed, 'false' if success.
8479 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8480 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8481 bool ByCopy = false);
8482
8483 /// Determine whether the given type is the type of *this that is used
8484 /// outside of the body of a member function for a type that is currently
8485 /// being defined.
8487
8488 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8490
8491 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8493
8494 //// ActOnCXXThrow - Parse throw expressions.
8497 bool IsThrownVarInScope);
8498
8499 /// CheckCXXThrowOperand - Validate the operand of a throw.
8500 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8501
8502 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8503 /// Can be interpreted either as function-style casting ("int(x)")
8504 /// or class type construction ("ClassType(x,y,z)")
8505 /// or creation of a value-initialized type ("int()").
8507 SourceLocation LParenOrBraceLoc,
8508 MultiExprArg Exprs,
8509 SourceLocation RParenOrBraceLoc,
8510 bool ListInitialization);
8511
8513 SourceLocation LParenLoc,
8514 MultiExprArg Exprs,
8515 SourceLocation RParenLoc,
8516 bool ListInitialization);
8517
8518 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8519 ///
8520 /// E.g.:
8521 /// @code new (memory) int[size][4] @endcode
8522 /// or
8523 /// @code ::new Foo(23, "hello") @endcode
8524 ///
8525 /// \param StartLoc The first location of the expression.
8526 /// \param UseGlobal True if 'new' was prefixed with '::'.
8527 /// \param PlacementLParen Opening paren of the placement arguments.
8528 /// \param PlacementArgs Placement new arguments.
8529 /// \param PlacementRParen Closing paren of the placement arguments.
8530 /// \param TypeIdParens If the type is in parens, the source range.
8531 /// \param D The type to be allocated, as well as array dimensions.
8532 /// \param Initializer The initializing expression or initializer-list, or
8533 /// null if there is none.
8534 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8535 SourceLocation PlacementLParen,
8536 MultiExprArg PlacementArgs,
8537 SourceLocation PlacementRParen,
8538 SourceRange TypeIdParens, Declarator &D,
8539 Expr *Initializer);
8541 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8542 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8543 SourceRange TypeIdParens, QualType AllocType,
8544 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8545 SourceRange DirectInitRange, Expr *Initializer);
8546
8547 /// Determine whether \p FD is an aligned allocation or deallocation
8548 /// function that is unavailable.
8550
8551 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8552 /// function that is unavailable.
8554 SourceLocation Loc);
8555
8556 /// Checks that a type is suitable as the allocated type
8557 /// in a new-expression.
8558 bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
8559 SourceRange R);
8560
8561 /// Finds the overloads of operator new and delete that are appropriate
8562 /// for the allocation.
8564 SourceLocation StartLoc, SourceRange Range,
8566 QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP,
8567 MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew,
8568 FunctionDecl *&OperatorDelete, bool Diagnose = true);
8569
8570 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8571 /// delete. These are:
8572 /// @code
8573 /// // C++03:
8574 /// void* operator new(std::size_t) throw(std::bad_alloc);
8575 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8576 /// void operator delete(void *) throw();
8577 /// void operator delete[](void *) throw();
8578 /// // C++11:
8579 /// void* operator new(std::size_t);
8580 /// void* operator new[](std::size_t);
8581 /// void operator delete(void *) noexcept;
8582 /// void operator delete[](void *) noexcept;
8583 /// // C++1y:
8584 /// void* operator new(std::size_t);
8585 /// void* operator new[](std::size_t);
8586 /// void operator delete(void *) noexcept;
8587 /// void operator delete[](void *) noexcept;
8588 /// void operator delete(void *, std::size_t) noexcept;
8589 /// void operator delete[](void *, std::size_t) noexcept;
8590 /// @endcode
8591 /// Note that the placement and nothrow forms of new are *not* implicitly
8592 /// declared. Their use requires including <new>.
8595 ArrayRef<QualType> Params);
8596
8598 DeclarationName Name, FunctionDecl *&Operator,
8600 bool Diagnose = true);
8603 DeclarationName Name,
8604 bool Diagnose = true);
8606 CXXRecordDecl *RD,
8607 bool Diagnose,
8608 bool LookForGlobal,
8609 DeclarationName Name);
8610
8611 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8612 /// @code ::delete ptr; @endcode
8613 /// or
8614 /// @code delete [] ptr; @endcode
8615 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8616 bool ArrayForm, Expr *Operand);
8618 bool IsDelete, bool CallCanBeVirtual,
8619 bool WarnOnNonAbstractTypes,
8620 SourceLocation DtorLoc);
8621
8623 Expr *Operand, SourceLocation RParen);
8625 SourceLocation RParen);
8626
8628 SourceLocation OpLoc,
8629 tok::TokenKind OpKind,
8630 ParsedType &ObjectType,
8631 bool &MayBePseudoDestructor);
8632
8634 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8635 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8636 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8637
8639 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8640 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8641 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8642
8644 SourceLocation OpLoc,
8645 tok::TokenKind OpKind,
8646 SourceLocation TildeLoc,
8647 const DeclSpec &DS);
8648
8649 /// MaybeCreateExprWithCleanups - If the current full-expression
8650 /// requires any cleanups, surround it with a ExprWithCleanups node.
8651 /// Otherwise, just returns the passed-in expression.
8655
8656 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8657 return ActOnFinishFullExpr(
8658 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8659 }
8661 bool DiscardedValue, bool IsConstexpr = false,
8662 bool IsTemplateArgument = false);
8664
8665 /// Process the expression contained within a decltype. For such expressions,
8666 /// certain semantic checks on temporaries are delayed until this point, and
8667 /// are omitted for the 'topmost' call in the decltype expression. If the
8668 /// topmost call bound a temporary, strip that temporary off the expression.
8670
8671 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8672 bool IsUDSuffix);
8673
8675
8676 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8677 SourceLocation StmtLoc,
8678 ConditionKind CK);
8679
8680 /// Check the use of the given variable as a C++ condition in an if,
8681 /// while, do-while, or switch statement.
8683 SourceLocation StmtLoc, ConditionKind CK);
8684
8685 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8686 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8687
8688 /// Helper function to determine whether this is the (deprecated) C++
8689 /// conversion from a string literal to a pointer to non-const char or
8690 /// non-const wchar_t (for narrow and wide string literals,
8691 /// respectively).
8693
8694 /// PerformImplicitConversion - Perform an implicit conversion of the
8695 /// expression From to the type ToType using the pre-computed implicit
8696 /// conversion sequence ICS. Returns the converted
8697 /// expression. Action is the kind of conversion we're performing,
8698 /// used in the error message.
8700 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8701 AssignmentAction Action,
8703
8704 /// PerformImplicitConversion - Perform an implicit conversion of the
8705 /// expression From to the type ToType by following the standard
8706 /// conversion sequence SCS. Returns the converted
8707 /// expression. Flavor is the context in which we're performing this
8708 /// conversion, for use in error messages.
8710 const StandardConversionSequence &SCS,
8711 AssignmentAction Action,
8713
8714 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8715
8716 /// Parsed one of the type trait support pseudo-functions.
8719 SourceLocation RParenLoc);
8722 SourceLocation RParenLoc);
8723
8724 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8725 /// pseudo-functions.
8727 ParsedType LhsTy, Expr *DimExpr,
8728 SourceLocation RParen);
8729
8731 TypeSourceInfo *TSInfo, Expr *DimExpr,
8732 SourceLocation RParen);
8733
8734 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8735 /// pseudo-functions.
8737 Expr *Queried, SourceLocation RParen);
8738
8740 Expr *Queried, SourceLocation RParen);
8741
8744 bool isIndirect);
8746 ExprResult &RHS,
8747 SourceLocation QuestionLoc);
8748
8749 //// Determines if a type is trivially relocatable
8750 /// according to the C++26 rules.
8751 // FIXME: This is in Sema because it requires
8752 // overload resolution, can we move to ASTContext?
8755
8756 /// Check the operands of ?: under C++ semantics.
8757 ///
8758 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8759 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8760 ///
8761 /// This function also implements GCC's vector extension and the
8762 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8763 /// permit the use of a?b:c where the type of a is that of a integer vector
8764 /// with the same number of elements and size as the vectors of b and c. If
8765 /// one of either b or c is a scalar it is implicitly converted to match the
8766 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8767 /// c are scalars, then b and c are checked and converted to the type of a if
8768 /// possible.
8769 ///
8770 /// The expressions are evaluated differently for GCC's and OpenCL's
8771 /// extensions. For the GCC extension, the ?: operator is evaluated as
8772 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8773 /// For the OpenCL extensions, the ?: operator is evaluated as
8774 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8775 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8777 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8778 ExprObjectKind &OK, SourceLocation questionLoc);
8779
8780 /// Find a merged pointer type and convert the two expressions to it.
8781 ///
8782 /// This finds the composite pointer type for \p E1 and \p E2 according to
8783 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8784 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8785 /// ConvertArgs is \c true).
8786 ///
8787 /// \param Loc The location of the operator requiring these two expressions to
8788 /// be converted to the composite pointer type.
8789 ///
8790 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8791 /// type.
8793 bool ConvertArgs = true);
8795 ExprResult &E2, bool ConvertArgs = true) {
8796 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8797 QualType Composite =
8798 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8799 E1 = E1Tmp;
8800 E2 = E2Tmp;
8801 return Composite;
8802 }
8803
8804 /// MaybeBindToTemporary - If the passed in expression has a record type with
8805 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8806 /// it simply returns the passed in expression.
8808
8809 /// IgnoredValueConversions - Given that an expression's result is
8810 /// syntactically ignored, perform any conversions that are
8811 /// required.
8813
8815
8818 const DeclarationNameInfo &TargetNameInfo);
8819
8821 SourceLocation KeywordLoc,
8822 bool IsIfExists, CXXScopeSpec &SS,
8823 UnqualifiedId &Name);
8824
8827 ArrayRef<ParmVarDecl *> LocalParameters,
8828 Scope *BodyScope);
8832 CXXScopeSpec &SS,
8833 SourceLocation NameLoc,
8834 const IdentifierInfo *TypeName,
8835 TemplateIdAnnotation *TemplateId);
8837 SourceLocation NoexceptLoc);
8839 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8840 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8843 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8847 bool IsSatisfied, SourceLocation NoexceptLoc,
8854 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8855 const ASTConstraintSatisfaction &Satisfaction);
8858 SourceLocation LParenLoc,
8859 ArrayRef<ParmVarDecl *> LocalParameters,
8860 SourceLocation RParenLoc,
8862 SourceLocation ClosingBraceLoc);
8863
8864private:
8865 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8866 bool IsDelete);
8867
8868 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8869 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8870 bool DeleteWasArrayForm);
8871
8872 ///@}
8873
8874 //
8875 //
8876 // -------------------------------------------------------------------------
8877 //
8878 //
8879
8880 /// \name Member Access Expressions
8881 /// Implementations are in SemaExprMember.cpp
8882 ///@{
8883
8884public:
8885 /// Check whether an expression might be an implicit class member access.
8887 bool IsAddressOfOperand);
8888
8889 /// Builds an expression which might be an implicit member expression.
8891 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8892 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8893
8894 /// Builds an implicit member access expression. The current context
8895 /// is known to be an instance method, and the given unqualified lookup
8896 /// set is known to contain only instance members, at least one of which
8897 /// is from an appropriate type.
8899 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8900 LookupResult &R,
8901 const TemplateArgumentListInfo *TemplateArgs,
8902 bool IsDefiniteInstance, const Scope *S);
8903
8905 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8906 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8907 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8908 const TemplateArgumentListInfo *TemplateArgs);
8909
8910 /// The main callback when the parser finds something like
8911 /// expression . [nested-name-specifier] identifier
8912 /// expression -> [nested-name-specifier] identifier
8913 /// where 'identifier' encompasses a fairly broad spectrum of
8914 /// possibilities, including destructor and operator references.
8915 ///
8916 /// \param OpKind either tok::arrow or tok::period
8917 /// \param ObjCImpDecl the current Objective-C \@implementation
8918 /// decl; this is an ugly hack around the fact that Objective-C
8919 /// \@implementations aren't properly put in the context chain
8921 tok::TokenKind OpKind, CXXScopeSpec &SS,
8922 SourceLocation TemplateKWLoc,
8923 UnqualifiedId &Member, Decl *ObjCImpDecl);
8924
8925 MemberExpr *
8926 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
8927 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
8928 ValueDecl *Member, DeclAccessPair FoundDecl,
8929 bool HadMultipleCandidates,
8930 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
8932 const TemplateArgumentListInfo *TemplateArgs = nullptr);
8933
8934 // Check whether the declarations we found through a nested-name
8935 // specifier in a member expression are actually members of the base
8936 // type. The restriction here is:
8937 //
8938 // C++ [expr.ref]p2:
8939 // ... In these cases, the id-expression shall name a
8940 // member of the class or of one of its base classes.
8941 //
8942 // So it's perfectly legitimate for the nested-name specifier to name
8943 // an unrelated class, and for us to find an overload set including
8944 // decls from classes which are not superclasses, as long as the decl
8945 // we actually pick through overload resolution is from a superclass.
8946 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
8947 const CXXScopeSpec &SS,
8948 const LookupResult &R);
8949
8950 // This struct is for use by ActOnMemberAccess to allow
8951 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
8952 // changing the access operator from a '.' to a '->' (to see if that is the
8953 // change needed to fix an error about an unknown member, e.g. when the class
8954 // defines a custom operator->).
8960
8962 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
8963 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8964 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8965 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
8966 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8967
8970 bool IsArrow, const CXXScopeSpec &SS,
8971 SourceLocation TemplateKWLoc,
8972 NamedDecl *FirstQualifierInScope, LookupResult &R,
8973 const TemplateArgumentListInfo *TemplateArgs,
8974 const Scope *S, bool SuppressQualifierCheck = false,
8975 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8976
8977 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
8978 SourceLocation OpLoc,
8979 const CXXScopeSpec &SS, FieldDecl *Field,
8980 DeclAccessPair FoundDecl,
8981 const DeclarationNameInfo &MemberNameInfo);
8982
8983 /// Perform conversions on the LHS of a member access expression.
8985
8987 const CXXScopeSpec &SS, SourceLocation nameLoc,
8988 IndirectFieldDecl *indirectField,
8989 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
8990 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
8991
8992private:
8993 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
8994
8995 ///@}
8996
8997 //
8998 //
8999 // -------------------------------------------------------------------------
9000 //
9001 //
9002
9003 /// \name Initializers
9004 /// Implementations are in SemaInit.cpp
9005 ///@{
9006
9007public:
9008 /// Stack of types that correspond to the parameter entities that are
9009 /// currently being copy-initialized. Can be empty.
9011
9012 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
9014
9015 bool IsStringInit(Expr *Init, const ArrayType *AT);
9016
9017 /// Determine whether we can perform aggregate initialization for the purposes
9018 /// of overload resolution.
9020 const InitializedEntity &Entity, InitListExpr *From);
9021
9023 SourceLocation EqualOrColonLoc,
9024 bool GNUSyntax, ExprResult Init);
9025
9026 /// Check that the lifetime of the initializer (and its subobjects) is
9027 /// sufficient for initializing the entity, and perform lifetime extension
9028 /// (when permitted) if not.
9030
9033 bool BoundToLvalueReference);
9034
9035 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
9036 /// it as an xvalue. In C++98, the result will still be a prvalue, because
9037 /// we don't have xvalues there.
9039
9043
9047 SourceLocation EqualLoc, ExprResult Init,
9048 bool TopLevelOfInitList = false,
9049 bool AllowExplicit = false);
9050
9052 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9053 const InitializationKind &Kind, MultiExprArg Init);
9054
9055 ///@}
9056
9057 //
9058 //
9059 // -------------------------------------------------------------------------
9060 //
9061 //
9062
9063 /// \name C++ Lambda Expressions
9064 /// Implementations are in SemaLambda.cpp
9065 ///@{
9066
9067public:
9068 /// Create a new lambda closure type.
9070 TypeSourceInfo *Info,
9071 unsigned LambdaDependencyKind,
9072 LambdaCaptureDefault CaptureDefault);
9073
9074 /// Number lambda for linkage purposes if necessary.
9076 std::optional<CXXRecordDecl::LambdaNumbering>
9077 NumberingOverride = std::nullopt);
9078
9079 /// Endow the lambda scope info with the relevant properties.
9080 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
9081 SourceRange IntroducerRange,
9082 LambdaCaptureDefault CaptureDefault,
9083 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
9084 bool Mutable);
9085
9088
9090 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
9091 TemplateParameterList *TemplateParams);
9092
9093 void
9095 SourceLocation CallOperatorLoc,
9096 const AssociatedConstraint &TrailingRequiresClause,
9097 TypeSourceInfo *MethodTyInfo,
9098 ConstexprSpecKind ConstexprKind, StorageClass SC,
9100 bool HasExplicitResultType);
9101
9102 /// Returns true if the explicit object parameter was invalid.
9104 SourceLocation CallLoc);
9105
9106 /// Perform initialization analysis of the init-capture and perform
9107 /// any implicit conversions such as an lvalue-to-rvalue conversion if
9108 /// not being used to initialize a reference.
9110 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
9111 IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init) {
9113 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
9115 }
9117 SourceLocation EllipsisLoc,
9118 UnsignedOrNone NumExpansions,
9119 IdentifierInfo *Id,
9120 bool DirectInit, Expr *&Init);
9121
9122 /// Create a dummy variable within the declcontext of the lambda's
9123 /// call operator, for name lookup purposes for a lambda init capture.
9124 ///
9125 /// CodeGen handles emission of lambda captures, ignoring these dummy
9126 /// variables appropriately.
9128 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
9129 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
9130
9131 /// Add an init-capture to a lambda scope.
9132 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
9133
9134 /// Note that we have finished the explicit captures for the
9135 /// given lambda.
9137
9138 /// Deduce a block or lambda's return type based on the return
9139 /// statements present in the body.
9141
9142 /// Once the Lambdas capture are known, we can start to create the closure,
9143 /// call operator method, and keep track of the captures.
9144 /// We do the capture lookup here, but they are not actually captured until
9145 /// after we know what the qualifiers of the call operator are.
9147 Scope *CurContext);
9148
9149 /// This is called after parsing the explicit template parameter list
9150 /// on a lambda (if it exists) in C++2a.
9152 SourceLocation LAngleLoc,
9153 ArrayRef<NamedDecl *> TParams,
9154 SourceLocation RAngleLoc,
9155 ExprResult RequiresClause);
9156
9158 SourceLocation MutableLoc);
9159
9161 Scope *LambdaScope,
9163
9164 /// ActOnStartOfLambdaDefinition - This is called just before we start
9165 /// parsing the body of a lambda; it analyzes the explicit captures and
9166 /// arguments, and sets up various data-structures for the body of the
9167 /// lambda.
9169 Declarator &ParamInfo, const DeclSpec &DS);
9170
9171 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
9172 /// is invoked to pop the information about the lambda.
9173 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
9174 bool IsInstantiation = false);
9175
9176 /// ActOnLambdaExpr - This is called when the body of a lambda expression
9177 /// was successfully completed.
9179
9180 /// Does copying/destroying the captured variable have side effects?
9181 bool CaptureHasSideEffects(const sema::Capture &From);
9182
9183 /// Diagnose if an explicit lambda capture is unused. Returns true if a
9184 /// diagnostic is emitted.
9185 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
9186 SourceRange FixItRange,
9187 const sema::Capture &From);
9188
9189 /// Build a FieldDecl suitable to hold the given capture.
9191
9192 /// Initialize the given capture with a suitable expression.
9194 SourceLocation ImplicitCaptureLoc,
9195 bool IsOpenMPMapping = false);
9196
9197 /// Complete a lambda-expression having processed and attached the
9198 /// lambda body.
9200
9201 /// Get the return type to use for a lambda's conversion function(s) to
9202 /// function pointer type, given the type of the call operator.
9203 QualType
9205 CallingConv CC);
9206
9208 SourceLocation ConvLocation,
9209 CXXConversionDecl *Conv, Expr *Src);
9210
9212 : private FunctionScopeRAII {
9213 public:
9215 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
9217 bool ShouldAddDeclsFromParentScope = true);
9218 };
9219
9220 /// Compute the mangling number context for a lambda expression or
9221 /// block literal. Also return the extra mangling decl if any.
9222 ///
9223 /// \param DC - The DeclContext containing the lambda expression or
9224 /// block literal.
9225 std::tuple<MangleNumberingContext *, Decl *>
9227
9228 ///@}
9229
9230 //
9231 //
9232 // -------------------------------------------------------------------------
9233 //
9234 //
9235
9236 /// \name Name Lookup
9237 ///
9238 /// These routines provide name lookup that is used during semantic
9239 /// analysis to resolve the various kinds of names (identifiers,
9240 /// overloaded operator names, constructor names, etc.) into zero or
9241 /// more declarations within a particular scope. The major entry
9242 /// points are LookupName, which performs unqualified name lookup,
9243 /// and LookupQualifiedName, which performs qualified name lookup.
9244 ///
9245 /// All name lookup is performed based on some specific criteria,
9246 /// which specify what names will be visible to name lookup and how
9247 /// far name lookup should work. These criteria are important both
9248 /// for capturing language semantics (certain lookups will ignore
9249 /// certain names, for example) and for performance, since name
9250 /// lookup is often a bottleneck in the compilation of C++. Name
9251 /// lookup criteria is specified via the LookupCriteria enumeration.
9252 ///
9253 /// The results of name lookup can vary based on the kind of name
9254 /// lookup performed, the current language, and the translation
9255 /// unit. In C, for example, name lookup will either return nothing
9256 /// (no entity found) or a single declaration. In C++, name lookup
9257 /// can additionally refer to a set of overloaded functions or
9258 /// result in an ambiguity. All of the possible results of name
9259 /// lookup are captured by the LookupResult class, which provides
9260 /// the ability to distinguish among them.
9261 ///
9262 /// Implementations are in SemaLookup.cpp
9263 ///@{
9264
9265public:
9266 /// Tracks whether we are in a context where typo correction is
9267 /// disabled.
9269
9270 /// The number of typos corrected by CorrectTypo.
9272
9273 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
9274 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
9275
9276 /// A cache containing identifiers for which typo correction failed and
9277 /// their locations, so that repeated attempts to correct an identifier in a
9278 /// given location are ignored if typo correction already failed for it.
9280
9281 /// SpecialMemberOverloadResult - The overloading result for a special member
9282 /// function.
9283 ///
9284 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
9285 /// integer are used to determine whether overload resolution succeeded.
9287 public:
9289
9290 private:
9291 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
9292
9293 public:
9296 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
9297
9298 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
9299 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
9300
9301 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
9302 void setKind(Kind K) { Pair.setInt(K); }
9303 };
9304
9305 class SpecialMemberOverloadResultEntry : public llvm::FastFoldingSetNode,
9307 public:
9308 SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
9309 : FastFoldingSetNode(ID) {}
9310 };
9311
9312 /// A cache of special member function overload resolution results
9313 /// for C++ records.
9314 llvm::FoldingSet<SpecialMemberOverloadResultEntry> SpecialMemberCache;
9315
9317
9318 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
9319 // TODO: make this is a typesafe union.
9322
9323 /// Describes the kind of name lookup to perform.
9325 /// Ordinary name lookup, which finds ordinary names (functions,
9326 /// variables, typedefs, etc.) in C and most kinds of names
9327 /// (functions, variables, members, types, etc.) in C++.
9329 /// Tag name lookup, which finds the names of enums, classes,
9330 /// structs, and unions.
9332 /// Label name lookup.
9334 /// Member name lookup, which finds the names of
9335 /// class/struct/union members.
9337 /// Look up of an operator name (e.g., operator+) for use with
9338 /// operator overloading. This lookup is similar to ordinary name
9339 /// lookup, but will ignore any declarations that are class members.
9341 /// Look up a name following ~ in a destructor name. This is an ordinary
9342 /// lookup, but prefers tags to typedefs.
9344 /// Look up of a name that precedes the '::' scope resolution
9345 /// operator in C++. This lookup completely ignores operator, object,
9346 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9348 /// Look up a namespace name within a C++ using directive or
9349 /// namespace alias definition, ignoring non-namespace names (C++
9350 /// [basic.lookup.udir]p1).
9352 /// Look up all declarations in a scope with the given name,
9353 /// including resolved using declarations. This is appropriate
9354 /// for checking redeclarations for a using declaration.
9356 /// Look up an ordinary name that is going to be redeclared as a
9357 /// name with linkage. This lookup ignores any declarations that
9358 /// are outside of the current scope unless they have linkage. See
9359 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9361 /// Look up a friend of a local class. This lookup does not look
9362 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9364 /// Look up the name of an Objective-C protocol.
9366 /// Look up implicit 'self' parameter of an objective-c method.
9368 /// Look up the name of an OpenMP user-defined reduction operation.
9370 /// Look up the name of an OpenMP user-defined mapper.
9372 /// Look up any declaration with any name.
9374 };
9375
9376 /// The possible outcomes of name lookup for a literal operator.
9378 /// The lookup resulted in an error.
9380 /// The lookup found no match but no diagnostic was issued.
9382 /// The lookup found a single 'cooked' literal operator, which
9383 /// expects a normal literal to be built and passed to it.
9385 /// The lookup found a single 'raw' literal operator, which expects
9386 /// a string literal containing the spelling of the literal token.
9388 /// The lookup found an overload set of literal operator templates,
9389 /// which expect the characters of the spelling of the literal token to be
9390 /// passed as a non-type template argument pack.
9392 /// The lookup found an overload set of literal operator templates,
9393 /// which expect the character type and characters of the spelling of the
9394 /// string literal token to be passed as template arguments.
9396 };
9397
9398 SpecialMemberOverloadResult
9400 bool VolatileArg, bool RValueThis, bool ConstThis,
9401 bool VolatileThis);
9402
9404
9405 /// Look up a name, looking for a single declaration. Return
9406 /// null if the results were absent, ambiguous, or overloaded.
9407 ///
9408 /// It is preferable to use the elaborated form and explicitly handle
9409 /// ambiguity and overloaded.
9411 Scope *S, DeclarationName Name, SourceLocation Loc,
9412 LookupNameKind NameKind,
9414
9415 /// Lookup a builtin function, when name lookup would otherwise
9416 /// fail.
9417 bool LookupBuiltin(LookupResult &R);
9418 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9419
9420 /// Perform unqualified name lookup starting from a given
9421 /// scope.
9422 ///
9423 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9424 /// used to find names within the current scope. For example, 'x' in
9425 /// @code
9426 /// int x;
9427 /// int f() {
9428 /// return x; // unqualified name look finds 'x' in the global scope
9429 /// }
9430 /// @endcode
9431 ///
9432 /// Different lookup criteria can find different names. For example, a
9433 /// particular scope can have both a struct and a function of the same
9434 /// name, and each can be found by certain lookup criteria. For more
9435 /// information about lookup criteria, see the documentation for the
9436 /// class LookupCriteria.
9437 ///
9438 /// @param S The scope from which unqualified name lookup will
9439 /// begin. If the lookup criteria permits, name lookup may also search
9440 /// in the parent scopes.
9441 ///
9442 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9443 /// look up and the lookup kind), and is updated with the results of lookup
9444 /// including zero or more declarations and possibly additional information
9445 /// used to diagnose ambiguities.
9446 ///
9447 /// @returns \c true if lookup succeeded and false otherwise.
9448 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9449 bool ForceNoCPlusPlus = false);
9450
9451 /// Perform qualified name lookup into a given context.
9452 ///
9453 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9454 /// names when the context of those names is explicit specified, e.g.,
9455 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9456 ///
9457 /// Different lookup criteria can find different names. For example, a
9458 /// particular scope can have both a struct and a function of the same
9459 /// name, and each can be found by certain lookup criteria. For more
9460 /// information about lookup criteria, see the documentation for the
9461 /// class LookupCriteria.
9462 ///
9463 /// \param R captures both the lookup criteria and any lookup results found.
9464 ///
9465 /// \param LookupCtx The context in which qualified name lookup will
9466 /// search. If the lookup criteria permits, name lookup may also search
9467 /// in the parent contexts or (for C++ classes) base classes.
9468 ///
9469 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9470 /// occurs as part of unqualified name lookup.
9471 ///
9472 /// \returns true if lookup succeeded, false if it failed.
9473 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9474 bool InUnqualifiedLookup = false);
9475
9476 /// Performs qualified name lookup or special type of lookup for
9477 /// "__super::" scope specifier.
9478 ///
9479 /// This routine is a convenience overload meant to be called from contexts
9480 /// that need to perform a qualified name lookup with an optional C++ scope
9481 /// specifier that might require special kind of lookup.
9482 ///
9483 /// \param R captures both the lookup criteria and any lookup results found.
9484 ///
9485 /// \param LookupCtx The context in which qualified name lookup will
9486 /// search.
9487 ///
9488 /// \param SS An optional C++ scope-specifier.
9489 ///
9490 /// \returns true if lookup succeeded, false if it failed.
9491 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9492 CXXScopeSpec &SS);
9493
9494 /// Performs name lookup for a name that was parsed in the
9495 /// source code, and may contain a C++ scope specifier.
9496 ///
9497 /// This routine is a convenience routine meant to be called from
9498 /// contexts that receive a name and an optional C++ scope specifier
9499 /// (e.g., "N::M::x"). It will then perform either qualified or
9500 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9501 /// respectively) on the given name and return those results. It will
9502 /// perform a special type of lookup for "__super::" scope specifier.
9503 ///
9504 /// @param S The scope from which unqualified name lookup will
9505 /// begin.
9506 ///
9507 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9508 ///
9509 /// @param EnteringContext Indicates whether we are going to enter the
9510 /// context of the scope-specifier SS (if present).
9511 ///
9512 /// @returns True if any decls were found (but possibly ambiguous)
9514 QualType ObjectType, bool AllowBuiltinCreation = false,
9515 bool EnteringContext = false);
9516
9517 /// Perform qualified name lookup into all base classes of the given
9518 /// class.
9519 ///
9520 /// \param R captures both the lookup criteria and any lookup results found.
9521 ///
9522 /// \param Class The context in which qualified name lookup will
9523 /// search. Name lookup will search in all base classes merging the results.
9524 ///
9525 /// @returns True if any decls were found (but possibly ambiguous)
9527
9529 UnresolvedSetImpl &Functions);
9530
9531 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9532 /// If GnuLabelLoc is a valid source location, then this is a definition
9533 /// of an __label__ label name, otherwise it is a normal label definition
9534 /// or use.
9536 SourceLocation GnuLabelLoc = SourceLocation());
9537
9538 /// Perform a name lookup for a label with the specified name; this does not
9539 /// create a new label if the lookup fails.
9541
9542 /// Look up the constructors for the given class.
9544
9545 /// Look up the default constructor for the given class.
9547
9548 /// Look up the copying constructor for the given class.
9550 unsigned Quals);
9551
9552 /// Look up the copying assignment operator for the given class.
9554 bool RValueThis, unsigned ThisQuals);
9555
9556 /// Look up the moving constructor for the given class.
9558 unsigned Quals);
9559
9560 /// Look up the moving assignment operator for the given class.
9562 bool RValueThis, unsigned ThisQuals);
9563
9564 /// Look for the destructor of the given class.
9565 ///
9566 /// During semantic analysis, this routine should be used in lieu of
9567 /// CXXRecordDecl::getDestructor().
9568 ///
9569 /// \returns The destructor for this class.
9571
9572 /// Force the declaration of any implicitly-declared members of this
9573 /// class.
9575
9576 /// Make a merged definition of an existing hidden definition \p ND
9577 /// visible at the specified location.
9579
9580 /// Check ODR hashes for C/ObjC when merging types from modules.
9581 /// Differently from C++, actually parse the body and reject in case
9582 /// of a mismatch.
9583 template <typename T,
9584 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9586 if (Duplicate->getODRHash() != Previous->getODRHash())
9587 return false;
9588
9589 // Make the previous decl visible.
9591 return true;
9592 }
9593
9594 /// Get the set of additional modules that should be checked during
9595 /// name lookup. A module and its imports become visible when instanting a
9596 /// template defined within it.
9597 llvm::DenseSet<Module *> &getLookupModules();
9598
9599 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9601
9602 /// Determine if the template parameter \p D has a visible default argument.
9603 bool
9605 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9606 /// Determine if the template parameter \p D has a reachable default argument.
9608 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9609 /// Determine if the template parameter \p D has a reachable default argument.
9613
9614 /// Determine if there is a visible declaration of \p D that is an explicit
9615 /// specialization declaration for a specialization of a template. (For a
9616 /// member specialization, use hasVisibleMemberSpecialization.)
9618 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9619 /// Determine if there is a reachable declaration of \p D that is an explicit
9620 /// specialization declaration for a specialization of a template. (For a
9621 /// member specialization, use hasReachableMemberSpecialization.)
9623 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9624
9625 /// Determine if there is a visible declaration of \p D that is a member
9626 /// specialization declaration (as opposed to an instantiated declaration).
9628 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9629 /// Determine if there is a reachable declaration of \p D that is a member
9630 /// specialization declaration (as opposed to an instantiated declaration).
9632 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9633
9634 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9635
9636 /// Determine whether any declaration of an entity is visible.
9637 bool
9639 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9640 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9641 }
9642
9645 /// Determine whether any declaration of an entity is reachable.
9646 bool
9648 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9649 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9650 }
9652 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9653
9654 void diagnoseTypo(const TypoCorrection &Correction,
9655 const PartialDiagnostic &TypoDiag,
9656 bool ErrorRecovery = true);
9657
9658 /// Diagnose a successfully-corrected typo. Separated from the correction
9659 /// itself to allow external validation of the result, etc.
9660 ///
9661 /// \param Correction The result of performing typo correction.
9662 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9663 /// string added to it (and usually also a fixit).
9664 /// \param PrevNote A note to use when indicating the location of the entity
9665 /// to which we are correcting. Will have the correction string added
9666 /// to it.
9667 /// \param ErrorRecovery If \c true (the default), the caller is going to
9668 /// recover from the typo as if the corrected string had been typed.
9669 /// In this case, \c PDiag must be an error, and we will attach a fixit
9670 /// to it.
9671 void diagnoseTypo(const TypoCorrection &Correction,
9672 const PartialDiagnostic &TypoDiag,
9673 const PartialDiagnostic &PrevNote,
9674 bool ErrorRecovery = true);
9675
9676 /// Find the associated classes and namespaces for
9677 /// argument-dependent lookup for a call with the given set of
9678 /// arguments.
9679 ///
9680 /// This routine computes the sets of associated classes and associated
9681 /// namespaces searched by argument-dependent lookup
9682 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9684 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9685 AssociatedNamespaceSet &AssociatedNamespaces,
9686 AssociatedClassSet &AssociatedClasses);
9687
9688 /// Produce a diagnostic describing the ambiguity that resulted
9689 /// from name lookup.
9690 ///
9691 /// \param Result The result of the ambiguous lookup to be diagnosed.
9693
9694 /// LookupLiteralOperator - Determine which literal operator should be used
9695 /// for a user-defined literal, per C++11 [lex.ext].
9696 ///
9697 /// Normal overload resolution is not used to select which literal operator to
9698 /// call for a user-defined literal. Look up the provided literal operator
9699 /// name, and filter the results to the appropriate set for the given argument
9700 /// types.
9703 bool AllowRaw, bool AllowTemplate,
9704 bool AllowStringTemplate, bool DiagnoseMissing,
9705 StringLiteral *StringLit = nullptr);
9706
9708 ArrayRef<Expr *> Args, ADLResult &Functions);
9709
9710 void LookupVisibleDecls(Scope *S, LookupNameKind Kind,
9712 bool IncludeGlobalScope = true,
9713 bool LoadExternal = true);
9714 void LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,
9716 bool IncludeGlobalScope = true,
9717 bool IncludeDependentBases = false,
9718 bool LoadExternal = true);
9719
9720 /// Try to "correct" a typo in the source code by finding
9721 /// visible declarations whose names are similar to the name that was
9722 /// present in the source code.
9723 ///
9724 /// \param TypoName the \c DeclarationNameInfo structure that contains
9725 /// the name that was present in the source code along with its location.
9726 ///
9727 /// \param LookupKind the name-lookup criteria used to search for the name.
9728 ///
9729 /// \param S the scope in which name lookup occurs.
9730 ///
9731 /// \param SS the nested-name-specifier that precedes the name we're
9732 /// looking for, if present.
9733 ///
9734 /// \param CCC A CorrectionCandidateCallback object that provides further
9735 /// validation of typo correction candidates. It also provides flags for
9736 /// determining the set of keywords permitted.
9737 ///
9738 /// \param MemberContext if non-NULL, the context in which to look for
9739 /// a member access expression.
9740 ///
9741 /// \param EnteringContext whether we're entering the context described by
9742 /// the nested-name-specifier SS.
9743 ///
9744 /// \param OPT when non-NULL, the search for visible declarations will
9745 /// also walk the protocols in the qualified interfaces of \p OPT.
9746 ///
9747 /// \returns a \c TypoCorrection containing the corrected name if the typo
9748 /// along with information such as the \c NamedDecl where the corrected name
9749 /// was declared, and any additional \c NestedNameSpecifier needed to access
9750 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9752 Sema::LookupNameKind LookupKind, Scope *S,
9754 CorrectTypoKind Mode,
9755 DeclContext *MemberContext = nullptr,
9756 bool EnteringContext = false,
9757 const ObjCObjectPointerType *OPT = nullptr,
9758 bool RecordFailure = true);
9759
9760 /// Kinds of missing import. Note, the values of these enumerators correspond
9761 /// to %select values in diagnostics.
9769
9770 /// Diagnose that the specified declaration needs to be visible but
9771 /// isn't, and suggest a module import that would resolve the problem.
9773 MissingImportKind MIK, bool Recover = true);
9775 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9776 MissingImportKind MIK, bool Recover);
9777
9778 /// Called on #pragma clang __debug dump II
9780
9781 /// Called on #pragma clang __debug dump E
9782 void ActOnPragmaDump(Expr *E);
9783
9784private:
9785 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9786 //
9787 // The boolean value will be true to indicate that the namespace was loaded
9788 // from an AST/PCH file, or false otherwise.
9789 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9790
9791 /// Whether we have already loaded known namespaces from an extenal
9792 /// source.
9793 bool LoadedExternalKnownNamespaces;
9794
9795 bool CppLookupName(LookupResult &R, Scope *S);
9796
9797 /// Determine if we could use all the declarations in the module.
9798 bool isUsableModule(const Module *M);
9799
9800 /// Helper for CorrectTypo used to create and populate a new
9801 /// TypoCorrectionConsumer. Returns nullptr if typo correction should be
9802 /// skipped entirely.
9803 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9804 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9806 DeclContext *MemberContext, bool EnteringContext,
9807 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9808
9809 /// Cache for module units which is usable for current module.
9810 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9811
9812 /// Record the typo correction failure and return an empty correction.
9813 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9814 bool RecordFailure = true) {
9815 if (RecordFailure)
9816 TypoCorrectionFailures[Typo].insert(TypoLoc);
9817 return TypoCorrection();
9818 }
9819
9820 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9821
9822 /// Determine whether two declarations should be linked together, given that
9823 /// the old declaration might not be visible and the new declaration might
9824 /// not have external linkage.
9825 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9826 const NamedDecl *New) {
9827 if (isVisible(Old))
9828 return true;
9829 // See comment in below overload for why it's safe to compute the linkage
9830 // of the new declaration here.
9831 if (New->isExternallyDeclarable()) {
9832 assert(Old->isExternallyDeclarable() &&
9833 "should not have found a non-externally-declarable previous decl");
9834 return true;
9835 }
9836 return false;
9837 }
9838 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9839
9840 ///@}
9841
9842 //
9843 //
9844 // -------------------------------------------------------------------------
9845 //
9846 //
9847
9848 /// \name Modules
9849 /// Implementations are in SemaModule.cpp
9850 ///@{
9851
9852public:
9853 /// Get the module unit whose scope we are currently within.
9855 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9856 }
9857
9858 /// Is the module scope we are an implementation unit?
9860 return ModuleScopes.empty()
9861 ? false
9862 : ModuleScopes.back().Module->isModuleImplementation();
9863 }
9864
9865 // When loading a non-modular PCH files, this is used to restore module
9866 // visibility.
9868 VisibleModules.setVisible(Mod, ImportLoc);
9869 }
9870
9871 enum class ModuleDeclKind {
9872 Interface, ///< 'export module X;'
9873 Implementation, ///< 'module X;'
9874 PartitionInterface, ///< 'export module X:Y;'
9875 PartitionImplementation, ///< 'module X:Y;'
9876 };
9877
9878 /// An enumeration to represent the transition of states in parsing module
9879 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9880 /// an error in state transition, the state is set to NotACXX20Module.
9882 FirstDecl, ///< Parsing the first decl in a TU.
9883 GlobalFragment, ///< after 'module;' but before 'module X;'
9884 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9885 ImportFinished, ///< after any non-import decl.
9886 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9887 ///< non-import decl.
9888 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9889 ///< non-import decl has already been seen.
9890 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9891 };
9892
9893 /// The parser has processed a module-declaration that begins the definition
9894 /// of a module interface or implementation.
9896 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9897 ModuleIdPath Path, ModuleIdPath Partition,
9898 ModuleImportState &ImportState,
9899 bool SeenNoTrivialPPDirective);
9900
9901 /// The parser has processed a global-module-fragment declaration that begins
9902 /// the definition of the global module fragment of the current module unit.
9903 /// \param ModuleLoc The location of the 'module' keyword.
9905
9906 /// The parser has processed a private-module-fragment declaration that begins
9907 /// the definition of the private module fragment of the current module unit.
9908 /// \param ModuleLoc The location of the 'module' keyword.
9909 /// \param PrivateLoc The location of the 'private' keyword.
9911 SourceLocation PrivateLoc);
9912
9913 /// The parser has processed a module import declaration.
9914 ///
9915 /// \param StartLoc The location of the first token in the declaration. This
9916 /// could be the location of an '@', 'export', or 'import'.
9917 /// \param ExportLoc The location of the 'export' keyword, if any.
9918 /// \param ImportLoc The location of the 'import' keyword.
9919 /// \param Path The module toplevel name as an access path.
9920 /// \param IsPartition If the name is for a partition.
9922 SourceLocation ExportLoc,
9923 SourceLocation ImportLoc, ModuleIdPath Path,
9924 bool IsPartition = false);
9926 SourceLocation ExportLoc,
9927 SourceLocation ImportLoc, Module *M,
9928 ModuleIdPath Path = {});
9929
9930 /// The parser has processed a module import translated from a
9931 /// #include or similar preprocessing directive.
9932 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9933 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9934
9935 /// The parsed has entered a submodule.
9936 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
9937 /// The parser has left a submodule.
9938 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
9939
9940 /// Create an implicit import of the given module at the given
9941 /// source location, for error recovery, if possible.
9942 ///
9943 /// This routine is typically used when an entity found by name lookup
9944 /// is actually hidden within a module that we know about but the user
9945 /// has forgotten to import.
9946 void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
9947 Module *Mod);
9948
9949 /// We have parsed the start of an export declaration, including the '{'
9950 /// (if present).
9951 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
9952 SourceLocation LBraceLoc);
9953
9954 /// Complete the definition of an export declaration.
9955 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
9956 SourceLocation RBraceLoc);
9957
9958private:
9959 /// The parser has begun a translation unit to be compiled as a C++20
9960 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
9961 void HandleStartOfHeaderUnit();
9962
9963 struct ModuleScope {
9964 SourceLocation BeginLoc;
9965 clang::Module *Module = nullptr;
9966 VisibleModuleSet OuterVisibleModules;
9967 };
9968 /// The modules we're currently parsing.
9969 llvm::SmallVector<ModuleScope, 16> ModuleScopes;
9970
9971 /// For an interface unit, this is the implicitly imported interface unit.
9972 clang::Module *ThePrimaryInterface = nullptr;
9973
9974 /// The explicit global module fragment of the current translation unit.
9975 /// The explicit Global Module Fragment, as specified in C++
9976 /// [module.global.frag].
9977 clang::Module *TheGlobalModuleFragment = nullptr;
9978
9979 /// The implicit global module fragments of the current translation unit.
9980 ///
9981 /// The contents in the implicit global module fragment can't be discarded.
9982 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
9983
9984 /// Namespace definitions that we will export when they finish.
9985 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
9986
9987 /// In a C++ standard module, inline declarations require a definition to be
9988 /// present at the end of a definition domain. This set holds the decls to
9989 /// be checked at the end of the TU.
9990 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
9991
9992 /// Helper function to judge if we are in module purview.
9993 /// Return false if we are not in a module.
9994 bool isCurrentModulePurview() const;
9995
9996 /// Enter the scope of the explicit global module fragment.
9997 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
9998 /// Leave the scope of the explicit global module fragment.
9999 void PopGlobalModuleFragment();
10000
10001 /// Enter the scope of an implicit global module fragment.
10002 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
10003 /// Leave the scope of an implicit global module fragment.
10004 void PopImplicitGlobalModuleFragment();
10005
10006 VisibleModuleSet VisibleModules;
10007
10008 /// Whether we had imported any named modules.
10009 bool HadImportedNamedModules = false;
10010 /// The set of instantiations we need to check if they references TU-local
10011 /// entity from TUs. This only makes sense if we imported any named modules.
10012 llvm::SmallVector<std::pair<FunctionDecl *, SourceLocation>>
10013 PendingCheckReferenceForTULocal;
10014 /// Implement [basic.link]p18, which requires that we can't use TU-local
10015 /// entities from other TUs (ignoring header units).
10016 void checkReferenceToTULocalFromOtherTU(FunctionDecl *FD,
10017 SourceLocation PointOfInstantiation);
10018 /// Implement [basic.link]p17, which diagnose for non TU local exposure in
10019 /// module interface or module partition.
10020 void checkExposure(const TranslationUnitDecl *TU);
10021
10022 ///@}
10023
10024 //
10025 //
10026 // -------------------------------------------------------------------------
10027 //
10028 //
10029
10030 /// \name C++ Overloading
10031 /// Implementations are in SemaOverload.cpp
10032 ///@{
10033
10034public:
10035 /// Whether deferrable diagnostics should be deferred.
10036 bool DeferDiags = false;
10037
10038 /// RAII class to control scope of DeferDiags.
10040 Sema &S;
10041 bool SavedDeferDiags = false;
10042
10043 public:
10045 : S(S), SavedDeferDiags(S.DeferDiags) {
10046 S.DeferDiags = SavedDeferDiags || DeferDiags;
10047 }
10048 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
10051 };
10052
10053 /// Flag indicating if Sema is building a recovery call expression.
10054 ///
10055 /// This flag is used to avoid building recovery call expressions
10056 /// if Sema is already doing so, which would cause infinite recursions.
10058
10059 /// Determine whether the given New declaration is an overload of the
10060 /// declarations in Old. This routine returns OverloadKind::Match or
10061 /// OverloadKind::NonFunction if New and Old cannot be overloaded, e.g., if
10062 /// New has the same signature as some function in Old (C++ 1.3.10) or if the
10063 /// Old declarations aren't functions (or function templates) at all. When it
10064 /// does return OverloadKind::Match or OverloadKind::NonFunction, MatchedDecl
10065 /// will point to the decl that New cannot be overloaded with. This decl may
10066 /// be a UsingShadowDecl on top of the underlying declaration.
10067 ///
10068 /// Example: Given the following input:
10069 ///
10070 /// void f(int, float); // #1
10071 /// void f(int, int); // #2
10072 /// int f(int, int); // #3
10073 ///
10074 /// When we process #1, there is no previous declaration of "f", so IsOverload
10075 /// will not be used.
10076 ///
10077 /// When we process #2, Old contains only the FunctionDecl for #1. By
10078 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
10079 /// they have different signatures), so this routine returns
10080 /// OverloadKind::Overload; MatchedDecl is unchanged.
10081 ///
10082 /// When we process #3, Old is an overload set containing #1 and #2. We
10083 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
10084 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
10085 /// types of functions are not part of the signature), IsOverload returns
10086 /// OverloadKind::Match and MatchedDecl will be set to point to the
10087 /// FunctionDecl for #2.
10088 ///
10089 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
10090 /// class by a using declaration. The rules for whether to hide shadow
10091 /// declarations ignore some properties which otherwise figure into a function
10092 /// template's signature.
10094 const LookupResult &OldDecls, NamedDecl *&OldDecl,
10095 bool UseMemberUsingDeclRules);
10097 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10098
10099 // Checks whether MD constitutes an override the base class method BaseMD.
10100 // When checking for overrides, the object object members are ignored.
10101 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
10102 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10103
10104 enum class AllowedExplicit {
10105 /// Allow no explicit functions to be used.
10107 /// Allow explicit conversion functions but not explicit constructors.
10109 /// Allow both explicit conversion functions and explicit constructors.
10111 };
10112
10114 Expr *From, QualType ToType, bool SuppressUserConversions,
10115 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
10116 bool AllowObjCWritebackConversion);
10117
10118 /// PerformImplicitConversion - Perform an implicit conversion of the
10119 /// expression From to the type ToType. Returns the
10120 /// converted expression. Flavor is the kind of conversion we're
10121 /// performing, used in the error message. If @p AllowExplicit,
10122 /// explicit user-defined conversions are permitted.
10124 AssignmentAction Action,
10125 bool AllowExplicit = false);
10126
10127 /// IsIntegralPromotion - Determines whether the conversion from the
10128 /// expression From (whose potentially-adjusted type is FromType) to
10129 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
10130 /// sets PromotedType to the promoted type.
10131 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
10132
10133 /// IsFloatingPointPromotion - Determines whether the conversion from
10134 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
10135 /// returns true and sets PromotedType to the promoted type.
10136 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
10137
10138 /// Determine if a conversion is a complex promotion.
10139 ///
10140 /// A complex promotion is defined as a complex -> complex conversion
10141 /// where the conversion between the underlying real types is a
10142 /// floating-point or integral promotion.
10143 bool IsComplexPromotion(QualType FromType, QualType ToType);
10144
10145 /// IsPointerConversion - Determines whether the conversion of the
10146 /// expression From, which has the (possibly adjusted) type FromType,
10147 /// can be converted to the type ToType via a pointer conversion (C++
10148 /// 4.10). If so, returns true and places the converted type (that
10149 /// might differ from ToType in its cv-qualifiers at some level) into
10150 /// ConvertedType.
10151 ///
10152 /// This routine also supports conversions to and from block pointers
10153 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
10154 /// pointers to interfaces. FIXME: Once we've determined the
10155 /// appropriate overloading rules for Objective-C, we may want to
10156 /// split the Objective-C checks into a different routine; however,
10157 /// GCC seems to consider all of these conversions to be pointer
10158 /// conversions, so for now they live here. IncompatibleObjC will be
10159 /// set if the conversion is an allowed Objective-C conversion that
10160 /// should result in a warning.
10161 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
10162 bool InOverloadResolution, QualType &ConvertedType,
10163 bool &IncompatibleObjC);
10164
10165 /// isObjCPointerConversion - Determines whether this is an
10166 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
10167 /// with the same arguments and return values.
10168 bool isObjCPointerConversion(QualType FromType, QualType ToType,
10169 QualType &ConvertedType, bool &IncompatibleObjC);
10170 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
10171 QualType &ConvertedType);
10172
10173 /// FunctionParamTypesAreEqual - This routine checks two function proto types
10174 /// for equality of their parameter types. Caller has already checked that
10175 /// they have same number of parameters. If the parameters are different,
10176 /// ArgPos will have the parameter index of the first different parameter.
10177 /// If `Reversed` is true, the parameters of `NewType` will be compared in
10178 /// reverse order. That's useful if one of the functions is being used as a
10179 /// C++20 synthesized operator overload with a reversed parameter order.
10182 unsigned *ArgPos = nullptr,
10183 bool Reversed = false);
10184
10186 const FunctionProtoType *NewType,
10187 unsigned *ArgPos = nullptr,
10188 bool Reversed = false);
10189
10190 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
10191 const FunctionDecl *NewFunction,
10192 unsigned *ArgPos = nullptr,
10193 bool Reversed = false);
10194
10195 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
10196 /// function types. Catches different number of parameter, mismatch in
10197 /// parameter types, and different return types.
10199 QualType ToType);
10200
10201 /// CheckPointerConversion - Check the pointer conversion from the
10202 /// expression From to the type ToType. This routine checks for
10203 /// ambiguous or inaccessible derived-to-base pointer
10204 /// conversions for which IsPointerConversion has already returned
10205 /// true. It returns true and produces a diagnostic if there was an
10206 /// error, or returns false otherwise.
10207 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
10208 CXXCastPath &BasePath, bool IgnoreBaseAccess,
10209 bool Diagnose = true);
10210
10211 /// IsMemberPointerConversion - Determines whether the conversion of the
10212 /// expression From, which has the (possibly adjusted) type FromType, can be
10213 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
10214 /// If so, returns true and places the converted type (that might differ from
10215 /// ToType in its cv-qualifiers at some level) into ConvertedType.
10216 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
10217 bool InOverloadResolution,
10218 QualType &ConvertedType);
10219
10229 /// CheckMemberPointerConversion - Check the member pointer conversion from
10230 /// the expression From to the type ToType. This routine checks for ambiguous
10231 /// or virtual or inaccessible base-to-derived member pointer conversions for
10232 /// which IsMemberPointerConversion has already returned true. It produces a
10233 // diagnostic if there was an error.
10235 QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
10236 CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
10237 bool IgnoreBaseAccess, MemberPointerConversionDirection Direction);
10238
10239 /// IsQualificationConversion - Determines whether the conversion from
10240 /// an rvalue of type FromType to ToType is a qualification conversion
10241 /// (C++ 4.4).
10242 ///
10243 /// \param ObjCLifetimeConversion Output parameter that will be set to
10244 /// indicate when the qualification conversion involves a change in the
10245 /// Objective-C object lifetime.
10246 bool IsQualificationConversion(QualType FromType, QualType ToType,
10247 bool CStyle, bool &ObjCLifetimeConversion);
10248
10249 /// Determine whether the conversion from FromType to ToType is a valid
10250 /// conversion of ExtInfo/ExtProtoInfo on the nested function type.
10251 /// More precisely, this method checks whether FromType can be transformed
10252 /// into an exact match for ToType, by transforming its extended function
10253 /// type information in legal manner (e.g. by strictly stripping "noreturn"
10254 /// or "noexcept", or by stripping "noescape" for arguments).
10255 bool IsFunctionConversion(QualType FromType, QualType ToType) const;
10256
10257 /// Same as `IsFunctionConversion`, but if this would return true, it sets
10258 /// `ResultTy` to `ToType`.
10259 bool TryFunctionConversion(QualType FromType, QualType ToType,
10260 QualType &ResultTy) const;
10261
10264 DeclarationName Name,
10265 OverloadCandidateSet &CandidateSet,
10266 FunctionDecl *Fn, MultiExprArg Args,
10267 bool IsMember = false);
10268
10270 FunctionDecl *Fun);
10272 Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl,
10274
10275 /// PerformContextuallyConvertToBool - Perform a contextual conversion
10276 /// of the expression From to bool (C++0x [conv]p3).
10278
10279 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
10280 /// conversion of the expression From to an Objective-C pointer type.
10281 /// Returns a valid but null ExprResult if no conversion sequence exists.
10283
10285 CCEKind CCE,
10286 NamedDecl *Dest = nullptr);
10287
10289 llvm::APSInt &Value, CCEKind CCE);
10291 APValue &Value, CCEKind CCE,
10292 NamedDecl *Dest = nullptr);
10293
10294 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10295 /// That is a converted constant expression
10296 /// (which was built with BuildConvertedConstantExpression)
10299 CCEKind CCE, bool RequireInt,
10300 const APValue &PreNarrowingValue);
10301
10302 /// Abstract base class used to perform a contextual implicit
10303 /// conversion from an expression to any type passing a filter.
10305 public:
10308
10312
10313 /// Determine whether the specified type is a valid destination type
10314 /// for this conversion.
10315 virtual bool match(QualType T) = 0;
10316
10317 /// Emits a diagnostic complaining that the expression does not have
10318 /// integral or enumeration type.
10320 QualType T) = 0;
10321
10322 /// Emits a diagnostic when the expression has incomplete class type.
10323 virtual SemaDiagnosticBuilder
10325
10326 /// Emits a diagnostic when the only matching conversion function
10327 /// is explicit.
10329 SourceLocation Loc,
10330 QualType T,
10331 QualType ConvTy) = 0;
10332
10333 /// Emits a note for the explicit conversion function.
10334 virtual SemaDiagnosticBuilder
10336
10337 /// Emits a diagnostic when there are multiple possible conversion
10338 /// functions.
10340 QualType T) = 0;
10341
10342 /// Emits a note for one of the candidate conversions.
10343 virtual SemaDiagnosticBuilder
10345
10346 /// Emits a diagnostic when we picked a conversion function
10347 /// (for cases when we are not allowed to pick a conversion function).
10349 SourceLocation Loc,
10350 QualType T,
10351 QualType ConvTy) = 0;
10352
10354 };
10355
10357 bool AllowScopedEnumerations;
10358
10359 public:
10360 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10361 bool SuppressConversion)
10363 AllowScopedEnumerations(AllowScopedEnumerations) {}
10364
10365 /// Match an integral or (possibly scoped) enumeration type.
10366 bool match(QualType T) override;
10367
10369 QualType T) override {
10370 return diagnoseNotInt(S, Loc, T);
10371 }
10372
10373 /// Emits a diagnostic complaining that the expression does not have
10374 /// integral or enumeration type.
10376 QualType T) = 0;
10377 };
10378
10379 /// Perform a contextual implicit conversion.
10382 ContextualImplicitConverter &Converter);
10383
10384 /// ReferenceCompareResult - Expresses the result of comparing two
10385 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10386 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10388 /// Ref_Incompatible - The two types are incompatible, so direct
10389 /// reference binding is not possible.
10391 /// Ref_Related - The two types are reference-related, which means
10392 /// that their unqualified forms (T1 and T2) are either the same
10393 /// or T1 is a base class of T2.
10395 /// Ref_Compatible - The two types are reference-compatible.
10397 };
10398
10399 // Fake up a scoped enumeration that still contextually converts to bool.
10401 /// The conversions that would be performed on an lvalue of type T2 when
10402 /// binding a reference of type T1 to it, as determined when evaluating
10403 /// whether T1 is reference-compatible with T2.
10414 };
10416
10417 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10418 /// determine whether they are reference-compatible,
10419 /// reference-related, or incompatible, for use in C++ initialization by
10420 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10421 /// type, and the first type (T1) is the pointee type of the reference
10422 /// type being initialized.
10425 ReferenceConversions *Conv = nullptr);
10426
10427 /// AddOverloadCandidate - Adds the given function to the set of
10428 /// candidate functions, using the given function call arguments. If
10429 /// @p SuppressUserConversions, then don't allow user-defined
10430 /// conversions via constructors or conversion operators.
10431 ///
10432 /// \param PartialOverloading true if we are performing "partial" overloading
10433 /// based on an incomplete set of function arguments. This feature is used by
10434 /// code completion.
10437 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10438 bool PartialOverloading = false, bool AllowExplicit = true,
10439 bool AllowExplicitConversion = false,
10440 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10441 ConversionSequenceList EarlyConversions = {},
10443 bool AggregateCandidateDeduction = false, bool StrictPackMatch = false);
10444
10445 /// Add all of the function declarations in the given function set to
10446 /// the overload candidate set.
10448 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10449 OverloadCandidateSet &CandidateSet,
10450 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10451 bool SuppressUserConversions = false, bool PartialOverloading = false,
10452 bool FirstArgumentIsBase = false);
10453
10454 /// AddMethodCandidate - Adds a named decl (which is some kind of
10455 /// method) as a method candidate to the given overload set.
10456 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10457 Expr::Classification ObjectClassification,
10458 ArrayRef<Expr *> Args,
10459 OverloadCandidateSet &CandidateSet,
10460 bool SuppressUserConversion = false,
10461 OverloadCandidateParamOrder PO = {});
10462
10463 /// AddMethodCandidate - Adds the given C++ member function to the set
10464 /// of candidate functions, using the given function call arguments
10465 /// and the object argument (@c Object). For example, in a call
10466 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10467 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10468 /// allow user-defined conversions via constructors or conversion
10469 /// operators.
10470 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10471 CXXRecordDecl *ActingContext, QualType ObjectType,
10472 Expr::Classification ObjectClassification,
10473 ArrayRef<Expr *> Args,
10474 OverloadCandidateSet &CandidateSet,
10475 bool SuppressUserConversions = false,
10476 bool PartialOverloading = false,
10477 ConversionSequenceList EarlyConversions = {},
10479 bool StrictPackMatch = false);
10480
10481 /// Add a C++ member function template as a candidate to the candidate
10482 /// set, using template argument deduction to produce an appropriate member
10483 /// function template specialization.
10485 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10486 CXXRecordDecl *ActingContext,
10487 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10488 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10489 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10490 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10491
10492 /// Add a C++ function template specialization as a candidate
10493 /// in the candidate set, using template argument deduction to produce
10494 /// an appropriate function template specialization.
10496 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10497 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10498 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10499 bool PartialOverloading = false, bool AllowExplicit = true,
10500 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10502 bool AggregateCandidateDeduction = false);
10503
10505 /// Do not consider any user-defined conversions when constructing the
10506 /// initializing sequence.
10508
10509 /// Before constructing the initializing sequence, we check whether the
10510 /// parameter type and argument type contain any user defined conversions.
10511 /// If so, do not initialize them. This effectively bypasses some undesired
10512 /// instantiation before checking constaints, which might otherwise result
10513 /// in non-SFINAE errors e.g. recursive constraints.
10515
10522 };
10523
10524 /// Check that implicit conversion sequences can be formed for each argument
10525 /// whose corresponding parameter has a non-dependent type, per DR1391's
10526 /// [temp.deduct.call]p10.
10529 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10531 CheckNonDependentConversionsFlag UserConversionFlag,
10532 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10533 Expr::Classification ObjectClassification = {},
10534 OverloadCandidateParamOrder PO = {});
10535
10536 /// AddConversionCandidate - Add a C++ conversion function as a
10537 /// candidate in the candidate set (C++ [over.match.conv],
10538 /// C++ [over.match.copy]). From is the expression we're converting from,
10539 /// and ToType is the type that we're eventually trying to convert to
10540 /// (which may or may not be the same type as the type that the
10541 /// conversion function produces).
10543 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10544 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10545 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10546 bool AllowExplicit, bool AllowResultConversion = true,
10547 bool StrictPackMatch = false);
10548
10549 /// Adds a conversion function template specialization
10550 /// candidate to the overload set, using template argument deduction
10551 /// to deduce the template arguments of the conversion function
10552 /// template from the type that we are converting to (C++
10553 /// [temp.deduct.conv]).
10555 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10556 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10557 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10558 bool AllowExplicit, bool AllowResultConversion = true);
10559
10560 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10561 /// converts the given @c Object to a function pointer via the
10562 /// conversion function @c Conversion, and then attempts to call it
10563 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10564 /// the type of function that we'll eventually be calling.
10565 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10566 DeclAccessPair FoundDecl,
10567 CXXRecordDecl *ActingContext,
10568 const FunctionProtoType *Proto, Expr *Object,
10569 ArrayRef<Expr *> Args,
10570 OverloadCandidateSet &CandidateSet);
10571
10572 /// Add all of the non-member operator function declarations in the given
10573 /// function set to the overload candidate set.
10575 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10576 OverloadCandidateSet &CandidateSet,
10577 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10578
10579 /// Add overload candidates for overloaded operators that are
10580 /// member functions.
10581 ///
10582 /// Add the overloaded operator candidates that are member functions
10583 /// for the operator Op that was used in an operator expression such
10584 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10585 /// CandidateSet will store the added overload candidates. (C++
10586 /// [over.match.oper]).
10588 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10589 OverloadCandidateSet &CandidateSet,
10591
10592 /// AddBuiltinCandidate - Add a candidate for a built-in
10593 /// operator. ResultTy and ParamTys are the result and parameter types
10594 /// of the built-in candidate, respectively. Args and NumArgs are the
10595 /// arguments being passed to the candidate. IsAssignmentOperator
10596 /// should be true when this built-in candidate is an assignment
10597 /// operator. NumContextualBoolArguments is the number of arguments
10598 /// (at the beginning of the argument list) that will be contextually
10599 /// converted to bool.
10600 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10601 OverloadCandidateSet &CandidateSet,
10602 bool IsAssignmentOperator = false,
10603 unsigned NumContextualBoolArguments = 0);
10604
10605 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10606 /// operator overloads to the candidate set (C++ [over.built]), based
10607 /// on the operator @p Op and the arguments given. For example, if the
10608 /// operator is a binary '+', this routine might add "int
10609 /// operator+(int, int)" to cover integer addition.
10611 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10612 OverloadCandidateSet &CandidateSet);
10613
10614 /// Add function candidates found via argument-dependent lookup
10615 /// to the set of overloading candidates.
10616 ///
10617 /// This routine performs argument-dependent name lookup based on the
10618 /// given function name (which may also be an operator name) and adds
10619 /// all of the overload candidates found by ADL to the overload
10620 /// candidate set (C++ [basic.lookup.argdep]).
10622 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10623 TemplateArgumentListInfo *ExplicitTemplateArgs,
10624 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10625
10626 /// Check the enable_if expressions on the given function. Returns the first
10627 /// failing attribute, or NULL if they were all successful.
10628 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10629 ArrayRef<Expr *> Args,
10630 bool MissingImplicitThis = false);
10631
10632 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10633 /// non-ArgDependent DiagnoseIfAttrs.
10634 ///
10635 /// Argument-dependent diagnose_if attributes should be checked each time a
10636 /// function is used as a direct callee of a function call.
10637 ///
10638 /// Returns true if any errors were emitted.
10639 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10640 const Expr *ThisArg,
10641 ArrayRef<const Expr *> Args,
10642 SourceLocation Loc);
10643
10644 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10645 /// ArgDependent DiagnoseIfAttrs.
10646 ///
10647 /// Argument-independent diagnose_if attributes should be checked on every use
10648 /// of a function.
10649 ///
10650 /// Returns true if any errors were emitted.
10651 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10652 SourceLocation Loc);
10653
10654 /// Determine if \p A and \p B are equivalent internal linkage declarations
10655 /// from different modules, and thus an ambiguity error can be downgraded to
10656 /// an extension warning.
10657 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10658 const NamedDecl *B);
10660 SourceLocation Loc, const NamedDecl *D,
10661 ArrayRef<const NamedDecl *> Equiv);
10662
10663 // Emit as a 'note' the specific overload candidate
10665 const NamedDecl *Found, const FunctionDecl *Fn,
10667 QualType DestType = QualType(), bool TakingAddress = false);
10668
10669 // Emit as a series of 'note's all template and non-templates identified by
10670 // the expression Expr
10671 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10672 bool TakingAddress = false);
10673
10674 /// Returns whether the given function's address can be taken or not,
10675 /// optionally emitting a diagnostic if the address can't be taken.
10676 ///
10677 /// Returns false if taking the address of the function is illegal.
10678 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10679 bool Complain = false,
10680 SourceLocation Loc = SourceLocation());
10681
10682 // [PossiblyAFunctionType] --> [Return]
10683 // NonFunctionType --> NonFunctionType
10684 // R (A) --> R(A)
10685 // R (*)(A) --> R (A)
10686 // R (&)(A) --> R (A)
10687 // R (S::*)(A) --> R (A)
10688 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10689
10690 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10691 /// an overloaded function (C++ [over.over]), where @p From is an
10692 /// expression with overloaded function type and @p ToType is the type
10693 /// we're trying to resolve to. For example:
10694 ///
10695 /// @code
10696 /// int f(double);
10697 /// int f(int);
10698 ///
10699 /// int (*pfd)(double) = f; // selects f(double)
10700 /// @endcode
10701 ///
10702 /// This routine returns the resulting FunctionDecl if it could be
10703 /// resolved, and NULL otherwise. When @p Complain is true, this
10704 /// routine will emit diagnostics if there is an error.
10705 FunctionDecl *
10706 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10707 bool Complain, DeclAccessPair &Found,
10708 bool *pHadMultipleCandidates = nullptr);
10709
10710 /// Given an expression that refers to an overloaded function, try to
10711 /// resolve that function to a single function that can have its address
10712 /// taken. This will modify `Pair` iff it returns non-null.
10713 ///
10714 /// This routine can only succeed if from all of the candidates in the
10715 /// overload set for SrcExpr that can have their addresses taken, there is one
10716 /// candidate that is more constrained than the rest.
10717 FunctionDecl *
10718 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10719
10720 /// Given an overloaded function, tries to turn it into a non-overloaded
10721 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10722 /// will perform access checks, diagnose the use of the resultant decl, and,
10723 /// if requested, potentially perform a function-to-pointer decay.
10724 ///
10725 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10726 /// Otherwise, returns true. This may emit diagnostics and return true.
10728 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10729
10730 /// Given an expression that refers to an overloaded function, try to
10731 /// resolve that overloaded function expression down to a single function.
10732 ///
10733 /// This routine can only resolve template-ids that refer to a single function
10734 /// template, where that template-id refers to a single template whose
10735 /// template arguments are either provided by the template-id or have
10736 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10737 ///
10738 /// If no template-ids are found, no diagnostics are emitted and NULL is
10739 /// returned.
10741 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10742 TemplateSpecCandidateSet *FailedTSC = nullptr,
10743 bool ForTypeDeduction = false);
10744
10745 // Resolve and fix an overloaded expression that can be resolved
10746 // because it identifies a single function template specialization.
10747 //
10748 // Last three arguments should only be supplied if Complain = true
10749 //
10750 // Return true if it was logically possible to so resolve the
10751 // expression, regardless of whether or not it succeeded. Always
10752 // returns true if 'complain' is set.
10754 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10755 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10756 QualType DestTypeForComplaining = QualType(),
10757 unsigned DiagIDForComplaining = 0);
10758
10759 /// Add the overload candidates named by callee and/or found by argument
10760 /// dependent lookup to the given overload set.
10761 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10762 ArrayRef<Expr *> Args,
10763 OverloadCandidateSet &CandidateSet,
10764 bool PartialOverloading = false);
10765
10766 /// Add the call candidates from the given set of lookup results to the given
10767 /// overload set. Non-function lookup results are ignored.
10769 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10770 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10771
10772 // An enum used to represent the different possible results of building a
10773 // range-based for loop.
10779
10780 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10781 /// given LookupResult is non-empty, it is assumed to describe a member which
10782 /// will be invoked. Otherwise, the function will be found via argument
10783 /// dependent lookup.
10784 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10785 /// otherwise CallExpr is set to ExprError() and some non-success value
10786 /// is returned.
10788 SourceLocation RangeLoc,
10789 const DeclarationNameInfo &NameInfo,
10790 LookupResult &MemberLookup,
10791 OverloadCandidateSet *CandidateSet,
10792 Expr *Range, ExprResult *CallExpr);
10793
10794 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10795 /// (which eventually refers to the declaration Func) and the call
10796 /// arguments Args/NumArgs, attempt to resolve the function call down
10797 /// to a specific function. If overload resolution succeeds, returns
10798 /// the call expression produced by overload resolution.
10799 /// Otherwise, emits diagnostics and returns ExprError.
10801 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10802 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10803 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10804
10805 /// Constructs and populates an OverloadedCandidateSet from
10806 /// the given function.
10807 /// \returns true when an the ExprResult output parameter has been set.
10809 MultiExprArg Args, SourceLocation RParenLoc,
10810 OverloadCandidateSet *CandidateSet,
10812
10816 const UnresolvedSetImpl &Fns,
10817 bool PerformADL = true);
10818
10819 /// Create a unary operation that may resolve to an overloaded
10820 /// operator.
10821 ///
10822 /// \param OpLoc The location of the operator itself (e.g., '*').
10823 ///
10824 /// \param Opc The UnaryOperatorKind that describes this operator.
10825 ///
10826 /// \param Fns The set of non-member functions that will be
10827 /// considered by overload resolution. The caller needs to build this
10828 /// set based on the context using, e.g.,
10829 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10830 /// set should not contain any member functions; those will be added
10831 /// by CreateOverloadedUnaryOp().
10832 ///
10833 /// \param Input The input argument.
10836 const UnresolvedSetImpl &Fns, Expr *input,
10837 bool RequiresADL = true);
10838
10839 /// Perform lookup for an overloaded binary operator.
10842 const UnresolvedSetImpl &Fns,
10843 ArrayRef<Expr *> Args, bool RequiresADL = true);
10844
10845 /// Create a binary operation that may resolve to an overloaded
10846 /// operator.
10847 ///
10848 /// \param OpLoc The location of the operator itself (e.g., '+').
10849 ///
10850 /// \param Opc The BinaryOperatorKind that describes this operator.
10851 ///
10852 /// \param Fns The set of non-member functions that will be
10853 /// considered by overload resolution. The caller needs to build this
10854 /// set based on the context using, e.g.,
10855 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10856 /// set should not contain any member functions; those will be added
10857 /// by CreateOverloadedBinOp().
10858 ///
10859 /// \param LHS Left-hand argument.
10860 /// \param RHS Right-hand argument.
10861 /// \param PerformADL Whether to consider operator candidates found by ADL.
10862 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10863 /// C++20 operator rewrites.
10864 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10865 /// the function in question. Such a function is never a candidate in
10866 /// our overload resolution. This also enables synthesizing a three-way
10867 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10869 const UnresolvedSetImpl &Fns, Expr *LHS,
10870 Expr *RHS, bool RequiresADL = true,
10871 bool AllowRewrittenCandidates = true,
10872 FunctionDecl *DefaultedFn = nullptr);
10874 const UnresolvedSetImpl &Fns,
10875 Expr *LHS, Expr *RHS,
10876 FunctionDecl *DefaultedFn);
10877
10879 SourceLocation RLoc, Expr *Base,
10880 MultiExprArg Args);
10881
10882 /// BuildCallToMemberFunction - Build a call to a member
10883 /// function. MemExpr is the expression that refers to the member
10884 /// function (and includes the object parameter), Args/NumArgs are the
10885 /// arguments to the function call (not including the object
10886 /// parameter). The caller needs to validate that the member
10887 /// expression refers to a non-static member function or an overloaded
10888 /// member function.
10890 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10891 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10892 bool IsExecConfig = false, bool AllowRecovery = false);
10893
10894 /// BuildCallToObjectOfClassType - Build a call to an object of class
10895 /// type (C++ [over.call.object]), which can end up invoking an
10896 /// overloaded function call operator (@c operator()) or performing a
10897 /// user-defined conversion on the object argument.
10899 SourceLocation LParenLoc,
10900 MultiExprArg Args,
10901 SourceLocation RParenLoc);
10902
10903 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
10904 /// (if one exists), where @c Base is an expression of class type and
10905 /// @c Member is the name of the member we're trying to find.
10907 SourceLocation OpLoc,
10908 bool *NoArrowOperatorFound = nullptr);
10909
10912 bool HadMultipleCandidates);
10913
10914 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
10915 /// to a literal operator described by the provided lookup results.
10918 SourceLocation LitEndLoc,
10919 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10920
10921 /// FixOverloadedFunctionReference - E is an expression that refers to
10922 /// a C++ overloaded function (possibly with some parentheses and
10923 /// perhaps a '&' around it). We have resolved the overloaded function
10924 /// to the function declaration Fn, so patch up the expression E to
10925 /// refer (possibly indirectly) to Fn. Returns the new expr.
10927 FunctionDecl *Fn);
10929 DeclAccessPair FoundDecl,
10930 FunctionDecl *Fn);
10931
10932 /// - Returns a selector which best matches given argument list or
10933 /// nullptr if none could be found
10935 bool IsInstance,
10937
10938 ///@}
10939
10940 //
10941 //
10942 // -------------------------------------------------------------------------
10943 //
10944 //
10945
10946 /// \name Statements
10947 /// Implementations are in SemaStmt.cpp
10948 ///@{
10949
10950public:
10951 /// Stack of active SEH __finally scopes. Can be empty.
10953
10954 /// Stack of '_Defer' statements that are currently being parsed, as well
10955 /// as the locations of their '_Defer' keywords. Can be empty.
10957
10958 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
10960
10962 bool HasLeadingEmptyMacro = false);
10963
10965 SourceLocation EndLoc);
10967
10968 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
10969 /// whose result is unused, warn.
10970 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
10971
10972 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
10976 ArrayRef<Stmt *> Elts, bool isStmtExpr);
10977
10979
10982 SourceLocation DotDotDotLoc, ExprResult RHS,
10983 SourceLocation ColonLoc);
10984
10985 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
10986 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
10987
10989 SourceLocation ColonLoc, Stmt *SubStmt,
10990 Scope *CurScope);
10992 SourceLocation ColonLoc, Stmt *SubStmt);
10993
10995 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
10997 Stmt *SubStmt);
10998
10999 /// Check whether the given statement can have musttail applied to it,
11000 /// issuing a diagnostic and returning false if not. In the success case,
11001 /// the statement is rewritten to remove implicit nodes from the return
11002 /// value.
11003 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
11004
11006 SourceLocation LParenLoc, Stmt *InitStmt,
11008 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11010 SourceLocation LParenLoc, Stmt *InitStmt,
11012 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11013
11015
11017 SourceLocation LParenLoc, Stmt *InitStmt,
11019 SourceLocation RParenLoc);
11021 Stmt *Body);
11022
11023 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
11024 /// integer not in the range of enum values.
11025 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
11026 Expr *SrcExpr);
11027
11030 Stmt *Body);
11032 SourceLocation WhileLoc, SourceLocation CondLParen,
11033 Expr *Cond, SourceLocation CondRParen);
11034
11036 Stmt *First, ConditionResult Second,
11037 FullExprArg Third, SourceLocation RParenLoc,
11038 Stmt *Body);
11039
11040 /// In an Objective C collection iteration statement:
11041 /// for (x in y)
11042 /// x can be an arbitrary l-value expression. Bind it up as a
11043 /// full-expression.
11045
11047 /// Initial building of a for-range statement.
11049 /// Instantiation or recovery rebuild of a for-range statement. Don't
11050 /// attempt any typo-correction.
11052 /// Determining whether a for-range statement could be built. Avoid any
11053 /// unnecessary or irreversible actions.
11055 };
11056
11057 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
11058 ///
11059 /// C++11 [stmt.ranged]:
11060 /// A range-based for statement is equivalent to
11061 ///
11062 /// {
11063 /// auto && __range = range-init;
11064 /// for ( auto __begin = begin-expr,
11065 /// __end = end-expr;
11066 /// __begin != __end;
11067 /// ++__begin ) {
11068 /// for-range-declaration = *__begin;
11069 /// statement
11070 /// }
11071 /// }
11072 ///
11073 /// The body of the loop is not available yet, since it cannot be analysed
11074 /// until we have determined the type of the for-range-declaration.
11076 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
11077 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
11078 SourceLocation RParenLoc, BuildForRangeKind Kind,
11079 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11080
11081 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
11082 StmtResult BuildCXXForRangeStmt(
11083 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
11084 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
11085 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
11086 BuildForRangeKind Kind,
11087 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11088
11089 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
11090 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
11091 /// body cannot be performed until after the type of the range variable is
11092 /// determined.
11093 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
11094
11095 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
11096 LabelDecl *TheDecl);
11097 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
11098 SourceLocation StarLoc, Expr *DestExp);
11099 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope,
11100 LabelDecl *Label, SourceLocation LabelLoc);
11101 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope,
11102 LabelDecl *Label, SourceLocation LabelLoc);
11103
11104 void ActOnStartOfDeferStmt(SourceLocation DeferLoc, Scope *CurScope);
11105 void ActOnDeferStmtError(Scope *CurScope);
11106 StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope);
11107
11110
11113
11114 bool isMoveEligible() const { return S != None; };
11116 };
11118
11119 /// Determine whether the given expression might be move-eligible or
11120 /// copy-elidable in either a (co_)return statement or throw expression,
11121 /// without considering function return type, if applicable.
11122 ///
11123 /// \param E The expression being returned from the function or block,
11124 /// being thrown, or being co_returned from a coroutine. This expression
11125 /// might be modified by the implementation.
11126 ///
11127 /// \param Mode Overrides detection of current language mode
11128 /// and uses the rules for C++23.
11129 ///
11130 /// \returns An aggregate which contains the Candidate and isMoveEligible
11131 /// and isCopyElidable methods. If Candidate is non-null, it means
11132 /// isMoveEligible() would be true under the most permissive language
11133 /// standard.
11134 NamedReturnInfo getNamedReturnInfo(
11136
11137 /// Determine whether the given NRVO candidate variable is move-eligible or
11138 /// copy-elidable, without considering function return type.
11139 ///
11140 /// \param VD The NRVO candidate variable.
11141 ///
11142 /// \returns An aggregate which contains the Candidate and isMoveEligible
11143 /// and isCopyElidable methods. If Candidate is non-null, it means
11144 /// isMoveEligible() would be true under the most permissive language
11145 /// standard.
11146 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
11147
11148 /// Updates given NamedReturnInfo's move-eligible and
11149 /// copy-elidable statuses, considering the function
11150 /// return type criteria as applicable to return statements.
11151 ///
11152 /// \param Info The NamedReturnInfo object to update.
11153 ///
11154 /// \param ReturnType This is the return type of the function.
11155 /// \returns The copy elision candidate, in case the initial return expression
11156 /// was copy elidable, or nullptr otherwise.
11157 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
11158 QualType ReturnType);
11159
11160 /// Perform the initialization of a potentially-movable value, which
11161 /// is the result of return value.
11162 ///
11163 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
11164 /// treat returned lvalues as rvalues in certain cases (to prefer move
11165 /// construction), then falls back to treating them as lvalues if that failed.
11168 const NamedReturnInfo &NRInfo, Expr *Value,
11169 bool SupressSimplerImplicitMoves = false);
11170
11172
11173 /// Deduce the return type for a function from a returned expression, per
11174 /// C++1y [dcl.spec.auto]p6.
11176 SourceLocation ReturnLoc, Expr *RetExpr,
11177 const AutoType *AT);
11178
11179 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11180 Scope *CurScope);
11181 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11182 bool AllowRecovery = false);
11183
11184 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
11185 /// for capturing scopes.
11187 NamedReturnInfo &NRInfo,
11188 bool SupressSimplerImplicitMoves);
11189
11190 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
11191 /// and creates a proper catch handler from them.
11193 Stmt *HandlerBlock);
11194
11195 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
11196 /// handlers and creates a try statement from them.
11198 ArrayRef<Stmt *> Handlers);
11199
11200 void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry);
11201
11202 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
11203 SourceLocation TryLoc, Stmt *TryBlock,
11204 Stmt *Handler);
11206 Stmt *Block);
11211
11213 bool IsIfExists,
11214 NestedNameSpecifierLoc QualifierLoc,
11215 DeclarationNameInfo NameInfo,
11216 Stmt *Nested);
11218 bool IsIfExists, CXXScopeSpec &SS,
11219 UnqualifiedId &Name, Stmt *Nested);
11220
11221 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11222 CapturedRegionKind Kind, unsigned NumParams);
11223 typedef std::pair<StringRef, QualType> CapturedParamNameType;
11224 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11225 CapturedRegionKind Kind,
11227 unsigned OpenMPCaptureLevel = 0);
11231 SourceLocation Loc,
11232 unsigned NumParams);
11233
11234private:
11235 /// Check whether the given statement can have musttail applied to it,
11236 /// issuing a diagnostic and returning false if not.
11237 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
11238
11239 /// Check if the given expression contains 'break' or 'continue'
11240 /// statement that produces control flow different from GCC.
11241 void CheckBreakContinueBinding(Expr *E);
11242
11243 ///@}
11244
11245 //
11246 //
11247 // -------------------------------------------------------------------------
11248 //
11249 //
11250
11251 /// \name `inline asm` Statement
11252 /// Implementations are in SemaStmtAsm.cpp
11253 ///@{
11254
11255public:
11256 ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel);
11257 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
11258 bool IsVolatile, unsigned NumOutputs,
11259 unsigned NumInputs, IdentifierInfo **Names,
11260 MultiExprArg Constraints, MultiExprArg Exprs,
11261 Expr *AsmString, MultiExprArg Clobbers,
11262 unsigned NumLabels, SourceLocation RParenLoc);
11263
11265 llvm::InlineAsmIdentifierInfo &Info);
11267 SourceLocation TemplateKWLoc,
11268 UnqualifiedId &Id,
11269 bool IsUnevaluatedContext);
11270 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
11271 SourceLocation AsmLoc);
11273 SourceLocation AsmLoc);
11275 ArrayRef<Token> AsmToks, StringRef AsmString,
11276 unsigned NumOutputs, unsigned NumInputs,
11277 ArrayRef<StringRef> Constraints,
11278 ArrayRef<StringRef> Clobbers,
11279 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
11280 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
11281 SourceLocation Location, bool AlwaysCreate);
11282
11283 ///@}
11284
11285 //
11286 //
11287 // -------------------------------------------------------------------------
11288 //
11289 //
11290
11291 /// \name Statement Attribute Handling
11292 /// Implementations are in SemaStmtAttr.cpp
11293 ///@{
11294
11295public:
11296 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11297 const AttributeCommonInfo &A);
11298 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11299 const AttributeCommonInfo &A);
11300
11301 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11303
11304 /// Process the attributes before creating an attributed statement. Returns
11305 /// the semantic attributes that have been processed.
11306 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11308
11310 SourceRange Range);
11312 const IdentifierInfo *AttrName,
11313 SourceRange Range);
11314
11315 ///@}
11316
11317 //
11318 //
11319 // -------------------------------------------------------------------------
11320 //
11321 //
11322
11323 /// \name C++ Templates
11324 /// Implementations are in SemaTemplate.cpp
11325 ///@{
11326
11327public:
11328 // Saves the current floating-point pragma stack and clear it in this Sema.
11330 public:
11332 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11333 S.FpPragmaStack.Stack.clear();
11334 }
11335 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11338
11339 private:
11340 Sema &S;
11342 };
11343
11345 CurFPFeatures = FPO;
11346 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11347 }
11348
11354
11359
11360 typedef llvm::MapVector<const FunctionDecl *,
11361 std::unique_ptr<LateParsedTemplate>>
11364
11365 /// Determine the number of levels of enclosing template parameters. This is
11366 /// only usable while parsing. Note that this does not include dependent
11367 /// contexts in which no template parameters have yet been declared, such as
11368 /// in a terse function template or generic lambda before the first 'auto' is
11369 /// encountered.
11370 unsigned getTemplateDepth(Scope *S) const;
11371
11373 bool AllowFunctionTemplates = true,
11374 bool AllowDependent = true);
11376 bool AllowFunctionTemplates = true,
11377 bool AllowDependent = true,
11378 bool AllowNonTemplateFunctions = false);
11379 /// Try to interpret the lookup result D as a template-name.
11380 ///
11381 /// \param D A declaration found by name lookup.
11382 /// \param AllowFunctionTemplates Whether function templates should be
11383 /// considered valid results.
11384 /// \param AllowDependent Whether unresolved using declarations (that might
11385 /// name templates) should be considered valid results.
11387 bool AllowFunctionTemplates = true,
11388 bool AllowDependent = true);
11389
11391 /// Whether and why a template name is required in this lookup.
11393 public:
11394 /// Template name is required if TemplateKWLoc is valid.
11396 : TemplateKW(TemplateKWLoc) {}
11397 /// Template name is unconditionally required.
11399
11401 return TemplateKW.value_or(SourceLocation());
11402 }
11403 bool hasTemplateKeyword() const {
11404 return getTemplateKeywordLoc().isValid();
11405 }
11406 bool isRequired() const { return TemplateKW != SourceLocation(); }
11407 explicit operator bool() const { return isRequired(); }
11408
11409 private:
11410 std::optional<SourceLocation> TemplateKW;
11411 };
11412
11414 /// This is not assumed to be a template name.
11416 /// This is assumed to be a template name because lookup found nothing.
11418 /// This is assumed to be a template name because lookup found one or more
11419 /// functions (but no function templates).
11421 };
11422
11423 bool
11425 QualType ObjectType, bool EnteringContext,
11426 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11427 AssumedTemplateKind *ATK = nullptr,
11428 bool AllowTypoCorrection = true);
11429
11431 bool hasTemplateKeyword,
11432 const UnqualifiedId &Name,
11433 ParsedType ObjectType, bool EnteringContext,
11435 bool &MemberOfUnknownSpecialization,
11436 bool Disambiguation = false);
11437
11438 /// Try to resolve an undeclared template name as a type template.
11439 ///
11440 /// Sets II to the identifier corresponding to the template name, and updates
11441 /// Name to a corresponding (typo-corrected) type template name and TNK to
11442 /// the corresponding kind, if possible.
11444 TemplateNameKind &TNK,
11445 SourceLocation NameLoc,
11446 IdentifierInfo *&II);
11447
11448 /// Determine whether a particular identifier might be the name in a C++1z
11449 /// deduction-guide declaration.
11450 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11451 SourceLocation NameLoc, CXXScopeSpec &SS,
11452 ParsedTemplateTy *Template = nullptr);
11453
11455 SourceLocation IILoc, Scope *S,
11456 const CXXScopeSpec *SS,
11457 TemplateTy &SuggestedTemplate,
11458 TemplateNameKind &SuggestedKind);
11459
11460 /// Determine whether we would be unable to instantiate this template (because
11461 /// it either has no definition, or is in the process of being instantiated).
11463 SourceLocation PointOfInstantiation, NamedDecl *Instantiation,
11464 bool InstantiatedFromMember, const NamedDecl *Pattern,
11465 const NamedDecl *PatternDef, TemplateSpecializationKind TSK,
11466 bool Complain = true, bool *Unreachable = nullptr);
11467
11468 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11469 /// that the template parameter 'PrevDecl' is being shadowed by a new
11470 /// declaration at location Loc. Returns true to indicate that this is
11471 /// an error, and false otherwise.
11472 ///
11473 /// \param Loc The location of the declaration that shadows a template
11474 /// parameter.
11475 ///
11476 /// \param PrevDecl The template parameter that the declaration shadows.
11477 ///
11478 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11479 /// a warning for compatibility with older versions of clang.
11480 /// Ignored when MSVC compatibility is enabled.
11482 bool SupportedForCompatibility = false);
11483
11484 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11485 /// the parameter D to reference the templated declaration and return a
11486 /// pointer to the template declaration. Otherwise, do nothing to D and return
11487 /// null.
11489
11490 /// ActOnTypeParameter - Called when a C++ template type parameter
11491 /// (e.g., "typename T") has been parsed. Typename specifies whether
11492 /// the keyword "typename" was used to declare the type parameter
11493 /// (otherwise, "class" was used), and KeyLoc is the location of the
11494 /// "class" or "typename" keyword. ParamName is the name of the
11495 /// parameter (NULL indicates an unnamed template parameter) and
11496 /// ParamNameLoc is the location of the parameter name (if any).
11497 /// If the type parameter has a default argument, it will be added
11498 /// later via ActOnTypeParameterDefault.
11500 SourceLocation EllipsisLoc,
11501 SourceLocation KeyLoc,
11502 IdentifierInfo *ParamName,
11503 SourceLocation ParamNameLoc, unsigned Depth,
11504 unsigned Position, SourceLocation EqualLoc,
11505 ParsedType DefaultArg, bool HasTypeConstraint);
11506
11508
11509 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11511 TemplateTypeParmDecl *ConstrainedParameter,
11512 SourceLocation EllipsisLoc);
11513 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11515 TemplateTypeParmDecl *ConstrainedParameter,
11516 SourceLocation EllipsisLoc,
11517 bool AllowUnexpandedPack);
11518
11519 /// Attach a type-constraint to a template parameter.
11520 /// \returns true if an error occurred. This can happen if the
11521 /// immediately-declared constraint could not be formed (e.g. incorrect number
11522 /// of arguments for the named concept).
11524 DeclarationNameInfo NameInfo,
11525 TemplateDecl *NamedConcept, NamedDecl *FoundDecl,
11526 const TemplateArgumentListInfo *TemplateArgs,
11527 TemplateTypeParmDecl *ConstrainedParameter,
11528 SourceLocation EllipsisLoc);
11529
11531 NonTypeTemplateParmDecl *NewConstrainedParm,
11532 NonTypeTemplateParmDecl *OrigConstrainedParm,
11533 SourceLocation EllipsisLoc);
11534
11535 /// Require the given type to be a structural type, and diagnose if it is not.
11536 ///
11537 /// \return \c true if an error was produced.
11539
11540 /// Check that the type of a non-type template parameter is
11541 /// well-formed.
11542 ///
11543 /// \returns the (possibly-promoted) parameter type if valid;
11544 /// otherwise, produces a diagnostic and returns a NULL type.
11546 SourceLocation Loc);
11548
11550 unsigned Depth, unsigned Position,
11551 SourceLocation EqualLoc,
11552 Expr *DefaultArg);
11553
11554 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11555 /// parameter (e.g. T in template <template <typename> class T> class array)
11556 /// has been parsed. S is the current scope.
11558 Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind,
11559 bool TypenameKeyword, TemplateParameterList *Params,
11560 SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11561 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11562 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11563
11564 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11565 /// constrained by RequiresClause, that contains the template parameters in
11566 /// Params.
11568 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11569 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11570 SourceLocation RAngleLoc, Expr *RequiresClause);
11571
11572 /// The context in which we are checking a template parameter list.
11574 // For this context, Class, Variable, TypeAlias, and non-pack Template
11575 // Template Parameters are treated uniformly.
11577
11584 };
11585
11586 /// Checks the validity of a template parameter list, possibly
11587 /// considering the template parameter list from a previous
11588 /// declaration.
11589 ///
11590 /// If an "old" template parameter list is provided, it must be
11591 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11592 /// template parameter list.
11593 ///
11594 /// \param NewParams Template parameter list for a new template
11595 /// declaration. This template parameter list will be updated with any
11596 /// default arguments that are carried through from the previous
11597 /// template parameter list.
11598 ///
11599 /// \param OldParams If provided, template parameter list from a
11600 /// previous declaration of the same template. Default template
11601 /// arguments will be merged from the old template parameter list to
11602 /// the new template parameter list.
11603 ///
11604 /// \param TPC Describes the context in which we are checking the given
11605 /// template parameter list.
11606 ///
11607 /// \param SkipBody If we might have already made a prior merged definition
11608 /// of this template visible, the corresponding body-skipping information.
11609 /// Default argument redefinition is not an error when skipping such a body,
11610 /// because (under the ODR) we can assume the default arguments are the same
11611 /// as the prior merged definition.
11612 ///
11613 /// \returns true if an error occurred, false otherwise.
11615 TemplateParameterList *OldParams,
11617 SkipBodyInfo *SkipBody = nullptr);
11618
11619 /// Match the given template parameter lists to the given scope
11620 /// specifier, returning the template parameter list that applies to the
11621 /// name.
11622 ///
11623 /// \param DeclStartLoc the start of the declaration that has a scope
11624 /// specifier or a template parameter list.
11625 ///
11626 /// \param DeclLoc The location of the declaration itself.
11627 ///
11628 /// \param SS the scope specifier that will be matched to the given template
11629 /// parameter lists. This scope specifier precedes a qualified name that is
11630 /// being declared.
11631 ///
11632 /// \param TemplateId The template-id following the scope specifier, if there
11633 /// is one. Used to check for a missing 'template<>'.
11634 ///
11635 /// \param ParamLists the template parameter lists, from the outermost to the
11636 /// innermost template parameter lists.
11637 ///
11638 /// \param IsFriend Whether to apply the slightly different rules for
11639 /// matching template parameters to scope specifiers in friend
11640 /// declarations.
11641 ///
11642 /// \param IsMemberSpecialization will be set true if the scope specifier
11643 /// denotes a fully-specialized type, and therefore this is a declaration of
11644 /// a member specialization.
11645 ///
11646 /// \returns the template parameter list, if any, that corresponds to the
11647 /// name that is preceded by the scope specifier @p SS. This template
11648 /// parameter list may have template parameters (if we're declaring a
11649 /// template) or may have no template parameters (if we're declaring a
11650 /// template specialization), or may be NULL (if what we're declaring isn't
11651 /// itself a template).
11653 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11654 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11655 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11656 bool &IsMemberSpecialization, bool &Invalid,
11657 bool SuppressDiagnostic = false);
11658
11659 /// Returns the template parameter list with all default template argument
11660 /// information.
11662
11664 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11665 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11666 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11667 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11668 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11669 TemplateParameterList **OuterTemplateParamLists,
11670 SkipBodyInfo *SkipBody = nullptr);
11671
11672 /// Translates template arguments as provided by the parser
11673 /// into template arguments used by semantic analysis.
11676
11677 /// Convert a parsed type into a parsed template argument. This is mostly
11678 /// trivial, except that we may have parsed a C++17 deduced class template
11679 /// specialization type, in which case we should form a template template
11680 /// argument instead of a type template argument.
11682
11684
11687 SourceLocation TemplateLoc,
11688 TemplateArgumentListInfo &TemplateArgs,
11689 Scope *Scope, bool ForNestedNameSpecifier);
11690
11692 ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword,
11693 SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS,
11694 SourceLocation TemplateKWLoc, TemplateTy Template,
11695 const IdentifierInfo *TemplateII,
11696 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11697 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11698 bool IsCtorOrDtorName = false, bool IsClassName = false,
11699 ImplicitTypenameContext AllowImplicitTypename =
11701
11702 /// Parsed an elaborated-type-specifier that refers to a template-id,
11703 /// such as \c class T::template apply<U>.
11705 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11706 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11707 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11708 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11709
11712 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11714
11715 /// Get the specialization of the given variable template corresponding to
11716 /// the specified argument list, or a null-but-valid result if the arguments
11717 /// are dependent.
11719 SourceLocation TemplateLoc,
11720 SourceLocation TemplateNameLoc,
11721 const TemplateArgumentListInfo &TemplateArgs,
11722 bool SetWrittenArgs);
11723
11724 /// Form a reference to the specialization of the given variable template
11725 /// corresponding to the specified argument list, or a null-but-valid result
11726 /// if the arguments are dependent.
11728 const DeclarationNameInfo &NameInfo,
11730 SourceLocation TemplateLoc,
11731 const TemplateArgumentListInfo *TemplateArgs);
11732
11734 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
11736 const TemplateArgumentListInfo *TemplateArgs);
11737
11739 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11740 const DeclarationNameInfo &ConceptNameInfo,
11741 NamedDecl *FoundDecl, TemplateDecl *NamedConcept,
11742 const TemplateArgumentListInfo *TemplateArgs,
11743 bool DoCheckConstraintSatisfaction = true);
11744
11747 bool TemplateKeyword, TemplateDecl *TD,
11748 SourceLocation Loc);
11749
11751 SourceLocation TemplateKWLoc, LookupResult &R,
11752 bool RequiresADL,
11753 const TemplateArgumentListInfo *TemplateArgs);
11754
11755 // We actually only call this from template instantiation.
11758 const DeclarationNameInfo &NameInfo,
11759 const TemplateArgumentListInfo *TemplateArgs,
11760 bool IsAddressOfOperand);
11761
11763 return Pack.pack_size() - 1 - *ArgPackSubstIndex;
11764 }
11765
11768 Arg = Arg.pack_elements()[*ArgPackSubstIndex];
11769 if (Arg.isPackExpansion())
11770 Arg = Arg.getPackExpansionPattern();
11771 return Arg;
11772 }
11773
11775 Decl *AssociatedDecl, const NonTypeTemplateParmDecl *NTTP,
11776 SourceLocation loc, TemplateArgument Replacement,
11777 UnsignedOrNone PackIndex, bool Final);
11778
11779 /// Form a template name from a name that is syntactically required to name a
11780 /// template, either due to use of the 'template' keyword or because a name in
11781 /// this syntactic context is assumed to name a template (C++
11782 /// [temp.names]p2-4).
11783 ///
11784 /// This action forms a template name given the name of the template and its
11785 /// optional scope specifier. This is used when the 'template' keyword is used
11786 /// or when the parsing context unambiguously treats a following '<' as
11787 /// introducing a template argument list. Note that this may produce a
11788 /// non-dependent template name if we can perform the lookup now and identify
11789 /// the named template.
11790 ///
11791 /// For example, given "x.MetaFun::template apply", the scope specifier
11792 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11793 /// of the "template" keyword, and "apply" is the \p Name.
11795 SourceLocation TemplateKWLoc,
11796 const UnqualifiedId &Name,
11797 ParsedType ObjectType,
11798 bool EnteringContext, TemplateTy &Template,
11799 bool AllowInjectedClassName = false);
11800
11802 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11803 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11805 MultiTemplateParamsArg TemplateParameterLists,
11806 SkipBodyInfo *SkipBody = nullptr);
11807
11808 /// Check the non-type template arguments of a class template
11809 /// partial specialization according to C++ [temp.class.spec]p9.
11810 ///
11811 /// \param TemplateNameLoc the location of the template name.
11812 /// \param PrimaryTemplate the template parameters of the primary class
11813 /// template.
11814 /// \param NumExplicit the number of explicitly-specified template arguments.
11815 /// \param TemplateArgs the template arguments of the class template
11816 /// partial specialization.
11817 ///
11818 /// \returns \c true if there was an error, \c false otherwise.
11820 TemplateDecl *PrimaryTemplate,
11821 unsigned NumExplicitArgs,
11827
11829 MultiTemplateParamsArg TemplateParameterLists,
11830 Declarator &D);
11831
11832 /// Diagnose cases where we have an explicit template specialization
11833 /// before/after an explicit template instantiation, producing diagnostics
11834 /// for those cases where they are required and determining whether the
11835 /// new specialization/instantiation will have any effect.
11836 ///
11837 /// \param NewLoc the location of the new explicit specialization or
11838 /// instantiation.
11839 ///
11840 /// \param NewTSK the kind of the new explicit specialization or
11841 /// instantiation.
11842 ///
11843 /// \param PrevDecl the previous declaration of the entity.
11844 ///
11845 /// \param PrevTSK the kind of the old explicit specialization or
11846 /// instantiatin.
11847 ///
11848 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11849 /// declaration was instantiated (either implicitly or explicitly).
11850 ///
11851 /// \param HasNoEffect will be set to true to indicate that the new
11852 /// specialization or instantiation has no effect and should be ignored.
11853 ///
11854 /// \returns true if there was an error that should prevent the introduction
11855 /// of the new declaration into the AST, false otherwise.
11857 SourceLocation NewLoc,
11858 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11859 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11860 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11861
11862 /// Perform semantic analysis for the given dependent function
11863 /// template specialization.
11864 ///
11865 /// The only possible way to get a dependent function template specialization
11866 /// is with a friend declaration, like so:
11867 ///
11868 /// \code
11869 /// template <class T> void foo(T);
11870 /// template <class T> class A {
11871 /// friend void foo<>(T);
11872 /// };
11873 /// \endcode
11874 ///
11875 /// There really isn't any useful analysis we can do here, so we
11876 /// just store the information.
11878 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
11880
11881 /// Perform semantic analysis for the given function template
11882 /// specialization.
11883 ///
11884 /// This routine performs all of the semantic analysis required for an
11885 /// explicit function template specialization. On successful completion,
11886 /// the function declaration \p FD will become a function template
11887 /// specialization.
11888 ///
11889 /// \param FD the function declaration, which will be updated to become a
11890 /// function template specialization.
11891 ///
11892 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
11893 /// if any. Note that this may be valid info even when 0 arguments are
11894 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
11895 /// as it anyway contains info on the angle brackets locations.
11896 ///
11897 /// \param Previous the set of declarations that may be specialized by
11898 /// this function specialization.
11899 ///
11900 /// \param QualifiedFriend whether this is a lookup for a qualified friend
11901 /// declaration with no explicit template argument list that might be
11902 /// befriending a function template specialization.
11904 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
11905 LookupResult &Previous, bool QualifiedFriend = false);
11906
11907 /// Perform semantic analysis for the given non-template member
11908 /// specialization.
11909 ///
11910 /// This routine performs all of the semantic analysis required for an
11911 /// explicit member function specialization. On successful completion,
11912 /// the function declaration \p FD will become a member function
11913 /// specialization.
11914 ///
11915 /// \param Member the member declaration, which will be updated to become a
11916 /// specialization.
11917 ///
11918 /// \param Previous the set of declarations, one of which may be specialized
11919 /// by this function specialization; the set will be modified to contain the
11920 /// redeclared member.
11923
11924 // Explicit instantiation of a class template specialization
11926 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
11927 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
11928 TemplateTy Template, SourceLocation TemplateNameLoc,
11929 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
11930 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
11931
11932 // Explicit instantiation of a member class of a class template.
11934 SourceLocation TemplateLoc,
11935 unsigned TagSpec, SourceLocation KWLoc,
11936 CXXScopeSpec &SS, IdentifierInfo *Name,
11937 SourceLocation NameLoc,
11938 const ParsedAttributesView &Attr);
11939
11941 SourceLocation TemplateLoc,
11942 Declarator &D);
11943
11944 /// If the given template parameter has a default template
11945 /// argument, substitute into that default template argument and
11946 /// return the corresponding template argument.
11948 TemplateDecl *Template, SourceLocation TemplateKWLoc,
11949 SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param,
11950 ArrayRef<TemplateArgument> SugaredConverted,
11951 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
11952
11953 /// Returns the top most location responsible for the definition of \p N.
11954 /// If \p N is a a template specialization, this is the location
11955 /// of the top of the instantiation stack.
11956 /// Otherwise, the location of \p N is returned.
11958
11959 /// Specifies the context in which a particular template
11960 /// argument is being checked.
11962 /// The template argument was specified in the code or was
11963 /// instantiated with some deduced template arguments.
11965
11966 /// The template argument was deduced via template argument
11967 /// deduction.
11969
11970 /// The template argument was deduced from an array bound
11971 /// via template argument deduction.
11973 };
11974
11982
11983 /// The checked, converted argument will be added to the
11984 /// end of these vectors.
11986
11987 /// The check is being performed in the context of partial ordering.
11989
11990 /// If true, assume these template arguments are
11991 /// the injected template arguments for a template template parameter.
11992 /// This will relax the requirement that all its possible uses are valid:
11993 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
11994 /// during instantiation.
11996
11997 /// Is set to true when, in the context of TTP matching, a pack parameter
11998 /// matches non-pack arguments.
11999 bool StrictPackMatch = false;
12000 };
12001
12002 /// Check that the given template argument corresponds to the given
12003 /// template parameter.
12004 ///
12005 /// \param Param The template parameter against which the argument will be
12006 /// checked.
12007 ///
12008 /// \param Arg The template argument, which may be updated due to conversions.
12009 ///
12010 /// \param Template The template in which the template argument resides.
12011 ///
12012 /// \param TemplateLoc The location of the template name for the template
12013 /// whose argument list we're matching.
12014 ///
12015 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
12016 /// the template argument list.
12017 ///
12018 /// \param ArgumentPackIndex The index into the argument pack where this
12019 /// argument will be placed. Only valid if the parameter is a parameter pack.
12020 ///
12021 /// \param CTAK Describes how we arrived at this particular template argument:
12022 /// explicitly written, deduced, etc.
12023 ///
12024 /// \returns true on error, false otherwise.
12026 NamedDecl *Template, SourceLocation TemplateLoc,
12027 SourceLocation RAngleLoc,
12028 unsigned ArgumentPackIndex,
12031
12032 /// Check that the given template arguments can be provided to
12033 /// the given template, converting the arguments along the way.
12034 ///
12035 /// \param Template The template to which the template arguments are being
12036 /// provided.
12037 ///
12038 /// \param TemplateLoc The location of the template name in the source.
12039 ///
12040 /// \param TemplateArgs The list of template arguments. If the template is
12041 /// a template template parameter, this function may extend the set of
12042 /// template arguments to also include substituted, defaulted template
12043 /// arguments.
12044 ///
12045 /// \param PartialTemplateArgs True if the list of template arguments is
12046 /// intentionally partial, e.g., because we're checking just the initial
12047 /// set of template arguments.
12048 ///
12049 /// \param Converted Will receive the converted, canonicalized template
12050 /// arguments.
12051 ///
12052 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
12053 /// contain the converted forms of the template arguments as written.
12054 /// Otherwise, \p TemplateArgs will not be modified.
12055 ///
12056 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
12057 /// receive true if the cause for the error is the associated constraints of
12058 /// the template not being satisfied by the template arguments.
12059 ///
12060 /// \param DefaultArgs any default arguments from template specialization
12061 /// deduction.
12062 ///
12063 /// \returns true if an error occurred, false otherwise.
12065 SourceLocation TemplateLoc,
12066 TemplateArgumentListInfo &TemplateArgs,
12067 const DefaultArguments &DefaultArgs,
12068 bool PartialTemplateArgs,
12070 bool UpdateArgsWithConversions = true,
12071 bool *ConstraintsNotSatisfied = nullptr);
12072
12075 SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
12076 const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
12077 CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions = true,
12078 bool *ConstraintsNotSatisfied = nullptr);
12079
12082 SmallVectorImpl<TemplateArgument> &SugaredConverted,
12083 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
12084
12085 /// Check a template argument against its corresponding
12086 /// template type parameter.
12087 ///
12088 /// This routine implements the semantics of C++ [temp.arg.type]. It
12089 /// returns true if an error occurred, and false otherwise.
12091
12092 /// Check a template argument against its corresponding
12093 /// non-type template parameter.
12094 ///
12095 /// This routine implements the semantics of C++ [temp.arg.nontype].
12096 /// If an error occurred, it returns ExprError(); otherwise, it
12097 /// returns the converted template argument. \p ParamType is the
12098 /// type of the non-type template parameter after it has been instantiated.
12100 QualType InstantiatedParamType, Expr *Arg,
12101 TemplateArgument &SugaredConverted,
12102 TemplateArgument &CanonicalConverted,
12103 bool StrictCheck,
12105
12106 /// Check a template argument against its corresponding
12107 /// template template parameter.
12108 ///
12109 /// This routine implements the semantics of C++ [temp.arg.template].
12110 /// It returns true if an error occurred, and false otherwise.
12112 TemplateParameterList *Params,
12114 bool PartialOrdering,
12115 bool *StrictPackMatch);
12116
12119 const TemplateArgumentLoc &Arg);
12120
12122 std::optional<SourceRange> ParamRange = {});
12124
12125 /// Given a non-type template argument that refers to a
12126 /// declaration and the type of its corresponding non-type template
12127 /// parameter, produce an expression that properly refers to that
12128 /// declaration.
12129 /// FIXME: This is used in some contexts where the resulting expression
12130 /// doesn't need to live too long. It would be useful if this function
12131 /// could return a temporary expression.
12133 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc,
12134 NamedDecl *TemplateParam = nullptr);
12137 SourceLocation Loc);
12138
12139 /// Enumeration describing how template parameter lists are compared
12140 /// for equality.
12142 /// We are matching the template parameter lists of two templates
12143 /// that might be redeclarations.
12144 ///
12145 /// \code
12146 /// template<typename T> struct X;
12147 /// template<typename T> struct X;
12148 /// \endcode
12150
12151 /// We are matching the template parameter lists of two template
12152 /// template parameters as part of matching the template parameter lists
12153 /// of two templates that might be redeclarations.
12154 ///
12155 /// \code
12156 /// template<template<int I> class TT> struct X;
12157 /// template<template<int Value> class Other> struct X;
12158 /// \endcode
12160
12161 /// We are determining whether the template-parameters are equivalent
12162 /// according to C++ [temp.over.link]/6. This comparison does not consider
12163 /// constraints.
12164 ///
12165 /// \code
12166 /// template<C1 T> void f(T);
12167 /// template<C2 T> void f(T);
12168 /// \endcode
12170 };
12171
12172 // A struct to represent the 'new' declaration, which is either itself just
12173 // the named decl, or the important information we need about it in order to
12174 // do constraint comparisons.
12176 const NamedDecl *ND = nullptr;
12177 const DeclContext *DC = nullptr;
12178 const DeclContext *LexicalDC = nullptr;
12179 SourceLocation Loc;
12180
12181 public:
12184 const DeclContext *LexicalDeclCtx,
12185 SourceLocation Loc)
12186
12187 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
12188 assert(DC && LexicalDC &&
12189 "Constructor only for cases where we have the information to put "
12190 "in here");
12191 }
12192
12193 // If this was constructed with no information, we cannot do substitution
12194 // for constraint comparison, so make sure we can check that.
12195 bool isInvalid() const { return !ND && !DC; }
12196
12197 const NamedDecl *getDecl() const { return ND; }
12198
12199 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
12200
12202 return ND ? ND->getLexicalDeclContext() : LexicalDC;
12203 }
12204
12206 return ND ? ND->getDeclContext() : DC;
12207 }
12208
12209 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
12210 };
12211
12212 /// Determine whether the given template parameter lists are
12213 /// equivalent.
12214 ///
12215 /// \param New The new template parameter list, typically written in the
12216 /// source code as part of a new template declaration.
12217 ///
12218 /// \param Old The old template parameter list, typically found via
12219 /// name lookup of the template declared with this template parameter
12220 /// list.
12221 ///
12222 /// \param Complain If true, this routine will produce a diagnostic if
12223 /// the template parameter lists are not equivalent.
12224 ///
12225 /// \param Kind describes how we are to match the template parameter lists.
12226 ///
12227 /// \param TemplateArgLoc If this source location is valid, then we
12228 /// are actually checking the template parameter list of a template
12229 /// argument (New) against the template parameter list of its
12230 /// corresponding template template parameter (Old). We produce
12231 /// slightly different diagnostics in this scenario.
12232 ///
12233 /// \returns True if the template parameter lists are equal, false
12234 /// otherwise.
12236 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
12237 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
12239 SourceLocation TemplateArgLoc = SourceLocation());
12240
12242 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
12244 SourceLocation TemplateArgLoc = SourceLocation()) {
12245 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
12246 Kind, TemplateArgLoc);
12247 }
12248
12249 /// Check whether a template can be declared within this scope.
12250 ///
12251 /// If the template declaration is valid in this scope, returns
12252 /// false. Otherwise, issues a diagnostic and returns true.
12253 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
12254
12255 /// Called when the parser has parsed a C++ typename
12256 /// specifier, e.g., "typename T::type".
12257 ///
12258 /// \param S The scope in which this typename type occurs.
12259 /// \param TypenameLoc the location of the 'typename' keyword
12260 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12261 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
12262 /// \param IdLoc the location of the identifier.
12263 /// \param IsImplicitTypename context where T::type refers to a type.
12265 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
12266 const IdentifierInfo &II, SourceLocation IdLoc,
12268
12269 /// Called when the parser has parsed a C++ typename
12270 /// specifier that ends in a template-id, e.g.,
12271 /// "typename MetaFun::template apply<T1, T2>".
12272 ///
12273 /// \param S The scope in which this typename type occurs.
12274 /// \param TypenameLoc the location of the 'typename' keyword
12275 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12276 /// \param TemplateLoc the location of the 'template' keyword, if any.
12277 /// \param TemplateName The template name.
12278 /// \param TemplateII The identifier used to name the template.
12279 /// \param TemplateIILoc The location of the template name.
12280 /// \param LAngleLoc The location of the opening angle bracket ('<').
12281 /// \param TemplateArgs The template arguments.
12282 /// \param RAngleLoc The location of the closing angle bracket ('>').
12284 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
12285 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
12286 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
12287 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
12288 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
12289
12291 SourceLocation KeywordLoc,
12292 NestedNameSpecifierLoc QualifierLoc,
12293 const IdentifierInfo &II, SourceLocation IILoc,
12294 TypeSourceInfo **TSI, bool DeducedTSTContext);
12295
12297 SourceLocation KeywordLoc,
12298 NestedNameSpecifierLoc QualifierLoc,
12299 const IdentifierInfo &II, SourceLocation IILoc,
12300 bool DeducedTSTContext = true);
12301
12302 /// Rebuilds a type within the context of the current instantiation.
12303 ///
12304 /// The type \p T is part of the type of an out-of-line member definition of
12305 /// a class template (or class template partial specialization) that was
12306 /// parsed and constructed before we entered the scope of the class template
12307 /// (or partial specialization thereof). This routine will rebuild that type
12308 /// now that we have entered the declarator's scope, which may produce
12309 /// different canonical types, e.g.,
12310 ///
12311 /// \code
12312 /// template<typename T>
12313 /// struct X {
12314 /// typedef T* pointer;
12315 /// pointer data();
12316 /// };
12317 ///
12318 /// template<typename T>
12319 /// typename X<T>::pointer X<T>::data() { ... }
12320 /// \endcode
12321 ///
12322 /// Here, the type "typename X<T>::pointer" will be created as a
12323 /// DependentNameType, since we do not know that we can look into X<T> when we
12324 /// parsed the type. This function will rebuild the type, performing the
12325 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
12326 /// canonical type is the same as the canonical type of T*, allowing the
12327 /// return types of the out-of-line definition and the declaration to match.
12329 SourceLocation Loc,
12330 DeclarationName Name);
12332
12334
12335 /// Rebuild the template parameters now that we know we're in a current
12336 /// instantiation.
12337 bool
12339
12340 /// Produces a formatted string that describes the binding of
12341 /// template parameters to template arguments.
12342 std::string
12344 const TemplateArgumentList &Args);
12345
12346 std::string
12348 const TemplateArgument *Args,
12349 unsigned NumArgs);
12350
12354
12355 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12356 /// was just parsed. This is only possible with an explicit scope
12357 /// specifier naming a dependent type.
12359 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12360 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12361 const TemplateArgumentListInfo *TemplateArgs);
12362
12365 SourceLocation TemplateKWLoc,
12366 const DeclarationNameInfo &NameInfo,
12367 const TemplateArgumentListInfo *TemplateArgs);
12368
12369 // Calculates whether the expression Constraint depends on an enclosing
12370 // template, for the purposes of [temp.friend] p9.
12371 // TemplateDepth is the 'depth' of the friend function, which is used to
12372 // compare whether a declaration reference is referring to a containing
12373 // template, or just the current friend function. A 'lower' TemplateDepth in
12374 // the AST refers to a 'containing' template. As the constraint is
12375 // uninstantiated, this is relative to the 'top' of the TU.
12376 bool
12378 unsigned TemplateDepth,
12379 const Expr *Constraint);
12380
12381 /// Find the failed Boolean condition within a given Boolean
12382 /// constant expression, and describe it with a string.
12383 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12384
12386
12388 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12389 const IdentifierInfo *Name, SourceLocation NameLoc);
12390
12392 Expr *ConstraintExpr,
12393 const ParsedAttributesView &Attrs);
12394
12396 bool &AddToScope);
12398
12399 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12400 const CXXScopeSpec &SS,
12401 const IdentifierInfo *Name,
12402 SourceLocation TagLoc, SourceLocation NameLoc);
12403
12405 CachedTokens &Toks);
12408
12409 /// We've found a use of a templated declaration that would trigger an
12410 /// implicit instantiation. Check that any relevant explicit specializations
12411 /// and partial specializations are visible/reachable, and diagnose if not.
12414
12415 ///@}
12416
12417 //
12418 //
12419 // -------------------------------------------------------------------------
12420 //
12421 //
12422
12423 /// \name C++ Template Argument Deduction
12424 /// Implementations are in SemaTemplateDeduction.cpp
12425 ///@{
12426
12427public:
12428 class SFINAETrap;
12429
12432 : S(S), Prev(std::exchange(S.CurrentSFINAEContext, Cur)) {}
12433
12434 protected:
12436 ~SFINAEContextBase() { S.CurrentSFINAEContext = Prev; }
12439
12440 private:
12441 SFINAETrap *Prev;
12442 };
12443
12447
12448 /// RAII class used to determine whether SFINAE has
12449 /// trapped any errors that occur during template argument
12450 /// deduction.
12451 class SFINAETrap : SFINAEContextBase {
12452 bool HasErrorOcurred = false;
12453 bool WithAccessChecking = false;
12454 bool PrevLastDiagnosticIgnored =
12455 S.getDiagnostics().isLastDiagnosticIgnored();
12456 sema::TemplateDeductionInfo *DeductionInfo = nullptr;
12457
12458 SFINAETrap(Sema &S, sema::TemplateDeductionInfo *Info,
12459 bool WithAccessChecking)
12460 : SFINAEContextBase(S, this), WithAccessChecking(WithAccessChecking),
12461 DeductionInfo(Info) {}
12462
12463 public:
12464 /// \param WithAccessChecking If true, discard all diagnostics (from the
12465 /// immediate context) instead of adding them to the currently active
12466 /// \ref TemplateDeductionInfo.
12467 explicit SFINAETrap(Sema &S, bool WithAccessChecking = false)
12468 : SFINAETrap(S, /*Info=*/nullptr, WithAccessChecking) {}
12469
12471 : SFINAETrap(S, &Info, /*WithAccessChecking=*/false) {}
12472
12474 S.getDiagnostics().setLastDiagnosticIgnored(PrevLastDiagnosticIgnored);
12475 }
12476
12477 SFINAETrap(const SFINAETrap &) = delete;
12478 SFINAETrap &operator=(const SFINAETrap &) = delete;
12479
12481 return DeductionInfo;
12482 }
12483
12484 /// Determine whether any SFINAE errors have been trapped.
12485 bool hasErrorOccurred() const { return HasErrorOcurred; }
12486 void setErrorOccurred() { HasErrorOcurred = true; }
12487
12488 bool withAccessChecking() const { return WithAccessChecking; }
12489 };
12490
12491 /// RAII class used to indicate that we are performing provisional
12492 /// semantic analysis to determine the validity of a construct, so
12493 /// typo-correction and diagnostics in the immediate context (not within
12494 /// implicitly-instantiated templates) should be suppressed.
12496 Sema &SemaRef;
12497 // FIXME: Using a SFINAETrap for this is a hack.
12498 SFINAETrap Trap;
12499 bool PrevDisableTypoCorrection;
12500
12501 public:
12502 explicit TentativeAnalysisScope(Sema &SemaRef)
12503 : SemaRef(SemaRef), Trap(SemaRef, /*ForValidityCheck=*/true),
12504 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12505 SemaRef.DisableTypoCorrection = true;
12506 }
12508 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12509 }
12510
12513 };
12514
12515 /// For each declaration that involved template argument deduction, the
12516 /// set of diagnostics that were suppressed during that template argument
12517 /// deduction.
12518 ///
12519 /// FIXME: Serialize this structure to the AST file.
12520 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12523
12524 /// Compare types for equality with respect to possibly compatible
12525 /// function types (noreturn adjustment, implicit calling conventions). If any
12526 /// of parameter and argument is not a function, just perform type comparison.
12527 ///
12528 /// \param P the template parameter type.
12529 ///
12530 /// \param A the argument type.
12532
12533 /// Allocate a TemplateArgumentLoc where all locations have
12534 /// been initialized to the given location.
12535 ///
12536 /// \param Arg The template argument we are producing template argument
12537 /// location information for.
12538 ///
12539 /// \param NTTPType For a declaration template argument, the type of
12540 /// the non-type template parameter that corresponds to this template
12541 /// argument. Can be null if no type sugar is available to add to the
12542 /// type from the template argument.
12543 ///
12544 /// \param Loc The source location to use for the resulting template
12545 /// argument.
12548 SourceLocation Loc,
12549 NamedDecl *TemplateParam = nullptr);
12550
12551 /// Get a template argument mapping the given template parameter to itself,
12552 /// e.g. for X in \c template<int X>, this would return an expression template
12553 /// argument referencing X.
12555 SourceLocation Location);
12556
12557 /// Adjust the type \p ArgFunctionType to match the calling convention,
12558 /// noreturn, and optionally the exception specification of \p FunctionType.
12559 /// Deduction often wants to ignore these properties when matching function
12560 /// types.
12562 bool AdjustExceptionSpec = false);
12563
12566 ArrayRef<TemplateArgument> TemplateArgs,
12568
12571 ArrayRef<TemplateArgument> TemplateArgs,
12573
12574 /// Deduce the template arguments of the given template from \p FromType.
12575 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12576 /// [over.match.class.deduct]p4.
12577 ///
12578 /// It only supports class or type alias templates.
12582
12587 bool NumberOfArgumentsMustMatch);
12588
12589 /// Substitute the explicitly-provided template arguments into the
12590 /// given function template according to C++ [temp.arg.explicit].
12591 ///
12592 /// \param FunctionTemplate the function template into which the explicit
12593 /// template arguments will be substituted.
12594 ///
12595 /// \param ExplicitTemplateArgs the explicitly-specified template
12596 /// arguments.
12597 ///
12598 /// \param Deduced the deduced template arguments, which will be populated
12599 /// with the converted and checked explicit template arguments.
12600 ///
12601 /// \param ParamTypes will be populated with the instantiated function
12602 /// parameters.
12603 ///
12604 /// \param FunctionType if non-NULL, the result type of the function template
12605 /// will also be instantiated and the pointed-to value will be updated with
12606 /// the instantiated function type.
12607 ///
12608 /// \param Info if substitution fails for any reason, this object will be
12609 /// populated with more information about the failure.
12610 ///
12611 /// \returns TemplateDeductionResult::Success if substitution was successful,
12612 /// or some failure condition.
12615 TemplateArgumentListInfo &ExplicitTemplateArgs,
12619
12620 /// brief A function argument from which we performed template argument
12621 // deduction for a call.
12634
12635 /// Finish template argument deduction for a function template,
12636 /// checking the deduced template arguments for completeness and forming
12637 /// the function template specialization.
12638 ///
12639 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12640 /// which the deduced argument types should be compared.
12641 /// \param CheckNonDependent Callback before substituting into the declaration
12642 /// with the deduced template arguments.
12643 /// \param OnlyInitializeNonUserDefinedConversions is used as a workaround for
12644 /// some breakages introduced by CWG2369, where non-user-defined conversions
12645 /// are checked first before the constraints.
12649 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12651 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
12652 bool PartialOverloading, bool PartialOrdering,
12653 bool ForOverloadSetAddressResolution,
12654 llvm::function_ref<bool(bool)> CheckNonDependent =
12655 [](bool /*OnlyInitializeNonUserDefinedConversions*/) {
12656 return false;
12657 });
12658
12659 /// Perform template argument deduction from a function call
12660 /// (C++ [temp.deduct.call]).
12661 ///
12662 /// \param FunctionTemplate the function template for which we are performing
12663 /// template argument deduction.
12664 ///
12665 /// \param ExplicitTemplateArgs the explicit template arguments provided
12666 /// for this call.
12667 ///
12668 /// \param Args the function call arguments
12669 ///
12670 /// \param Specialization if template argument deduction was successful,
12671 /// this will be set to the function template specialization produced by
12672 /// template argument deduction.
12673 ///
12674 /// \param Info the argument will be updated to provide additional information
12675 /// about template argument deduction.
12676 ///
12677 /// \param CheckNonDependent A callback to invoke to check conversions for
12678 /// non-dependent parameters, between deduction and substitution, per DR1391.
12679 /// If this returns true, substitution will be skipped and we return
12680 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12681 /// passed the parameter types (after substituting explicit template
12682 /// arguments).
12683 ///
12684 /// \returns the result of template argument deduction.
12687 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12689 bool PartialOverloading, bool AggregateDeductionCandidate,
12690 bool PartialOrdering, QualType ObjectType,
12691 Expr::Classification ObjectClassification,
12692 bool ForOverloadSetAddressResolution,
12693 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent);
12694
12695 /// Deduce template arguments when taking the address of a function
12696 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12697 /// a template.
12698 ///
12699 /// \param FunctionTemplate the function template for which we are performing
12700 /// template argument deduction.
12701 ///
12702 /// \param ExplicitTemplateArgs the explicitly-specified template
12703 /// arguments.
12704 ///
12705 /// \param ArgFunctionType the function type that will be used as the
12706 /// "argument" type (A) when performing template argument deduction from the
12707 /// function template's function type. This type may be NULL, if there is no
12708 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12709 ///
12710 /// \param Specialization if template argument deduction was successful,
12711 /// this will be set to the function template specialization produced by
12712 /// template argument deduction.
12713 ///
12714 /// \param Info the argument will be updated to provide additional information
12715 /// about template argument deduction.
12716 ///
12717 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12718 /// the address of a function template per [temp.deduct.funcaddr] and
12719 /// [over.over]. If \c false, we are looking up a function template
12720 /// specialization based on its signature, per [temp.deduct.decl].
12721 ///
12722 /// \returns the result of template argument deduction.
12725 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12727 bool IsAddressOfFunction = false);
12728
12729 /// Deduce template arguments for a templated conversion
12730 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12731 /// conversion function template specialization.
12734 Expr::Classification ObjectClassification, QualType ToType,
12736
12737 /// Deduce template arguments for a function template when there is
12738 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12739 ///
12740 /// \param FunctionTemplate the function template for which we are performing
12741 /// template argument deduction.
12742 ///
12743 /// \param ExplicitTemplateArgs the explicitly-specified template
12744 /// arguments.
12745 ///
12746 /// \param Specialization if template argument deduction was successful,
12747 /// this will be set to the function template specialization produced by
12748 /// template argument deduction.
12749 ///
12750 /// \param Info the argument will be updated to provide additional information
12751 /// about template argument deduction.
12752 ///
12753 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12754 /// the address of a function template in a context where we do not have a
12755 /// target type, per [over.over]. If \c false, we are looking up a function
12756 /// template specialization based on its signature, which only happens when
12757 /// deducing a function parameter type from an argument that is a template-id
12758 /// naming a function template specialization.
12759 ///
12760 /// \returns the result of template argument deduction.
12763 TemplateArgumentListInfo *ExplicitTemplateArgs,
12766 bool IsAddressOfFunction = false);
12767
12768 /// Substitute Replacement for \p auto in \p TypeWithAuto
12769 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12770 /// Substitute Replacement for auto in TypeWithAuto
12772 QualType Replacement);
12773
12774 // Substitute auto in TypeWithAuto for a Dependent auto type
12776
12777 // Substitute auto in TypeWithAuto for a Dependent auto type
12780
12781 /// Completely replace the \c auto in \p TypeWithAuto by
12782 /// \p Replacement. This does not retain any \c auto type sugar.
12783 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12785 QualType Replacement);
12786
12787 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12788 ///
12789 /// Note that this is done even if the initializer is dependent. (This is
12790 /// necessary to support partial ordering of templates using 'auto'.)
12791 /// A dependent type will be produced when deducing from a dependent type.
12792 ///
12793 /// \param Type the type pattern using the auto type-specifier.
12794 /// \param Init the initializer for the variable whose type is to be deduced.
12795 /// \param Result if type deduction was successful, this will be set to the
12796 /// deduced type.
12797 /// \param Info the argument will be updated to provide additional information
12798 /// about template argument deduction.
12799 /// \param DependentDeduction Set if we should permit deduction in
12800 /// dependent cases. This is necessary for template partial ordering
12801 /// with 'auto' template parameters. The template parameter depth to be
12802 /// used should be specified in the 'Info' parameter.
12803 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12804 /// does not satisfy the type-constraint in the auto
12805 /// type.
12809 bool DependentDeduction = false,
12810 bool IgnoreConstraints = false,
12811 TemplateSpecCandidateSet *FailedTSC = nullptr);
12812 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12814 bool Diagnose = true);
12815
12817 SourceLocation Loc);
12818
12819 /// Returns the more specialized class template partial specialization
12820 /// according to the rules of partial ordering of class template partial
12821 /// specializations (C++ [temp.class.order]).
12822 ///
12823 /// \param PS1 the first class template partial specialization
12824 ///
12825 /// \param PS2 the second class template partial specialization
12826 ///
12827 /// \returns the more specialized class template partial specialization. If
12828 /// neither partial specialization is more specialized, returns NULL.
12833
12836
12840
12843
12845 TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg,
12846 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
12847 bool PartialOrdering, bool *StrictPackMatch);
12848
12849 /// Mark which template parameters are used in a given expression.
12850 ///
12851 /// \param E the expression from which template parameters will be deduced.
12852 ///
12853 /// \param Used a bit vector whose elements will be set to \c true
12854 /// to indicate when the corresponding template parameter will be
12855 /// deduced.
12856 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12857 unsigned Depth, llvm::SmallBitVector &Used);
12858
12859 /// Mark which template parameters are named in a given expression.
12860 ///
12861 /// Unlike MarkUsedTemplateParameters, this excludes parameter that
12862 /// are used but not directly named by an expression - i.e. it excludes
12863 /// any template parameter that denotes the type of a referenced NTTP.
12864 ///
12865 /// \param Used a bit vector whose elements will be set to \c true
12866 /// to indicate when the corresponding template parameter will be
12867 /// deduced.
12869 const Expr *E, unsigned Depth, llvm::SmallBitVector &Used);
12870
12871 /// Mark which template parameters can be deduced from a given
12872 /// template argument list.
12873 ///
12874 /// \param TemplateArgs the template argument list from which template
12875 /// parameters will be deduced.
12876 ///
12877 /// \param Used a bit vector whose elements will be set to \c true
12878 /// to indicate when the corresponding template parameter will be
12879 /// deduced.
12880 void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
12881 bool OnlyDeduced, unsigned Depth,
12882 llvm::SmallBitVector &Used);
12883
12885 unsigned Depth, llvm::SmallBitVector &Used);
12886
12888 unsigned Depth, llvm::SmallBitVector &Used);
12889
12890 void
12892 llvm::SmallBitVector &Deduced) {
12894 }
12895
12896 /// Marks all of the template parameters that will be deduced by a
12897 /// call to the given function template.
12898 static void
12901 llvm::SmallBitVector &Deduced);
12902
12903 /// Returns the more specialized function template according
12904 /// to the rules of function template partial ordering (C++
12905 /// [temp.func.order]).
12906 ///
12907 /// \param FT1 the first function template
12908 ///
12909 /// \param FT2 the second function template
12910 ///
12911 /// \param TPOC the context in which we are performing partial ordering of
12912 /// function templates.
12913 ///
12914 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
12915 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
12916 /// when calling a member function.
12917 ///
12918 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
12919 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
12920 /// template from a member function
12921 ///
12922 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
12923 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
12924 /// template from a member function
12925 ///
12926 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
12927 /// candidate with a reversed parameter order. In this case, the corresponding
12928 /// P/A pairs between FT1 and FT2 are reversed.
12929 ///
12930 /// \returns the more specialized function template. If neither
12931 /// template is more specialized, returns NULL.
12934 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
12935 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false,
12936 bool PartialOverloading = false);
12937
12938 /// Retrieve the most specialized of the given function template
12939 /// specializations.
12940 ///
12941 /// \param SpecBegin the start iterator of the function template
12942 /// specializations that we will be comparing.
12943 ///
12944 /// \param SpecEnd the end iterator of the function template
12945 /// specializations, paired with \p SpecBegin.
12946 ///
12947 /// \param Loc the location where the ambiguity or no-specializations
12948 /// diagnostic should occur.
12949 ///
12950 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
12951 /// no matching candidates.
12952 ///
12953 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
12954 /// occurs.
12955 ///
12956 /// \param CandidateDiag partial diagnostic used for each function template
12957 /// specialization that is a candidate in the ambiguous ordering. One
12958 /// parameter in this diagnostic should be unbound, which will correspond to
12959 /// the string describing the template arguments for the function template
12960 /// specialization.
12961 ///
12962 /// \returns the most specialized function template specialization, if
12963 /// found. Otherwise, returns SpecEnd.
12964 UnresolvedSetIterator
12965 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
12966 TemplateSpecCandidateSet &FailedCandidates,
12967 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
12968 const PartialDiagnostic &AmbigDiag,
12969 const PartialDiagnostic &CandidateDiag,
12970 bool Complain = true, QualType TargetType = QualType());
12971
12972 /// Returns the more constrained function according to the rules of
12973 /// partial ordering by constraints (C++ [temp.constr.order]).
12974 ///
12975 /// \param FD1 the first function
12976 ///
12977 /// \param FD2 the second function
12978 ///
12979 /// \returns the more constrained function. If neither function is
12980 /// more constrained, returns NULL.
12981 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
12982 FunctionDecl *FD2);
12983
12984 ///@}
12985
12986 //
12987 //
12988 // -------------------------------------------------------------------------
12989 //
12990 //
12991
12992 /// \name C++ Template Deduction Guide
12993 /// Implementations are in SemaTemplateDeductionGuide.cpp
12994 ///@{
12995
12996 /// Declare implicit deduction guides for a class template if we've
12997 /// not already done so.
12998 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
12999 SourceLocation Loc);
13000
13001 FunctionTemplateDecl *DeclareAggregateDeductionGuideFromInitList(
13002 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
13003 SourceLocation Loc);
13004
13005 ///@}
13006
13007 //
13008 //
13009 // -------------------------------------------------------------------------
13010 //
13011 //
13012
13013 /// \name C++ Template Instantiation
13014 /// Implementations are in SemaTemplateInstantiate.cpp
13015 ///@{
13016
13017public:
13018 /// A helper class for building up ExtParameterInfos.
13021 bool HasInteresting = false;
13022
13023 public:
13024 /// Set the ExtParameterInfo for the parameter at the given index,
13025 ///
13027 assert(Infos.size() <= index);
13028 Infos.resize(index);
13029 Infos.push_back(info);
13030
13031 if (!HasInteresting)
13032 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
13033 }
13034
13035 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
13036 /// ExtParameterInfo array we've built up.
13038 getPointerOrNull(unsigned numParams) {
13039 if (!HasInteresting)
13040 return nullptr;
13041 Infos.resize(numParams);
13042 return Infos.data();
13043 }
13044 };
13045
13046 /// The current instantiation scope used to store local
13047 /// variables.
13049
13050 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
13052
13053 /// A mapping from parameters with unparsed default arguments to the
13054 /// set of instantiations of each parameter.
13055 ///
13056 /// This mapping is a temporary data structure used when parsing
13057 /// nested class templates or nested classes of class templates,
13058 /// where we might end up instantiating an inner class before the
13059 /// default arguments of its methods have been parsed.
13061
13062 using InstantiatingSpecializationsKey = llvm::PointerIntPair<Decl *, 2>;
13063
13070
13072 : S(S), Key(D->getCanonicalDecl(), unsigned(Kind)) {
13073 auto [_, Created] = S.InstantiatingSpecializations.insert(Key);
13074 if (!Created)
13075 Key = {};
13076 }
13077
13079 if (Key.getOpaqueValue()) {
13080 [[maybe_unused]] bool Erased =
13081 S.InstantiatingSpecializations.erase(Key);
13082 assert(Erased);
13083 }
13084 }
13085
13088
13089 operator bool() const { return Key.getOpaqueValue() == nullptr; }
13090
13091 private:
13092 Sema &S;
13094 };
13095
13096 /// A context in which code is being synthesized (where a source location
13097 /// alone is not sufficient to identify the context). This covers template
13098 /// instantiation and various forms of implicitly-generated functions.
13100 /// The kind of template instantiation we are performing
13102 /// We are instantiating a template declaration. The entity is
13103 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
13105
13106 /// We are instantiating a default argument for a template
13107 /// parameter. The Entity is the template parameter whose argument is
13108 /// being instantiated, the Template is the template, and the
13109 /// TemplateArgs/NumTemplateArguments provide the template arguments as
13110 /// specified.
13112
13113 /// We are instantiating a default argument for a function.
13114 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
13115 /// provides the template arguments as specified.
13117
13118 /// We are substituting explicit template arguments provided for
13119 /// a function template. The entity is a FunctionTemplateDecl.
13121
13122 /// We are substituting template argument determined as part of
13123 /// template argument deduction for either a class template
13124 /// partial specialization or a function template. The
13125 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
13126 /// a TemplateDecl.
13128
13129 /// We are substituting into a lambda expression.
13131
13132 /// We are substituting prior template arguments into a new
13133 /// template parameter. The template parameter itself is either a
13134 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
13136
13137 /// We are checking the validity of a default template argument that
13138 /// has been used when naming a template-id.
13140
13141 /// We are computing the exception specification for a defaulted special
13142 /// member function.
13144
13145 /// We are instantiating the exception specification for a function
13146 /// template which was deferred until it was needed.
13148
13149 /// We are instantiating a requirement of a requires expression.
13151
13152 /// We are checking the satisfaction of a nested requirement of a requires
13153 /// expression.
13155
13156 /// We are declaring an implicit special member function.
13158
13159 /// We are declaring an implicit 'operator==' for a defaulted
13160 /// 'operator<=>'.
13162
13163 /// We are defining a synthesized function (such as a defaulted special
13164 /// member).
13166
13167 // We are checking the constraints associated with a constrained entity or
13168 // the constraint expression of a concept. This includes the checks that
13169 // atomic constraints have the type 'bool' and that they can be constant
13170 // evaluated.
13172
13173 // We are substituting template arguments into a constraint expression.
13175
13176 // We are normalizing a constraint expression.
13178
13179 // Instantiating a Requires Expression parameter clause.
13181
13182 // We are substituting into the parameter mapping of an atomic constraint
13183 // during normalization.
13185
13186 /// We are rewriting a comparison operator in terms of an operator<=>.
13188
13189 /// We are initializing a structured binding.
13191
13192 /// We are marking a class as __dllexport.
13194
13195 /// We are building an implied call from __builtin_dump_struct. The
13196 /// arguments are in CallArgs.
13198
13199 /// Added for Template instantiation observation.
13200 /// Memoization means we are _not_ instantiating a template because
13201 /// it is already instantiated (but we entered a context where we
13202 /// would have had to if it was not already instantiated).
13204
13205 /// We are building deduction guides for a class.
13207
13208 /// We are instantiating a type alias template declaration.
13210
13211 /// We are performing partial ordering for template template parameters.
13213 } Kind;
13214
13215 /// Whether we're substituting into constraints.
13217
13218 /// Whether we're substituting into the parameter mapping of a constraint.
13220
13221 /// The point of instantiation or synthesis within the source code.
13223
13224 /// The entity that is being synthesized.
13226
13227 /// The template (or partial specialization) in which we are
13228 /// performing the instantiation, for substitutions of prior template
13229 /// arguments.
13231
13232 union {
13233 /// The list of template arguments we are substituting, if they
13234 /// are not part of the entity.
13236
13237 /// The list of argument expressions in a synthesized call.
13238 const Expr *const *CallArgs;
13239 };
13240
13241 // FIXME: Wrap this union around more members, or perhaps store the
13242 // kind-specific members in the RAII object owning the context.
13243 union {
13244 /// The number of template arguments in TemplateArgs.
13246
13247 /// The number of expressions in CallArgs.
13248 unsigned NumCallArgs;
13249
13250 /// The special member being declared or defined.
13252 };
13253
13258
13259 /// The source range that covers the construct that cause
13260 /// the instantiation, e.g., the template-id that causes a class
13261 /// template instantiation.
13263
13268
13269 /// Determines whether this template is an actual instantiation
13270 /// that should be counted toward the maximum instantiation depth.
13271 bool isInstantiationRecord() const;
13272 };
13273
13274 /// A stack object to be created when performing template
13275 /// instantiation.
13276 ///
13277 /// Construction of an object of type \c InstantiatingTemplate
13278 /// pushes the current instantiation onto the stack of active
13279 /// instantiations. If the size of this stack exceeds the maximum
13280 /// number of recursive template instantiations, construction
13281 /// produces an error and evaluates true.
13282 ///
13283 /// Destruction of this object will pop the named instantiation off
13284 /// the stack.
13286 /// Note that we are instantiating a class template,
13287 /// function template, variable template, alias template,
13288 /// or a member thereof.
13289 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13290 Decl *Entity,
13291 SourceRange InstantiationRange = SourceRange());
13292
13294 /// Note that we are instantiating an exception specification
13295 /// of a function template.
13296 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13298 SourceRange InstantiationRange = SourceRange());
13299
13300 /// Note that we are instantiating a type alias template declaration.
13301 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13302 TypeAliasTemplateDecl *Entity,
13303 ArrayRef<TemplateArgument> TemplateArgs,
13304 SourceRange InstantiationRange = SourceRange());
13305
13306 /// Note that we are instantiating a default argument in a
13307 /// template-id.
13308 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13310 ArrayRef<TemplateArgument> TemplateArgs,
13311 SourceRange InstantiationRange = SourceRange());
13312
13313 /// Note that we are substituting either explicitly-specified or
13314 /// deduced template arguments during function template argument deduction.
13315 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13317 ArrayRef<TemplateArgument> TemplateArgs,
13319 SourceRange InstantiationRange = SourceRange());
13320
13321 /// Note that we are instantiating as part of template
13322 /// argument deduction for a class template declaration.
13323 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13325 ArrayRef<TemplateArgument> TemplateArgs,
13326 SourceRange InstantiationRange = SourceRange());
13327
13328 /// Note that we are instantiating as part of template
13329 /// argument deduction for a class template partial
13330 /// specialization.
13331 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13333 ArrayRef<TemplateArgument> TemplateArgs,
13334 SourceRange InstantiationRange = SourceRange());
13335
13336 /// Note that we are instantiating as part of template
13337 /// argument deduction for a variable template partial
13338 /// specialization.
13339 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13341 ArrayRef<TemplateArgument> TemplateArgs,
13342 SourceRange InstantiationRange = SourceRange());
13343
13344 /// Note that we are instantiating a default argument for a function
13345 /// parameter.
13346 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13347 ParmVarDecl *Param,
13348 ArrayRef<TemplateArgument> TemplateArgs,
13349 SourceRange InstantiationRange = SourceRange());
13350
13351 /// Note that we are substituting prior template arguments into a
13352 /// non-type parameter.
13353 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13355 ArrayRef<TemplateArgument> TemplateArgs,
13356 SourceRange InstantiationRange);
13357
13358 /// Note that we are substituting prior template arguments into a
13359 /// template template parameter.
13360 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13362 ArrayRef<TemplateArgument> TemplateArgs,
13363 SourceRange InstantiationRange);
13364
13365 /// Note that we are checking the default template argument
13366 /// against the template parameter for a given template-id.
13367 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13369 ArrayRef<TemplateArgument> TemplateArgs,
13370 SourceRange InstantiationRange);
13371
13373 /// \brief Note that we are checking the constraints associated with some
13374 /// constrained entity (a concept declaration or a template with associated
13375 /// constraints).
13376 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13378 ArrayRef<TemplateArgument> TemplateArgs,
13379 SourceRange InstantiationRange);
13380
13382 /// \brief Note that we are checking a constraint expression associated
13383 /// with a template declaration or as part of the satisfaction check of a
13384 /// concept.
13385 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13387 SourceRange InstantiationRange);
13388
13390 /// \brief Note that we are normalizing a constraint expression.
13391 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13393 SourceRange InstantiationRange);
13394
13396 /// \brief Note that we are subtituting into the parameter mapping of an
13397 /// atomic constraint during constraint normalization.
13398 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13400 SourceRange InstantiationRange);
13401
13402 /// \brief Note that we are substituting template arguments into a part of
13403 /// a requirement of a requires expression.
13404 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13406 SourceRange InstantiationRange = SourceRange());
13407
13408 /// \brief Note that we are checking the satisfaction of the constraint
13409 /// expression inside of a nested requirement.
13410 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13412 SourceRange InstantiationRange = SourceRange());
13413
13414 /// \brief Note that we are checking a requires clause.
13415 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13416 const RequiresExpr *E,
13417 SourceRange InstantiationRange);
13418
13420 /// \brief Note that we are building deduction guides.
13421 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13423 SourceRange InstantiationRange = SourceRange());
13424
13426 /// \brief Note that we are partial ordering template template parameters.
13427 InstantiatingTemplate(Sema &SemaRef, SourceLocation ArgLoc,
13429 SourceRange InstantiationRange = SourceRange());
13430
13431 /// Note that we have finished instantiating this template.
13432 void Clear();
13433
13435
13436 /// Determines whether we have exceeded the maximum
13437 /// recursive template instantiations.
13438 bool isInvalid() const { return Invalid; }
13439
13440 private:
13441 Sema &SemaRef;
13442 bool Invalid;
13443
13446 SourceLocation PointOfInstantiation,
13447 SourceRange InstantiationRange, Decl *Entity,
13448 NamedDecl *Template = nullptr,
13449 ArrayRef<TemplateArgument> TemplateArgs = {});
13450
13452
13453 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13454 };
13455
13456 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13457 const MultiLevelTemplateArgumentList &TemplateArgs,
13458 TemplateArgumentLoc &Output,
13459 SourceLocation Loc = {},
13460 const DeclarationName &Entity = {});
13461 bool
13462 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13463 const MultiLevelTemplateArgumentList &TemplateArgs,
13464 TemplateArgumentListInfo &Outputs);
13465
13466 /// Substitute concept template arguments in the constraint expression
13467 /// of a concept-id. This is used to implement [temp.constr.normal].
13469 SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE,
13470 const Expr *ConstraintExpr,
13471 const MultiLevelTemplateArgumentList &MLTAL);
13472
13474 ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
13475 const MultiLevelTemplateArgumentList &TemplateArgs,
13476 TemplateArgumentListInfo &Out, bool BuildPackExpansionTypes);
13477
13478 /// Retrieve the template argument list(s) that should be used to
13479 /// instantiate the definition of the given declaration.
13480 ///
13481 /// \param ND the declaration for which we are computing template
13482 /// instantiation arguments.
13483 ///
13484 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13485 /// the decl context where it will be created. In this case, the `Innermost`
13486 /// should likely be provided. If ND is non-null, this is ignored.
13487 ///
13488 /// \param Innermost if non-NULL, specifies a template argument list for the
13489 /// template declaration passed as ND.
13490 ///
13491 /// \param RelativeToPrimary true if we should get the template
13492 /// arguments relative to the primary template, even when we're
13493 /// dealing with a specialization. This is only relevant for function
13494 /// template specializations.
13495 ///
13496 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13497 /// instantiating the definition of the given declaration, \p ND. This is
13498 /// used to determine the proper set of template instantiation arguments for
13499 /// friend function template specializations.
13500 ///
13501 /// \param ForConstraintInstantiation when collecting arguments,
13502 /// ForConstraintInstantiation indicates we should continue looking when
13503 /// encountering a lambda generic call operator, and continue looking for
13504 /// arguments on an enclosing class template.
13505 ///
13506 /// \param SkipForSpecialization when specified, any template specializations
13507 /// in a traversal would be ignored.
13508 ///
13509 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13510 /// when encountering a specialized member function template, rather than
13511 /// returning immediately.
13512 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13513 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13514 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13515 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13516 bool ForConstraintInstantiation = false,
13517 bool SkipForSpecialization = false,
13518 bool ForDefaultArgumentSubstitution = false);
13519
13520 /// RAII object to handle the state changes required to synthesize
13521 /// a function body.
13523 Sema &S;
13524 Sema::ContextRAII SavedContext;
13525 bool PushedCodeSynthesisContext = false;
13526
13527 public:
13529 : S(S), SavedContext(S, DC) {
13530 auto *FD = dyn_cast<FunctionDecl>(DC);
13531 S.PushFunctionScope();
13532 S.PushExpressionEvaluationContextForFunction(
13534 if (FD)
13535 FD->setWillHaveBody(true);
13536 else
13537 assert(isa<ObjCMethodDecl>(DC));
13538 }
13539
13541 assert(!PushedCodeSynthesisContext);
13542
13545 Ctx.PointOfInstantiation = UseLoc;
13546 Ctx.Entity = cast<Decl>(S.CurContext);
13547 S.pushCodeSynthesisContext(Ctx);
13548
13549 PushedCodeSynthesisContext = true;
13550 }
13551
13553 if (PushedCodeSynthesisContext)
13554 S.popCodeSynthesisContext();
13555 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13556 FD->setWillHaveBody(false);
13557 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13558 }
13559 S.PopExpressionEvaluationContext();
13560 S.PopFunctionScopeInfo();
13561 }
13562
13566 };
13567
13568 /// List of active code synthesis contexts.
13569 ///
13570 /// This vector is treated as a stack. As synthesis of one entity requires
13571 /// synthesis of another, additional contexts are pushed onto the stack.
13573
13574 /// Specializations whose definitions are currently being instantiated.
13575 llvm::DenseSet<InstantiatingSpecializationsKey> InstantiatingSpecializations;
13576
13577 /// Non-dependent types used in templates that have already been instantiated
13578 /// by some template instantiation.
13579 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13580
13581 /// Extra modules inspected when performing a lookup during a template
13582 /// instantiation. Computed lazily.
13584
13585 /// Cache of additional modules that should be used for name lookup
13586 /// within the current template instantiation. Computed lazily; use
13587 /// getLookupModules() to get a complete set.
13588 llvm::DenseSet<Module *> LookupModulesCache;
13589
13590 /// Map from the most recent declaration of a namespace to the most
13591 /// recent visible declaration of that namespace.
13592 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13593
13595
13596 /// The number of \p CodeSynthesisContexts that are not template
13597 /// instantiations and, therefore, should not be counted as part of the
13598 /// instantiation depth.
13599 ///
13600 /// When the instantiation depth reaches the user-configurable limit
13601 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13602 // FIXME: Should we have a similar limit for other forms of synthesis?
13604
13605 /// The depth of the context stack at the point when the most recent
13606 /// error or warning was produced.
13607 ///
13608 /// This value is used to suppress printing of redundant context stacks
13609 /// when there are multiple errors or warnings in the same instantiation.
13610 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13612
13613 /// The template instantiation callbacks to trace or track
13614 /// instantiations (objects can be chained).
13615 ///
13616 /// This callbacks is used to print, trace or track template
13617 /// instantiations as they are being constructed.
13618 std::vector<std::unique_ptr<TemplateInstantiationCallback>>
13620
13621 /// The current index into pack expansion arguments that will be
13622 /// used for substitution of parameter packs.
13623 ///
13624 /// The pack expansion index will be none to indicate that parameter packs
13625 /// should be instantiated as themselves. Otherwise, the index specifies
13626 /// which argument within the parameter pack will be used for substitution.
13628
13629 /// RAII object used to change the argument pack substitution index
13630 /// within a \c Sema object.
13631 ///
13632 /// See \c ArgPackSubstIndex for more information.
13634 Sema &Self;
13635 UnsignedOrNone OldSubstIndex;
13636
13637 public:
13639 : Self(Self),
13640 OldSubstIndex(std::exchange(Self.ArgPackSubstIndex, NewSubstIndex)) {}
13641
13642 ~ArgPackSubstIndexRAII() { Self.ArgPackSubstIndex = OldSubstIndex; }
13645 };
13646
13649
13660 /// Prints the current instantiation stack through a series of
13661 /// notes.
13666
13667 /// Returns a pointer to the current SFINAE context, if any.
13668 [[nodiscard]] SFINAETrap *getSFINAEContext() const {
13669 return CurrentSFINAEContext;
13670 }
13671 [[nodiscard]] bool isSFINAEContext() const {
13672 return CurrentSFINAEContext != nullptr;
13673 }
13674
13675 /// Perform substitution on the type T with a given set of template
13676 /// arguments.
13677 ///
13678 /// This routine substitutes the given template arguments into the
13679 /// type T and produces the instantiated type.
13680 ///
13681 /// \param T the type into which the template arguments will be
13682 /// substituted. If this type is not dependent, it will be returned
13683 /// immediately.
13684 ///
13685 /// \param Args the template arguments that will be
13686 /// substituted for the top-level template parameters within T.
13687 ///
13688 /// \param Loc the location in the source code where this substitution
13689 /// is being performed. It will typically be the location of the
13690 /// declarator (if we're instantiating the type of some declaration)
13691 /// or the location of the type in the source code (if, e.g., we're
13692 /// instantiating the type of a cast expression).
13693 ///
13694 /// \param Entity the name of the entity associated with a declaration
13695 /// being instantiated (if any). May be empty to indicate that there
13696 /// is no such entity (if, e.g., this is a type that occurs as part of
13697 /// a cast expression) or that the entity has no name (e.g., an
13698 /// unnamed function parameter).
13699 ///
13700 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13701 /// acceptable as the top level type of the result.
13702 ///
13703 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13704 /// whenever substitution would perform a replacement with a null or
13705 /// non-existent template argument.
13706 ///
13707 /// \returns If the instantiation succeeds, the instantiated
13708 /// type. Otherwise, produces diagnostics and returns a NULL type.
13710 const MultiLevelTemplateArgumentList &TemplateArgs,
13711 SourceLocation Loc, DeclarationName Entity,
13712 bool AllowDeducedTST = false);
13713
13715 const MultiLevelTemplateArgumentList &TemplateArgs,
13716 SourceLocation Loc, DeclarationName Entity,
13717 bool *IsIncompleteSubstitution = nullptr);
13718
13720 const MultiLevelTemplateArgumentList &TemplateArgs,
13721 SourceLocation Loc, DeclarationName Entity);
13722
13723 /// A form of SubstType intended specifically for instantiating the
13724 /// type of a FunctionDecl. Its purpose is solely to force the
13725 /// instantiation of default-argument expressions and to avoid
13726 /// instantiating an exception-specification.
13728 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13729 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13730 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13732 const MultiLevelTemplateArgumentList &Args);
13735 SmallVectorImpl<QualType> &ExceptionStorage,
13736 const MultiLevelTemplateArgumentList &Args);
13737 ParmVarDecl *
13739 const MultiLevelTemplateArgumentList &TemplateArgs,
13740 int indexAdjustment, UnsignedOrNone NumExpansions,
13741 bool ExpectParameterPack, bool EvaluateConstraints = true);
13742
13743 /// Substitute the given template arguments into the given set of
13744 /// parameters, producing the set of parameter types that would be generated
13745 /// from such a substitution.
13747 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13748 const MultiLevelTemplateArgumentList &TemplateArgs,
13749 SmallVectorImpl<QualType> &ParamTypes,
13751 ExtParameterInfoBuilder &ParamInfos);
13752
13753 /// Substitute the given template arguments into the default argument.
13755 const MultiLevelTemplateArgumentList &TemplateArgs,
13756 bool ForCallExpr = false);
13758 const MultiLevelTemplateArgumentList &TemplateArgs);
13759 /// Substitute an expression as if it is a address-of-operand, which makes it
13760 /// act like a CXXIdExpression rather than an attempt to call.
13762 const MultiLevelTemplateArgumentList &TemplateArgs);
13763
13764 // A RAII type used by the TemplateDeclInstantiator and TemplateInstantiator
13765 // to disable constraint evaluation, then restore the state.
13766 template <typename InstTy> struct ConstraintEvalRAII {
13767 InstTy &TI;
13769
13771 : TI(TI), OldValue(TI.getEvaluateConstraints()) {
13772 TI.setEvaluateConstraints(false);
13773 }
13774 ~ConstraintEvalRAII() { TI.setEvaluateConstraints(OldValue); }
13777 };
13778
13779 // Must be used instead of SubstExpr at 'constraint checking' time.
13782 const MultiLevelTemplateArgumentList &TemplateArgs);
13783 // Unlike the above, this does not evaluate constraints.
13785 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13786
13787 /// Substitute the given template arguments into a list of
13788 /// expressions, expanding pack expansions if required.
13789 ///
13790 /// \param Exprs The list of expressions to substitute into.
13791 ///
13792 /// \param IsCall Whether this is some form of call, in which case
13793 /// default arguments will be dropped.
13794 ///
13795 /// \param TemplateArgs The set of template arguments to substitute.
13796 ///
13797 /// \param Outputs Will receive all of the substituted arguments.
13798 ///
13799 /// \returns true if an error occurred, false otherwise.
13800 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13801 const MultiLevelTemplateArgumentList &TemplateArgs,
13802 SmallVectorImpl<Expr *> &Outputs);
13803
13805 const MultiLevelTemplateArgumentList &TemplateArgs);
13806
13809 bool CXXDirectInit);
13810
13811 /// Perform substitution on the base class specifiers of the
13812 /// given class template specialization.
13813 ///
13814 /// Produces a diagnostic and returns true on error, returns false and
13815 /// attaches the instantiated base classes to the class template
13816 /// specialization if successful.
13817 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13818 const MultiLevelTemplateArgumentList &TemplateArgs);
13819
13820 /// Instantiate the definition of a class from a given pattern.
13821 ///
13822 /// \param PointOfInstantiation The point of instantiation within the
13823 /// source code.
13824 ///
13825 /// \param Instantiation is the declaration whose definition is being
13826 /// instantiated. This will be either a class template specialization
13827 /// or a member class of a class template specialization.
13828 ///
13829 /// \param Pattern is the pattern from which the instantiation
13830 /// occurs. This will be either the declaration of a class template or
13831 /// the declaration of a member class of a class template.
13832 ///
13833 /// \param TemplateArgs The template arguments to be substituted into
13834 /// the pattern.
13835 ///
13836 /// \param TSK the kind of implicit or explicit instantiation to perform.
13837 ///
13838 /// \param Complain whether to complain if the class cannot be instantiated
13839 /// due to the lack of a definition.
13840 ///
13841 /// \returns true if an error occurred, false otherwise.
13842 bool InstantiateClass(SourceLocation PointOfInstantiation,
13843 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13844 const MultiLevelTemplateArgumentList &TemplateArgs,
13845 TemplateSpecializationKind TSK, bool Complain = true);
13846
13847private:
13848 bool InstantiateClassImpl(SourceLocation PointOfInstantiation,
13849 CXXRecordDecl *Instantiation,
13850 CXXRecordDecl *Pattern,
13851 const MultiLevelTemplateArgumentList &TemplateArgs,
13852 TemplateSpecializationKind TSK, bool Complain);
13853
13854public:
13855 /// Instantiate the definition of an enum from a given pattern.
13856 ///
13857 /// \param PointOfInstantiation The point of instantiation within the
13858 /// source code.
13859 /// \param Instantiation is the declaration whose definition is being
13860 /// instantiated. This will be a member enumeration of a class
13861 /// temploid specialization, or a local enumeration within a
13862 /// function temploid specialization.
13863 /// \param Pattern The templated declaration from which the instantiation
13864 /// occurs.
13865 /// \param TemplateArgs The template arguments to be substituted into
13866 /// the pattern.
13867 /// \param TSK The kind of implicit or explicit instantiation to perform.
13868 ///
13869 /// \return \c true if an error occurred, \c false otherwise.
13870 bool InstantiateEnum(SourceLocation PointOfInstantiation,
13871 EnumDecl *Instantiation, EnumDecl *Pattern,
13872 const MultiLevelTemplateArgumentList &TemplateArgs,
13874
13875 /// Instantiate the definition of a field from the given pattern.
13876 ///
13877 /// \param PointOfInstantiation The point of instantiation within the
13878 /// source code.
13879 /// \param Instantiation is the declaration whose definition is being
13880 /// instantiated. This will be a class of a class temploid
13881 /// specialization, or a local enumeration within a function temploid
13882 /// specialization.
13883 /// \param Pattern The templated declaration from which the instantiation
13884 /// occurs.
13885 /// \param TemplateArgs The template arguments to be substituted into
13886 /// the pattern.
13887 ///
13888 /// \return \c true if an error occurred, \c false otherwise.
13890 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
13891 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
13892
13894 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec);
13895
13897 SourceLocation PointOfInstantiation,
13898 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13899 TemplateSpecializationKind TSK, bool Complain,
13900 bool PrimaryStrictPackMatch);
13901
13902 /// Instantiates the definitions of all of the member
13903 /// of the given class, which is an instantiation of a class template
13904 /// or a member class of a template.
13905 void
13906 InstantiateClassMembers(SourceLocation PointOfInstantiation,
13907 CXXRecordDecl *Instantiation,
13908 const MultiLevelTemplateArgumentList &TemplateArgs,
13910
13911 /// Instantiate the definitions of all of the members of the
13912 /// given class template specialization, which was named as part of an
13913 /// explicit instantiation.
13915 SourceLocation PointOfInstantiation,
13916 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13918
13921 const MultiLevelTemplateArgumentList &TemplateArgs);
13922
13923 /// Do template substitution on declaration name info.
13926 const MultiLevelTemplateArgumentList &TemplateArgs);
13928 SubstTemplateName(SourceLocation TemplateKWLoc,
13929 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
13930 SourceLocation NameLoc,
13931 const MultiLevelTemplateArgumentList &TemplateArgs);
13932
13934 const MultiLevelTemplateArgumentList &TemplateArgs,
13935 bool EvaluateConstraint);
13936
13937 /// Determine whether we are currently performing template instantiation.
13940 }
13941
13942 /// Determine whether we are currently performing constraint substitution.
13944 return !CodeSynthesisContexts.empty() &&
13945 CodeSynthesisContexts.back().InConstraintSubstitution;
13946 }
13947
13949 return !CodeSynthesisContexts.empty() &&
13950 CodeSynthesisContexts.back().InParameterMappingSubstitution &&
13952 }
13953
13954 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
13955
13956 /// \brief create a Requirement::SubstitutionDiagnostic with only a
13957 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
13960
13961 ///@}
13962
13963 //
13964 //
13965 // -------------------------------------------------------------------------
13966 //
13967 //
13968
13969 /// \name C++ Template Declaration Instantiation
13970 /// Implementations are in SemaTemplateInstantiateDecl.cpp
13971 ///@{
13972
13973public:
13974 /// An entity for which implicit template instantiation is required.
13975 ///
13976 /// The source location associated with the declaration is the first place in
13977 /// the source code where the declaration was "used". It is not necessarily
13978 /// the point of instantiation (which will be either before or after the
13979 /// namespace-scope declaration that triggered this implicit instantiation),
13980 /// However, it is the location that diagnostics should generally refer to,
13981 /// because users will need to know what code triggered the instantiation.
13982 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
13983
13984 /// The queue of implicit template instantiations that are required
13985 /// but have not yet been performed.
13986 std::deque<PendingImplicitInstantiation> PendingInstantiations;
13987
13988 /// Queue of implicit template instantiations that cannot be performed
13989 /// eagerly.
13991
13995
13996 /// The queue of implicit template instantiations that are required
13997 /// and must be performed within the current local scope.
13998 ///
13999 /// This queue is only used for member functions of local classes in
14000 /// templates, which must be instantiated in the same scope as their
14001 /// enclosing function, so that they can reference function-local
14002 /// types, static variables, enumerators, etc.
14003 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
14004
14006 public:
14008 : S(S), AtEndOfTU(AtEndOfTU) {
14009 SavedPendingLocalImplicitInstantiations.swap(
14010 S.PendingLocalImplicitInstantiations);
14011 }
14012
14013 void perform() {
14014 S.PerformPendingInstantiations(/*LocalOnly=*/true,
14015 /*AtEndOfTU=*/AtEndOfTU);
14016 }
14017
14019 assert(S.PendingLocalImplicitInstantiations.empty() &&
14020 "there shouldn't be any pending local implicit instantiations");
14021 SavedPendingLocalImplicitInstantiations.swap(
14022 S.PendingLocalImplicitInstantiations);
14023 }
14024
14028
14029 private:
14030 Sema &S;
14031 bool AtEndOfTU;
14032 std::deque<PendingImplicitInstantiation>
14033 SavedPendingLocalImplicitInstantiations;
14034 };
14035
14036 /// Records and restores the CurFPFeatures state on entry/exit of compound
14037 /// statements.
14039 public:
14042 FPOptionsOverride getOverrides() { return OldOverrides; }
14043
14044 private:
14045 Sema &S;
14046 FPOptions OldFPFeaturesState;
14047 FPOptionsOverride OldOverrides;
14048 LangOptions::FPEvalMethodKind OldEvalMethod;
14049 SourceLocation OldFPPragmaLocation;
14050 };
14051
14053 public:
14054 GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
14055 : S(S), Enabled(Enabled), AtEndOfTU(AtEndOfTU) {
14056 if (!Enabled)
14057 return;
14058
14059 S.SavedPendingInstantiations.emplace_back();
14060 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
14061
14062 S.SavedVTableUses.emplace_back();
14063 S.SavedVTableUses.back().swap(S.VTableUses);
14064 }
14065
14066 void perform() {
14067 if (Enabled) {
14068 S.DefineUsedVTables();
14069 S.PerformPendingInstantiations(/*LocalOnly=*/false,
14070 /*AtEndOfTU=*/AtEndOfTU);
14071 }
14072 }
14073
14075 if (!Enabled)
14076 return;
14077
14078 // Restore the set of pending vtables.
14079 assert(S.VTableUses.empty() &&
14080 "VTableUses should be empty before it is discarded.");
14081 S.VTableUses.swap(S.SavedVTableUses.back());
14082 S.SavedVTableUses.pop_back();
14083
14084 // Restore the set of pending implicit instantiations.
14085 if ((S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) &&
14086 AtEndOfTU) {
14087 assert(S.PendingInstantiations.empty() &&
14088 "PendingInstantiations should be empty before it is discarded.");
14089 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14090 S.SavedPendingInstantiations.pop_back();
14091 } else {
14092 // Template instantiations in the PCH may be delayed until the TU.
14093 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14094 S.PendingInstantiations.insert(
14095 S.PendingInstantiations.end(),
14096 S.SavedPendingInstantiations.back().begin(),
14097 S.SavedPendingInstantiations.back().end());
14098 S.SavedPendingInstantiations.pop_back();
14099 }
14100 }
14101
14103 delete;
14106
14107 private:
14108 Sema &S;
14109 bool Enabled;
14110 bool AtEndOfTU;
14111 };
14112
14114 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
14115
14126
14127 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
14128 const Decl *Pattern, Decl *Inst,
14129 LateInstantiatedAttrVec *LateAttrs = nullptr,
14130 LocalInstantiationScope *OuterMostScope = nullptr);
14131
14132 /// Update instantiation attributes after template was late parsed.
14133 ///
14134 /// Some attributes are evaluated based on the body of template. If it is
14135 /// late parsed, such attributes cannot be evaluated when declaration is
14136 /// instantiated. This function is used to update instantiation attributes
14137 /// when template definition is ready.
14138 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
14139
14140 void
14142 const Decl *Pattern, Decl *Inst,
14143 LateInstantiatedAttrVec *LateAttrs = nullptr,
14144 LocalInstantiationScope *OuterMostScope = nullptr);
14145
14146 /// In the MS ABI, we need to instantiate default arguments of dllexported
14147 /// default constructors along with the constructor definition. This allows IR
14148 /// gen to emit a constructor closure which calls the default constructor with
14149 /// its default arguments.
14151
14153 ParmVarDecl *Param);
14154 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
14156
14157 /// Instantiate (or find existing instantiation of) a function template with a
14158 /// given set of template arguments.
14159 ///
14160 /// Usually this should not be used, and template argument deduction should be
14161 /// used in its place.
14164 SourceLocation Loc,
14167
14168 /// Instantiate the definition of the given function from its
14169 /// template.
14170 ///
14171 /// \param PointOfInstantiation the point at which the instantiation was
14172 /// required. Note that this is not precisely a "point of instantiation"
14173 /// for the function, but it's close.
14174 ///
14175 /// \param Function the already-instantiated declaration of a
14176 /// function template specialization or member function of a class template
14177 /// specialization.
14178 ///
14179 /// \param Recursive if true, recursively instantiates any functions that
14180 /// are required by this instantiation.
14181 ///
14182 /// \param DefinitionRequired if true, then we are performing an explicit
14183 /// instantiation where the body of the function is required. Complain if
14184 /// there is no such body.
14185 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
14187 bool Recursive = false,
14188 bool DefinitionRequired = false,
14189 bool AtEndOfTU = false);
14192 const TemplateArgumentList *PartialSpecArgs,
14194 SourceLocation PointOfInstantiation,
14195 LateInstantiatedAttrVec *LateAttrs = nullptr,
14196 LocalInstantiationScope *StartingScope = nullptr);
14197
14198 /// Instantiates a variable template specialization by completing it
14199 /// with appropriate type information and initializer.
14201 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
14202 const MultiLevelTemplateArgumentList &TemplateArgs);
14203
14204 /// BuildVariableInstantiation - Used after a new variable has been created.
14205 /// Sets basic variable data and decides whether to postpone the
14206 /// variable instantiation.
14207 void
14209 const MultiLevelTemplateArgumentList &TemplateArgs,
14210 LateInstantiatedAttrVec *LateAttrs,
14211 DeclContext *Owner,
14212 LocalInstantiationScope *StartingScope,
14213 bool InstantiatingVarTemplate = false,
14214 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
14215
14216 /// Instantiate the initializer of a variable.
14218 VarDecl *Var, VarDecl *OldVar,
14219 const MultiLevelTemplateArgumentList &TemplateArgs);
14220
14221 /// Instantiate the definition of the given variable from its
14222 /// template.
14223 ///
14224 /// \param PointOfInstantiation the point at which the instantiation was
14225 /// required. Note that this is not precisely a "point of instantiation"
14226 /// for the variable, but it's close.
14227 ///
14228 /// \param Var the already-instantiated declaration of a templated variable.
14229 ///
14230 /// \param Recursive if true, recursively instantiates any functions that
14231 /// are required by this instantiation.
14232 ///
14233 /// \param DefinitionRequired if true, then we are performing an explicit
14234 /// instantiation where a definition of the variable is required. Complain
14235 /// if there is no such definition.
14236 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
14237 VarDecl *Var, bool Recursive = false,
14238 bool DefinitionRequired = false,
14239 bool AtEndOfTU = false);
14240
14243 const MultiLevelTemplateArgumentList &TemplateArgs);
14244
14245 /// Find the instantiation of the given declaration within the
14246 /// current instantiation.
14247 ///
14248 /// This routine is intended to be used when \p D is a declaration
14249 /// referenced from within a template, that needs to mapped into the
14250 /// corresponding declaration within an instantiation. For example,
14251 /// given:
14252 ///
14253 /// \code
14254 /// template<typename T>
14255 /// struct X {
14256 /// enum Kind {
14257 /// KnownValue = sizeof(T)
14258 /// };
14259 ///
14260 /// bool getKind() const { return KnownValue; }
14261 /// };
14262 ///
14263 /// template struct X<int>;
14264 /// \endcode
14265 ///
14266 /// In the instantiation of X<int>::getKind(), we need to map the \p
14267 /// EnumConstantDecl for \p KnownValue (which refers to
14268 /// X<T>::<Kind>::KnownValue) to its instantiation
14269 /// (X<int>::<Kind>::KnownValue).
14270 /// \p FindInstantiatedDecl performs this mapping from within the
14271 /// instantiation of X<int>.
14272 NamedDecl *
14274 const MultiLevelTemplateArgumentList &TemplateArgs,
14275 bool FindingInstantiatedContext = false);
14276
14277 /// Finds the instantiation of the given declaration context
14278 /// within the current instantiation.
14279 ///
14280 /// \returns NULL if there was an error
14281 DeclContext *
14283 const MultiLevelTemplateArgumentList &TemplateArgs);
14284
14285 Decl *SubstDecl(Decl *D, DeclContext *Owner,
14286 const MultiLevelTemplateArgumentList &TemplateArgs);
14287
14288 /// Substitute the name and return type of a defaulted 'operator<=>' to form
14289 /// an implicit 'operator=='.
14291 FunctionDecl *Spaceship);
14292
14293 /// Performs template instantiation for all implicit template
14294 /// instantiations we have seen until this point.
14295 void PerformPendingInstantiations(bool LocalOnly = false,
14296 bool AtEndOfTU = true);
14297
14300 const MultiLevelTemplateArgumentList &TemplateArgs,
14301 bool EvaluateConstraints = true);
14302
14304 const DeclContext *Pattern,
14305 const MultiLevelTemplateArgumentList &TemplateArgs);
14306
14307private:
14308 /// Introduce the instantiated local variables into the local
14309 /// instantiation scope.
14310 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
14311 const FunctionDecl *PatternDecl,
14313 /// Introduce the instantiated function parameters into the local
14314 /// instantiation scope, and set the parameter names to those used
14315 /// in the template.
14316 bool addInstantiatedParametersToScope(
14317 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14319 const MultiLevelTemplateArgumentList &TemplateArgs);
14320
14321 /// Introduce the instantiated captures of the lambda into the local
14322 /// instantiation scope.
14323 bool addInstantiatedCapturesToScope(
14324 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14326 const MultiLevelTemplateArgumentList &TemplateArgs);
14327
14328 int ParsingClassDepth = 0;
14329
14330 class SavePendingParsedClassStateRAII {
14331 public:
14332 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14333
14334 ~SavePendingParsedClassStateRAII() {
14335 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14336 "there shouldn't be any pending delayed exception spec checks");
14337 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14338 "there shouldn't be any pending delayed exception spec checks");
14339 swapSavedState();
14340 }
14341
14342 SavePendingParsedClassStateRAII(const SavePendingParsedClassStateRAII &) =
14343 delete;
14344 SavePendingParsedClassStateRAII &
14345 operator=(const SavePendingParsedClassStateRAII &) = delete;
14346
14347 private:
14348 Sema &S;
14350 SavedOverridingExceptionSpecChecks;
14352 SavedEquivalentExceptionSpecChecks;
14353
14354 void swapSavedState() {
14355 SavedOverridingExceptionSpecChecks.swap(
14356 S.DelayedOverridingExceptionSpecChecks);
14357 SavedEquivalentExceptionSpecChecks.swap(
14358 S.DelayedEquivalentExceptionSpecChecks);
14359 }
14360 };
14361
14362 ///@}
14363
14364 //
14365 //
14366 // -------------------------------------------------------------------------
14367 //
14368 //
14369
14370 /// \name C++ Variadic Templates
14371 /// Implementations are in SemaTemplateVariadic.cpp
14372 ///@{
14373
14374public:
14375 /// Determine whether an unexpanded parameter pack might be permitted in this
14376 /// location. Useful for error recovery.
14378
14379 /// The context in which an unexpanded parameter pack is
14380 /// being diagnosed.
14381 ///
14382 /// Note that the values of this enumeration line up with the first
14383 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
14385 /// An arbitrary expression.
14387
14388 /// The base type of a class type.
14390
14391 /// The type of an arbitrary declaration.
14393
14394 /// The type of a data member.
14396
14397 /// The size of a bit-field.
14399
14400 /// The expression in a static assertion.
14402
14403 /// The fixed underlying type of an enumeration.
14405
14406 /// The enumerator value.
14408
14409 /// A using declaration.
14411
14412 /// A friend declaration.
14414
14415 /// A declaration qualifier.
14417
14418 /// An initializer.
14420
14421 /// A default argument.
14423
14424 /// The type of a non-type template parameter.
14426
14427 /// The type of an exception.
14429
14430 /// Explicit specialization.
14432
14433 /// Partial specialization.
14435
14436 /// Microsoft __if_exists.
14438
14439 /// Microsoft __if_not_exists.
14441
14442 /// Lambda expression.
14444
14445 /// Block expression.
14447
14448 /// A type constraint.
14450
14451 // A requirement in a requires-expression.
14453
14454 // A requires-clause.
14456 };
14457
14458 /// Diagnose unexpanded parameter packs.
14459 ///
14460 /// \param Loc The location at which we should emit the diagnostic.
14461 ///
14462 /// \param UPPC The context in which we are diagnosing unexpanded
14463 /// parameter packs.
14464 ///
14465 /// \param Unexpanded the set of unexpanded parameter packs.
14466 ///
14467 /// \returns true if an error occurred, false otherwise.
14471
14472 /// If the given type contains an unexpanded parameter pack,
14473 /// diagnose the error.
14474 ///
14475 /// \param Loc The source location where a diagnostc should be emitted.
14476 ///
14477 /// \param T The type that is being checked for unexpanded parameter
14478 /// packs.
14479 ///
14480 /// \returns true if an error occurred, false otherwise.
14483
14484 /// If the given expression contains an unexpanded parameter
14485 /// pack, diagnose the error.
14486 ///
14487 /// \param E The expression that is being checked for unexpanded
14488 /// parameter packs.
14489 ///
14490 /// \returns true if an error occurred, false otherwise.
14493
14494 /// If the given requirees-expression contains an unexpanded reference to one
14495 /// of its own parameter packs, diagnose the error.
14496 ///
14497 /// \param RE The requiress-expression that is being checked for unexpanded
14498 /// parameter packs.
14499 ///
14500 /// \returns true if an error occurred, false otherwise.
14502
14503 /// If the given nested-name-specifier contains an unexpanded
14504 /// parameter pack, diagnose the error.
14505 ///
14506 /// \param SS The nested-name-specifier that is being checked for
14507 /// unexpanded parameter packs.
14508 ///
14509 /// \returns true if an error occurred, false otherwise.
14512
14513 /// If the given name contains an unexpanded parameter pack,
14514 /// diagnose the error.
14515 ///
14516 /// \param NameInfo The name (with source location information) that
14517 /// is being checked for unexpanded parameter packs.
14518 ///
14519 /// \returns true if an error occurred, false otherwise.
14522
14523 /// If the given template name contains an unexpanded parameter pack,
14524 /// diagnose the error.
14525 ///
14526 /// \param Loc The location of the template name.
14527 ///
14528 /// \param Template The template name that is being checked for unexpanded
14529 /// parameter packs.
14530 ///
14531 /// \returns true if an error occurred, false otherwise.
14535
14536 /// If the given template argument contains an unexpanded parameter
14537 /// pack, diagnose the error.
14538 ///
14539 /// \param Arg The template argument that is being checked for unexpanded
14540 /// parameter packs.
14541 ///
14542 /// \returns true if an error occurred, false otherwise.
14545
14546 /// Collect the set of unexpanded parameter packs within the given
14547 /// template argument.
14548 ///
14549 /// \param Arg The template argument that will be traversed to find
14550 /// unexpanded parameter packs.
14552 TemplateArgument Arg,
14554
14555 /// Collect the set of unexpanded parameter packs within the given
14556 /// template argument.
14557 ///
14558 /// \param Arg The template argument that will be traversed to find
14559 /// unexpanded parameter packs.
14563
14564 /// Collect the set of unexpanded parameter packs within the given
14565 /// type.
14566 ///
14567 /// \param T The type that will be traversed to find
14568 /// unexpanded parameter packs.
14571
14572 /// Collect the set of unexpanded parameter packs within the given
14573 /// type.
14574 ///
14575 /// \param TL The type that will be traversed to find
14576 /// unexpanded parameter packs.
14579
14580 /// Collect the set of unexpanded parameter packs within the given
14581 /// nested-name-specifier.
14582 ///
14583 /// \param NNS The nested-name-specifier that will be traversed to find
14584 /// unexpanded parameter packs.
14588
14589 /// Collect the set of unexpanded parameter packs within the given
14590 /// name.
14591 ///
14592 /// \param NameInfo The name that will be traversed to find
14593 /// unexpanded parameter packs.
14595 const DeclarationNameInfo &NameInfo,
14597
14598 /// Collect the set of unexpanded parameter packs within the given
14599 /// expression.
14602
14603 /// Invoked when parsing a template argument.
14604 ///
14605 /// \param Arg the template argument, which may already be invalid.
14606 ///
14607 /// If it is followed by ellipsis, this function is called before
14608 /// `ActOnPackExpansion`.
14611
14612 /// Invoked when parsing a template argument followed by an
14613 /// ellipsis, which creates a pack expansion.
14614 ///
14615 /// \param Arg The template argument preceding the ellipsis, which
14616 /// may already be invalid.
14617 ///
14618 /// \param EllipsisLoc The location of the ellipsis.
14620 SourceLocation EllipsisLoc);
14621
14622 /// Invoked when parsing a type followed by an ellipsis, which
14623 /// creates a pack expansion.
14624 ///
14625 /// \param Type The type preceding the ellipsis, which will become
14626 /// the pattern of the pack expansion.
14627 ///
14628 /// \param EllipsisLoc The location of the ellipsis.
14630
14631 /// Construct a pack expansion type from the pattern of the pack
14632 /// expansion.
14634 SourceLocation EllipsisLoc,
14635 UnsignedOrNone NumExpansions);
14636
14637 /// Construct a pack expansion type from the pattern of the pack
14638 /// expansion.
14639 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14640 SourceLocation EllipsisLoc,
14641 UnsignedOrNone NumExpansions);
14642
14643 /// Invoked when parsing an expression followed by an ellipsis, which
14644 /// creates a pack expansion.
14645 ///
14646 /// \param Pattern The expression preceding the ellipsis, which will become
14647 /// the pattern of the pack expansion.
14648 ///
14649 /// \param EllipsisLoc The location of the ellipsis.
14650 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14651
14652 /// Invoked when parsing an expression followed by an ellipsis, which
14653 /// creates a pack expansion.
14654 ///
14655 /// \param Pattern The expression preceding the ellipsis, which will become
14656 /// the pattern of the pack expansion.
14657 ///
14658 /// \param EllipsisLoc The location of the ellipsis.
14659 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14660 UnsignedOrNone NumExpansions);
14661
14662 /// Determine whether we could expand a pack expansion with the
14663 /// given set of parameter packs into separate arguments by repeatedly
14664 /// transforming the pattern.
14665 ///
14666 /// \param EllipsisLoc The location of the ellipsis that identifies the
14667 /// pack expansion.
14668 ///
14669 /// \param PatternRange The source range that covers the entire pattern of
14670 /// the pack expansion.
14671 ///
14672 /// \param Unexpanded The set of unexpanded parameter packs within the
14673 /// pattern.
14674 ///
14675 /// \param ShouldExpand Will be set to \c true if the transformer should
14676 /// expand the corresponding pack expansions into separate arguments. When
14677 /// set, \c NumExpansions must also be set.
14678 ///
14679 /// \param RetainExpansion Whether the caller should add an unexpanded
14680 /// pack expansion after all of the expanded arguments. This is used
14681 /// when extending explicitly-specified template argument packs per
14682 /// C++0x [temp.arg.explicit]p9.
14683 ///
14684 /// \param NumExpansions The number of separate arguments that will be in
14685 /// the expanded form of the corresponding pack expansion. This is both an
14686 /// input and an output parameter, which can be set by the caller if the
14687 /// number of expansions is known a priori (e.g., due to a prior substitution)
14688 /// and will be set by the callee when the number of expansions is known.
14689 /// The callee must set this value when \c ShouldExpand is \c true; it may
14690 /// set this value in other cases.
14691 ///
14692 /// \returns true if an error occurred (e.g., because the parameter packs
14693 /// are to be instantiated with arguments of different lengths), false
14694 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14695 /// must be set.
14697 SourceLocation EllipsisLoc, SourceRange PatternRange,
14699 const MultiLevelTemplateArgumentList &TemplateArgs,
14700 bool FailOnPackProducingTemplates, bool &ShouldExpand,
14701 bool &RetainExpansion, UnsignedOrNone &NumExpansions,
14702 bool Diagnose = true);
14703
14704 /// Determine the number of arguments in the given pack expansion
14705 /// type.
14706 ///
14707 /// This routine assumes that the number of arguments in the expansion is
14708 /// consistent across all of the unexpanded parameter packs in its pattern.
14709 ///
14710 /// Returns an empty Optional if the type can't be expanded.
14712 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14713
14716 const MultiLevelTemplateArgumentList &TemplateArgs);
14717
14718 /// Determine whether the given declarator contains any unexpanded
14719 /// parameter packs.
14720 ///
14721 /// This routine is used by the parser to disambiguate function declarators
14722 /// with an ellipsis prior to the ')', e.g.,
14723 ///
14724 /// \code
14725 /// void f(T...);
14726 /// \endcode
14727 ///
14728 /// To determine whether we have an (unnamed) function parameter pack or
14729 /// a variadic function.
14730 ///
14731 /// \returns true if the declarator contains any unexpanded parameter packs,
14732 /// false otherwise.
14734
14735 /// Returns the pattern of the pack expansion for a template argument.
14736 ///
14737 /// \param OrigLoc The template argument to expand.
14738 ///
14739 /// \param Ellipsis Will be set to the location of the ellipsis.
14740 ///
14741 /// \param NumExpansions Will be set to the number of expansions that will
14742 /// be generated from this pack expansion, if known a priori.
14745 SourceLocation &Ellipsis,
14746 UnsignedOrNone &NumExpansions) const;
14747
14748 /// Given a template argument that contains an unexpanded parameter pack, but
14749 /// which has already been substituted, attempt to determine the number of
14750 /// elements that will be produced once this argument is fully-expanded.
14751 ///
14752 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14753 /// avoid actually expanding the pack where possible.
14755
14756 /// Called when an expression computing the size of a parameter pack
14757 /// is parsed.
14758 ///
14759 /// \code
14760 /// template<typename ...Types> struct count {
14761 /// static const unsigned value = sizeof...(Types);
14762 /// };
14763 /// \endcode
14764 ///
14765 //
14766 /// \param OpLoc The location of the "sizeof" keyword.
14767 /// \param Name The name of the parameter pack whose size will be determined.
14768 /// \param NameLoc The source location of the name of the parameter pack.
14769 /// \param RParenLoc The location of the closing parentheses.
14771 IdentifierInfo &Name,
14772 SourceLocation NameLoc,
14773 SourceLocation RParenLoc);
14774
14775 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14776 SourceLocation EllipsisLoc,
14777 SourceLocation LSquareLoc, Expr *IndexExpr,
14778 SourceLocation RSquareLoc);
14779
14780 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14781 SourceLocation EllipsisLoc, Expr *IndexExpr,
14782 SourceLocation RSquareLoc,
14783 ArrayRef<Expr *> ExpandedExprs = {},
14784 bool FullySubstituted = false);
14785
14786 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14787 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14788 tok::TokenKind Operator,
14789 SourceLocation EllipsisLoc, Expr *RHS,
14790 SourceLocation RParenLoc);
14791 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14792 SourceLocation LParenLoc, Expr *LHS,
14793 BinaryOperatorKind Operator,
14794 SourceLocation EllipsisLoc, Expr *RHS,
14795 SourceLocation RParenLoc,
14796 UnsignedOrNone NumExpansions);
14797 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14798 BinaryOperatorKind Operator);
14799
14800 ///@}
14801
14802 //
14803 //
14804 // -------------------------------------------------------------------------
14805 //
14806 //
14807
14808 /// \name Constraints and Concepts
14809 /// Implementations are in SemaConcept.cpp
14810 ///@{
14811
14812public:
14814 const llvm::FoldingSetNodeID &ID) {
14815 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14816 SatisfactionStack.emplace_back(Can, ID);
14817 }
14818
14819 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14820
14822 const llvm::FoldingSetNodeID &ID) const {
14823 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14824 return llvm::is_contained(SatisfactionStack,
14825 SatisfactionStackEntryTy{Can, ID});
14826 }
14827
14829 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
14830
14831 // Resets the current SatisfactionStack for cases where we are instantiating
14832 // constraints as a 'side effect' of normal instantiation in a way that is not
14833 // indicative of recursive definition.
14836 Sema &SemaRef;
14837
14838 public:
14840 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14841 }
14842
14844 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14845 }
14846
14850 };
14851
14854 SatisfactionStack.swap(NewSS);
14855 }
14856
14858 llvm::PointerUnion<const NamedDecl *,
14860
14861 /// Check whether the given expression is a valid constraint expression.
14862 /// A diagnostic is emitted if it is not, false is returned, and
14863 /// PossibleNonPrimary will be set to true if the failure might be due to a
14864 /// non-primary expression being used as an atomic constraint.
14865 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
14866 bool *PossibleNonPrimary = nullptr,
14867 bool IsTrailingRequiresClause = false);
14868
14869 /// \brief Check whether the given list of constraint expressions are
14870 /// satisfied (as if in a 'conjunction') given template arguments.
14871 /// \param Template the template-like entity that triggered the constraints
14872 /// check (either a concept or a constrained entity).
14873 /// \param ConstraintExprs a list of constraint expressions, treated as if
14874 /// they were 'AND'ed together.
14875 /// \param TemplateArgLists the list of template arguments to substitute into
14876 /// the constraint expression.
14877 /// \param TemplateIDRange The source range of the template id that
14878 /// caused the constraints check.
14879 /// \param Satisfaction if true is returned, will contain details of the
14880 /// satisfaction, with enough information to diagnose an unsatisfied
14881 /// expression.
14882 /// \returns true if an error occurred and satisfaction could not be checked,
14883 /// false otherwise.
14886 ArrayRef<AssociatedConstraint> AssociatedConstraints,
14887 const MultiLevelTemplateArgumentList &TemplateArgLists,
14888 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction,
14889 const ConceptReference *TopLevelConceptId = nullptr,
14890 Expr **ConvertedExpr = nullptr);
14891
14892 /// \brief Check whether the given non-dependent constraint expression is
14893 /// satisfied. Returns false and updates Satisfaction with the satisfaction
14894 /// verdict if successful, emits a diagnostic and returns true if an error
14895 /// occurred and satisfaction could not be determined.
14896 ///
14897 /// \returns true if an error occurred, false otherwise.
14898 bool
14900 ConstraintSatisfaction &Satisfaction);
14901
14902 /// Check whether the given function decl's trailing requires clause is
14903 /// satisfied, if any. Returns false and updates Satisfaction with the
14904 /// satisfaction verdict if successful, emits a diagnostic and returns true if
14905 /// an error occurred and satisfaction could not be determined.
14906 ///
14907 /// \returns true if an error occurred, false otherwise.
14909 ConstraintSatisfaction &Satisfaction,
14910 SourceLocation UsageLoc = SourceLocation(),
14911 bool ForOverloadResolution = false);
14912
14913 // Calculates whether two constraint expressions are equal irrespective of a
14914 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
14915 // 'New', which are the "source" of the constraint, since this is necessary
14916 // for figuring out the relative 'depth' of the constraint. The depth of the
14917 // 'primary template' and the 'instantiated from' templates aren't necessarily
14918 // the same, such as a case when one is a 'friend' defined in a class.
14920 const Expr *OldConstr,
14922 const Expr *NewConstr);
14923
14924 // Calculates whether the friend function depends on an enclosing template for
14925 // the purposes of [temp.friend] p9.
14927
14928 /// \brief Ensure that the given template arguments satisfy the constraints
14929 /// associated with the given template, emitting a diagnostic if they do not.
14930 ///
14931 /// \param Template The template to which the template arguments are being
14932 /// provided.
14933 ///
14934 /// \param TemplateArgs The converted, canonicalized template arguments.
14935 ///
14936 /// \param TemplateIDRange The source range of the template id that
14937 /// caused the constraints check.
14938 ///
14939 /// \returns true if the constrains are not satisfied or could not be checked
14940 /// for satisfaction, false if the constraints are satisfied.
14943 const MultiLevelTemplateArgumentList &TemplateArgs,
14944 SourceRange TemplateIDRange);
14945
14946 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
14948 ArrayRef<TemplateArgument> TemplateArgs,
14949 ConstraintSatisfaction &Satisfaction);
14950
14951 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14952 /// unsatisfied.
14953 /// \param First whether this is the first time an unsatisfied constraint is
14954 /// diagnosed for this error.
14956 SourceLocation Loc = {},
14957 bool First = true);
14958
14959 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14960 /// unsatisfied.
14961 void
14963 bool First = true);
14964
14967 ArrayRef<AssociatedConstraint> AssociatedConstraints);
14968
14969 /// \brief Check whether the given declaration's associated constraints are
14970 /// at least as constrained than another declaration's according to the
14971 /// partial ordering of constraints.
14972 ///
14973 /// \param Result If no error occurred, receives the result of true if D1 is
14974 /// at least constrained than D2, and false otherwise.
14975 ///
14976 /// \returns true if an error occurred, false otherwise.
14977 bool IsAtLeastAsConstrained(const NamedDecl *D1,
14979 const NamedDecl *D2,
14981 bool &Result);
14982
14983 /// If D1 was not at least as constrained as D2, but would've been if a pair
14984 /// of atomic constraints involved had been declared in a concept and not
14985 /// repeated in two separate places in code.
14986 /// \returns true if such a diagnostic was emitted, false otherwise.
14990
14991 /// Cache the satisfaction of an atomic constraint.
14992 /// The key is based on the unsubstituted expression and the parameter
14993 /// mapping. This lets us not substituting the mapping more than once,
14994 /// which is (very!) expensive.
14995 /// FIXME: this should be private.
14996 llvm::DenseMap<llvm::FoldingSetNodeID,
14999
15000private:
15001 /// Caches pairs of template-like decls whose associated constraints were
15002 /// checked for subsumption and whether or not the first's constraints did in
15003 /// fact subsume the second's.
15004 llvm::DenseMap<std::pair<const NamedDecl *, const NamedDecl *>, bool>
15005 SubsumptionCache;
15006 /// Caches the normalized associated constraints of declarations (concepts or
15007 /// constrained declarations). If an error occurred while normalizing the
15008 /// associated constraints of the template or concept, nullptr will be cached
15009 /// here.
15010 llvm::DenseMap<ConstrainedDeclOrNestedRequirement, NormalizedConstraint *>
15011 NormalizationCache;
15012
15013 /// Cache whether the associated constraint of a declaration
15014 /// is satisfied.
15015 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
15016 SatisfactionCache;
15017
15018 // The current stack of constraint satisfactions, so we can exit-early.
15020
15021 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to set up the
15022 /// LocalInstantiationScope of the current non-lambda function. For lambdas,
15023 /// use LambdaScopeForCallOperatorInstantiationRAII.
15024 bool
15025 SetupConstraintScope(FunctionDecl *FD,
15026 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15027 const MultiLevelTemplateArgumentList &MLTAL,
15029
15030 /// Used during constraint checking, sets up the constraint template argument
15031 /// lists, and calls SetupConstraintScope to set up the
15032 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
15033 std::optional<MultiLevelTemplateArgumentList>
15034 SetupConstraintCheckingTemplateArgumentsAndScope(
15035 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15037
15038 ///@}
15039
15040 //
15041 //
15042 // -------------------------------------------------------------------------
15043 //
15044 //
15045
15046 /// \name Types
15047 /// Implementations are in SemaType.cpp
15048 ///@{
15049
15050public:
15051 /// A mapping that describes the nullability we've seen in each header file.
15053
15054 static int getPrintable(int I) { return I; }
15055 static unsigned getPrintable(unsigned I) { return I; }
15056 static bool getPrintable(bool B) { return B; }
15057 static const char *getPrintable(const char *S) { return S; }
15058 static StringRef getPrintable(StringRef S) { return S; }
15059 static const std::string &getPrintable(const std::string &S) { return S; }
15060 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
15061 return II;
15062 }
15064 static QualType getPrintable(QualType T) { return T; }
15065 static SourceRange getPrintable(SourceRange R) { return R; }
15067 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
15069
15070 enum class CompleteTypeKind {
15071 /// Apply the normal rules for complete types. In particular,
15072 /// treat all sizeless types as incomplete.
15074
15075 /// Relax the normal rules for complete types so that they include
15076 /// sizeless built-in types.
15078
15079 // FIXME: Eventually we should flip the default to Normal and opt in
15080 // to AcceptSizeless rather than opt out of it.
15082 };
15083
15085 const DeclSpec *DS = nullptr);
15087 const DeclSpec *DS = nullptr);
15088
15089 /// Build a pointer type.
15090 ///
15091 /// \param T The type to which we'll be building a pointer.
15092 ///
15093 /// \param Loc The location of the entity whose type involves this
15094 /// pointer type or, if there is no such entity, the location of the
15095 /// type that will have pointer type.
15096 ///
15097 /// \param Entity The name of the entity that involves the pointer
15098 /// type, if known.
15099 ///
15100 /// \returns A suitable pointer type, if there are no
15101 /// errors. Otherwise, returns a NULL type.
15103 DeclarationName Entity);
15104
15105 /// Build a reference type.
15106 ///
15107 /// \param T The type to which we'll be building a reference.
15108 ///
15109 /// \param Loc The location of the entity whose type involves this
15110 /// reference type or, if there is no such entity, the location of the
15111 /// type that will have reference type.
15112 ///
15113 /// \param Entity The name of the entity that involves the reference
15114 /// type, if known.
15115 ///
15116 /// \returns A suitable reference type, if there are no
15117 /// errors. Otherwise, returns a NULL type.
15119 DeclarationName Entity);
15120
15121 /// Build an array type.
15122 ///
15123 /// \param T The type of each element in the array.
15124 ///
15125 /// \param ASM C99 array size modifier (e.g., '*', 'static').
15126 ///
15127 /// \param ArraySize Expression describing the size of the array.
15128 ///
15129 /// \param Brackets The range from the opening '[' to the closing ']'.
15130 ///
15131 /// \param Entity The name of the entity that involves the array
15132 /// type, if known.
15133 ///
15134 /// \returns A suitable array type, if there are no errors. Otherwise,
15135 /// returns a NULL type.
15137 unsigned Quals, SourceRange Brackets,
15138 DeclarationName Entity);
15140
15141 /// Build an ext-vector type.
15142 ///
15143 /// Run the required checks for the extended vector type.
15145 SourceLocation AttrLoc);
15146 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
15147 SourceLocation AttrLoc);
15148
15150 Expr *CountExpr,
15151 bool CountInBytes,
15152 bool OrNull);
15153
15154 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
15155 /// expression is uninstantiated. If instantiated it will apply the
15156 /// appropriate address space to the type. This function allows dependent
15157 /// template variables to be used in conjunction with the address_space
15158 /// attribute
15159 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
15160 SourceLocation AttrLoc);
15161
15162 /// Same as above, but constructs the AddressSpace index if not provided.
15164 SourceLocation AttrLoc);
15165
15167
15169
15170 /// Build a function type.
15171 ///
15172 /// This routine checks the function type according to C++ rules and
15173 /// under the assumption that the result type and parameter types have
15174 /// just been instantiated from a template. It therefore duplicates
15175 /// some of the behavior of GetTypeForDeclarator, but in a much
15176 /// simpler form that is only suitable for this narrow use case.
15177 ///
15178 /// \param T The return type of the function.
15179 ///
15180 /// \param ParamTypes The parameter types of the function. This array
15181 /// will be modified to account for adjustments to the types of the
15182 /// function parameters.
15183 ///
15184 /// \param Loc The location of the entity whose type involves this
15185 /// function type or, if there is no such entity, the location of the
15186 /// type that will have function type.
15187 ///
15188 /// \param Entity The name of the entity that involves the function
15189 /// type, if known.
15190 ///
15191 /// \param EPI Extra information about the function type. Usually this will
15192 /// be taken from an existing function with the same prototype.
15193 ///
15194 /// \returns A suitable function type, if there are no errors. The
15195 /// unqualified type will always be a FunctionProtoType.
15196 /// Otherwise, returns a NULL type.
15198 SourceLocation Loc, DeclarationName Entity,
15200
15201 /// Build a member pointer type \c T Class::*.
15202 ///
15203 /// \param T the type to which the member pointer refers.
15204 /// \param Class the class type into which the member pointer points.
15205 /// \param Loc the location where this type begins
15206 /// \param Entity the name of the entity that will have this member pointer
15207 /// type
15208 ///
15209 /// \returns a member pointer type, if successful, or a NULL type if there was
15210 /// an error.
15212 CXXRecordDecl *Cls, SourceLocation Loc,
15213 DeclarationName Entity);
15214
15215 /// Build a block pointer type.
15216 ///
15217 /// \param T The type to which we'll be building a block pointer.
15218 ///
15219 /// \param Loc The source location, used for diagnostics.
15220 ///
15221 /// \param Entity The name of the entity that involves the block pointer
15222 /// type, if known.
15223 ///
15224 /// \returns A suitable block pointer type, if there are no
15225 /// errors. Otherwise, returns a NULL type.
15227 DeclarationName Entity);
15228
15229 /// Build a paren type including \p T.
15232
15233 /// Build a Read-only Pipe type.
15234 ///
15235 /// \param T The type to which we'll be building a Pipe.
15236 ///
15237 /// \param Loc We do not use it for now.
15238 ///
15239 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15240 /// a NULL type.
15242
15243 /// Build a Write-only Pipe type.
15244 ///
15245 /// \param T The type to which we'll be building a Pipe.
15246 ///
15247 /// \param Loc We do not use it for now.
15248 ///
15249 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15250 /// a NULL type.
15252
15253 /// Build a bit-precise integer type.
15254 ///
15255 /// \param IsUnsigned Boolean representing the signedness of the type.
15256 ///
15257 /// \param BitWidth Size of this int type in bits, or an expression
15258 /// representing that.
15259 ///
15260 /// \param Loc Location of the keyword.
15261 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
15262
15263 /// GetTypeForDeclarator - Convert the type for the specified
15264 /// declarator to Type instances.
15265 ///
15266 /// The result of this call will never be null, but the associated
15267 /// type may be a null type if there's an unrecoverable error.
15270
15271 /// Package the given type and TSI into a ParsedType.
15274 TypeSourceInfo **TInfo = nullptr);
15275
15277
15278 // Check whether the size of array element of type \p EltTy is a multiple of
15279 // its alignment and return false if it isn't.
15281
15282 void
15283 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
15284 SourceLocation FallbackLoc,
15285 SourceLocation ConstQualLoc = SourceLocation(),
15286 SourceLocation VolatileQualLoc = SourceLocation(),
15287 SourceLocation RestrictQualLoc = SourceLocation(),
15288 SourceLocation AtomicQualLoc = SourceLocation(),
15289 SourceLocation UnalignedQualLoc = SourceLocation());
15290
15291 /// Retrieve the keyword associated
15293
15294 /// Adjust the calling convention of a method to be the ABI default if it
15295 /// wasn't specified explicitly. This handles method types formed from
15296 /// function type typedefs and typename template arguments.
15297 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
15298 bool IsCtorOrDtor, SourceLocation Loc);
15299
15300 // Check if there is an explicit attribute, but only look through parens.
15301 // The intent is to look for an attribute on the current declarator, but not
15302 // one that came from a typedef.
15304
15305 /// Check whether a nullability type specifier can be added to the given
15306 /// type through some means not written in source (e.g. API notes).
15307 ///
15308 /// \param Type The type to which the nullability specifier will be
15309 /// added. On success, this type will be updated appropriately.
15310 ///
15311 /// \param Nullability The nullability specifier to add.
15312 ///
15313 /// \param DiagLoc The location to use for diagnostics.
15314 ///
15315 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
15316 /// array type (e.g., because it will decay to a pointer).
15317 ///
15318 /// \param OverrideExisting Whether to override an existing, locally-specified
15319 /// nullability specifier rather than complaining about the conflict.
15320 ///
15321 /// \returns true if nullability cannot be applied, false otherwise.
15323 NullabilityKind Nullability,
15324 SourceLocation DiagLoc,
15325 bool AllowArrayTypes,
15326 bool OverrideExisting);
15327
15328 /// Get the type of expression E, triggering instantiation to complete the
15329 /// type if necessary -- that is, if the expression refers to a templated
15330 /// static data member of incomplete array type.
15331 ///
15332 /// May still return an incomplete type if instantiation was not possible or
15333 /// if the type is incomplete for a different reason. Use
15334 /// RequireCompleteExprType instead if a diagnostic is expected for an
15335 /// incomplete expression type.
15337
15339
15340 /// Ensure that the type of the given expression is complete.
15341 ///
15342 /// This routine checks whether the expression \p E has a complete type. If
15343 /// the expression refers to an instantiable construct, that instantiation is
15344 /// performed as needed to complete its type. Furthermore
15345 /// Sema::RequireCompleteType is called for the expression's type (or in the
15346 /// case of a reference type, the referred-to type).
15347 ///
15348 /// \param E The expression whose type is required to be complete.
15349 /// \param Kind Selects which completeness rules should be applied.
15350 /// \param Diagnoser The object that will emit a diagnostic if the type is
15351 /// incomplete.
15352 ///
15353 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
15354 /// otherwise.
15356 TypeDiagnoser &Diagnoser);
15357 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
15358
15359 template <typename... Ts>
15360 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
15361 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15363 }
15364
15365 // Returns the underlying type of a decltype with the given expression.
15367
15369 /// If AsUnevaluated is false, E is treated as though it were an evaluated
15370 /// context, such as when building a type for decltype(auto).
15371 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
15372
15373 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
15374 SourceLocation Loc,
15375 SourceLocation EllipsisLoc);
15376 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
15377 SourceLocation Loc, SourceLocation EllipsisLoc,
15378 bool FullySubstituted = false,
15379 ArrayRef<QualType> Expansions = {});
15380
15381 using UTTKind = UnaryTransformType::UTTKind;
15383 SourceLocation Loc);
15389 SourceLocation Loc);
15391 SourceLocation Loc);
15393 SourceLocation Loc);
15394
15396 return BuiltinRemoveReference(BaseType, UTTKind::RemoveCVRef, Loc);
15397 }
15398
15400 SourceLocation Loc);
15402 SourceLocation Loc);
15403
15404 bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
15405
15406 /// Ensure that the type T is a literal type.
15407 ///
15408 /// This routine checks whether the type @p T is a literal type. If @p T is an
15409 /// incomplete type, an attempt is made to complete it. If @p T is a literal
15410 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
15411 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
15412 /// it the type @p T), along with notes explaining why the type is not a
15413 /// literal type, and returns true.
15414 ///
15415 /// @param Loc The location in the source that the non-literal type
15416 /// diagnostic should refer to.
15417 ///
15418 /// @param T The type that this routine is examining for literalness.
15419 ///
15420 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
15421 ///
15422 /// @returns @c true if @p T is not a literal type and a diagnostic was
15423 /// emitted, @c false otherwise.
15425 TypeDiagnoser &Diagnoser);
15426 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
15427
15428 template <typename... Ts>
15429 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID,
15430 const Ts &...Args) {
15431 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15432 return RequireLiteralType(Loc, T, Diagnoser);
15433 }
15434
15437 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
15438 }
15439
15440 /// Ensure that the type T is a complete type.
15441 ///
15442 /// This routine checks whether the type @p T is complete in any
15443 /// context where a complete type is required. If @p T is a complete
15444 /// type, returns false. If @p T is a class template specialization,
15445 /// this routine then attempts to perform class template
15446 /// instantiation. If instantiation fails, or if @p T is incomplete
15447 /// and cannot be completed, issues the diagnostic @p diag (giving it
15448 /// the type @p T) and returns true.
15449 ///
15450 /// @param Loc The location in the source that the incomplete type
15451 /// diagnostic should refer to.
15452 ///
15453 /// @param T The type that this routine is examining for completeness.
15454 ///
15455 /// @param Kind Selects which completeness rules should be applied.
15456 ///
15457 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
15458 /// @c false otherwise.
15460 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
15462 CompleteTypeKind Kind, unsigned DiagID);
15463
15465 TypeDiagnoser &Diagnoser) {
15466 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, Diagnoser);
15467 }
15468 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID) {
15469 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, DiagID);
15470 }
15471
15472 template <typename... Ts>
15473 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID,
15474 const Ts &...Args) {
15475 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15476 return RequireCompleteType(Loc, T, Diagnoser);
15477 }
15478
15479 /// Determine whether a declaration is visible to name lookup.
15480 bool isVisible(const NamedDecl *D) {
15481 return D->isUnconditionallyVisible() ||
15482 isAcceptableSlow(D, AcceptableKind::Visible);
15483 }
15484
15485 /// Determine whether a declaration is reachable.
15486 bool isReachable(const NamedDecl *D) {
15487 // All visible declarations are reachable.
15488 return D->isUnconditionallyVisible() ||
15489 isAcceptableSlow(D, AcceptableKind::Reachable);
15490 }
15491
15492 /// Determine whether a declaration is acceptable (visible/reachable).
15494 return Kind == AcceptableKind::Visible ? isVisible(D) : isReachable(D);
15495 }
15496
15497 /// Determine if \p D and \p Suggested have a structurally compatible
15498 /// layout as described in C11 6.2.7/1.
15499 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15500
15501 /// Determine if \p D has a visible definition. If not, suggest a declaration
15502 /// that should be made visible to expose the definition.
15503 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15504 bool OnlyNeedComplete = false);
15506 NamedDecl *Hidden;
15507 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15508 }
15509 /// Determine if \p D has a definition which allows we redefine it in current
15510 /// TU. \p Suggested is the definition that should be made visible to expose
15511 /// the definition.
15512 bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested,
15513 bool &Visible);
15515 NamedDecl *Hidden;
15516 return isRedefinitionAllowedFor(const_cast<NamedDecl *>(D), &Hidden,
15517 Visible);
15518 }
15519
15520 /// Determine if \p D has a reachable definition. If not, suggest a
15521 /// declaration that should be made reachable to expose the definition.
15522 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15523 bool OnlyNeedComplete = false);
15525 NamedDecl *Hidden;
15526 return hasReachableDefinition(D, &Hidden);
15527 }
15528
15529 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15530 AcceptableKind Kind,
15531 bool OnlyNeedComplete = false);
15533 NamedDecl *Hidden;
15534 return hasAcceptableDefinition(D, &Hidden, Kind);
15535 }
15536
15537 /// Try to parse the conditional expression attached to an effect attribute
15538 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15539 /// optional on error.
15540 std::optional<FunctionEffectMode>
15541 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15542
15543 void ActOnCleanupAttr(Decl *D, const Attr *A);
15544
15545private:
15546 /// The implementation of RequireCompleteType
15547 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15548 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15549
15550 /// Nullability type specifiers.
15551 IdentifierInfo *Ident__Nonnull = nullptr;
15552 IdentifierInfo *Ident__Nullable = nullptr;
15553 IdentifierInfo *Ident__Nullable_result = nullptr;
15554 IdentifierInfo *Ident__Null_unspecified = nullptr;
15555
15556 ///@}
15557
15558 //
15559 //
15560 // -------------------------------------------------------------------------
15561 //
15562 //
15563
15564 /// \name FixIt Helpers
15565 /// Implementations are in SemaFixItUtils.cpp
15566 ///@{
15567
15568public:
15569 /// Get a string to suggest for zero-initialization of a type.
15571 SourceLocation Loc) const;
15572 std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const;
15573
15574 ///@}
15575
15576 //
15577 //
15578 // -------------------------------------------------------------------------
15579 //
15580 //
15581
15582 /// \name Function Effects
15583 /// Implementations are in SemaFunctionEffects.cpp
15584 ///@{
15585public:
15588
15591 std::optional<FunctionEffectWithCondition>
15592 Old; // Invalid when 'Kind' is 'Added'.
15593 std::optional<FunctionEffectWithCondition>
15594 New; // Invalid when 'Kind' is 'Removed'.
15595
15596 StringRef effectName() const {
15597 if (Old)
15598 return Old.value().Effect.name();
15599 return New.value().Effect.name();
15600 }
15601
15602 /// Describes the result of effects differing between a base class's virtual
15603 /// method and an overriding method in a subclass.
15604 enum class OverrideResult {
15607 Merge // Merge missing effect from base to derived.
15608 };
15609
15610 /// Return true if adding or removing the effect as part of a type
15611 /// conversion should generate a diagnostic.
15613 const FunctionEffectsRef &SrcFX,
15614 QualType DstType,
15615 const FunctionEffectsRef &DstFX) const;
15616
15617 /// Return true if adding or removing the effect in a redeclaration should
15618 /// generate a diagnostic.
15619 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15620 const FunctionEffectsRef &OldFX,
15621 const FunctionDecl &NewFunction,
15622 const FunctionEffectsRef &NewFX) const;
15623
15624 /// Return true if adding or removing the effect in a C++ virtual method
15625 /// override should generate a diagnostic.
15627 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15628 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15629 };
15630
15631 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15632 /// Caller should short-circuit by checking for equality first.
15634 const FunctionEffectsRef &New);
15635 };
15636
15637 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15638 /// FunctionEffectsRef to be verified.
15640
15641 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15642 /// are all null.
15644
15645public:
15646 /// Warn and return true if adding a function effect to a set would create a
15647 /// conflict.
15650 SourceLocation NewAttrLoc);
15651
15652 // Report a failure to merge function effects between declarations due to a
15653 // conflict.
15654 void
15656 SourceLocation NewLoc,
15657 SourceLocation OldLoc);
15658
15659 /// Inline checks from the start of maybeAddDeclWithEffects, to
15660 /// minimize performance impact on code not using effects.
15661 template <class FuncOrBlockDecl>
15662 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15663 if (Context.hasAnyFunctionEffects())
15664 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15666 }
15667
15668 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15669 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15670
15671 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15672 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15673
15675
15676 ///@}
15677};
15678
15679DeductionFailureInfo
15681 sema::TemplateDeductionInfo &Info);
15682
15683/// Contains a late templated function.
15684/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15687 /// The template function declaration to be late parsed.
15689 /// Floating-point options in the point of definition.
15691};
15692
15693template <>
15695 PragmaMsStackAction Action,
15696 llvm::StringRef StackSlotLabel,
15698
15699} // end namespace clang
15700
15701#endif
#define V(N, I)
Forward declaration of all AST node types.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
Defines enumerations for expression traits intrinsics.
Token Tok
The Token.
FormatToken * Previous
The previous token in the unwrapped line.
static const Decl * getCanonicalDecl(const Decl *D)
#define X(type, name)
Definition Value.h:97
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition MachO.h:31
Defines the clang::Module class, which describes a module in the source code.
#define SM(sm)
Defines the clang::OpenCLOptions class.
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
@ NotForRedeclaration
The lookup is a reference to this name that is not for the purpose of redeclaring the name.
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
AccessResult
A copy of Sema's enum without AR_delayed.
CastType
Definition SemaCast.cpp:49
static void CheckFormatString(Sema &S, const FormatStringLiteral *FExpr, const StringLiteral *ReferenceFormatString, const Expr *OrigFormatExpr, ArrayRef< const Expr * > Args, Sema::FormatArgumentPassingKind APK, unsigned format_idx, unsigned firstDataArg, FormatStringType Type, bool inFunctionCall, VariadicCallType CallType, llvm::SmallBitVector &CheckedVarArgs, UncoveredArgHandler &UncoveredArg, bool IgnoreStringsWithoutSpecifiers)
static void CheckBoolLikeConversion(Sema &S, Expr *E, SourceLocation CC)
Check conversion of given expression to boolean.
Sema::AllowedExplicit AllowedExplicit
This file declares semantic analysis functions specific to RISC-V.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
Defines a utilitiy for warning once when close to out of stack space.
Defines the clang::TemplateNameKind enum.
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
Defines enumerations for the type traits support.
TypePropertyCache< Private > Cache
Definition Type.cpp:4786
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:220
Represents a member of a struct/union/class.
Definition Decl.h:3160
a trap message and trap category.
A class for storing results from argument-dependent lookup.
Definition Lookup.h:871
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:35
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Reads an AST files chain containing the contents of a translation unit.
Definition ASTReader.h:430
Writes an AST file containing the contents of a translation unit.
Definition ASTWriter.h:97
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition Expr.h:2721
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3723
Attr - This represents one attribute.
Definition Attr.h:45
Represents a C++ declaration that introduces decls from somewhere else.
Definition DeclCXX.h:3492
A binding in a decomposition declaration.
Definition DeclCXX.h:4181
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4671
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents a C++ constructor within a class.
Definition DeclCXX.h:2604
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2939
Represents a C++ base or member initializer.
Definition DeclCXX.h:2369
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2626
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of C++ classes.
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:73
Represents the this expression in C++.
Definition ExprCXX.h:1154
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:2943
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4943
CaseStmt - Represent a case statement.
Definition Stmt.h:1911
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3676
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:3673
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
The information about the darwin SDK that was used during this compilation.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
Definition DeclBase.h:1382
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1270
Captures information about "declaration specifiers".
Definition DeclSpec.h:217
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Definition DeclBase.h:859
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:842
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1874
A decomposition declaration.
Definition DeclCXX.h:4245
Captures a template argument whose value has been deduced via c++ template argument deduction.
Definition Template.h:331
A dependently-generated diagnostic.
Designation - Represent a full designation, which is a sequence of designators.
Definition Designator.h:208
A little helper class used to produce diagnostics.
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3423
Represents an enum.
Definition Decl.h:4010
Store information needed for an explicit specifier.
Definition DeclCXX.h:1924
The return type of classify().
Definition Expr.h:337
This represents one expression.
Definition Expr.h:112
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:194
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
Definition Expr.h:802
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:276
An abstract interface that should be implemented by external AST sources that also provide informatio...
virtual void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs)
Read the set of tentative definitions known to the external Sema source.
virtual void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls)
Read the set of unused file-scope declarations known to the external Sema source.
virtual void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls)
Read the set of ext_vector type declarations known to the external Sema source.
virtual void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls)
Read the set of delegating constructors known to the external Sema source.
Represents difference between two FPOptions values.
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
Represents a member of a struct/union/class.
Definition Decl.h:3160
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
A mapping from file IDs to a record of whether we've seen nullability information in that file.
Definition Sema.h:259
FileNullability & operator[](FileID file)
Definition Sema.h:270
FileNullability Nullability
Definition Sema.h:266
Represents a function declaration or definition.
Definition Decl.h:2000
A mutable set of FunctionEffect::Kind.
Definition TypeBase.h:5123
SmallVector< Conflict > Conflicts
Definition TypeBase.h:5237
Kind
Identifies the particular effect.
Definition TypeBase.h:4885
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5069
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:5269
Declaration of a template function.
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition TypeBase.h:4491
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4465
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:621
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3467
Describes an C or C++ initializer list.
Definition Expr.h:5299
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:369
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4394
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4340
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:3364
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3654
Abstract interface for a module loader.
Describes a module or submodule.
Definition Module.h:144
Data structure that captures multiple levels of template argument lists for use in template instantia...
Definition Template.h:76
This represents a decl that may have a name.
Definition Decl.h:274
Represent a C++ namespace.
Definition Decl.h:592
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition TypeBase.h:7910
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:1159
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition Attr.h:273
ParenExpr - This represents a parenthesized expression, e.g.
Definition Expr.h:2182
Represents a parameter to a function.
Definition Decl.h:1790
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
ParsedAttributes - A collection of parsed attributes.
Definition ParsedAttr.h:937
Represents the parsed form of a C++ template argument.
void Emit(const DiagnosticBuilder &DB) const
PreferredTypeBuilder(ASTContext *Ctx, bool Enabled)
Definition Sema.h:293
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:329
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:2694
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:4324
Represents the body of a requires-expression.
Definition DeclCXX.h:2098
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
Smart pointer class that efficiently represents Objective-C method names.
A generic diagnostic builder for errors which may or may not be deferred.
Definition SemaBase.h:111
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:1843
bool operator==(const AlignPackInfo &Info) const
Definition Sema.h:1903
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition Sema.h:1875
unsigned getPackNumber() const
Definition Sema.h:1893
bool IsXLStack() const
Definition Sema.h:1901
bool IsPackSet() const
Definition Sema.h:1895
AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
Definition Sema.h:1849
bool IsAlignAttr() const
Definition Sema.h:1889
bool IsPackAttr() const
Definition Sema.h:1887
bool operator!=(const AlignPackInfo &Info) const
Definition Sema.h:1909
AlignPackInfo(bool IsXL)
Definition Sema.h:1853
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Definition Sema.h:1860
Mode getAlignMode() const
Definition Sema.h:1891
ArgPackSubstIndexRAII(Sema &Self, UnsignedOrNone NewSubstIndex)
Definition Sema.h:13638
ArgPackSubstIndexRAII & operator=(const ArgPackSubstIndexRAII &)=delete
ArgPackSubstIndexRAII(const ArgPackSubstIndexRAII &)=delete
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8276
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8281
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition Sema.h:8268
std::tuple< const Ts &... > Args
Definition Sema.h:8265
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:1292
CompoundScopeRAII(const CompoundScopeRAII &)=delete
std::pair< VarDecl *, Expr * > get() const
Definition Sema.h:7815
std::optional< bool > getKnownValue() const
Definition Sema.h:7819
A RAII object to temporarily push a declaration context.
Definition Sema.h:3472
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition Sema.h:3482
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:10304
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:10309
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:6383
DefaultedFunctionKind(CXXSpecialMemberKind CSM)
Definition Sema.h:6360
unsigned getDiagnosticIndex() const
Get the index of this function kind for use in diagnostics.
Definition Sema.h:6388
DefaultedFunctionKind(DefaultedComparisonKind Comp)
Definition Sema.h:6363
CXXSpecialMemberKind asSpecialMember() const
Definition Sema.h:6380
DeferDiagsRAII(Sema &S, bool DeferDiags)
Definition Sema.h:10044
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:1357
DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool)
Enter a new scope.
Definition Sema.h:1376
void popUndelayed(DelayedDiagnosticsState state)
Undo a previous pushUndelayed().
Definition Sema.h:1400
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
Definition Sema.h:1369
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1372
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:1386
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
Definition Sema.h:1392
A helper class for building up ExtParameterInfos.
Definition Sema.h:13019
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:13038
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition Sema.h:13026
FPOptionsOverride getOverrides()
Definition Sema.h:14042
FpPragmaStackSaveRAII(const FpPragmaStackSaveRAII &)=delete
FpPragmaStackSaveRAII & operator=(const FpPragmaStackSaveRAII &)=delete
FullExprArg(Sema &actions)
Definition Sema.h:7759
ExprResult release()
Definition Sema.h:7761
friend class Sema
Definition Sema.h:7770
Expr * get() const
Definition Sema.h:7763
GlobalEagerInstantiationScope(const GlobalEagerInstantiationScope &)=delete
GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
Definition Sema.h:14054
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:10368
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:10360
unsigned size() const
The number of exceptions in the exception specification.
Definition Sema.h:5482
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition Sema.h:5475
const QualType * data() const
The set of exceptions in the exception specification.
Definition Sema.h:5485
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:5491
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition Sema.h:5498
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:14007
LocalEagerInstantiationScope(const LocalEagerInstantiationScope &)=delete
static NameClassification DependentNonType()
Definition Sema.h:3688
static NameClassification VarTemplate(TemplateName Name)
Definition Sema.h:3698
ExprResult getExpression() const
Definition Sema.h:3724
NameClassification(const IdentifierInfo *Keyword)
Definition Sema.h:3661
static NameClassification Unknown()
Definition Sema.h:3668
static NameClassification OverloadSet(ExprResult E)
Definition Sema.h:3672
NameClassificationKind getKind() const
Definition Sema.h:3722
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition Sema.h:3716
static NameClassification FunctionTemplate(TemplateName Name)
Definition Sema.h:3704
NamedDecl * getNonTypeDecl() const
Definition Sema.h:3734
NameClassification(ParsedType Type)
Definition Sema.h:3658
TemplateName getTemplateName() const
Definition Sema.h:3739
ParsedType getType() const
Definition Sema.h:3729
TemplateNameKind getTemplateNameKind() const
Definition Sema.h:3748
static NameClassification NonType(NamedDecl *D)
Definition Sema.h:3678
static NameClassification Concept(TemplateName Name)
Definition Sema.h:3710
static NameClassification UndeclaredNonType()
Definition Sema.h:3684
static NameClassification TypeTemplate(TemplateName Name)
Definition Sema.h:3692
static NameClassification Error()
Definition Sema.h:3664
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2467
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:11398
SourceLocation getTemplateKeywordLoc() const
Definition Sema.h:11400
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition Sema.h:11395
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12451
SFINAETrap & operator=(const SFINAETrap &)=delete
SFINAETrap(const SFINAETrap &)=delete
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition Sema.h:12485
SFINAETrap(Sema &S, bool WithAccessChecking=false)
Definition Sema.h:12467
bool withAccessChecking() const
Definition Sema.h:12488
sema::TemplateDeductionInfo * getDeductionInfo() const
Definition Sema.h:12480
SFINAETrap(Sema &S, sema::TemplateDeductionInfo &Info)
Definition Sema.h:12470
SatisfactionStackResetRAII(const SatisfactionStackResetRAII &)=delete
SatisfactionStackResetRAII & operator=(const SatisfactionStackResetRAII &)=delete
A derivative of BoundTypeDiagnoser for which the diagnostic's type parameter is preceded by a 0/1 enu...
Definition Sema.h:8293
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8298
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8295
SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
Definition Sema.h:9308
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition Sema.h:9295
CXXMethodDecl * getMethod() const
Definition Sema.h:9298
void setMethod(CXXMethodDecl *MD)
Definition Sema.h:9299
void addContextNote(SourceLocation UseLoc)
Definition Sema.h:13540
SynthesizedFunctionScope(const SynthesizedFunctionScope &)=delete
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition Sema.h:13528
SynthesizedFunctionScope & operator=(const SynthesizedFunctionScope &)=delete
SourceLocation getLocation() const
Definition Sema.h:12209
bool ContainsDecl(const NamedDecl *ND) const
Definition Sema.h:12199
const DeclContext * getDeclContext() const
Definition Sema.h:12205
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition Sema.h:12183
const NamedDecl * getDecl() const
Definition Sema.h:12197
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition Sema.h:12182
const DeclContext * getLexicalDeclContext() const
Definition Sema.h:12201
TentativeAnalysisScope(Sema &SemaRef)
Definition Sema.h:12502
TentativeAnalysisScope & operator=(const TentativeAnalysisScope &)=delete
TentativeAnalysisScope(const TentativeAnalysisScope &)=delete
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition Sema.h:7718
virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc)
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:855
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:1418
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:3566
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:13588
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:8198
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition SemaAttr.cpp:503
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13572
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:10952
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13048
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2540
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1120
void MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New, LookupResult &OldDecls)
MergeTypedefNameDecl - We just parsed a typedef 'New' which has the same name and scope as a previous...
TemplateDeductionResult DeduceTemplateArgumentsFromType(TemplateDecl *TD, QualType FromType, sema::TemplateDeductionInfo &Info)
Deduce the template arguments of the given template from FromType.
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S)
Register the given locally-scoped extern "C" declaration so that it can be found later for redeclarat...
friend class ASTWriter
Definition Sema.h:1561
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:13992
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void PopParsingClass(ParsingClassState state)
Definition Sema.h:6551
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:10057
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1061
bool containsUnexpandedParameterPacks(Declarator &D)
Determine whether the given declarator contains any unexpanded parameter packs.
std::optional< QualType > BuiltinVectorMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::None)
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
llvm::SmallPtrSet< SpecialMemberDecl, 4 > SpecialMembersBeingDeclared
The C++ special members which we are currently in the process of declaring.
Definition Sema.h:6540
void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc, SourceLocation ArgLoc)
ActOnParamUnparsedDefaultArgument - We've seen a default argument for a function parameter,...
QualType CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc)
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs, SmallVectorImpl< const Attr * > &OutAttrs)
Process the attributes before creating an attributed statement.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition Sema.h:8248
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:8166
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
Definition Sema.cpp:935
bool isAttrContext() const
Definition Sema.h:6947
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:8241
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition Sema.cpp:2640
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition Sema.h:6302
LookupNameKind
Describes the kind of name lookup to perform.
Definition Sema.h:9324
@ LookupLabel
Label name lookup.
Definition Sema.h:9333
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9328
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition Sema.h:9355
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition Sema.h:9347
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition Sema.h:9369
@ LookupLocalFriendName
Look up a friend of a local class.
Definition Sema.h:9363
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition Sema.h:9365
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition Sema.h:9360
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition Sema.h:9340
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition Sema.h:9367
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9351
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9336
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition Sema.h:9343
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9331
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition Sema.h:9371
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9373
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:411
llvm::DenseMap< IdentifierInfo *, SrcLocSet > IdentifierSourceLocations
Definition Sema.h:9274
LazyVector< TypedefNameDecl *, ExternalSemaSource, &ExternalSemaSource::ReadExtVectorDecls, 2, 2 > ExtVectorDeclsType
Definition Sema.h:4881
UnaryTransformType::UTTKind UTTKind
Definition Sema.h:15381
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:628
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, Expr *Operand, SourceLocation RParen)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:6239
SemaM68k & M68k()
Definition Sema.h:1468
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:13650
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:1352
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
bool BuildTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc, bool AllowUnexpandedPack)
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the pragma attribute stack.
Definition Sema.h:2111
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:9762
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:4826
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:5038
OpaquePtr< QualType > TypeTy
Definition Sema.h:1276
void ActOnTagDefinitionError(Scope *S, Decl *TagDecl)
ActOnTagDefinitionError - Invoked when there was an unrecoverable error parsing the definition of a t...
void DiagnoseAlwaysNonNullPointer(Expr *E, Expr::NullPointerConstantKind NullType, bool IsEqual, SourceRange Range)
Diagnose pointers that are always non-null.
bool IsStringInit(Expr *Init, const ArrayType *AT)
Definition SemaInit.cpp:170
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
bool CheckCXXThisType(SourceLocation Loc, QualType Type)
Check whether the type of 'this' is valid in the current context.
void CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body)
bool LookupInSuper(LookupResult &R, CXXRecordDecl *Class)
Perform qualified name lookup into all base classes of the given class.
void addImplicitTypedef(StringRef Name, QualType T)
Definition Sema.cpp:365
void PrintContextStack()
Definition Sema.h:13659
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:1503
void CheckDelegatingCtorCycles()
llvm::SmallSet< SourceLocation, 2 > SrcLocSet
Definition Sema.h:9273
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:2286
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6277
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition Sema.h:9638
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:1344
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope)
bool BoundsSafetyCheckAssignmentToCountAttrPtr(QualType LHSTy, Expr *RHSExpr, AssignmentAction Action, SourceLocation Loc, const ValueDecl *Assignee, bool ShowFullyQualifiedAssigneeName)
Perform Bounds Safety Semantic checks for assigning to a __counted_by or __counted_by_or_null pointer...
void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode)
Called to set constant rounding mode for floating point operations.
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, ArithConvKind ACK)
UsualArithmeticConversions - Performs various conversions that are common to binary operators (C99 6....
static const IdentifierInfo * getPrintable(const IdentifierInfo *II)
Definition Sema.h:15060
StmtResult ActOnForEachLValueExpr(Expr *E)
In an Objective C collection iteration statement: for (x in y) x can be an arbitrary l-value expressi...
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
Definition Sema.h:1241
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
Definition Sema.h:4737
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:3548
PragmaClangSection PragmaClangRodataSection
Definition Sema.h:1815
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:15505
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:6513
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:5137
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1152
bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc, SourceLocation ColonLoc, const ParsedAttributesView &Attrs)
ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition Sema.h:6494
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl)
Definition SemaStmt.cpp:85
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
void InstantiateExceptionSpec(SourceLocation PointOfInstantiation, FunctionDecl *Function)
TemplateName SubstTemplateName(SourceLocation TemplateKWLoc, NestedNameSpecifierLoc &QualifierLoc, TemplateName Name, SourceLocation NameLoc, const MultiLevelTemplateArgumentList &TemplateArgs)
TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK, const CXXScopeSpec &SS, const IdentifierInfo *Name, SourceLocation TagLoc, SourceLocation NameLoc)
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
bool checkSectionName(SourceLocation LiteralLoc, StringRef Str)
VarDecl * buildCoroutinePromise(SourceLocation Loc)
unsigned CapturingFunctionScopes
Track the number of currently active capturing scopes.
Definition Sema.h:1230
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
ParmVarDecl * SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, UnsignedOrNone NumExpansions, bool ExpectParameterPack, bool EvaluateConstraints=true)
ExprResult ActOnExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
ActOnExpressionTrait - Parsed one of the unary type trait support pseudo-functions.
SemaCUDA & CUDA()
Definition Sema.h:1443
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD)
Check a completed declaration of an implicit special member.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A, bool SkipArgCountCheck=false)
Handles semantic checking for features that are common to all attributes, such as checking whether a ...
bool CompleteConstructorCall(CXXConstructorDecl *Constructor, QualType DeclInitType, MultiExprArg ArgsPtr, SourceLocation Loc, SmallVectorImpl< Expr * > &ConvertedArgs, bool AllowExplicit=false, bool IsListInitialization=false)
Given a constructor and the set of arguments provided for the constructor, convert the arguments and ...
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
void InstantiateClassTemplateSpecializationMembers(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK)
Instantiate the definitions of all of the members of the given class template specialization,...
void Initialize()
Perform initialization that occurs after the parser has been initialized but before it parses anythin...
Definition Sema.cpp:371
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
Definition Sema.h:7835
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7837
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
Definition Sema.h:7836
void LateTemplateParserCB(void *P, LateParsedTemplate &LPT)
Callback to the parser to parse templated functions when needed.
Definition Sema.h:1325
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:15464
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition Sema.h:15066
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:8186
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:9875
@ Interface
'export module X;'
Definition Sema.h:9872
@ Implementation
'module X;'
Definition Sema.h:9873
@ PartitionInterface
'export module X:Y;'
Definition Sema.h:9874
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition Sema.h:8328
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1223
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
void ActOnExitFunctionContext()
bool ActOnDuplicateODRHashDefinition(T *Duplicate, T *Previous)
Check ODR hashes for C/ObjC when merging types from modules.
Definition Sema.h:9585
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition Sema.h:10387
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10390
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10396
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10394
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
Definition SemaAttr.cpp:277
void RefersToMemberWithReducedAlignment(Expr *E, llvm::function_ref< void(Expr *, RecordDecl *, FieldDecl *, CharUnits)> Action)
This function calls Action when it determines that E designates a misaligned member due to the packed...
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType)
Definition Sema.h:1773
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
@ AR_dependent
Definition Sema.h:1658
@ AR_accessible
Definition Sema.h:1656
@ AR_inaccessible
Definition Sema.h:1657
@ AR_delayed
Definition Sema.h:1659
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:15073
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
Definition Sema.h:15077
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:925
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition Sema.h:6925
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2312
StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
QualType GetSignedSizelessVectorType(QualType V)
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
void ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurContext)
Once the Lambdas capture are known, we can start to create the closure, call operator method,...
FunctionTemplateDecl * DeclareAggregateDeductionGuideFromInitList(TemplateDecl *Template, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc)
ExprResult BuildBuiltinBitCastExpr(SourceLocation KWLoc, TypeSourceInfo *TSI, Expr *Operand, SourceLocation RParenLoc)
Definition SemaCast.cpp:438
void AddTemplateParametersToLambdaCallOperator(CXXMethodDecl *CallOperator, CXXRecordDecl *Class, TemplateParameterList *TemplateParams)
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
class clang::Sema::DelayedDiagnostics DelayedDiagnostics
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
llvm::SmallPtrSet< ConstantExpr *, 4 > FailedImmediateInvocations
Definition Sema.h:8317
void deduceOpenCLAddressSpace(ValueDecl *decl)
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2046
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:8229
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
static SourceRange getPrintable(const Expr *E)
Definition Sema.h:15067
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2040
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:15643
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2493
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:4886
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:2120
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:6754
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
void ActOnPragmaMSComment(SourceLocation CommentLoc, PragmaMSCommentKind Kind, StringRef Arg)
ActOnPragmaMSComment - Called on well formed #pragma comment(kind, "arg").
Definition SemaAttr.cpp:620
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
QualType BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc)
Build an ext-vector type.
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
SmallVector< AlignPackIncludeState, 8 > AlignPackIncludeStack
Definition Sema.h:2035
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:11117
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:2592
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:4137
@ Default
= default ;
Definition Sema.h:4139
@ Delete
deleted-function-body
Definition Sema.h:4145
LiteralOperatorLookupResult LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef< QualType > ArgTys, bool AllowRaw, bool AllowTemplate, bool AllowStringTemplate, bool DiagnoseMissing, StringLiteral *StringLit=nullptr)
LookupLiteralOperator - Determine which literal operator should be used for a user-defined literal,...
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
bool RequireStructuralType(QualType T, SourceLocation Loc)
Require the given type to be a structural type, and diagnose if it is not.
ExprResult VerifyBitField(SourceLocation FieldLoc, const IdentifierInfo *FieldName, QualType FieldTy, bool IsMsStruct, Expr *BitWidth)
VerifyBitField - verifies that a bit field expression is an ICE and has the correct width,...
concepts::Requirement * ActOnSimpleRequirement(Expr *E)
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
Definition Sema.h:13954
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
Definition SemaStmt.cpp:48
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
TemplateDeductionResult FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned NumExplicitlySpecified, FunctionDecl *&Specialization, sema::TemplateDeductionInfo &Info, SmallVectorImpl< OriginalCallArg > const *OriginalCallArgs, bool PartialOverloading, bool PartialOrdering, bool ForOverloadSetAddressResolution, llvm::function_ref< bool(bool)> CheckNonDependent=[](bool) { return false;})
Finish template argument deduction for a function template, checking the deduced template arguments f...
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
Definition Sema.cpp:1231
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
ConceptDecl * ActOnFinishConceptDefinition(Scope *S, ConceptDecl *C, Expr *ConstraintExpr, const ParsedAttributesView &Attrs)
FPOptionsOverride CurFPFeatureOverrides()
Definition Sema.h:2047
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:1458
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
bool isValidSveBitcast(QualType srcType, QualType destType)
Are the two types SVE-bitcast-compatible types?
ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)
ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.
void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef)
Add an init-capture to a lambda scope.
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture)
Build a FieldDecl suitable to hold the given capture.
concepts::Requirement * ActOnCompoundRequirement(Expr *E, SourceLocation NoexceptLoc)
void ActOnPragmaMSSeg(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, StringLiteral *SegmentName, llvm::StringRef PragmaName)
Called on well formed #pragma bss_seg/data_seg/const_seg/code_seg.
Definition SemaAttr.cpp:847
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
void CheckThreadLocalForLargeAlignment(VarDecl *VD)
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc)
bool hasVisibleExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is an explicit specialization declaration for a...
bool IsInsideALocalClassWithinATemplateFunction()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
llvm::DenseMap< llvm::FoldingSetNodeID, UnsubstitutedConstraintSatisfactionCacheResult > UnsubstitutedConstraintSatisfactionCache
Cache the satisfaction of an atomic constraint.
Definition Sema.h:14998
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition Sema.cpp:172
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, const MultiLevelTemplateArgumentList &Args)
void ActOnReenterFunctionContext(Scope *S, Decl *D)
Push the parameters of D, which must be a function, into scope.
ExprResult BuildResolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, Expr *Awaiter, bool IsImplicit=false)
SemaSYCL & SYCL()
Definition Sema.h:1528
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:2867
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:6937
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:1654
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action, PragmaFloatControlKind Value)
ActOnPragmaFloatControl - Call on well-formed #pragma float_control.
Definition SemaAttr.cpp:663
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition SemaExpr.cpp:833
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition Sema.h:11363
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:11961
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition Sema.h:11972
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition Sema.h:11964
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition Sema.h:11968
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:675
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnPragmaMSPointersToMembers(LangOptions::PragmaMSPointersToMembersKind Kind, SourceLocation PragmaLoc)
ActOnPragmaMSPointersToMembers - called on well formed #pragma pointers_to_members(representation met...
Definition SemaAttr.cpp:717
bool CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old)
[module.interface]p6: A redeclaration of an entity X is implicitly exported if X was introduced by an...
void DiagnosePrecisionLossInComplexDivision()
ExprResult CheckUnevaluatedOperand(Expr *E)
void CheckTemplatePartialSpecialization(ClassTemplatePartialSpecializationDecl *Partial)
void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc, Expr *defarg)
ActOnParamDefaultArgument - Check whether the default argument provided for a function parameter is w...
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
Definition Sema.h:9268
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
SemaX86 & X86()
Definition Sema.h:1548
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:13592
ExprResult tryConvertExprToType(Expr *E, QualType Ty)
Try to convert an expression E to type Ty.
Decl * ActOnFileScopeAsmDecl(Expr *expr, SourceLocation AsmLoc, SourceLocation RParenLoc)
bool hasMergedDefinitionInCurrentModule(const NamedDecl *Def)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
std::vector< Token > ExpandFunctionLocalPredefinedMacros(ArrayRef< Token > Toks)
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy, CastKind &Kind)
QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc)
CheckAddressOfOperand - The operand of & must be either a function designator or an lvalue designatin...
ParsedTemplateArgument ActOnTemplateTypeArgument(TypeResult ParsedType)
Convert a parsed type into a parsed template argument.
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry)
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
bool DiagnoseUnknownTemplateName(const IdentifierInfo &II, SourceLocation IILoc, Scope *S, const CXXScopeSpec *SS, TemplateTy &SuggestedTemplate, TemplateNameKind &SuggestedKind)
ASTContext & Context
Definition Sema.h:1283
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain, bool PrimaryStrictPackMatch)
static bool TooManyArguments(size_t NumParams, size_t NumArgs, bool PartialOverloading=false)
To be used for checking whether the arguments being passed to function exceeds the number of paramete...
Definition Sema.h:8153
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
Definition Sema.cpp:680
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
the following "Check" methods will return a valid/converted QualType or a null QualType (indicating a...
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
ExprResult ActOnCoyieldExpr(Scope *S, SourceLocation KwLoc, Expr *E)
LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION()
This virtual key function only exists to limit the emission of debug info describing the Sema class.
bool ConstraintExpressionDependsOnEnclosingTemplate(const FunctionDecl *Friend, unsigned TemplateDepth, const Expr *Constraint)
bool BoundsSafetyCheckUseOfCountAttrPtr(const Expr *E)
Perform Bounds Safety semantic checks for uses of invalid uses counted_by or counted_by_or_null point...
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
bool CheckTemplatePartialSpecializationArgs(SourceLocation Loc, TemplateDecl *PrimaryTemplate, unsigned NumExplicitArgs, ArrayRef< TemplateArgument > Args)
Check the non-type template arguments of a class template partial specialization according to C++ [te...
ExprResult ActOnCXXNullPtrLiteral(SourceLocation Loc)
ActOnCXXNullPtrLiteral - Parse 'nullptr'.
void ActOnCapturedRegionError()
void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnFinishDelayedCXXMethodDeclaration - We have finished processing the delayed method declaration f...
ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc)
Build a C++ typeid expression with a type operand.
void MarkUsedTemplateParametersForSubsumptionParameterMapping(const Expr *E, unsigned Depth, llvm::SmallBitVector &Used)
Mark which template parameters are named in a given expression.
IdentifierSourceLocations TypoCorrectionFailures
A cache containing identifiers for which typo correction failed and their locations,...
Definition Sema.h:9279
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition Sema.h:7780
QualType BuildFunctionType(QualType T, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI)
Build a function type.
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
void ActOnPragmaUnused(const Token &Identifier, Scope *curScope, SourceLocation PragmaLoc)
ActOnPragmaUnused - Called on well-formed '#pragma unused'.
Definition SemaAttr.cpp:935
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow)
Perform conversions on the LHS of a member access expression.
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:923
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:4363
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15429
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool CheckCaseExpression(Expr *E)
void resetFPOptions(FPOptions FPO)
Definition Sema.h:11344
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition Sema.h:15532
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:9859
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:15056
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
SemaObjC & ObjC()
Definition Sema.h:1488
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:2822
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:1413
void CheckDelayedMemberExceptionSpecs()
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition SemaDecl.cpp:79
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
ExprResult BuildPackIndexingExpr(Expr *PackExpression, SourceLocation EllipsisLoc, Expr *IndexExpr, SourceLocation RSquareLoc, ArrayRef< Expr * > ExpandedExprs={}, bool FullySubstituted=false)
void InstantiateMemInitializers(CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl, const MultiLevelTemplateArgumentList &TemplateArgs)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ParsedType getDestructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
void ActOnPragmaMSAllocText(SourceLocation PragmaLocation, StringRef Section, const SmallVector< std::tuple< IdentifierInfo *, SourceLocation > > &Functions)
Called on well-formed #pragma alloc_text().
Definition SemaAttr.cpp:899
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition Sema.h:3145
bool captureSwiftVersionIndependentAPINotes()
Whether APINotes should be gathered for all applicable Swift language versions, without being applied...
Definition Sema.h:1639
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:2043
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void PrintInstantiationStack()
Definition Sema.h:13663
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:3556
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:754
bool isImmediateFunctionContext() const
Definition Sema.h:8178
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:926
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1060
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:655
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
Definition SemaExpr.cpp:764
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:6520
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:1406
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:6604
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:2039
StmtResult ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition Sema.cpp:756
void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, SourceLocation PragmaLoc)
ActOnPragmaOptionsAlign - Called on well formed #pragma options align.
Definition SemaAttr.cpp:334
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
Definition SemaExpr.cpp:883
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:699
bool isConstantEvaluatedOverride
Used to change context to isConstantEvaluated without pushing a heavy ExpressionEvaluationContextReco...
Definition Sema.h:2590
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:6547
@ FRS_Success
Definition Sema.h:10775
@ FRS_DiagnosticIssued
Definition Sema.h:10777
@ FRS_NoViableFunction
Definition Sema.h:10776
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:14125
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:968
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
Definition Sema.h:9321
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:9271
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:6072
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
Definition Sema.h:6086
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
Definition Sema.h:6083
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
Definition Sema.h:6080
@ None
This is not a defaultable comparison operator.
Definition Sema.h:6074
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
Definition Sema.h:6077
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:9010
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:15639
@ Conversions
Allow explicit conversion functions but not explicit constructors.
Definition Sema.h:10108
@ All
Allow both explicit conversion functions and explicit constructors.
Definition Sema.h:10110
void ActOnFinishRequiresExpr()
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
Definition Sema.h:1213
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition Sema.h:6535
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
ExprResult BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional< Expr * > ArraySize, SourceRange DirectInitRange, Expr *Initializer)
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
void * SaveNestedNameSpecifierAnnotation(CXXScopeSpec &SS)
Given a C++ nested-name-specifier, produce an annotation value that the parser can use later to recon...
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
void ProcessPragmaWeak(Scope *S, Decl *D)
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
bool shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee)
NamedDecl * BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists)
Builds a using declaration.
bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum, llvm::APSInt &Result)
BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr TheCall is a constant expression.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1191
std::string getFixItZeroInitializerForType(QualType T, SourceLocation Loc) const
Get a string to suggest for zero-initialization of a type.
bool IsComplexPromotion(QualType FromType, QualType ToType)
Determine if a conversion is a complex promotion.
llvm::PointerUnion< const NamedDecl *, const concepts::NestedRequirement * > ConstrainedDeclOrNestedRequirement
Definition Sema.h:14857
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:636
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
Definition Sema.h:3579
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:1659
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:2583
unsigned InventedParameterInfosStart
The index of the first InventedParameterInfo that refers to the current context.
Definition Sema.h:3469
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:2503
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:12141
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition Sema.h:12159
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition Sema.h:12149
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition Sema.h:12169
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:4877
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:1673
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:8359
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
Definition SemaAttr.cpp:389
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
AssumedTemplateKind
Definition Sema.h:11413
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
Definition Sema.h:11420
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
Definition Sema.h:11417
bool CheckParamExceptionSpec(const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const FunctionProtoType *Target, bool SkipTargetFirstParameter, SourceLocation TargetLoc, const FunctionProtoType *Source, bool SkipSourceFirstParameter, SourceLocation SourceLoc)
CheckParamExceptionSpec - Check if the parameter and return types of the two functions have equivalen...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
Definition SemaAttr.cpp:795
bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, CheckTemplateArgumentInfo &CTAI, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld)
MergeVarDeclTypes - We parsed a variable 'New' which has the same name and scope as a previous declar...
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
StmtResult ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *Body)
AtomicArgumentOrder
Definition Sema.h:2697
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2331
ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS, NamedDecl *Found, SourceLocation NameLoc, const Token &NextToken)
Act on the result of classifying a name as a specific non-type declaration.
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl, ExprResult Operand, SourceLocation RParenLoc)
Definition SemaCast.cpp:426
SourceRange getExprRange(Expr *E) const
Definition SemaExpr.cpp:506
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:11349
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
Definition SemaAttr.cpp:168
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
LazyVector< const DeclaratorDecl *, ExternalSemaSource, &ExternalSemaSource::ReadUnusedFileScopedDecls, 2, 2 > UnusedFileScopedDeclsType
Definition Sema.h:3552
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
Definition Sema.h:8213
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:15063
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition Sema.h:4575
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:1559
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:921
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition Sema.h:8311
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:83
sema::LambdaScopeInfo * PushLambdaScope()
Definition Sema.cpp:2349
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:2482
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15473
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:14384
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition Sema.h:14404
@ UPPC_RequiresClause
Definition Sema.h:14455
@ UPPC_UsingDeclaration
A using declaration.
Definition Sema.h:14410
@ UPPC_IfExists
Microsoft __if_exists.
Definition Sema.h:14437
@ UPPC_Requirement
Definition Sema.h:14452
@ UPPC_ExceptionType
The type of an exception.
Definition Sema.h:14428
@ UPPC_EnumeratorValue
The enumerator value.
Definition Sema.h:14407
@ UPPC_Lambda
Lambda expression.
Definition Sema.h:14443
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition Sema.h:14440
@ UPPC_PartialSpecialization
Partial specialization.
Definition Sema.h:14434
@ UPPC_Initializer
An initializer.
Definition Sema.h:14419
@ UPPC_BaseType
The base type of a class type.
Definition Sema.h:14389
@ UPPC_FriendDeclaration
A friend declaration.
Definition Sema.h:14413
@ UPPC_DefaultArgument
A default argument.
Definition Sema.h:14422
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14392
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14386
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition Sema.h:14431
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition Sema.h:14416
@ UPPC_DataMemberType
The type of a data member.
Definition Sema.h:14395
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition Sema.h:14401
@ UPPC_Block
Block expression.
Definition Sema.h:14446
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition Sema.h:14398
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition Sema.h:14425
@ UPPC_TypeConstraint
A type constraint.
Definition Sema.h:14449
api_notes::APINotesManager APINotes
Definition Sema.h:1287
bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low, int High, bool RangeIsError=true)
BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr TheCall is a constant express...
CXXConstructorDecl * LookupDefaultConstructor(CXXRecordDecl *Class)
Look up the default constructor for the given class.
bool IsLayoutCompatible(QualType T1, QualType T2) const
Decl * ActOnStartNamespaceDef(Scope *S, SourceLocation InlineLoc, SourceLocation NamespaceLoc, SourceLocation IdentLoc, IdentifierInfo *Ident, SourceLocation LBrace, const ParsedAttributesView &AttrList, UsingDirectiveDecl *&UsingDecl, bool IsNested)
ActOnStartNamespaceDef - This is called at the start of a namespace definition.
llvm::DenseMap< Decl *, SmallVector< PartialDiagnosticAt, 1 > > SuppressedDiagnosticsMap
For each declaration that involved template argument deduction, the set of diagnostics that were supp...
Definition Sema.h:12521
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:919
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:13062
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:5851
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:2443
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:2082
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action, SourceLocation PragmaLoc, MSVtorDispMode Value)
Called on well formed #pragma vtordisp().
Definition SemaAttr.cpp:724
SemaCodeCompletion & CodeCompletion()
Definition Sema.h:1438
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
Definition SemaAttr.cpp:220
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:3573
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:1493
void SwapSatisfactionStack(llvm::SmallVectorImpl< SatisfactionStackEntryTy > &NewSS)
Definition Sema.h:14852
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:7013
@ ReuseLambdaContextDecl
Definition Sema.h:7013
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:927
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:1433
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
void MarkFunctionParmPackReferenced(FunctionParmPackExpr *E)
Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
void * OpaqueParser
Definition Sema.h:1327
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
Preprocessor & PP
Definition Sema.h:1282
QualType CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
bool isPotentialImplicitMemberAccess(const CXXScopeSpec &SS, LookupResult &R, bool IsAddressOfOperand)
Check whether an expression might be an implicit class member access.
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
QualType BuiltinEnumUnderlyingType(QualType BaseType, SourceLocation Loc)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc, const Expr *Op, const CXXMethodDecl *MD)
bool MSPragmaOptimizeIsOn
The "on" or "off" argument passed by #pragma optimize, that denotes whether the optimizations in the ...
Definition Sema.h:2129
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, SourceLocation BuiltinLoc, SourceLocation RPLoc, DeclContext *ParentContext)
bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty, SourceLocation OpLoc, SourceRange R)
ActOnAlignasTypeArgument - Handle alignas(type-id) and _Alignas(type-name) .
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
threadSafety::BeforeSet * ThreadSafetyDeclCache
Definition Sema.h:1322
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
Definition Sema.h:2107
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:2121
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:3560
SemaDirectX & DirectX()
Definition Sema.h:1448
llvm::SmallSetVector< const NamedDecl *, 16 > NamedDeclSetType
Definition Sema.h:6496
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:1478
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:1560
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
Definition Sema.h:1281
void InstantiateClassMembers(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiates the definitions of all of the member of the given class, which is an instantiation of a ...
NamedDecl * FindFirstQualifierInScope(Scope *S, NestedNameSpecifier NNS)
If the given nested-name-specifier begins with a bare identifier (e.g., Base::), perform name lookup ...
bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody)
Perform ODR-like check for C/ObjC when merging tag types from modules.
void ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
ActOnCXXExitDeclaratorScope - Called when a declarator that previously invoked ActOnCXXEnterDeclarato...
std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)
Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...
ExprResult PerformQualificationConversion(Expr *E, QualType Ty, ExprValueKind VK=VK_PRValue, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition Sema.h:1219
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2558
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
static const uint64_t MaximumAlignment
Definition Sema.h:1214
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
llvm::DenseMap< unsigned, CXXDeductionGuideDecl * > AggregateDeductionCandidates
Definition Sema.h:9013
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:952
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition SemaStmt.cpp:416
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition Sema.h:15486
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:6498
SemaHLSL & HLSL()
Definition Sema.h:1453
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:11362
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1217
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition Sema.h:9320
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
ExprResult ConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ConvertVectorExpr - Handle __builtin_convertvector.
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
Definition Sema.cpp:1171
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
ExprResult ActOnCXXTypeConstructExpr(ParsedType TypeRep, SourceLocation LParenOrBraceLoc, MultiExprArg Exprs, SourceLocation RParenOrBraceLoc, bool ListInitialization)
ActOnCXXTypeConstructExpr - Parse construction of a specified type.
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
FieldDecl * CheckFieldDecl(DeclarationName Name, QualType T, TypeSourceInfo *TInfo, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitfieldWidth, InClassInitStyle InitStyle, SourceLocation TSSL, AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D=nullptr)
Build a new FieldDecl and check its well-formedness.
ExpressionEvaluationContextRecord & currentEvaluationContext()
Definition Sema.h:6931
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:1816
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
static StringRef GetFormatStringTypeName(FormatStringType FST)
SemaMIPS & MIPS()
Definition Sema.h:1473
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
Definition Sema.cpp:139
void InstantiateVariableInitializer(VarDecl *Var, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the initializer of a variable.
void CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc, SourceLocation CallOperatorLoc, const AssociatedConstraint &TrailingRequiresClause, TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind, StorageClass SC, ArrayRef< ParmVarDecl * > Params, bool HasExplicitResultType)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
SemaRISCV & RISCV()
Definition Sema.h:1518
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:15662
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
Definition Sema.h:1805
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:5857
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:213
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:5231
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
Definition Sema.h:5234
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
Definition Sema.h:5238
MemberPointerConversionDirection
Definition Sema.h:10228
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:13990
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition Sema.h:6491
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
Definition SemaExpr.cpp:75
ConditionResult ActOnConditionVariable(Decl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS)
checkUnsafeAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained type.
void performFunctionEffectAnalysis(TranslationUnitDecl *TU)
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
EltwiseBuiltinArgTyRestriction
Definition Sema.h:2763
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:15058
SemaSwift & Swift()
Definition Sema.h:1533
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:2028
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:6596
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:6958
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
Definition Sema.h:13619
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition Sema.h:6528
StmtResult ActOnExprStmtError()
Definition SemaStmt.cpp:65
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2038
ExprResult BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc)
const VarDecl * getCopyElisionCandidate(NamedReturnInfo &Info, QualType ReturnType)
Updates given NamedReturnInfo's move-eligible and copy-elidable statuses, considering the function re...
CXXRecordDecl * getCurrentInstantiationOf(NestedNameSpecifier NNS)
If the given nested name specifier refers to the current instantiation, return the declaration that c...
void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD)
Mark the exception specifications of all virtual member functions in the given class as needed.
bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)
void completeExprArrayBound(Expr *E)
DeclContext * getCurLexicalContext() const
Definition Sema.h:1124
std::function< TypeResult(StringRef, StringRef, SourceLocation)> ParseTypeFromStringCallback
Callback to the parser to parse a type expressed as a string.
Definition Sema.h:1336
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:2085
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:1666
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:898
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:1278
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:11767
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
Definition Sema.h:13994
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:2132
ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
void ExitDeclaratorContext(Scope *S)
bool isQualifiedMemberAccess(Expr *E)
Determine whether the given expression is a qualified member access expression, of a form that could ...
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
void DiagnoseShadowingLambdaDecls(const sema::LambdaScopeInfo *LSI)
Diagnose shadowing for variables shadowed in the lambda record LambdaRD when these variables are capt...
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Definition Sema.cpp:849
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
RecordDecl * CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc, unsigned NumParams)
bool isLibstdcxxEagerExceptionSpecHack(const Declarator &D)
Determine if we're in a case where we need to (incorrectly) eagerly parse an exception specification ...
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a block pointer.
bool buildCoroutineParameterMoves(SourceLocation Loc)
void DefineImplicitDestructor(SourceLocation CurrentLocation, CXXDestructorDecl *Destructor)
DefineImplicitDestructor - Checks for feasibility of defining this destructor as the default destruct...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
Definition Sema.h:4752
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:10415
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition Sema.h:15052
ProcessingContextState ParsingClassState
Definition Sema.h:6546
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:1316
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:2477
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:2911
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:3825
std::pair< const IdentifierInfo *, uint64_t > TypeTagMagicValue
A pair of ArgumentKind identifier and magic value.
Definition Sema.h:2670
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:15395
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
bool CheckNontrivialField(FieldDecl *FD)
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType, Expr *SrcExpr)
DiagnoseAssignmentEnum - Warn if assignment to enum is a constant integer not in the range of enum va...
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
Definition Sema.h:6955
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
bool CheckExceptionSpecSubset(const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID, const FunctionProtoType *Superset, bool SkipSupersetFirstParameter, SourceLocation SuperLoc, const FunctionProtoType *Subset, bool SkipSubsetFirstParameter, SourceLocation SubLoc)
CheckExceptionSpecSubset - Check whether the second function type's exception specification is a subs...
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope)
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:2295
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:11762
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:13060
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:4837
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:5847
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:639
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:15480
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8182
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2081
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9854
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:2525
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:8049
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:2513
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:6970
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:6505
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:1416
auto getDefaultDiagFunc()
Definition Sema.h:2288
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount)
Checks that a call expression's argument count is at least the desired number.
bool FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope, QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP, MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew, FunctionDecl *&OperatorDelete, bool Diagnose=true)
Finds the overloads of operator new and delete that are appropriate for the allocation.
ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path)
Check a cast of an unknown-any type.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
ExprResult ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, SourceLocation LAngleBracketLoc, Declarator &D, SourceLocation RAngleBracketLoc, SourceLocation LParenLoc, Expr *E, SourceLocation RParenLoc)
ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const,addrspace}_cast's.
Definition SemaCast.cpp:314
DeclGroupPtrTy ActOnPrivateModuleFragmentDecl(SourceLocation ModuleLoc, SourceLocation PrivateLoc)
The parser has processed a private-module-fragment declaration that begins the definition of the priv...
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
SuppressedDiagnosticsMap SuppressedDiagnostics
Definition Sema.h:12522
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6524
SemaOpenCL & OpenCL()
Definition Sema.h:1498
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:14003
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:616
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
Definition Sema.h:2212
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the keyword associated.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression, SourceLocation EllipsisLoc, SourceLocation LSquareLoc, Expr *IndexExpr, SourceLocation RSquareLoc)
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation, StringLiteral *SegmentName)
Called on well-formed #pragma init_seg().
Definition SemaAttr.cpp:890
AccessResult CheckConstructorAccess(SourceLocation Loc, CXXConstructorDecl *D, DeclAccessPair FoundDecl, const InitializedEntity &Entity, bool IsCopyBindingRefToTemp=false)
Checks access to a constructor.
static SourceRange getPrintable(TypeLoc TL)
Definition Sema.h:15068
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:2600
@ FAPK_Elsewhere
Definition Sema.h:2604
@ FAPK_Fixed
Definition Sema.h:2601
@ FAPK_Variadic
Definition Sema.h:2602
@ FAPK_VAList
Definition Sema.h:2603
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:8174
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition Sema.h:13051
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1634
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:15493
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:14828
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:8370
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:3570
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition Sema.h:6757
bool MSStructPragmaOn
Definition Sema.h:1802
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:13603
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:13938
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition Sema.h:15468
SourceManager & getSourceManager() const
Definition Sema.h:924
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:8441
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:4815
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
ExprResult BuildAsTypeExpr(Expr *E, QualType DestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Create a new AsTypeExpr node (bitcast) from the arguments.
bool CheckVecStepExpr(Expr *E)
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
Definition Sema.cpp:630
bool isModuleVisible(const Module *M, bool ModulePrivate=false)
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_bits attribute.
Definition Sema.h:3523
bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str)
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
bool CheckRebuiltStmtAttributes(ArrayRef< const Attr * > Attrs)
void diagnoseExprIntendedAsTemplateName(Scope *S, ExprResult TemplateName, SourceLocation Less, SourceLocation Greater)
bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, Scope *S, bool MergeTypeWithOld)
Completes the merge of two function declarations that are known to be compatible.
bool hasVisibleMergedDefinition(const NamedDecl *Def)
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
Definition Sema.cpp:946
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
void DeclareImplicitDeductionGuides(TemplateDecl *Template, SourceLocation Loc)
Declare implicit deduction guides for a class template if we've not already done so.
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
void diagnoseFunctionEffectConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn when implicitly changing function effects.
Definition Sema.cpp:696
ClassTemplateDecl * lookupCoroutineTraits(SourceLocation KwLoc, SourceLocation FuncLoc)
Lookup 'coroutine_traits' in std namespace and std::experimental namespace.
bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
bool TemplateParameterListsAreEqual(TemplateParameterList *New, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Definition Sema.h:12241
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:2300
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:9314
ExprResult CheckLValueToRValueConversionOperand(Expr *E)
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
QualType CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc)
void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, SourceLocation IncludeLoc)
Definition SemaAttr.cpp:550
Decl * ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc, Expr *LangStr, SourceLocation LBraceLoc)
ActOnStartLinkageSpecification - Parsed the beginning of a C++ linkage specification,...
bool ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc, QualType Type)
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount, unsigned MaxArgCount)
Checks that a call expression's argument count is in the desired range.
void FilterUsingLookup(Scope *S, LookupResult &lookup)
Remove decls we can't actually see from a lookup being used to declare shadow using decls.
bool inConstraintSubstitution() const
Determine whether we are currently performing constraint substitution.
Definition Sema.h:13943
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:5967
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:1817
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:7468
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:4076
@ NTCUK_Destruct
Definition Sema.h:4078
@ NTCUK_Init
Definition Sema.h:4077
@ NTCUK_Copy
Definition Sema.h:4079
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:1353
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:8327
PragmaClangSection PragmaClangDataSection
Definition Sema.h:1814
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:9109
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:2343
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:2027
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:6755
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
ExternalSemaSource * getExternalSource() const
Definition Sema.h:929
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
void ActOnCXXEnterDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an initializer for the declaration ...
unsigned FunctionScopesStart
The index of the first FunctionScope that corresponds to the current context.
Definition Sema.h:1227
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2088
SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const
Returns the top most location responsible for the definition of N.
bool isSFINAEContext() const
Definition Sema.h:13671
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition Sema.h:8794
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, bool IsInstantiation=false)
ActOnLambdaError - If there is an error parsing a lambda, this callback is invoked to pop the informa...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:224
static SourceRange getPrintable(SourceRange R)
Definition Sema.h:15065
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:13627
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:14813
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:15435
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, const PartialDiagnostic &PD, const FunctionDecl *FD=nullptr)
Definition Sema.h:1130
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition Sema.cpp:2873
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void emitDeferredDiags()
Definition Sema.cpp:2014
void setFunctionHasMustTail()
Definition Sema.cpp:2508
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:8366
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:14819
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:2498
RedeclarationKind forRedeclarationInCurContext() const
bool hasReachableDefinition(NamedDecl *D)
Definition Sema.h:15524
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:2592
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition Sema.h:6516
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:627
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
QualType BuiltinAddPointer(QualType BaseType, SourceLocation Loc)
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
bool BuiltinElementwiseTernaryMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::FloatTy)
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
Definition Sema.cpp:1165
StmtResult BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End, Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc, BuildForRangeKind Kind, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
friend class Parser
Definition Sema.h:1557
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:11223
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:3544
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
Definition SemaDecl.cpp:274
ExprResult SubstConstraintExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition Sema.h:1554
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:1284
bool handlerCanCatch(QualType HandlerType, QualType ExceptionType)
RequiresExprBodyDecl * ActOnStartRequiresExpr(SourceLocation RequiresKWLoc, ArrayRef< ParmVarDecl * > LocalParameters, Scope *BodyScope)
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
ExprResult BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, bool IsAddressOfOperand)
void ActOnFinishCXXMemberDecls()
Perform any semantic analysis which needs to be delayed until all pending class member declarations h...
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
Definition Sema.h:4638
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
PragmaAlignPackDiagnoseKind
Definition Sema.h:2190
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:6962
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:123
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1321
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:1780
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:13986
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:9881
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
Definition Sema.h:9888
@ ImportFinished
after any non-import decl.
Definition Sema.h:9885
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
Definition Sema.h:9886
@ FirstDecl
Parsing the first decl in a TU.
Definition Sema.h:9882
@ GlobalFragment
after 'module;' but before 'module X;'
Definition Sema.h:9883
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
Definition Sema.h:9890
@ ImportAllowed
after 'module X;' but before any non-import decl.
Definition Sema.h:9884
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:15064
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
Definition Sema.cpp:109
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void incrementMSManglingNumber() const
Definition Sema.h:1248
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
bool CheckDistantExceptionSpec(QualType T)
CheckDistantExceptionSpec - Check if the given type is a pointer or pointer to member to a function w...
bool isAcceptableNestedNameSpecifier(const NamedDecl *SD, bool *CanCorrect=nullptr)
Determines whether the given declaration is an valid acceptable result for name lookup of a nested-na...
DeclResult ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc, unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS, TemplateTy Template, SourceLocation TemplateNameLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, const ParsedAttributesView &Attr)
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
void AddNonMemberOperatorCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
Add all of the non-member operator function declarations in the given function set to the overload ca...
QualType CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc)
Note that LHS is not null here, even if this is the gnu "x ?: y" extension.
void 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:6699
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
Definition Sema.h:6721
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
Definition Sema.h:6711
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6726
@ DiscardedStatement
The current expression occurs within a discarded statement.
Definition Sema.h:6716
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6736
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6705
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6731
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
Definition Sema.h:6746
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:13611
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:4800
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
Definition Sema.h:4806
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition Sema.h:4810
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition Sema.h:4803
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:967
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:13948
SemaPPC & PPC()
Definition Sema.h:1508
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:2356
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:4874
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls)
void actOnDelayedExceptionSpecification(Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr)
Add an exception-specification to the given member or friend function (or function template).
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
Definition Sema.h:1246
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
void ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context)
void DiagnoseUnterminatedPragmaAttribute()
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
bool SatisfactionStackContains(const NamedDecl *D, const llvm::FoldingSetNodeID &ID) const
Definition Sema.h:14821
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:1326
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:8377
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:3563
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:10036
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:8164
SemaSystemZ & SystemZ()
Definition Sema.h:1538
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition Sema.cpp:123
bool isRedefinitionAllowedFor(const NamedDecl *D, bool &Visible)
Definition Sema.h:15514
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:2895
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:8314
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:10220
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:9867
bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum, unsigned ArgBits)
BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of TheCall is a constant expression re...
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList, Stmt *SubStmt)
Definition SemaStmt.cpp:648
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
QualType BuiltinChangeCVRQualifiers(QualType BaseType, UTTKind UKind, SourceLocation Loc)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
Definition Sema.h:1286
DeclResult CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation TemplateNameLoc, const TemplateArgumentListInfo &TemplateArgs, bool SetWrittenArgs)
Get the specialization of the given variable template corresponding to the specified argument list,...
TemplateNameIsRequiredTag
Definition Sema.h:11390
@ TemplateNameIsRequired
Definition Sema.h:11390
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:783
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
bool hasReachableExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is an explicit specialization declaration for...
Decl * BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS, RecordDecl *Record)
BuildMicrosoftCAnonymousStruct - Handle the declaration of an Microsoft C anonymous structure.
bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, SourceLocation NameLoc, CXXScopeSpec &SS, ParsedTemplateTy *Template=nullptr)
Determine whether a particular identifier might be the name in a C++1z deduction-guide declaration.
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, StringRef SlotLabel, Expr *Alignment)
ActOnPragmaPack - Called on well formed #pragma pack(...).
Definition SemaAttr.cpp:438
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnStartDelayedCXXMethodDeclaration - We have completed parsing a top-level (non-nested) C++ class,...
LazyVector< CXXConstructorDecl *, ExternalSemaSource, &ExternalSemaSource::ReadDelegatingConstructors, 2, 2 > DelegatingCtorDeclsType
Definition Sema.h:6509
LabelDecl * GetOrCreateMSAsmLabel(StringRef ExternalLabelName, SourceLocation Location, bool AlwaysCreate)
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
Definition Sema.h:1285
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:589
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition Sema.h:7784
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:920
FPOptions CurFPFeatures
Definition Sema.h:1279
void ActOnStartSEHFinallyBlock()
TypeAwareAllocationMode ShouldUseTypeAwareOperatorNewOrDelete() const
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
static bool CanBeGetReturnObject(const FunctionDecl *FD)
NamespaceDecl * getStdNamespace() const
void SetLateTemplateParser(LateTemplateParserCB *LTP, void *P)
Definition Sema.h:1329
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition Sema.h:6500
ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, BinaryOperatorKind Operator)
void DeclareImplicitEqualityComparison(CXXRecordDecl *RD, FunctionDecl *Spaceship)
ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex, bool IsThrownVarInScope)
bool IsAtLeastAsConstrained(const NamedDecl *D1, MutableArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, MutableArrayRef< AssociatedConstraint > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an initializer for the declaratio...
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
QualType BuildArrayType(QualType T, ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity)
Build an array type.
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
Definition SemaExpr.cpp:515
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2037
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:2934
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:11573
@ TPC_TemplateTemplateParameterPack
Definition Sema.h:11583
@ TPC_FriendFunctionTemplate
Definition Sema.h:11581
@ TPC_ClassTemplateMember
Definition Sema.h:11579
@ TPC_FunctionTemplate
Definition Sema.h:11578
@ TPC_FriendClassTemplate
Definition Sema.h:11580
@ TPC_FriendFunctionTemplateDefinition
Definition Sema.h:11582
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:1428
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:1558
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:2116
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:7743
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:6532
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition Sema.h:13583
void PrintStats() const
Print out statistics about the semantic analysis.
Definition Sema.cpp:670
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
static unsigned getPrintable(unsigned I)
Definition Sema.h:15055
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:1800
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
QualType CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
llvm::BumpPtrAllocator BumpAlloc
Definition Sema.h:1232
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
QualType BuildWritePipeType(QualType T, SourceLocation Loc)
Build a Write-only Pipe type.
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
Definition Sema.cpp:88
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
BuildForRangeKind
Definition Sema.h:11046
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11054
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11048
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11051
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
SemaNVPTX & NVPTX()
Definition Sema.h:1483
void checkIncorrectVTablePointerAuthenticationAttribute(CXXRecordDecl &RD)
Check that VTable Pointer authentication is only being set on the first first instantiation of the vt...
StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl, Stmt *HandlerBlock)
ActOnCXXCatchBlock - Takes an exception declaration and a handler block and creates a proper catch ha...
void ActOnPragmaMSStrictGuardStackCheck(SourceLocation PragmaLocation, PragmaMsStackAction Action, bool Value)
ActOnPragmaMSStrictGuardStackCheck - Called on well formed #pragma strict_gs_check.
Definition SemaAttr.cpp:874
void ActOnUninitializedDecl(Decl *dcl)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
void ApplyAPINotesType(Decl *D, StringRef TypeString)
Apply the 'Type:' annotation to the specified declaration.
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation, FunctionDecl *Decl, ArrayRef< TemplateArgument > TemplateArgs, ConstraintSatisfaction &Satisfaction)
TypedefDecl * ParseTypedefDecl(Scope *S, Declarator &D, QualType T, TypeSourceInfo *TInfo)
Subroutines of ActOnDeclarator().
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:2057
@ PSK_ConstSeg
Definition Sema.h:2060
@ PSK_DataSeg
Definition Sema.h:2058
@ PSK_CodeSeg
Definition Sema.h:2061
@ PSK_BSSSeg
Definition Sema.h:2059
void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous, bool &AddToScope)
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
ExprResult BuildArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, TypeSourceInfo *TSInfo, Expr *DimExpr, SourceLocation RParen)
TypeResult ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword, SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, const IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false, bool IsClassName=false, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition Sema.cpp:625
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
Definition SemaCast.cpp:337
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation TriviallyRelocatable, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
Definition Sema.h:6276
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,...
bool SubstTemplateArgumentsInParameterMapping(ArrayRef< TemplateArgumentLoc > Args, SourceLocation BaseLoc, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Out, bool BuildPackExpansionTypes)
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:3538
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2104
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:1813
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:1340
QualType CheckMatrixLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel)
AbstractDiagSelID
Definition Sema.h:6222
@ AbstractSynthesizedIvarType
Definition Sema.h:6229
@ AbstractVariableType
Definition Sema.h:6226
@ AbstractReturnType
Definition Sema.h:6224
@ AbstractNone
Definition Sema.h:6223
@ AbstractFieldType
Definition Sema.h:6227
@ AbstractArrayType
Definition Sema.h:6230
@ AbstractParamType
Definition Sema.h:6225
@ AbstractIvarType
Definition Sema.h:6228
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:1523
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:8363
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:7972
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:9377
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition Sema.h:9381
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition Sema.h:9387
@ LOLR_Error
The lookup resulted in an error.
Definition Sema.h:9379
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition Sema.h:9384
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition Sema.h:9395
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition Sema.h:9391
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:2528
const ExpressionEvaluationContextRecord & parentEvaluationContext() const
Definition Sema.h:6943
SemaLoongArch & LoongArch()
Definition Sema.h:1463
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:6411
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6416
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6413
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:13982
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:2887
OpaquePtr< TemplateName > TemplateTy
Definition Sema.h:1275
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD)
Invoked when we enter a tag definition that we're skipping.
void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E)
Warn when implicitly casting 0 to nullptr.
Definition Sema.cpp:708
bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E)
CheckCXXThrowOperand - Validate the operand of a throw.
bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit, Expr *Init)
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
void ActOnPragmaDump(Scope *S, SourceLocation Loc, IdentifierInfo *II)
Called on pragma clang __debug dump II.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled)
ActOnPragmaFenvAccess - Called on well formed #pragma STDC FENV_ACCESS.
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
void checkEnumArithmeticConversions(Expr *LHS, Expr *RHS, SourceLocation Loc, ArithConvKind ACK)
Check that the usual arithmetic conversions can be performed on this pair of expressions that might b...
bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Perform substitution on the base class specifiers of the given class template specialization.
void LoadExternalVTableUses()
Load any externally-stored vtable uses.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
llvm::SmallPtrSet< const NamedDecl *, 4 > TypoCorrectedFunctionDefinitions
The function definitions which were renamed as part of typo-correction to match their respective decl...
Definition Sema.h:3519
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:1679
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:15360
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:7821
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:1543
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:3465
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:13579
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:1513
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:2489
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition SemaStmt.cpp:588
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
Definition Sema.h:11355
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:7777
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:718
void DiagnoseSizeOfParametersAndReturnValue(ArrayRef< ParmVarDecl * > Parameters, QualType ReturnTy, NamedDecl *D)
Diagnose whether the size of parameters or return value of a function or obj-c method definition is p...
void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD, SourceLocation NameLoc)
Returns the TypeDeclType for the given type declaration, as ASTContext::getTypeDeclType would,...
Definition SemaDecl.cpp:147
void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
Definition Sema.h:8322
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition Sema.h:1274
static int getPrintable(int I)
Definition Sema.h:15054
TypeResult ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc)
Parsed an elaborated-type-specifier that refers to a template-id, such as class T::template apply.
void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags, StringLiteral *SegmentName)
Called on well formed #pragma section().
Definition SemaAttr.cpp:885
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
Definition Sema.h:9647
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:12891
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:3811
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:15059
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:8190
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:13594
SemaARM & ARM()
Definition Sema.h:1423
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:13575
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
Definition SemaAttr.cpp:322
bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, const LookupResult &R)
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
static const char * getPrintable(const char *S)
Definition Sema.h:15057
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment)
ExprResult ActOnDecltypeExpression(Expr *E)
Process the expression contained within a decltype.
SmallVector< std::pair< Scope *, SourceLocation >, 2 > CurrentDefer
Stack of '_Defer' statements that are currently being parsed, as well as the locations of their '_Def...
Definition Sema.h:10956
bool isAbstractType(SourceLocation Loc, QualType T)
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
Definition Sema.cpp:651
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
PragmaMsStackAction
Definition Sema.h:1819
@ PSK_Push_Set
Definition Sema.h:1825
@ PSK_Reset
Definition Sema.h:1820
@ PSK_Pop_Set
Definition Sema.h:1826
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:8656
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:13668
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:85
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:338
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1799
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
Exposes information about the current target.
Definition TargetInfo.h:226
A convenient class for passing around template argument information.
A template argument list.
Location wrapper for a TemplateArgument.
Represents a template argument.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
The base class of all kinds of template declarations (e.g., class, function, etc.).
This is a base class for callbacks that will be notified at every template instantiation.
Represents a C++ template name within the type system.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
Token - This structure provides full information about a lexed token.
Definition Token.h:36
A declaration that models statements at global scope.
Definition Decl.h:4634
The top declaration context.
Definition Decl.h:105
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition ASTConcept.h:227
Represents a declaration of a type.
Definition Decl.h:3513
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
A container of type source information.
Definition TypeBase.h:8263
The base class of the type hierarchy.
Definition TypeBase.h:1833
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3667
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
Simple class containing the result of Sema::CorrectTypo.
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:998
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h: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:3587
Represents C++ using-directive.
Definition DeclCXX.h:3092
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3395
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:4176
Represents a C++11 virt-specifier-seq.
Definition DeclSpec.h:2754
Consumes visible declarations found when searching for all visible names within a given scope or cont...
Definition Lookup.h:838
Captures information about a #pragma weak directive.
Definition Weak.h:25
The API notes manager helps find API notes associated with declarations.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
A static requirement that can be used in a requires-expression to check properties of types and expre...
A requires-expression requirement which queries the existence of a type name or type template special...
Retains information about a block that is currently being parsed.
Definition ScopeInfo.h:790
Retains information about a captured region.
Definition ScopeInfo.h:816
Contains information about the compound statement currently being parsed.
Definition ScopeInfo.h:67
A collection of diagnostics which were delayed.
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
Retains information about a function, method, or block that is currently being parsed.
Definition ScopeInfo.h:104
Provides information about an attempted template argument deduction, whose success or failure was des...
#define bool
Definition gpuintrin.h:32
#define UINT_MAX
Definition limits.h:64
Definition SPIR.cpp:47
Enums for the diagnostics of target, target_version and target_clones.
Definition Sema.h:841
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
llvm::DenseMap< int, SourceRange > ParsedSubjectMatchRuleSet
void threadSafetyCleanup(BeforeSet *Cache)
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:25
The JSON file list parser is used to communicate input to InstallAPI.
PragmaClangSectionAction
Definition Sema.h:475
TypeSpecifierType
Specifies the kind of type.
Definition Specifiers.h:55
ImplicitTypenameContext
Definition DeclSpec.h:1857
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
OverloadKind
Definition Sema.h:810
@ NonFunction
This is not an overload because the lookup results contain a non-function.
Definition Sema.h:821
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:817
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
Definition Sema.h:813
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:512
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
Definition Sema.h:458
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:778
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
Definition Sema.h:786
PragmaMSCommentKind
Definition PragmaKinds.h:14
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition Specifiers.h:35
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
TryCaptureKind
Definition Sema.h:652
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
Definition Specifiers.h:39
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
Definition Sema.h:660
@ BitwiseOp
A bitwise operation.
Definition Sema.h:664
@ Arithmetic
An arithmetic operation.
Definition Sema.h:662
@ Conditional
A conditional (?:) operator.
Definition Sema.h:668
@ CompAssign
A compound assignment expression.
Definition Sema.h:670
@ Comparison
A comparison.
Definition Sema.h:666
NullabilityKind
Describes the nullability of a particular type.
Definition Specifiers.h:348
InClassInitStyle
In-class initialization styles for non-static data members.
Definition Specifiers.h:271
@ Success
Annotation was successful.
Definition Parser.h:65
CXXConstructionKind
Definition ExprCXX.h:1540
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition Specifiers.h:149
PointerAuthDiscArgKind
Definition Sema.h:593
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
Definition Sema.h:603
@ TemplateTemplateArgument
Definition Sema.h:612
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
Definition Overload.h:84
NonTrivialCUnionContext
Definition Sema.h:531
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
Definition Sema.h:627
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:635
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
Definition Sema.h:641
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
Definition Sema.h:632
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
Definition Sema.h:638
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
Definition Sema.h:237
@ 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
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
Definition CallGraph.h:204
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:123
@ AS_none
Definition Specifiers.h:127
LazyOffsetPtr< Decl, GlobalDeclID, &ExternalASTSource::GetExternalDecl > LazyDeclPtr
A lazy pointer to a declaration.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
ActionResult< Decl * > DeclResult
Definition Ownership.h:255
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
StorageClass
Storage classes.
Definition Specifiers.h:248
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:928
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
Definition Parser.h:142
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
Definition TypeTraits.h:51
bool isFunctionOrMethodOrBlockForAttrSubject(const Decl *D)
Return true if the given decl has function type (function or function-typed variable) or an Objective...
Definition Attr.h:40
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
Definition Overload.h:89
MutableArrayRef< Expr * > MultiExprArg
Definition Ownership.h:259
LambdaCaptureInitKind
Definition DeclSpec.h:2798
@ CopyInit
[a = b], [a = {b}]
Definition DeclSpec.h:2800
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
@ AANT_ArgumentIntegerConstant
PragmaOptionsAlignKind
Definition Sema.h:477
@ Result
The result type of a method or function.
Definition TypeBase.h:905
ActionResult< ParsedType > TypeResult
Definition Ownership.h:251
OffsetOfKind
Definition Sema.h:615
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition TypeBase.h:3720
CorrectTypoKind
Definition Sema.h:805
ActionResult< CXXCtorInitializer * > MemInitResult
Definition Ownership.h:253
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
bool isFunctionOrMethodVariadic(const Decl *D)
Definition Attr.h:112
@ Template
We are parsing a template declaration.
Definition Parser.h:81
ActionResult< CXXBaseSpecifier * > BaseResult
Definition Ownership.h:252
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
Definition Sema.h:688
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
Definition Sema.h:711
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
Definition Sema.h:774
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
Definition Sema.h:703
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
Definition Sema.h:753
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
Definition Sema.h:743
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
Definition Sema.h:770
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
Definition Sema.h:757
@ CompatibleVoidPtrToNonVoidPtr
CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because a void * can implicitly convert...
Definition Sema.h:695
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
Definition Sema.h:737
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
Definition Sema.h:732
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
Definition Sema.h:766
@ Compatible
Compatible - the types are compatible according to the standard.
Definition Sema.h:690
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
Definition Sema.h:722
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
Definition Sema.h:699
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
Definition Sema.h:707
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
Definition Sema.h:749
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
Definition Sema.h:716
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
Definition Sema.h:728
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
Definition Sema.h:761
TagUseKind
Definition Sema.h:450
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:466
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:5893
TUFragmentKind
Definition Sema.h:486
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:554
@ FunctionTemplate
The name was classified as a function template name.
Definition Sema.h:586
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:561
@ DependentNonType
The name denotes a member of a dependent type that could not be resolved.
Definition Sema.h:575
@ UndeclaredTemplate
The name was classified as an ADL-only function template name.
Definition Sema.h:588
@ NonType
The name was classified as a specific non-type, non-template declaration.
Definition Sema.h:567
@ Unknown
This name is not a type or template in this context, but might be something else.
Definition Sema.h:557
@ Error
Classification failed; an error has been produced.
Definition Sema.h:559
@ Type
The name was classified as a type.
Definition Sema.h:563
@ TypeTemplate
The name was classified as a template whose specializations are types.
Definition Sema.h:582
@ Concept
The name was classified as a concept name.
Definition Sema.h:590
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition Sema.h:580
@ UndeclaredNonType
The name was classified as an ADL-only function name.
Definition Sema.h:571
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:584
LangAS
Defines the address space values used by the address space qualifier of QualType.
FormatStringType
Definition Sema.h:498
CastKind
CastKind - The kind of operation required for a conversion.
AllowFoldKind
Definition Sema.h:654
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:675
PragmaMSStructKind
Definition PragmaKinds.h:23
AssignmentAction
Definition Sema.h:215
CXXSpecialMemberKind
Kinds of C++ special members.
Definition Sema.h:426
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:520
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool hasImplicitObjectParameter(const Decl *D)
Definition Attr.h:126
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
Definition Lambda.h:22
PragmaFloatControlKind
Definition PragmaKinds.h:28
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:149
TypeAwareAllocationMode
Definition ExprCXX.h:2251
IfExistsResult
Describes the result of an "if-exists" condition check.
Definition Sema.h:790
@ Exists
The symbol exists.
Definition Sema.h:792
@ DoesNotExist
The symbol does not exist.
Definition Sema.h:795
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
Definition Specifiers.h:410
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
Definition Attr.h:55
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
Definition Attr.h:64
TPOC
The context in which partial ordering of function templates occurs.
Definition Template.h:302
TrivialABIHandling
Definition Sema.h:644
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
Definition Sema.h:649
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
Definition Sema.h:646
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:368
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
Definition Sema.h:418
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
Definition Sema.h:413
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
Definition Sema.h:416
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
Definition Sema.h:389
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
Definition Sema.h:375
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
Definition Sema.h:411
@ CUDATargetMismatch
CUDA Target attributes do not match.
Definition Sema.h:420
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
Definition Sema.h:408
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
Definition Sema.h:378
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
Definition Sema.h:392
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
Definition Sema.h:381
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
Definition Sema.h:395
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:384
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
Definition Sema.h:405
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:422
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
Definition Sema.h:399
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
Definition Sema.h:402
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:188
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:278
U cast(CodeGen::Address addr)
Definition Address.h:327
SmallVector< Token, 4 > CachedTokens
A set of tokens that has been cached for later parsing.
Definition DeclSpec.h:1215
@ None
The alignment was not explicit in code.
Definition ASTContext.h:178
CCEKind
Contexts in which a converted constant expression is required.
Definition Sema.h:825
@ CaseValue
Expression in a case label.
Definition Sema.h:826
@ StaticAssertMessageData
Call to data() in a static assert message.
Definition Sema.h:836
@ Enumerator
Enumerator value with fixed underlying type.
Definition Sema.h:827
@ StaticAssertMessageSize
Call to size() in a static assert message.
Definition Sema.h:834
@ Noexcept
Condition in a noexcept(bool) specifier.
Definition Sema.h:833
@ ArrayBound
Array bound in array declarator or new-expression.
Definition Sema.h:831
@ TempArgStrict
As above, but applies strict template checking rules.
Definition Sema.h:829
@ ExplicitBool
Condition in an explicit(bool) specifier.
Definition Sema.h:832
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
SourceLocIdentKind
Definition Expr.h:5004
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5868
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5879
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5882
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Definition TypeBase.h:5886
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:2245
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Dynamic
throw(T1, T2)
PredefinedIdentKind
Definition Expr.h:1989
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:437
@ Implicit
An implicit conversion.
Definition Sema.h:439
@ CStyleCast
A C-style cast.
Definition Sema.h:441
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
Definition Sema.h:447
@ OtherCast
A cast other than a C-style cast.
Definition Sema.h:445
@ FunctionalCast
A functional-style cast.
Definition Sema.h:443
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
Definition Specifiers.h:173
unsigned int uint32_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
int const char * function
Definition c++config.h:31
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:91
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
A structure used to record information about a failed template argument deduction,...
Describes whether we've seen any nullability information for the given file.
Definition Sema.h:241
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
Definition Sema.h:248
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
Definition Sema.h:244
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
Definition Sema.h:254
uint8_t PointerKind
Which kind of pointer declarator we saw.
Definition Sema.h:251
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Definition TypeBase.h:5006
Holds information about the various types of exception specification.
Definition TypeBase.h:5326
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5328
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5331
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition TypeBase.h:5334
Extra information about a function prototype.
Definition TypeBase.h:5354
Represents a complete lambda introducer.
Definition DeclSpec.h:2806
Contains a late templated function.
Definition Sema.h:15685
FPOptions FPO
Floating-point options in the point of definition.
Definition Sema.h:15690
Decl * D
The template function declaration to be late parsed.
Definition Sema.h:15688
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:932
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Definition Sema.h:2032
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
Definition Sema.h:10507
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
Definition Sema.h:10514
CheckNonDependentConversionsFlag(bool SuppressUserConversions, bool OnlyInitializeNonUserDefinedConversions)
Definition Sema.h:10516
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
Definition Sema.h:11999
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition Sema.h:11995
CheckTemplateArgumentInfo(const CheckTemplateArgumentInfo &)=delete
CheckTemplateArgumentInfo(bool PartialOrdering=false, bool MatchingTTP=false)
Definition Sema.h:11976
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition Sema.h:11988
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
Definition Sema.h:11985
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition Sema.h:11985
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:13099
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition Sema.h:13262
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
bool InParameterMappingSubstitution
Whether we're substituting into the parameter mapping of a constraint.
Definition Sema.h:13219
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition Sema.h:13235
ArrayRef< TemplateArgument > template_arguments() const
Definition Sema.h:13254
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition Sema.h:13230
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13222
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition Sema.h:13248
bool InConstraintSubstitution
Whether we're substituting into constraints.
Definition Sema.h:13216
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition Sema.h:13238
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition Sema.h:13245
SynthesisKind
The kind of template instantiation we are performing.
Definition Sema.h:13101
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13193
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition Sema.h:13111
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:13120
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition Sema.h:13139
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13190
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition Sema.h:13147
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition Sema.h:13154
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition Sema.h:13197
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition Sema.h:13165
@ Memoization
Added for Template instantiation observation.
Definition Sema.h:13203
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition Sema.h:13130
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition Sema.h:13209
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition Sema.h:13206
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition Sema.h:13212
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:13127
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition Sema.h:13135
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13143
@ TemplateInstantiation
We are instantiating a template declaration.
Definition Sema.h:13104
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition Sema.h:13157
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13161
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition Sema.h:13116
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13187
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition Sema.h:13150
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13225
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition Sema.h:13251
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:6860
Data structure used to record current or nested expression evaluation contexts.
Definition Sema.h:6761
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:6794
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition Sema.h:6796
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition Sema.h:6847
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition Sema.h:6781
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:6790
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition Sema.h:6801
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:6809
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition Sema.h:6805
bool IsCaseExpr
Whether evaluating an expression for a switch case label.
Definition Sema.h:6850
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6815
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:6776
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition Sema.h:6823
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6853
SmallVector< MisalignedMember, 4 > MisalignedMembers
Small set of gathered accesses to potentially misaligned members due to the packed attribute.
Definition Sema.h:6819
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition Sema.h:6766
VarDecl * DeclForInitializer
Declaration for initializer if one is currently being parsed.
Definition Sema.h:6786
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6870
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition Sema.h:6872
ExpressionEvaluationContext Context
The expression evaluation context.
Definition Sema.h:6763
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition Sema.h:6770
FormatArgumentPassingKind ArgPassingKind
Definition Sema.h:2612
FunctionEffectDiffVector(const FunctionEffectsRef &Old, const FunctionEffectsRef &New)
Caller should short-circuit by checking for equality first.
std::optional< FunctionEffectWithCondition > Old
Definition Sema.h:15592
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:15596
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:15604
std::optional< FunctionEffectWithCondition > New
Definition Sema.h:15594
FunctionEffect::Kind EffectKind
Definition Sema.h:15589
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13438
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:14118
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition Sema.h:14121
bool isMoveEligible() const
Definition Sema.h:11114
bool isCopyElidable() const
Definition Sema.h:11115
const VarDecl * Candidate
Definition Sema.h:11109
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition Sema.h:3278
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition Sema.h:3287
SourceLocation IdentifierLoc
The location of the identifier.
Definition Sema.h:3281
SourceLocation CCLoc
The location of the '::'.
Definition Sema.h:3284
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition Sema.h:3275
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition Sema.h:3293
SourceLocation LocStart
Definition Sema.h:7555
IdentifierInfo * IdentInfo
Definition Sema.h:7558
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition Sema.h:12623
This an attribute introduced by #pragma clang attribute.
Definition Sema.h:2091
SmallVector< attr::SubjectMatchRule, 4 > MatchRules
Definition Sema.h:2094
A push'd group of PragmaAttributeEntries.
Definition Sema.h:2099
SourceLocation Loc
The location of the push attribute.
Definition Sema.h:2101
SmallVector< PragmaAttributeEntry, 2 > Entries
Definition Sema.h:2104
const IdentifierInfo * Namespace
The namespace of this push group.
Definition Sema.h:2103
SourceLocation PragmaLocation
Definition Sema.h:1810
PragmaMsStackAction Action
Definition Sema.h:1830
Slot(llvm::StringRef StackSlotLabel, ValueType Value, SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
Definition Sema.h:1943
llvm::StringRef StackSlotLabel
Definition Sema.h:1939
SourceLocation PragmaLocation
Definition Sema.h:1941
SourceLocation PragmaPushLocation
Definition Sema.h:1942
ValueType CurrentValue
Definition Sema.h:2013
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
Definition Sema.h:1999
bool hasValue() const
Definition Sema.h:2009
SmallVector< Slot, 2 > Stack
Definition Sema.h:2011
ValueType DefaultValue
Definition Sema.h:2012
SourceLocation CurrentPragmaLocation
Definition Sema.h:2014
PragmaStack(const ValueType &Default)
Definition Sema.h:2006
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)
Definition Sema.h:1950
ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val)
Definition Sema.h:5072
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition Sema.h:5066
RecursiveInstGuard(Sema &S, Decl *D, Kind Kind)
Definition Sema.h:13071
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:10404
SFINAEContextBase & operator=(const SFINAEContextBase &)=delete
SFINAEContextBase(Sema &S, SFINAETrap *Cur)
Definition Sema.h:12431
SFINAEContextBase(const SFINAEContextBase &)=delete
Abstract class used to diagnose incomplete types.
Definition Sema.h:8255
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull)
Definition Sema.h:2654
unsigned LayoutCompatible
If true, Type should be compared with other expression's types for layout-compatibility.
Definition Sema.h:2663
bool CheckSameAsPrevious
Definition Sema.h:354
NamedDecl * Previous
Definition Sema.h:355
SkipBodyInfo()=default
NamedDecl * New
Definition Sema.h:356
Information about a template-id annotation token.