clang 24.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"
41#include "clang/Basic/Cuda.h"
44#include "clang/Basic/LLVM.h"
45#include "clang/Basic/Lambda.h"
47#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"
70#include "clang/Sema/Weak.h"
71#include "llvm/ADT/APInt.h"
72#include "llvm/ADT/ArrayRef.h"
73#include "llvm/ADT/BitmaskEnum.h"
74#include "llvm/ADT/DenseMap.h"
75#include "llvm/ADT/DenseSet.h"
76#include "llvm/ADT/FloatingPointMode.h"
77#include "llvm/ADT/FoldingSet.h"
78#include "llvm/ADT/MapVector.h"
79#include "llvm/ADT/PointerIntPair.h"
80#include "llvm/ADT/PointerUnion.h"
81#include "llvm/ADT/STLExtras.h"
82#include "llvm/ADT/STLForwardCompat.h"
83#include "llvm/ADT/STLFunctionalExtras.h"
84#include "llvm/ADT/SetVector.h"
85#include "llvm/ADT/SmallBitVector.h"
86#include "llvm/ADT/SmallPtrSet.h"
87#include "llvm/ADT/SmallSet.h"
88#include "llvm/ADT/SmallVector.h"
89#include "llvm/ADT/StringExtras.h"
90#include "llvm/ADT/StringMap.h"
91#include "llvm/ADT/TinyPtrVector.h"
92#include "llvm/Support/Allocator.h"
93#include "llvm/Support/Compiler.h"
94#include "llvm/Support/Error.h"
95#include "llvm/Support/ErrorHandling.h"
96#include <cassert>
97#include <climits>
98#include <cstddef>
99#include <cstdint>
100#include <deque>
101#include <functional>
102#include <iterator>
103#include <memory>
104#include <optional>
105#include <string>
106#include <tuple>
107#include <type_traits>
108#include <utility>
109#include <vector>
110
111namespace llvm {
112struct InlineAsmIdentifierInfo;
113} // namespace llvm
114
115namespace clang {
116class ADLResult;
117class APValue;
119class ASTConsumer;
120class ASTContext;
121class ASTDeclReader;
123class ASTReader;
124class ASTWriter;
125class CXXBasePath;
126class CXXBasePaths;
129enum class ComparisonCategoryType : unsigned char;
131class DarwinSDKInfo;
132class DeclGroupRef;
136class Designation;
137class IdentifierInfo;
144enum class LangAS : unsigned int;
146class LookupResult;
149class ModuleLoader;
153class ObjCMethodDecl;
154struct OverloadCandidate;
155enum class OverloadCandidateParamOrder : char;
156enum OverloadCandidateRewriteKind : unsigned;
158class Preprocessor;
160struct ResolvedAllocation;
161class SemaAMDGPU;
162class SemaARM;
163class SemaAVR;
164class SemaBPF;
166class SemaCUDA;
167class SemaDirectX;
168class SemaHLSL;
169class SemaHexagon;
170class SemaLoongArch;
171class SemaM68k;
172class SemaMIPS;
173class SemaMSP430;
174class SemaNVPTX;
175class SemaObjC;
176class SemaOpenACC;
177class SemaOpenCL;
178class SemaOpenMP;
179class SemaPPC;
180class SemaPseudoObject;
181class SemaRISCV;
182class SemaSPIRV;
183class SemaSYCL;
184class SemaSwift;
185class SemaSystemZ;
186class SemaWasm;
187class SemaX86;
189class TemplateArgument;
191class TemplateInstantiationCallback;
194class Token;
195class TypeConstraint;
200
201namespace sema {
202class BlockScopeInfo;
203class Capture;
210class LambdaScopeInfo;
211class SemaPPCallbacks;
213} // namespace sema
214
215// AssignmentAction - This is used by all the assignment diagnostic functions
216// to represent what is actually causing the operation
227
228// Inline capacity for type-aware, aligned, and unaligned allocation argument
229// list candidates.
231
232namespace threadSafety {
233class BeforeSet;
234void threadSafetyCleanup(BeforeSet *Cache);
235} // namespace threadSafety
236
237// FIXME: No way to easily map from TemplateTypeParmTypes to
238// TemplateTypeParmDecls, so we have this horrible PointerUnion.
239typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *,
240 const TemplateSpecializationType *,
241 const SubstBuiltinTemplatePackType *>,
242 SourceLocation>
244
245/// Describes whether we've seen any nullability information for the given
246/// file.
248 /// The first pointer declarator (of any pointer kind) in the file that does
249 /// not have a corresponding nullability annotation.
251
252 /// The end location for the first pointer declarator in the file. Used for
253 /// placing fix-its.
255
256 /// Which kind of pointer declarator we saw.
258
259 /// Whether we saw any type nullability annotations in the given file.
260 bool SawTypeNullability = false;
261};
262
263/// A mapping from file IDs to a record of whether we've seen nullability
264/// information in that file.
266 /// A mapping from file IDs to the nullability information for each file ID.
267 llvm::DenseMap<FileID, FileNullability> Map;
268
269 /// A single-element cache based on the file ID.
270 struct {
273 } Cache;
274
275public:
277 // Check the single-element cache.
278 if (file == Cache.File)
279 return Cache.Nullability;
280
281 // It's not in the single-element cache; flush the cache if we have one.
282 if (!Cache.File.isInvalid()) {
283 Map[Cache.File] = Cache.Nullability;
284 }
285
286 // Pull this entry into the cache.
287 Cache.File = file;
288 Cache.Nullability = Map[file];
289 return Cache.Nullability;
290 }
291};
292
293/// Tracks expected type during expression parsing, for use in code completion.
294/// The type is tied to a particular token, all functions that update or consume
295/// the type take a start location of the token they are looking at as a
296/// parameter. This avoids updating the type on hot paths in the parser.
298public:
300 : Ctx(Ctx), Enabled(Enabled) {}
301
305 /// Handles e.g. BaseType{ .D = Tok...
307 const Designation &D);
308 /// Computing a type for the function argument may require running
309 /// overloading, so we postpone its computation until it is actually needed.
310 ///
311 /// Clients should be very careful when using this function, as it stores a
312 /// function_ref, clients should make sure all calls to get() with the same
313 /// location happen while function_ref is alive.
314 ///
315 /// The callback should also emit signature help as a side-effect, but only
316 /// if the completion point has been reached.
318 llvm::function_ref<QualType()> ComputeType);
319
322 SourceLocation OpLoc);
325 void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS);
326 /// Handles all type casts, including C-style cast, C++ casts, etc.
328
329 /// Get the expected type associated with this location, if any.
330 ///
331 /// If the location is a function argument, determining the expected type
332 /// involves considering all function overloads and the arguments so far.
333 /// In this case, signature help for these function overloads will be reported
334 /// as a side-effect (only if the completion point has been reached).
336 if (!Enabled || Tok != ExpectedLoc)
337 return QualType();
338 if (!Type.isNull())
339 return Type;
340 if (ComputeType)
341 return ComputeType();
342 return QualType();
343 }
344
345private:
346 ASTContext *Ctx;
347 bool Enabled;
348 /// Start position of a token for which we store expected type.
349 SourceLocation ExpectedLoc;
350 /// Expected type for a token starting at ExpectedLoc.
352 /// A function to compute expected type at ExpectedLoc. It is only considered
353 /// if Type is null.
354 llvm::function_ref<QualType()> ComputeType;
355};
356
358 SkipBodyInfo() = default;
359 bool ShouldSkip = false;
361 NamedDecl *Previous = nullptr;
362 NamedDecl *New = nullptr;
363};
364
365/// Describes the result of template argument deduction.
366///
367/// The TemplateDeductionResult enumeration describes the result of
368/// template argument deduction, as returned from
369/// DeduceTemplateArguments(). The separate TemplateDeductionInfo
370/// structure provides additional information about the results of
371/// template argument deduction, e.g., the deduced template argument
372/// list (if successful) or the specific template parameters or
373/// deduced arguments that were involved in the failure.
375 /// Template argument deduction was successful.
377 /// The declaration was invalid; do nothing.
379 /// Template argument deduction exceeded the maximum template
380 /// instantiation depth (which has already been diagnosed).
382 /// Template argument deduction did not deduce a value
383 /// for every template parameter.
385 /// Template argument deduction did not deduce a value for every
386 /// expansion of an expanded template parameter pack.
388 /// Template argument deduction produced inconsistent
389 /// deduced values for the given template parameter.
391 /// Template argument deduction failed due to inconsistent
392 /// cv-qualifiers on a template parameter type that would
393 /// otherwise be deduced, e.g., we tried to deduce T in "const T"
394 /// but were given a non-const "X".
396 /// Substitution of the deduced template argument values
397 /// resulted in an error.
399 /// After substituting deduced template arguments, a dependent
400 /// parameter type did not match the corresponding argument.
402 /// After substituting deduced template arguments, an element of
403 /// a dependent parameter type did not match the corresponding element
404 /// of the corresponding argument (when deducing from an initializer list).
406 /// A non-depnedent component of the parameter did not match the
407 /// corresponding component of the argument.
409 /// When performing template argument deduction for a function
410 /// template, there were too many call arguments.
412 /// When performing template argument deduction for a function
413 /// template, there were too few call arguments.
415 /// The explicitly-specified template arguments were not valid
416 /// template arguments for the given template.
418 /// Checking non-dependent argument conversions failed.
420 /// The deduced arguments did not satisfy the constraints associated
421 /// with the template.
423 /// Deduction failed; that's all we know.
425 /// CUDA Target attributes do not match.
427 /// Some error which was already diagnosed.
429};
430
431/// The kind of conversion being performed.
433 /// An implicit conversion.
435 /// A C-style cast.
437 /// A functional-style cast.
439 /// A cast other than a C-style cast.
441 /// A conversion for an operand of a builtin overloaded operator.
443};
444
445enum class TagUseKind {
446 Reference, // Reference to a tag: 'struct foo *X;'
447 Declaration, // Fwd decl of a tag: 'struct foo;'
448 Definition, // Definition of a tag: 'struct foo { int X; } Y;'
449 Friend // Friend declaration: 'friend struct foo;'
450};
451
452/// Used with attributes/effects with a boolean condition, e.g. `nonblocking`.
454 None, // effect is not present.
455 False, // effect(false).
456 True, // effect(true).
457 Dependent // effect(expr) where expr is dependent.
458};
459
460/// pragma clang section kind
463 BSS = 1,
464 Data = 2,
466 Text = 4,
468};
469
470enum class PragmaClangSectionAction { Set = 0, Clear = 1 };
471
473 Native, // #pragma options align=native
474 Natural, // #pragma options align=natural
475 Packed, // #pragma options align=packed
476 Power, // #pragma options align=power
477 Mac68k, // #pragma options align=mac68k
478 Reset // #pragma options align=reset
479};
480
481enum class TUFragmentKind {
482 /// The global module fragment, between 'module;' and a module-declaration.
484 /// A normal translation unit fragment. For a non-module unit, this is the
485 /// entire translation unit. Otherwise, it runs from the module-declaration
486 /// to the private-module-fragment (if any) or the end of the TU (if not).
488 /// The private module fragment, between 'module :private;' and the end of
489 /// the translation unit.
491};
492
505
506// Used for emitting the right warning by DefaultVariadicArgumentPromotion
514
523
524// Contexts where using non-trivial C union types can be disallowed. This is
525// passed to err_non_trivial_c_union_in_invalid_context.
527 // Function parameter.
529 // Function return.
531 // Default-initialized object.
533 // Variable with automatic storage duration.
535 // Initializer expression that might copy from another object.
537 // Assignment.
539 // Compound literal.
541 // Block capture.
543 // lvalue-to-rvalue conversion of volatile type.
545};
546
547/// Describes the result of the name lookup and resolution performed
548/// by \c Sema::ClassifyName().
550 /// This name is not a type or template in this context, but might be
551 /// something else.
553 /// Classification failed; an error has been produced.
555 /// The name has been typo-corrected to a keyword.
557 /// The name was classified as a type.
559 /// The name was classified as a specific non-type, non-template
560 /// declaration. ActOnNameClassifiedAsNonType should be called to
561 /// convert the declaration to an expression.
563 /// The name was classified as an ADL-only function name.
564 /// ActOnNameClassifiedAsUndeclaredNonType should be called to convert the
565 /// result to an expression.
567 /// The name denotes a member of a dependent type that could not be
568 /// resolved. ActOnNameClassifiedAsDependentNonType should be called to
569 /// convert the result to an expression.
571 /// The name was classified as an overload set, and an expression
572 /// representing that overload set has been formed.
573 /// ActOnNameClassifiedAsOverloadSet should be called to form a suitable
574 /// expression referencing the overload set.
576 /// The name was classified as a template whose specializations are types.
578 /// The name was classified as a variable template name.
580 /// The name was classified as a function template name.
582 /// The name was classified as an ADL-only function template name.
584 /// The name was classified as a concept name.
586};
587
589 // Address discrimination argument of __ptrauth.
591
592 // Extra discriminator argument of __ptrauth.
594};
595
596/// Common ways to introduce type names without a tag for use in diagnostics.
597/// Keep in sync with err_tag_reference_non_tag.
609
610enum class OffsetOfKind {
611 // Not parsing a type within __builtin_offsetof.
613 // Parsing a type within __builtin_offsetof.
615 // Parsing a type within macro "offsetof", defined in __buitin_offsetof
616 // To improve our diagnostic message.
618};
619
620/// Describes the kind of merge to perform for availability
621/// attributes (including "deprecated", "unavailable", and "availability").
623 /// Don't merge availability attributes at all.
625 /// Merge availability attributes for a redeclaration, which requires
626 /// an exact match.
628 /// Merge availability attributes for an override, which requires
629 /// an exact match or a weakening of constraints.
631 /// Merge availability attributes for an implementation of
632 /// a protocol requirement.
634 /// Merge availability attributes for an implementation of
635 /// an optional protocol requirement.
637};
638
640 /// The triviality of a method unaffected by "trivial_abi".
642
643 /// The triviality of a method affected by "trivial_abi".
645};
646
648
649enum class AllowFoldKind {
652};
653
654/// Context in which we're performing a usual arithmetic conversion.
655enum class ArithConvKind {
656 /// An arithmetic operation.
658 /// A bitwise operation.
660 /// A comparison.
662 /// A conditional (?:) operator.
664 /// A compound assignment expression.
666};
667
668// Used for determining in which context a type is allowed to be passed to a
669// vararg function.
677
678/// AssignConvertType - All of the 'assignment' semantic checks return this
679/// enum to indicate whether the assignment was allowed. These checks are
680/// done for simple assignments, as well as initialization, return from
681/// function, argument passing, etc. The query is phrased in terms of a
682/// source and destination type.
684 /// Compatible - the types are compatible according to the standard.
686
687 /// CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because
688 /// a void * can implicitly convert to another pointer type, which we
689 /// differentiate for better diagnostic behavior.
691
692 /// PointerToInt - The assignment converts a pointer to an int, which we
693 /// accept as an extension.
695
696 /// IntToPointer - The assignment converts an int to a pointer, which we
697 /// accept as an extension.
699
700 /// FunctionVoidPointer - The assignment is between a function pointer and
701 /// void*, which the standard doesn't allow, but we accept as an extension.
703
704 /// IncompatiblePointer - The assignment is between two pointers types that
705 /// are not compatible, but we accept them as an extension.
707
708 /// IncompatibleFunctionPointer - The assignment is between two function
709 /// pointers types that are not compatible, but we accept them as an
710 /// extension.
712
713 /// IncompatibleFunctionPointerStrict - The assignment is between two
714 /// function pointer types that are not identical, but are compatible,
715 /// unless compiled with -fsanitize=cfi, in which case the type mismatch
716 /// may trip an indirect call runtime check.
718
719 /// IncompatiblePointerSign - The assignment is between two pointers types
720 /// which point to integers which have a different sign, but are otherwise
721 /// identical. This is a subset of the above, but broken out because it's by
722 /// far the most common case of incompatible pointers.
724
725 /// CompatiblePointerDiscardsQualifiers - The assignment discards
726 /// c/v/r qualifiers, which we accept as an extension.
728
729 /// IncompatiblePointerDiscardsQualifiers - The assignment
730 /// discards qualifiers that we don't permit to be discarded,
731 /// like address spaces.
733
734 /// IncompatiblePointerDiscardsOverflowBehavior - The assignment
735 /// discards overflow behavior annotations between otherwise compatible
736 /// pointer types.
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 /// IncompatibleOBTKinds - Assigning between incompatible OverflowBehaviorType
773 /// kinds, e.g., from __ob_trap to __ob_wrap or vice versa.
775
776 /// CompatibleOBTDiscards - Assignment discards overflow behavior
778
779 /// Incompatible - We reject this conversion outright, it is invalid to
780 /// represent it in the AST.
782};
783
784/// The scope in which to find allocation functions.
786 /// Only look for allocation functions in the global scope.
788 /// Only look for allocation functions in the scope of the
789 /// allocated class.
791 /// Look for allocation functions in both the global scope
792 /// and in the scope of the allocated class.
794};
795
796/// Describes the result of an "if-exists" condition check.
797enum class IfExistsResult {
798 /// The symbol exists.
800
801 /// The symbol does not exist.
803
804 /// The name is a dependent name, so the results will differ
805 /// from one instantiation to the next.
807
808 /// An error occurred.
810};
811
812enum class CorrectTypoKind {
813 NonError, // CorrectTypo used in a non error recovery situation.
814 ErrorRecovery // CorrectTypo used in normal error recovery.
815};
816
817enum class OverloadKind {
818 /// This is a legitimate overload: the existing declarations are
819 /// functions or function templates with different signatures.
821
822 /// This is not an overload because the signature exactly matches
823 /// an existing declaration.
825
826 /// This is not an overload because the lookup results contain a
827 /// non-function.
829};
830
831/// Contexts in which a converted constant expression is required.
832enum class CCEKind {
833 CaseValue, ///< Expression in a case label.
834 Enumerator, ///< Enumerator value with fixed underlying type.
835 TemplateArg, ///< Value of a non-type template parameter.
836 TempArgStrict, ///< As above, but applies strict template checking
837 ///< rules.
838 ArrayBound, ///< Array bound in array declarator or new-expression.
839 ExplicitBool, ///< Condition in an explicit(bool) specifier.
840 Noexcept, ///< Condition in a noexcept(bool) specifier.
841 StaticAssertMessageSize, ///< Call to size() in a static assert
842 ///< message.
843 StaticAssertMessageData, ///< Call to data() in a static assert
844 ///< message.
845 PackIndex ///< Index of a pack indexing expression or specifier.
846};
847
848/// Enums for the diagnostics of target, target_version and target_clones.
849namespace DiagAttrParams {
853} // end namespace DiagAttrParams
854
855void inferNoReturnAttr(Sema &S, Decl *D);
856
857#ifdef __GNUC__
858#pragma GCC diagnostic push
859#pragma GCC diagnostic ignored "-Wattributes"
860#endif
861/// Sema - This implements semantic analysis and AST building for C.
862/// \nosubgrouping
863class Sema final : public SemaBase {
864#ifdef __GNUC__
865#pragma GCC diagnostic pop
866#endif
867 // Table of Contents
868 // -----------------
869 // 1. Semantic Analysis (Sema.cpp)
870 // 2. API Notes (SemaAPINotes.cpp)
871 // 3. C++ Access Control (SemaAccess.cpp)
872 // 4. Attributes (SemaAttr.cpp)
873 // 5. Availability Attribute Handling (SemaAvailability.cpp)
874 // 6. Bounds Safety (SemaBoundsSafety.cpp)
875 // 7. Casts (SemaCast.cpp)
876 // 8. Extra Semantic Checking (SemaChecking.cpp)
877 // 9. C++ Coroutines (SemaCoroutine.cpp)
878 // 10. C++ Scope Specifiers (SemaCXXScopeSpec.cpp)
879 // 11. Declarations (SemaDecl.cpp)
880 // 12. Declaration Attribute Handling (SemaDeclAttr.cpp)
881 // 13. C++ Declarations (SemaDeclCXX.cpp)
882 // 14. C++ Exception Specifications (SemaExceptionSpec.cpp)
883 // 15. Expressions (SemaExpr.cpp)
884 // 16. C++ Expressions (SemaExprCXX.cpp)
885 // 17. Member Access Expressions (SemaExprMember.cpp)
886 // 18. Initializers (SemaInit.cpp)
887 // 19. C++ Lambda Expressions (SemaLambda.cpp)
888 // 20. Name Lookup (SemaLookup.cpp)
889 // 21. Modules (SemaModule.cpp)
890 // 22. C++ Overloading (SemaOverload.cpp)
891 // 23. Statements (SemaStmt.cpp)
892 // 24. `inline asm` Statement (SemaStmtAsm.cpp)
893 // 25. Statement Attribute Handling (SemaStmtAttr.cpp)
894 // 26. C++ Templates (SemaTemplate.cpp)
895 // 27. C++ Template Argument Deduction (SemaTemplateDeduction.cpp)
896 // 28. C++ Template Deduction Guide (SemaTemplateDeductionGuide.cpp)
897 // 29. C++ Template Instantiation (SemaTemplateInstantiate.cpp)
898 // 30. C++ Template Declaration Instantiation
899 // (SemaTemplateInstantiateDecl.cpp)
900 // 31. C++ Variadic Templates (SemaTemplateVariadic.cpp)
901 // 32. Constraints and Concepts (SemaConcept.cpp)
902 // 33. Types (SemaType.cpp)
903 // 34. FixIt Helpers (SemaFixItUtils.cpp)
904 // 35. Function Effects (SemaFunctionEffects.cpp)
905 // 36. C++ Expansion Statements (SemaExpand.cpp)
906
907 /// \name Semantic Analysis
908 /// Implementations are in Sema.cpp
909 ///@{
910
911public:
912 Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
914 CodeCompleteConsumer *CompletionConsumer = nullptr);
915 ~Sema();
916
917 /// Perform initialization that occurs after the parser has been
918 /// initialized but before it parses anything.
919 void Initialize();
920
921 /// This virtual key function only exists to limit the emission of debug info
922 /// describing the Sema class. GCC and Clang only emit debug info for a class
923 /// with a vtable when the vtable is emitted. Sema is final and not
924 /// polymorphic, but the debug info size savings are so significant that it is
925 /// worth adding a vtable just to take advantage of this optimization.
927
928 const LangOptions &getLangOpts() const { return LangOpts; }
931
934 Preprocessor &getPreprocessor() const { return PP; }
935 ASTContext &getASTContext() const { return Context; }
939
941 StringRef Platform);
943
944 /// Registers an external source. If an external source already exists,
945 /// creates a multiplex external source and appends to it.
946 ///
947 ///\param[in] E - A non-null external sema source.
948 ///
950
951 /// Print out statistics about the semantic analysis.
952 void PrintStats() const;
953
954 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
955 /// guaranteed). Produces a warning if we're low on stack space and allocates
956 /// more in that case. Use this in code that may recurse deeply (for example,
957 /// in template instantiation) to avoid stack overflow.
959 llvm::function_ref<void()> Fn);
960
961 /// Returns default addr space for method qualifiers.
963
964 /// Load weak undeclared identifiers from the external source.
966
967 /// Load #pragma redefine_extname'd undeclared identifiers from the external
968 /// source.
970
971 /// Determine if VD, which must be a variable or function, is an external
972 /// symbol that nonetheless can't be referenced from outside this translation
973 /// unit because its type has no linkage and it's not extern "C".
974 bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
975
976 /// Determines whether the given source location is in the main file
977 /// and we're in a context where we should warn about unused entities.
978 bool isMainFileLoc(SourceLocation Loc) const;
979
980 /// Obtain a sorted list of functions that are undefined but ODR-used.
982 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation>> &Undefined);
983
984 typedef std::pair<SourceLocation, bool> DeleteExprLoc;
986 /// Retrieves list of suspicious delete-expressions that will be checked at
987 /// the end of translation unit.
988 const llvm::MapVector<FieldDecl *, DeleteLocs> &
990
991 /// Cause the built diagnostic to be emitted on the DiagosticsEngine.
992 /// This is closely coupled to the SemaDiagnosticBuilder class and
993 /// should not be used elsewhere.
994 void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB);
995
996 void addImplicitTypedef(StringRef Name, QualType T);
997
998 /// Whether uncompilable error has occurred. This includes error happens
999 /// in deferred diagnostics.
1000 bool hasUncompilableErrorOccurred() const;
1001
1002 /// Looks through the macro-expansion chain for the given
1003 /// location, looking for a macro expansion with the given name.
1004 /// If one is found, returns true and sets the location to that
1005 /// expansion loc.
1006 bool findMacroSpelling(SourceLocation &loc, StringRef name);
1007
1008 /// Calls \c Lexer::getLocForEndOfToken()
1009 SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset = 0);
1010
1011 /// Calls \c Lexer::findNextToken() to find the next token, and if the
1012 /// locations of both ends of the token can be resolved it return that
1013 /// range; Otherwise it returns an invalid SourceRange.
1015 SourceLocation Loc, bool IncludeMacros, bool IncludeComments,
1016 std::optional<tok::TokenKind> ExpectedToken = std::nullopt);
1017
1018 /// Retrieve the module loader associated with the preprocessor.
1020
1021 /// Invent a new identifier for parameters of abbreviated templates.
1024 unsigned Index);
1025
1027
1028 // Emit all deferred diagnostics.
1029 void emitDeferredDiags();
1030
1031 /// This is called before the very first declaration in the translation unit
1032 /// is parsed. Note that the ASTContext may have already injected some
1033 /// declarations.
1035 /// ActOnEndOfTranslationUnit - This is called at the very end of the
1036 /// translation unit when EOF is reached and all but the top-level scope is
1037 /// popped.
1040
1041 /// Determines the active Scope associated with the given declaration
1042 /// context.
1043 ///
1044 /// This routine maps a declaration context to the active Scope object that
1045 /// represents that declaration context in the parser. It is typically used
1046 /// from "scope-less" code (e.g., template instantiation, lazy creation of
1047 /// declarations) that injects a name for name-lookup purposes and, therefore,
1048 /// must update the Scope.
1049 ///
1050 /// \returns The scope corresponding to the given declaraion context, or NULL
1051 /// if no such scope is open.
1053
1054 void PushFunctionScope();
1055 void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
1057
1058 /// This is used to inform Sema what the current TemplateParameterDepth
1059 /// is during Parsing. Currently it is used to pass on the depth
1060 /// when parsing generic lambda 'auto' parameters.
1061 void RecordParsingTemplateParameterDepth(unsigned Depth);
1062
1063 void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
1065 unsigned OpenMPCaptureLevel = 0);
1066
1067 /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
1068 /// time after they've been popped.
1070 Sema *Self;
1071
1072 public:
1073 explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
1075 };
1076
1078 std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
1079
1080 /// Pop a function (or block or lambda or captured region) scope from the
1081 /// stack.
1082 ///
1083 /// \param WP The warning policy to use for CFG-based warnings, or null if
1084 /// such warnings should not be produced.
1085 /// \param D The declaration corresponding to this function scope, if
1086 /// producing CFG-based warnings.
1087 /// \param BlockType The type of the block expression, if D is a BlockDecl.
1090 Decl *D = nullptr, QualType BlockType = QualType());
1091
1093
1098
1099 void PushCompoundScope(bool IsStmtExpr);
1100 void PopCompoundScope();
1101
1102 /// Determine whether any errors occurred within this function/method/
1103 /// block.
1105
1106 /// Retrieve the current block, if any.
1108
1109 /// Get the innermost lambda or block enclosing the current location, if any.
1110 /// This looks through intervening non-lambda, non-block scopes such as local
1111 /// functions.
1113
1114 /// Retrieve the current lambda scope info, if any.
1115 /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
1116 /// lambda scope info ignoring all inner capturing scopes that are not
1117 /// lambda scopes.
1119 getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
1120
1121 /// Retrieve the current generic lambda info, if any.
1123
1124 /// Retrieve the current captured region, if any.
1126
1127 void ActOnComment(SourceRange Comment);
1128
1129 /// Retrieve the parser's current scope.
1130 ///
1131 /// This routine must only be used when it is certain that semantic analysis
1132 /// and the parser are in precisely the same context, which is not the case
1133 /// when, e.g., we are performing any kind of template instantiation.
1134 /// Therefore, the only safe places to use this scope are in the parser
1135 /// itself and in routines directly invoked from the parser and *never* from
1136 /// template substitution or instantiation.
1137 Scope *getCurScope() const { return CurScope; }
1138
1140
1144
1145 SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
1146 const FunctionDecl *FD = nullptr);
1148 const PartialDiagnostic &PD,
1149 const FunctionDecl *FD = nullptr) {
1150 return targetDiag(Loc, PD.getDiagID(), FD) << PD;
1151 }
1152
1153 /// Check if the type is allowed to be used for the current target.
1155 ValueDecl *D = nullptr);
1156
1157 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
1158 /// cast. If there is already an implicit cast, merge into the existing one.
1159 /// If isLvalue, the result of the cast is an lvalue.
1162 const CXXCastPath *BasePath = nullptr,
1164
1165 /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
1166 /// to the conversion from scalar type ScalarTy to the Boolean type.
1168
1169 /// If \p AllowLambda is true, treat lambda as function.
1170 DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
1171
1172 /// Returns a pointer to the innermost enclosing function, or nullptr if the
1173 /// current context is not inside a function. If \p AllowLambda is true,
1174 /// this can return the call operator of an enclosing lambda, otherwise
1175 /// lambdas are skipped when looking for an enclosing function.
1176 FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
1177
1178 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
1179 /// the method decl for the method being parsed. If we're currently
1180 /// in a 'block', this returns the containing context.
1182
1183 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
1184 /// or C function we're in, otherwise return null. If we're currently
1185 /// in a 'block', this returns the containing context.
1187
1188 /// Warn if we're implicitly casting from a _Nullable pointer type to a
1189 /// _Nonnull one.
1191 SourceLocation Loc);
1192
1193 /// Warn when implicitly casting 0 to nullptr.
1194 void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E);
1195
1196 /// Warn when implicitly changing function effects.
1198 SourceLocation Loc);
1199
1200 /// makeUnavailableInSystemHeader - There is an error in the current
1201 /// context. If we're still in a system header, and we can plausibly
1202 /// make the relevant declaration unavailable instead of erroring, do
1203 /// so and return true.
1205 UnavailableAttr::ImplicitReason reason);
1206
1207 /// Retrieve a suitable printing policy for diagnostics.
1211
1212 /// Retrieve a suitable printing policy for diagnostics.
1214 const Preprocessor &PP);
1215
1216 /// Scope actions.
1218
1219 /// Determine whether \param D is function like (function or function
1220 /// template) for parsing.
1222
1223 /// The maximum alignment, same as in llvm::Value. We duplicate them here
1224 /// because that allows us not to duplicate the constants in clang code,
1225 /// which we must to since we can't directly use the llvm constants.
1226 /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
1227 ///
1228 /// This is the greatest alignment value supported by load, store, and alloca
1229 /// instructions, and global values.
1230 static const unsigned MaxAlignmentExponent = 32;
1231 static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
1232
1233 /// Flag indicating whether or not to collect detailed statistics.
1235
1236 std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
1237
1238 /// Stack containing information about each of the nested
1239 /// function, block, and method scopes that are currently active.
1241
1242 /// The index of the first FunctionScope that corresponds to the current
1243 /// context.
1245
1246 /// Track the number of currently active capturing scopes.
1248
1249 llvm::BumpPtrAllocator BumpAlloc;
1250
1251 /// The kind of translation unit we are processing.
1252 ///
1253 /// When we're processing a complete translation unit, Sema will perform
1254 /// end-of-translation-unit semantic tasks (such as creating
1255 /// initializers for tentative definitions in C) once parsing has
1256 /// completed. Modules and precompiled headers perform different kinds of
1257 /// checks.
1259
1260 /// Translation Unit Scope - useful to Objective-C actions that need
1261 /// to lookup file scope declarations in the "ordinary" C decl namespace.
1262 /// For example, user-defined classes, built-in "id" type, etc.
1264
1266 return CurScope->incrementMSManglingNumber();
1267 }
1268
1269 /// Try to recover by turning the given expression into a
1270 /// call. Returns true if recovery was attempted or an error was
1271 /// emitted; this may also leave the ExprResult invalid.
1273 bool ForceComplain = false,
1274 bool (*IsPlausibleResult)(QualType) = nullptr);
1275
1276 // Adds implicit lifetime bound attribute for implicit this to its
1277 // TypeSourceInfo.
1279
1280 /// Figure out if an expression could be turned into a call.
1281 ///
1282 /// Use this when trying to recover from an error where the programmer may
1283 /// have written just the name of a function instead of actually calling it.
1284 ///
1285 /// \param E - The expression to examine.
1286 /// \param ZeroArgCallReturnTy - If the expression can be turned into a call
1287 /// with no arguments, this parameter is set to the type returned by such a
1288 /// call; otherwise, it is set to an empty QualType.
1289 /// \param OverloadSet - If the expression is an overloaded function
1290 /// name, this parameter is populated with the decls of the various
1291 /// overloads.
1292 bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
1293 UnresolvedSetImpl &NonTemplateOverloads);
1294
1298
1301
1309
1310 std::unique_ptr<APINotesSelectorDiagnosticState> APINotesSelectorDiagnostics;
1311
1312 /// A RAII object to enter scope of a compound statement.
1314 public:
1315 CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
1316 S.ActOnStartOfCompoundStmt(IsStmtExpr);
1317 }
1318
1319 ~CompoundScopeRAII() { S.ActOnFinishOfCompoundStmt(); }
1322
1323 private:
1324 Sema &S;
1325 };
1326
1327 /// An RAII helper that pops function a function scope on exit.
1333 if (Active)
1334 S.PopFunctionScopeInfo();
1335 }
1336 void disable() { Active = false; }
1337 };
1338
1340 return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
1341 }
1342
1343 /// Worker object for performing CFG-based warnings.
1346
1347 /// Callback to the parser to parse templated functions when needed.
1348 typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
1351
1353 LateTemplateParser = LTP;
1354 OpaqueParser = P;
1355 }
1356
1357 /// Callback to the parser to parse a type expressed as a string.
1358 std::function<TypeResult(StringRef, StringRef, SourceLocation)>
1360
1361 /// VAListTagName - The declaration name corresponding to __va_list_tag.
1362 /// This is used as part of a hack to omit that class from ADL results.
1364
1365 /// Is the last error level diagnostic immediate. This is used to determined
1366 /// whether the next info diagnostic should be immediate.
1368
1369 /// Track if we're currently analyzing overflow behavior types in assignment
1370 /// context.
1372
1373 class DelayedDiagnostics;
1374
1376 sema::DelayedDiagnosticPool *SavedPool = nullptr;
1378 };
1381
1382 /// A class which encapsulates the logic for delaying diagnostics
1383 /// during parsing and other processing.
1385 /// The current pool of diagnostics into which delayed
1386 /// diagnostics should go.
1387 sema::DelayedDiagnosticPool *CurPool = nullptr;
1388
1389 public:
1391
1392 /// Adds a delayed diagnostic.
1393 void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
1394
1395 /// Determines whether diagnostics should be delayed.
1396 bool shouldDelayDiagnostics() { return CurPool != nullptr; }
1397
1398 /// Returns the current delayed-diagnostics pool.
1399 sema::DelayedDiagnosticPool *getCurrentPool() const { return CurPool; }
1400
1401 /// Enter a new scope. Access and deprecation diagnostics will be
1402 /// collected in this pool.
1405 state.SavedPool = CurPool;
1406 CurPool = &pool;
1407 return state;
1408 }
1409
1410 /// Leave a delayed-diagnostic state that was previously pushed.
1411 /// Do not emit any of the diagnostics. This is performed as part
1412 /// of the bookkeeping of popping a pool "properly".
1414 CurPool = state.SavedPool;
1415 }
1416
1417 /// Enter a new scope where access and deprecation diagnostics are
1418 /// not delayed.
1421 state.SavedPool = CurPool;
1422 CurPool = nullptr;
1423 return state;
1424 }
1425
1426 /// Undo a previous pushUndelayed().
1428 assert(CurPool == nullptr);
1429 CurPool = state.SavedPool;
1430 }
1432
1436
1437 /// Diagnostics that are emitted only if we discover that the given function
1438 /// must be codegen'ed. Because handling these correctly adds overhead to
1439 /// compilation, this is currently only used for offload languages like CUDA,
1440 /// OpenMP, and SYCL.
1441 SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags;
1442
1443 /// CurContext - This is the current declaration context of parsing.
1445
1447 assert(AMDGPUPtr);
1448 return *AMDGPUPtr;
1449 }
1450
1452 assert(ARMPtr);
1453 return *ARMPtr;
1454 }
1455
1457 assert(AVRPtr);
1458 return *AVRPtr;
1459 }
1460
1462 assert(BPFPtr);
1463 return *BPFPtr;
1464 }
1465
1467 assert(CodeCompletionPtr);
1468 return *CodeCompletionPtr;
1469 }
1470
1472 assert(CUDAPtr);
1473 return *CUDAPtr;
1474 }
1475
1477 assert(DirectXPtr);
1478 return *DirectXPtr;
1479 }
1480
1482 assert(HLSLPtr);
1483 return *HLSLPtr;
1484 }
1485
1487 assert(HexagonPtr);
1488 return *HexagonPtr;
1489 }
1490
1492 assert(LoongArchPtr);
1493 return *LoongArchPtr;
1494 }
1495
1497 assert(M68kPtr);
1498 return *M68kPtr;
1499 }
1500
1502 assert(MIPSPtr);
1503 return *MIPSPtr;
1504 }
1505
1507 assert(MSP430Ptr);
1508 return *MSP430Ptr;
1509 }
1510
1512 assert(NVPTXPtr);
1513 return *NVPTXPtr;
1514 }
1515
1517 assert(ObjCPtr);
1518 return *ObjCPtr;
1519 }
1520
1522 assert(OpenACCPtr);
1523 return *OpenACCPtr;
1524 }
1525
1527 assert(OpenCLPtr);
1528 return *OpenCLPtr;
1529 }
1530
1532 assert(OpenMPPtr && "SemaOpenMP is dead");
1533 return *OpenMPPtr;
1534 }
1535
1537 assert(PPCPtr);
1538 return *PPCPtr;
1539 }
1540
1542 assert(PseudoObjectPtr);
1543 return *PseudoObjectPtr;
1544 }
1545
1547 assert(RISCVPtr);
1548 return *RISCVPtr;
1549 }
1550
1552 assert(SPIRVPtr);
1553 return *SPIRVPtr;
1554 }
1555
1557 assert(SYCLPtr);
1558 return *SYCLPtr;
1559 }
1560
1562 assert(SwiftPtr);
1563 return *SwiftPtr;
1564 }
1565
1567 assert(SystemZPtr);
1568 return *SystemZPtr;
1569 }
1570
1572 assert(WasmPtr);
1573 return *WasmPtr;
1574 }
1575
1577 assert(X86Ptr);
1578 return *X86Ptr;
1579 }
1580
1581 /// Source of additional semantic information.
1583
1584protected:
1585 friend class Parser;
1587 friend class ASTReader;
1588 friend class ASTDeclReader;
1589 friend class ASTWriter;
1590
1591private:
1592 std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1593 bool WarnedDarwinSDKInfoMissing = false;
1594
1595 StackExhaustionHandler StackHandler;
1596
1597 Sema(const Sema &) = delete;
1598 void operator=(const Sema &) = delete;
1599
1600 /// The handler for the FileChanged preprocessor events.
1601 ///
1602 /// Used for diagnostics that implement custom semantic analysis for #include
1603 /// directives, like -Wpragma-pack.
1604 sema::SemaPPCallbacks *SemaPPCallbackHandler;
1605
1606 /// The parser's current scope.
1607 ///
1608 /// The parser maintains this state here.
1609 Scope *CurScope;
1610
1611 mutable IdentifierInfo *Ident_super;
1612
1613 std::unique_ptr<SemaAMDGPU> AMDGPUPtr;
1614 std::unique_ptr<SemaARM> ARMPtr;
1615 std::unique_ptr<SemaAVR> AVRPtr;
1616 std::unique_ptr<SemaBPF> BPFPtr;
1617 std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
1618 std::unique_ptr<SemaCUDA> CUDAPtr;
1619 std::unique_ptr<SemaDirectX> DirectXPtr;
1620 std::unique_ptr<SemaHLSL> HLSLPtr;
1621 std::unique_ptr<SemaHexagon> HexagonPtr;
1622 std::unique_ptr<SemaLoongArch> LoongArchPtr;
1623 std::unique_ptr<SemaM68k> M68kPtr;
1624 std::unique_ptr<SemaMIPS> MIPSPtr;
1625 std::unique_ptr<SemaMSP430> MSP430Ptr;
1626 std::unique_ptr<SemaNVPTX> NVPTXPtr;
1627 std::unique_ptr<SemaObjC> ObjCPtr;
1628 std::unique_ptr<SemaOpenACC> OpenACCPtr;
1629 std::unique_ptr<SemaOpenCL> OpenCLPtr;
1630 std::unique_ptr<SemaOpenMP> OpenMPPtr;
1631 std::unique_ptr<SemaPPC> PPCPtr;
1632 std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
1633 std::unique_ptr<SemaRISCV> RISCVPtr;
1634 std::unique_ptr<SemaSPIRV> SPIRVPtr;
1635 std::unique_ptr<SemaSYCL> SYCLPtr;
1636 std::unique_ptr<SemaSwift> SwiftPtr;
1637 std::unique_ptr<SemaSystemZ> SystemZPtr;
1638 std::unique_ptr<SemaWasm> WasmPtr;
1639 std::unique_ptr<SemaX86> X86Ptr;
1640
1641 ///@}
1642
1643 //
1644 //
1645 // -------------------------------------------------------------------------
1646 //
1647 //
1648
1649 /// \name API Notes
1650 /// Implementations are in SemaAPINotes.cpp
1651 ///@{
1652
1653public:
1654 /// Map any API notes provided for this declaration to attributes on the
1655 /// declaration.
1656 ///
1657 /// Triggered by declaration-attribute processing.
1658 void ProcessAPINotes(Decl *D);
1659 /// Apply the 'Nullability:' annotation to the specified declaration
1660 void ApplyNullability(Decl *D, NullabilityKind Nullability);
1661 /// Apply the 'Type:' annotation to the specified declaration
1662 void ApplyAPINotesType(Decl *D, StringRef TypeString);
1663
1664 /// Diagnose exact API notes selectors that were not matched by any
1665 /// declaration processed in this translation unit.
1667
1668 /// Whether APINotes should be gathered for all applicable Swift language
1669 /// versions, without being applied. Leaving clients of the current module
1670 /// to select and apply the correct version.
1672 return APINotes.captureVersionIndependentSwift();
1673 }
1674 ///@}
1675
1676 //
1677 //
1678 // -------------------------------------------------------------------------
1679 //
1680 //
1681
1682 /// \name C++ Access Control
1683 /// Implementations are in SemaAccess.cpp
1684 ///@{
1685
1686public:
1693
1694 /// SetMemberAccessSpecifier - Set the access specifier of a member.
1695 /// Returns true on error (when the previous member decl access specifier
1696 /// is different from the new member decl access specifier).
1697 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1698 NamedDecl *PrevMemberDecl,
1699 AccessSpecifier LexicalAS);
1700
1701 /// Perform access-control checking on a previously-unresolved member
1702 /// access which has now been resolved to a member.
1704 DeclAccessPair FoundDecl);
1706 DeclAccessPair FoundDecl);
1707
1708 /// Checks access to an overloaded operator new or delete.
1710 SourceRange PlacementRange,
1711 CXXRecordDecl *NamingClass,
1712 DeclAccessPair FoundDecl,
1713 bool Diagnose = true);
1714
1715 /// Checks access to a constructor.
1717 DeclAccessPair FoundDecl,
1718 const InitializedEntity &Entity,
1719 bool IsCopyBindingRefToTemp = false);
1720
1721 /// Checks access to a constructor.
1723 DeclAccessPair FoundDecl,
1724 const InitializedEntity &Entity,
1725 const PartialDiagnostic &PDiag);
1727 CXXDestructorDecl *Dtor,
1728 const PartialDiagnostic &PDiag,
1729 QualType objectType = QualType());
1730
1731 /// Checks access to the target of a friend declaration.
1733
1734 /// Checks access to a member.
1736 CXXRecordDecl *NamingClass,
1738
1739 /// Checks implicit access to a member in a structured binding.
1742 CXXRecordDecl *DecomposedClass,
1743 DeclAccessPair Field);
1745 const SourceRange &,
1746 DeclAccessPair FoundDecl);
1747
1748 /// Checks access to an overloaded member operator, including
1749 /// conversion operators.
1751 Expr *ArgExpr,
1752 DeclAccessPair FoundDecl);
1754 ArrayRef<Expr *> ArgExprs,
1755 DeclAccessPair FoundDecl);
1757 DeclAccessPair FoundDecl);
1758
1759 /// Checks access for a hierarchy conversion.
1760 ///
1761 /// \param ForceCheck true if this check should be performed even if access
1762 /// control is disabled; some things rely on this for semantics
1763 /// \param ForceUnprivileged true if this check should proceed as if the
1764 /// context had no special privileges
1766 QualType Derived, const CXXBasePath &Path,
1767 unsigned DiagID, bool ForceCheck = false,
1768 bool ForceUnprivileged = false);
1769
1771 SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived,
1772 const CXXBasePath &Path, unsigned DiagID,
1773 llvm::function_ref<void(PartialDiagnostic &PD)> SetupPDiag,
1774 bool ForceCheck = false, bool ForceUnprivileged = false);
1775
1776 /// Checks access to all the declarations in the given result set.
1777 void CheckLookupAccess(const LookupResult &R);
1778
1779 /// Checks access to Target from the given class. The check will take access
1780 /// specifiers into account, but no member access expressions and such.
1781 ///
1782 /// \param Target the declaration to check if it can be accessed
1783 /// \param NamingClass the class in which the lookup was started.
1784 /// \param BaseType type of the left side of member access expression.
1785 /// \p BaseType and \p NamingClass are used for C++ access control.
1786 /// Depending on the lookup case, they should be set to the following:
1787 /// - lhs.target (member access without a qualifier):
1788 /// \p BaseType and \p NamingClass are both the type of 'lhs'.
1789 /// - lhs.X::target (member access with a qualifier):
1790 /// BaseType is the type of 'lhs', NamingClass is 'X'
1791 /// - X::target (qualified lookup without member access):
1792 /// BaseType is null, NamingClass is 'X'.
1793 /// - target (unqualified lookup).
1794 /// BaseType is null, NamingClass is the parent class of 'target'.
1795 /// \return true if the Target is accessible from the Class, false otherwise.
1796 bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
1797 QualType BaseType);
1798
1799 /// Is the given member accessible for the purposes of deciding whether to
1800 /// define a special member function as deleted?
1802 DeclAccessPair Found, QualType ObjectType,
1803 SourceLocation Loc,
1804 const PartialDiagnostic &Diag);
1807 QualType ObjectType) {
1808 return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
1809 SourceLocation(), PDiag());
1810 }
1811
1813 const DependentDiagnostic &DD,
1814 const MultiLevelTemplateArgumentList &TemplateArgs);
1816
1817 ///@}
1818
1819 //
1820 //
1821 // -------------------------------------------------------------------------
1822 //
1823 //
1824
1825 /// \name Attributes
1826 /// Implementations are in SemaAttr.cpp
1827 ///@{
1828
1829public:
1830 /// Controls member pointer representation format under the MS ABI.
1833
1834 bool MSStructPragmaOn; // True when \#pragma ms_struct on
1835
1836 /// Source location for newly created implicit MSInheritanceAttrs
1838
1844
1850
1852 PSK_Reset = 0x0, // #pragma ()
1853 PSK_Set = 0x1, // #pragma (value)
1854 PSK_Push = 0x2, // #pragma (push[, id])
1855 PSK_Pop = 0x4, // #pragma (pop[, id])
1856 PSK_Show = 0x8, // #pragma (show) -- only for "pack"!
1857 PSK_Push_Set = PSK_Push | PSK_Set, // #pragma (push[, id], value)
1858 PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value)
1859 };
1860
1866
1867 // #pragma pack and align.
1869 public:
1870 // `Native` represents default align mode, which may vary based on the
1871 // platform.
1872 enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
1873
1874 // #pragma pack info constructor
1875 AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
1876 : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
1877 assert(Num == PackNumber && "The pack number has been truncated.");
1878 }
1879
1880 // #pragma align info constructor
1882 : PackAttr(false), AlignMode(M),
1883 PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
1884
1885 explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
1886
1888
1889 // When a AlignPackInfo itself cannot be used, this returns an 32-bit
1890 // integer encoding for it. This should only be passed to
1891 // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
1893 std::uint32_t Encoding{};
1894 if (Info.IsXLStack())
1895 Encoding |= IsXLMask;
1896
1897 Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
1898
1899 if (Info.IsPackAttr())
1900 Encoding |= PackAttrMask;
1901
1902 Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
1903
1904 return Encoding;
1905 }
1906
1907 static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
1908 bool IsXL = static_cast<bool>(Encoding & IsXLMask);
1910 static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
1911 int PackNumber = (Encoding & PackNumMask) >> 4;
1912
1913 if (Encoding & PackAttrMask)
1914 return AlignPackInfo(M, PackNumber, IsXL);
1915
1916 return AlignPackInfo(M, IsXL);
1917 }
1918
1919 bool IsPackAttr() const { return PackAttr; }
1920
1921 bool IsAlignAttr() const { return !PackAttr; }
1922
1923 Mode getAlignMode() const { return AlignMode; }
1924
1925 unsigned getPackNumber() const { return PackNumber; }
1926
1927 bool IsPackSet() const {
1928 // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
1929 // attriute on a decl.
1930 return PackNumber != UninitPackVal && PackNumber != 0;
1931 }
1932
1933 bool IsXLStack() const { return XLStack; }
1934
1935 bool operator==(const AlignPackInfo &Info) const {
1936 return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
1937 std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
1938 Info.XLStack);
1939 }
1940
1941 bool operator!=(const AlignPackInfo &Info) const {
1942 return !(*this == Info);
1943 }
1944
1945 private:
1946 /// \brief True if this is a pragma pack attribute,
1947 /// not a pragma align attribute.
1948 bool PackAttr;
1949
1950 /// \brief The alignment mode that is in effect.
1951 Mode AlignMode;
1952
1953 /// \brief The pack number of the stack.
1954 unsigned char PackNumber;
1955
1956 /// \brief True if it is a XL #pragma align/pack stack.
1957 bool XLStack;
1958
1959 /// \brief Uninitialized pack value.
1960 static constexpr unsigned char UninitPackVal = -1;
1961
1962 // Masks to encode and decode an AlignPackInfo.
1963 static constexpr uint32_t IsXLMask{0x0000'0001};
1964 static constexpr uint32_t AlignModeMask{0x0000'0006};
1965 static constexpr uint32_t PackAttrMask{0x00000'0008};
1966 static constexpr uint32_t PackNumMask{0x0000'01F0};
1967 };
1968
1969 template <typename ValueType> struct PragmaStack {
1981
1982 void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
1983 llvm::StringRef StackSlotLabel, ValueType Value) {
1984 if (Action == PSK_Reset) {
1986 CurrentPragmaLocation = PragmaLocation;
1987 return;
1988 }
1989 if (Action & PSK_Push)
1990 Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
1991 PragmaLocation);
1992 else if (Action & PSK_Pop) {
1993 if (!StackSlotLabel.empty()) {
1994 // If we've got a label, try to find it and jump there.
1995 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
1996 return x.StackSlotLabel == StackSlotLabel;
1997 });
1998 // If we found the label so pop from there.
1999 if (I != Stack.rend()) {
2000 CurrentValue = I->Value;
2001 CurrentPragmaLocation = I->PragmaLocation;
2002 Stack.erase(std::prev(I.base()), Stack.end());
2003 }
2004 } else if (!Stack.empty()) {
2005 // We do not have a label, just pop the last entry.
2006 CurrentValue = Stack.back().Value;
2007 CurrentPragmaLocation = Stack.back().PragmaLocation;
2008 Stack.pop_back();
2009 }
2010 }
2011 if (Action & PSK_Set) {
2013 CurrentPragmaLocation = PragmaLocation;
2014 }
2015 }
2016
2017 // MSVC seems to add artificial slots to #pragma stacks on entering a C++
2018 // method body to restore the stacks on exit, so it works like this:
2019 //
2020 // struct S {
2021 // #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
2022 // void Method {}
2023 // #pragma <name>(pop, InternalPragmaSlot)
2024 // };
2025 //
2026 // It works even with #pragma vtordisp, although MSVC doesn't support
2027 // #pragma vtordisp(push [, id], n)
2028 // syntax.
2029 //
2030 // Push / pop a named sentinel slot.
2031 void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
2032 assert((Action == PSK_Push || Action == PSK_Pop) &&
2033 "Can only push / pop #pragma stack sentinels!");
2034 Act(CurrentPragmaLocation, Action, Label, CurrentValue);
2035 }
2036
2037 // Constructors.
2038 explicit PragmaStack(const ValueType &Default)
2040
2041 bool hasValue() const { return CurrentValue != DefaultValue; }
2042
2044 ValueType DefaultValue; // Value used for PSK_Reset action.
2045 ValueType CurrentValue;
2047 };
2048 // FIXME: We should serialize / deserialize these if they occur in a PCH (but
2049 // we shouldn't do so if they're in a module).
2050
2051 /// Whether to insert vtordisps prior to virtual bases in the Microsoft
2052 /// C++ ABI. Possible values are 0, 1, and 2, which mean:
2053 ///
2054 /// 0: Suppress all vtordisps
2055 /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
2056 /// structors
2057 /// 2: Always insert vtordisps to support RTTI on partially constructed
2058 /// objects
2061 // The current #pragma align/pack values and locations at each #include.
2068 // Segment #pragmas.
2073
2074 // #pragma strict_gs_check.
2076
2077 // This stack tracks the current state of Sema.CurFPFeatures.
2080 FPOptionsOverride result;
2081 if (!FpPragmaStack.hasValue()) {
2082 result = FPOptionsOverride();
2083 } else {
2084 result = FpPragmaStack.CurrentValue;
2085 }
2086 return result;
2087 }
2088
2095
2096 // RAII object to push / pop sentinel slots for all MS #pragma stacks.
2097 // Actions should be performed only if we enter / exit a C++ method body.
2099 public:
2100 PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
2105
2106 private:
2107 Sema &S;
2108 StringRef SlotLabel;
2109 bool ShouldAct;
2110 };
2111
2112 /// Last section used with #pragma init_seg.
2115
2116 /// Sections used with #pragma alloc_text.
2117 llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
2118
2119 /// VisContext - Manages the stack for \#pragma GCC visibility.
2120 void *VisContext; // Really a "PragmaVisStack*"
2121
2122 /// This an attribute introduced by \#pragma clang attribute.
2129
2130 /// A push'd group of PragmaAttributeEntries.
2132 /// The location of the push attribute.
2134 /// The namespace of this push group.
2137 };
2138
2140
2141 /// The declaration that is currently receiving an attribute from the
2142 /// #pragma attribute stack.
2144
2145 /// This represents the last location of a "#pragma clang optimize off"
2146 /// directive if such a directive has not been closed by an "on" yet. If
2147 /// optimizations are currently "on", this is set to an invalid location.
2149
2150 /// Get the location for the currently active "\#pragma clang optimize
2151 /// off". If this location is invalid, then the state of the pragma is "on".
2155
2156 /// The "on" or "off" argument passed by \#pragma optimize, that denotes
2157 /// whether the optimizations in the list passed to the pragma should be
2158 /// turned off or on. This boolean is true by default because command line
2159 /// options are honored when `#pragma optimize("", on)`.
2160 /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
2162
2163 /// Set of no-builtin functions listed by \#pragma function.
2165
2166 /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
2167 /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
2169
2170 /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
2172
2173 /// Add gsl::Pointer attribute to std::container::iterator
2174 /// \param ND The declaration that introduces the name
2175 /// std::container::iterator. \param UnderlyingRecord The record named by ND.
2176 void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
2177
2178 /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
2180
2181 /// Add [[clang:::lifetimebound]] attr for std:: functions and methods.
2183
2184 /// Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
2186
2187 /// Add [[gsl::Pointer]] attributes for std:: types.
2189
2190 LifetimeCaptureByAttr *ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
2191 StringRef ParamName);
2192 // Processes the argument 'X' in [[clang::lifetime_capture_by(X)]]. Since 'X'
2193 // can be the name of a function parameter, we need to parse the function
2194 // declaration and rest of the parameters before processesing 'X'. Therefore
2195 // do this lazily instead of processing while parsing the annotation itself.
2197
2198 /// Add _Nullable attributes for std:: types.
2200
2201 /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
2204 PragmaClangSectionKind SecKind,
2205 StringRef SecName);
2206
2207 /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
2209 SourceLocation PragmaLoc);
2210
2211 /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
2212 void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
2213 StringRef SlotLabel, Expr *Alignment);
2214
2215 /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
2216 /// (unless they are value dependent or type dependent). Returns false
2217 /// and emits a diagnostic if one or more of the arguments could not be
2218 /// folded into a constant.
2221
2226
2228 SourceLocation IncludeLoc);
2230
2231 /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
2233
2234 /// ActOnPragmaMSComment - Called on well formed
2235 /// \#pragma comment(kind, "arg").
2237 StringRef Arg);
2238
2239 /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
2240 void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
2241 StringRef Value);
2242
2243 /// Are precise floating point semantics currently enabled?
2245 return !CurFPFeatures.getAllowFPReassociate() &&
2246 !CurFPFeatures.getNoSignedZero() &&
2247 !CurFPFeatures.getAllowReciprocal() &&
2248 !CurFPFeatures.getAllowApproxFunc();
2249 }
2250
2253
2254 /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
2255 void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action,
2257
2258 /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
2259 /// pointers_to_members(representation method[, general purpose
2260 /// representation]).
2263 SourceLocation PragmaLoc);
2264
2265 /// Called on well formed \#pragma vtordisp().
2266 void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action,
2268
2269 bool UnifySection(StringRef SectionName, int SectionFlags,
2270 NamedDecl *TheDecl);
2271 bool UnifySection(StringRef SectionName, int SectionFlags,
2272 SourceLocation PragmaSectionLocation);
2273
2274 /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
2275 void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
2276 PragmaMsStackAction Action,
2277 llvm::StringRef StackSlotLabel,
2278 StringLiteral *SegmentName, llvm::StringRef PragmaName);
2279
2280 /// Called on well formed \#pragma section().
2281 void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags,
2282 StringLiteral *SegmentName);
2283
2284 /// Called on well-formed \#pragma init_seg().
2285 void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
2286 StringLiteral *SegmentName);
2287
2288 /// Called on well-formed \#pragma alloc_text().
2290 SourceLocation PragmaLocation, StringRef Section,
2291 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
2292 &Functions);
2293
2294 /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
2295 /// strict_gs_check.
2297 PragmaMsStackAction Action,
2298 bool Value);
2299
2300 /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
2301 void ActOnPragmaUnused(const Token &Identifier, Scope *curScope,
2302 SourceLocation PragmaLoc);
2303
2305 SourceLocation PragmaLoc,
2308 const IdentifierInfo *Namespace);
2309
2310 /// Called on well-formed '\#pragma clang attribute pop'.
2312 const IdentifierInfo *Namespace);
2313
2314 /// Adds the attributes that have been specified using the
2315 /// '\#pragma clang attribute push' directives to the given declaration.
2316 void AddPragmaAttributes(Scope *S, Decl *D);
2317
2319 llvm::function_ref<void(SourceLocation, PartialDiagnostic)>;
2321 return [this](SourceLocation Loc, PartialDiagnostic PD) {
2322 // This bypasses a lot of the filters in the diag engine, as it's
2323 // to be used to attach notes to diagnostics which have already
2324 // been filtered through.
2325 DiagnosticBuilder Builder(Diags.Report(Loc, PD.getDiagID()));
2326 PD.Emit(Builder);
2327 };
2328 }
2329
2335
2337
2338 /// Called on well formed \#pragma clang optimize.
2339 void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
2340
2341 /// #pragma optimize("[optimization-list]", on | off).
2342 void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
2343
2344 /// Call on well formed \#pragma function.
2345 void
2347 const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
2348
2350 SourceLocation NameLoc,
2351 Scope *curScope);
2352
2353 /// Information from a C++ #pragma export, for a symbol that we
2354 /// haven't seen the declaration for yet.
2359
2360 llvm::DenseMap<IdentifierInfo *, PendingPragmaInfo> PendingExportedNames;
2361
2362 /// ActonPragmaExport - called on well-formed '\#pragma export'.
2363 void ActOnPragmaExport(IdentifierInfo *IdentId, SourceLocation ExportNameLoc,
2364 Scope *curScope);
2365
2366 /// Only called on function definitions; if there is a pragma in scope
2367 /// with the effect of a range-based optnone, consider marking the function
2368 /// with attribute optnone.
2370
2371 /// Only called on function definitions; if there is a `#pragma alloc_text`
2372 /// that decides which code section the function should be in, add
2373 /// attribute section to the function.
2375
2376 /// Adds the 'optnone' attribute to the function declaration if there
2377 /// are no conflicts; Loc represents the location causing the 'optnone'
2378 /// attribute to be added (usually because of a pragma).
2380
2381 /// Only called on function definitions; if there is a MSVC #pragma optimize
2382 /// in scope, consider changing the function's attributes based on the
2383 /// optimization list passed to the pragma.
2385
2386 /// Only called on function definitions; if there is a pragma in scope
2387 /// with the effect of a range-based no_builtin, consider marking the function
2388 /// with attribute no_builtin.
2390
2391 /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
2392 /// add an appropriate visibility attribute.
2394
2395 /// FreeVisContext - Deallocate and null out VisContext.
2396 void FreeVisContext();
2397
2398 /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
2399 void ActOnPragmaVisibility(const IdentifierInfo *VisType,
2400 SourceLocation PragmaLoc);
2401
2402 /// ActOnPragmaFPContract - Called on well formed
2403 /// \#pragma {STDC,OPENCL} FP_CONTRACT and
2404 /// \#pragma clang fp contract
2406
2407 /// Called on well formed
2408 /// \#pragma clang fp reassociate
2409 /// or
2410 /// \#pragma clang fp reciprocal
2412 bool IsEnabled);
2413
2414 /// ActOnPragmaFenvAccess - Called on well formed
2415 /// \#pragma STDC FENV_ACCESS
2416 void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
2417
2418 /// ActOnPragmaCXLimitedRange - Called on well formed
2419 /// \#pragma STDC CX_LIMITED_RANGE
2422
2423 /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
2426
2427 /// Called to set constant rounding mode for floating point operations.
2428 void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
2429
2430 /// Called to set exception behavior for floating point operations.
2432
2433 /// PushNamespaceVisibilityAttr - Note that we've entered a
2434 /// namespace with a visibility attribute.
2435 void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
2436 SourceLocation Loc);
2437
2438 /// PopPragmaVisibility - Pop the top element of the visibility stack; used
2439 /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
2440 void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
2441
2442 /// Handles semantic checking for features that are common to all attributes,
2443 /// such as checking whether a parameter was properly specified, or the
2444 /// correct number of arguments were passed, etc. Returns true if the
2445 /// attribute has been diagnosed.
2446 bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
2447 bool SkipArgCountCheck = false);
2448 bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
2449 bool SkipArgCountCheck = false);
2450
2451 ///@}
2452
2453 //
2454 //
2455 // -------------------------------------------------------------------------
2456 //
2457 //
2458
2459 /// \name Availability Attribute Handling
2460 /// Implementations are in SemaAvailability.cpp
2461 ///@{
2462
2463public:
2464 /// Issue any -Wunguarded-availability warnings in \c FD
2466
2468
2469 /// Retrieve the current function, if any, that should be analyzed for
2470 /// potential availability violations.
2472
2474 const ObjCInterfaceDecl *UnknownObjCClass,
2475 bool ObjCPropertyAccess,
2476 bool AvoidPartialAvailabilityChecks,
2477 ObjCInterfaceDecl *ClassReceiver);
2478
2480
2481 std::pair<AvailabilityResult, const NamedDecl *>
2482 ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message,
2483 ObjCInterfaceDecl *ClassReceiver);
2484 ///@}
2485
2486 //
2487 //
2488 // -------------------------------------------------------------------------
2489 //
2490 //
2491
2492 /// \name Bounds Safety
2493 /// Implementations are in SemaBoundsSafety.cpp
2494 ///@{
2495public:
2496 /// Check if applying the specified attribute variant from the "counted by"
2497 /// family of attributes to FieldDecl \p FD is semantically valid. If
2498 /// semantically invalid diagnostics will be emitted explaining the problems.
2499 ///
2500 /// \param FD The FieldDecl to apply the attribute to
2501 /// \param E The count expression on the attribute
2502 /// \param CountInBytes If true the attribute is from the "sized_by" family of
2503 /// attributes. If the false the attribute is from
2504 /// "counted_by" family of attributes.
2505 /// \param OrNull If true the attribute is from the "_or_null" suffixed family
2506 /// of attributes. If false the attribute does not have the
2507 /// suffix.
2508 ///
2509 /// Together \p CountInBytes and \p OrNull decide the attribute variant. E.g.
2510 /// \p CountInBytes and \p OrNull both being true indicates the
2511 /// `counted_by_or_null` attribute.
2512 ///
2513 /// \returns false iff semantically valid.
2514 bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
2515 bool OrNull);
2516
2517 /// Perform Bounds Safety Semantic checks for assigning to a `__counted_by` or
2518 /// `__counted_by_or_null` pointer type \param LHSTy.
2519 ///
2520 /// \param LHSTy The type being assigned to. Checks will only be performed if
2521 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2522 /// \param RHSExpr The expression being assigned from.
2523 /// \param Action The type assignment being performed
2524 /// \param Loc The SourceLocation to use for error diagnostics
2525 /// \param Assignee The ValueDecl being assigned. This is used to compute
2526 /// the name of the assignee. If the assignee isn't known this can
2527 /// be set to nullptr.
2528 /// \param ShowFullyQualifiedAssigneeName If set to true when using \p
2529 /// Assignee to compute the name of the assignee use the fully
2530 /// qualified name, otherwise use the unqualified name.
2531 ///
2532 /// \returns True iff no diagnostic where emitted, false otherwise.
2534 QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
2535 SourceLocation Loc, const ValueDecl *Assignee,
2536 bool ShowFullyQualifiedAssigneeName);
2537
2538 /// Perform Bounds Safety Semantic checks for initializing a Bounds Safety
2539 /// pointer.
2540 ///
2541 /// \param Entity The entity being initialized
2542 /// \param Kind The kind of initialization being performed
2543 /// \param Action The type assignment being performed
2544 /// \param LHSTy The type being assigned to. Checks will only be performed if
2545 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2546 /// \param RHSExpr The expression being used for initialization.
2547 ///
2548 /// \returns True iff no diagnostic where emitted, false otherwise.
2550 const InitializationKind &Kind,
2551 AssignmentAction Action,
2552 QualType LHSType, Expr *RHSExpr);
2553
2554 /// Perform Bounds Safety semantic checks for uses of invalid uses counted_by
2555 /// or counted_by_or_null pointers in \param E.
2556 ///
2557 /// \param E the expression to check
2558 ///
2559 /// \returns True iff no diagnostic where emitted, false otherwise.
2561 ///@}
2562
2563 //
2564 //
2565 // -------------------------------------------------------------------------
2566 //
2567 //
2568
2569 /// \name Casts
2570 /// Implementations are in SemaCast.cpp
2571 ///@{
2572
2573public:
2579
2580 /// ActOnCXXNamedCast - Parse
2581 /// {dynamic,static,reinterpret,const,addrspace}_cast's.
2583 SourceLocation LAngleBracketLoc, Declarator &D,
2584 SourceLocation RAngleBracketLoc,
2585 SourceLocation LParenLoc, Expr *E,
2586 SourceLocation RParenLoc);
2587
2589 TypeSourceInfo *Ty, Expr *E,
2590 SourceRange AngleBrackets, SourceRange Parens);
2591
2593 ExprResult Operand,
2594 SourceLocation RParenLoc);
2595
2597 Expr *Operand, SourceLocation RParenLoc);
2598
2599 // Checks that reinterpret casts don't have undefined behavior.
2600 void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2601 bool IsDereference, SourceRange Range);
2602
2603 // Checks that the vector type should be initialized from a scalar
2604 // by splatting the value rather than populating a single element.
2605 // This is the case for AltiVecVector types as well as with
2606 // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
2607 bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
2608
2609 // Checks if the -faltivec-src-compat=gcc option is specified.
2610 // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
2611 // treated the same way as they are when trying to initialize
2612 // these vectors on gcc (an error is emitted).
2614 QualType SrcTy);
2615
2617 SourceLocation RParenLoc, Expr *Op);
2618
2620 SourceLocation LParenLoc,
2621 Expr *CastExpr,
2622 SourceLocation RParenLoc);
2623
2624 ///@}
2625
2626 //
2627 //
2628 // -------------------------------------------------------------------------
2629 //
2630 //
2631
2632 /// \name Extra Semantic Checking
2633 /// Implementations are in SemaChecking.cpp
2634 ///@{
2635
2636public:
2637 /// Used to change context to isConstantEvaluated without pushing a heavy
2638 /// ExpressionEvaluationContextRecord object.
2640
2645
2647 unsigned ByteNo) const;
2648
2650 FAPK_Fixed, // values to format are fixed (no C-style variadic arguments)
2651 FAPK_Variadic, // values to format are passed as variadic arguments
2652 FAPK_VAList, // values to format are passed in a va_list
2653 FAPK_Elsewhere, // values to format are not passed to this function
2654 };
2655
2656 // Used to grab the relevant information from a FormatAttr and a
2657 // FunctionDeclaration.
2663
2664 /// Given a function and its FormatAttr or FormatMatchesAttr info, attempts to
2665 /// populate the FormatStringInfo parameter with the attribute's correct
2666 /// format_idx and firstDataArg. Returns true when the format fits the
2667 /// function and the FormatStringInfo has been populated.
2668 static bool getFormatStringInfo(const Decl *Function, unsigned FormatIdx,
2669 unsigned FirstArg, FormatStringInfo *FSI);
2670 static bool getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg,
2671 bool HasImplicitThisParam, bool IsVariadic,
2672 FormatStringInfo *FSI);
2673
2674 // Used by C++ template instantiation.
2676
2677 /// ConvertVectorExpr - Handle __builtin_convertvector
2679 SourceLocation BuiltinLoc,
2680 SourceLocation RParenLoc);
2681
2682 static StringRef GetFormatStringTypeName(FormatStringType FST);
2683 static FormatStringType GetFormatStringType(StringRef FormatFlavor);
2684 static FormatStringType GetFormatStringType(const FormatAttr *Format);
2685 static FormatStringType GetFormatStringType(const FormatMatchesAttr *Format);
2686
2687 bool FormatStringHasSArg(const StringLiteral *FExpr);
2688
2689 /// Check for comparisons of floating-point values using == and !=. Issue a
2690 /// warning if the comparison is not likely to do what the programmer
2691 /// intended.
2692 void CheckFloatComparison(SourceLocation Loc, const Expr *LHS,
2693 const Expr *RHS, BinaryOperatorKind Opcode);
2694
2695 /// Register a magic integral constant to be used as a type tag.
2696 void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
2697 uint64_t MagicValue, QualType Type,
2698 bool LayoutCompatible, bool MustBeNull);
2699
2702
2706
2708
2709 /// If true, \c Type should be compared with other expression's types for
2710 /// layout-compatibility.
2711 LLVM_PREFERRED_TYPE(bool)
2713 LLVM_PREFERRED_TYPE(bool)
2714 unsigned MustBeNull : 1;
2715 };
2716
2717 /// A pair of ArgumentKind identifier and magic value. This uniquely
2718 /// identifies the magic value.
2719 typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
2720
2721 /// Diagnoses the current set of gathered accesses. This happens at the end of
2722 /// each expression evaluation context. Diagnostics are emitted only for
2723 /// accesses gathered in the current evaluation context.
2725
2726 /// This function checks if the expression is in the sef of potentially
2727 /// misaligned members and it is converted to some pointer type T with lower
2728 /// or equal alignment requirements. If so it removes it. This is used when
2729 /// we do not want to diagnose such misaligned access (e.g. in conversions to
2730 /// void*).
2731 void DiscardMisalignedMemberAddress(const Type *T, Expr *E);
2732
2733 /// Returns true if `From` is a function or pointer to a function with the
2734 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2735 /// function without this attribute.
2736 bool DiscardingCFIUncheckedCallee(QualType From, QualType To) const;
2737
2738 /// This function calls Action when it determines that E designates a
2739 /// misaligned member due to the packed attribute. This is used to emit
2740 /// local diagnostics like in reference binding.
2742 Expr *E,
2743 llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
2744 Action);
2745
2746 enum class AtomicArgumentOrder { API, AST };
2748 BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
2749 SourceLocation RParenLoc, MultiExprArg Args,
2752
2753 /// Check to see if a given expression could have '.c_str()' called on it.
2754 bool hasCStrMethod(const Expr *E);
2755
2756 /// Diagnose pointers that are always non-null.
2757 /// \param E the expression containing the pointer
2758 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
2759 /// compared to a null pointer
2760 /// \param IsEqual True when the comparison is equal to a null pointer
2761 /// \param Range Extra SourceRange to highlight in the diagnostic
2764 bool IsEqual, SourceRange Range);
2765
2766 /// CheckParmsForFunctionDef - Check that the parameters of the given
2767 /// function are appropriate for the definition of a function. This
2768 /// takes care of any checks that cannot be performed on the
2769 /// declaration itself, e.g., that the types of each of the function
2770 /// parameters are complete.
2772 bool CheckParameterNames);
2773
2774 /// CheckCastAlign - Implements -Wcast-align, which warns when a
2775 /// pointer cast increases the alignment requirements.
2776 void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2777
2778 /// checkUnsafeAssigns - Check whether +1 expr is being assigned
2779 /// to weak/__unsafe_unretained type.
2780 bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS);
2781
2782 /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
2783 /// to weak/__unsafe_unretained expression.
2784 void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS);
2785
2786 /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
2787 /// statement as a \p Body, and it is located on the same line.
2788 ///
2789 /// This helps prevent bugs due to typos, such as:
2790 /// if (condition);
2791 /// do_stuff();
2792 void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body,
2793 unsigned DiagID);
2794
2795 /// Warn if a for/while loop statement \p S, which is followed by
2796 /// \p PossibleBody, has a suspicious null statement as a body.
2797 void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody);
2798
2799 /// DiagnoseSelfMove - Emits a warning if a value is moved to itself.
2800 void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
2801 SourceLocation OpLoc);
2802
2803 bool IsLayoutCompatible(QualType T1, QualType T2) const;
2805 const TypeSourceInfo *Derived);
2806
2807 /// CheckFunctionCall - Check a direct function call for various correctness
2808 /// and safety properties not strictly enforced by the C type system.
2809 bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
2810 const FunctionProtoType *Proto);
2811
2818
2819 /// \param FPOnly restricts the arguments to floating-point types.
2820 std::optional<QualType>
2821 BuiltinVectorMath(CallExpr *TheCall,
2824 bool BuiltinVectorToScalarMath(CallExpr *TheCall);
2825
2826 void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction,
2827 const Expr *ThisArg, ArrayRef<const Expr *> Args);
2828
2829 /// Handles the checks for format strings, non-POD arguments to vararg
2830 /// functions, NULL arguments passed to non-NULL parameters, diagnose_if
2831 /// attributes and AArch64 SME attributes.
2832 void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
2833 const Expr *ThisArg, ArrayRef<const Expr *> Args,
2834 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
2835 VariadicCallType CallType);
2836
2837 /// Verify that two format strings (as understood by attribute(format) and
2838 /// attribute(format_matches) are compatible. If they are incompatible,
2839 /// diagnostics are emitted with the assumption that \c
2840 /// AuthoritativeFormatString is correct and
2841 /// \c TestedFormatString is wrong. If \c FunctionCallArg is provided,
2842 /// diagnostics will point to it and a note will refer to \c
2843 /// TestedFormatString or \c AuthoritativeFormatString as appropriate.
2844 bool
2846 const StringLiteral *AuthoritativeFormatString,
2847 const StringLiteral *TestedFormatString,
2848 const Expr *FunctionCallArg = nullptr);
2849
2850 /// Verify that one format string (as understood by attribute(format)) is
2851 /// self-consistent; for instance, that it doesn't have multiple positional
2852 /// arguments referring to the same argument in incompatible ways. Diagnose
2853 /// if it isn't.
2855
2856 /// \brief Enforce the bounds of a TCB
2857 /// CheckTCBEnforcement - Enforces that every function in a named TCB only
2858 /// directly calls other functions in the same TCB as marked by the
2859 /// enforce_tcb and enforce_tcb_leaf attributes.
2860 void CheckTCBEnforcement(const SourceLocation CallExprLoc,
2861 const NamedDecl *Callee);
2862
2863 void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
2864
2865 /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr
2866 /// TheCall is a constant expression.
2867 bool BuiltinConstantArg(CallExpr *TheCall, unsigned ArgNum,
2868 llvm::APSInt &Result);
2869
2870 /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr
2871 /// TheCall is a constant expression in the range [Low, High].
2872 bool BuiltinConstantArgRange(CallExpr *TheCall, unsigned ArgNum, int Low,
2873 int High, bool RangeIsError = true);
2874
2875 /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr
2876 /// TheCall is a constant expression is a multiple of Num..
2877 bool BuiltinConstantArgMultiple(CallExpr *TheCall, unsigned ArgNum,
2878 unsigned Multiple);
2879
2880 /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a
2881 /// constant expression representing a power of 2.
2882 bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum);
2883
2884 /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is
2885 /// a constant expression representing an arbitrary byte value shifted left by
2886 /// a multiple of 8 bits.
2887 bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, unsigned ArgNum,
2888 unsigned ArgBits);
2889
2890 /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of
2891 /// TheCall is a constant expression representing either a shifted byte value,
2892 /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression
2893 /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some
2894 /// Arm MVE intrinsics.
2895 bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, unsigned ArgNum,
2896 unsigned ArgBits);
2897
2898 /// Checks that a call expression's argument count is at least the desired
2899 /// number. This is useful when doing custom type-checking on a variadic
2900 /// function. Returns true on error.
2901 bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
2902
2903 /// Checks that a call expression's argument count is at most the desired
2904 /// number. This is useful when doing custom type-checking on a variadic
2905 /// function. Returns true on error.
2906 bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
2907
2908 /// Checks that a call expression's argument count is in the desired range.
2909 /// This is useful when doing custom type-checking on a variadic function.
2910 /// Returns true on error.
2911 bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
2912 unsigned MaxArgCount);
2913
2914 /// Checks that a call expression's argument count is the desired number.
2915 /// This is useful when doing custom type-checking. Returns true on error.
2916 bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
2917
2919
2920 /// Returns true if the argument consists of one contiguous run of 1s with any
2921 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2922 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2923 /// since all 1s are not contiguous.
2924 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2925
2927 bool *ICContext = nullptr,
2928 bool IsListInit = false);
2929
2930 /// Check for overflow behavior type related implicit conversion diagnostics.
2931 /// Returns true if OBT-related diagnostic was issued, false otherwise.
2933 SourceLocation CC);
2934
2935 bool
2940 CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr =
2942
2943private:
2944 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2945 const ArraySubscriptExpr *ASE = nullptr,
2946 bool AllowOnePastEnd = true, bool IndexNegated = false);
2947 void CheckArrayAccess(const Expr *E);
2948
2949 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2950 const FunctionProtoType *Proto);
2951
2952 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2953 /// such as function pointers returned from functions.
2954 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2955
2956 /// CheckConstructorCall - Check a constructor call for correctness and safety
2957 /// properties not enforced by the C type system.
2958 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2960 const FunctionProtoType *Proto, SourceLocation Loc);
2961
2962 /// Warn if a pointer or reference argument passed to a function points to an
2963 /// object that is less aligned than the parameter. This can happen when
2964 /// creating a typedef with a lower alignment than the original type and then
2965 /// calling functions defined in terms of the original type.
2966 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2967 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2968
2969 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2970
2971 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2972 CallExpr *TheCall);
2973
2974 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2975 CallExpr *TheCall);
2976
2977 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2978
2979 /// Argument-value fortify checks for libc functions that are not builtins,
2980 /// dispatched by name (e.g. umask). Diagnostics belong to -Wfortify-source.
2981 void checkFortifiedLibcArgument(FunctionDecl *FD, CallExpr *TheCall);
2982
2983 /// Check the arguments to '__builtin_va_start', '__builtin_ms_va_start',
2984 /// or '__builtin_c23_va_start' for validity. Emit an error and return true
2985 /// on failure; return false on success.
2986 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2987 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2988
2989 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2990 /// friends. This is declared to take (...), so we have to check everything.
2991 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2992
2993 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2994 /// __builtin_isnan and friends. This is declared to take (...), so we have
2995 /// to check everything.
2996 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2997 unsigned BuiltinID);
2998
2999 /// Perform semantic analysis for a call to __builtin_complex.
3000 bool BuiltinComplex(CallExpr *TheCall);
3001 bool BuiltinOSLogFormat(CallExpr *TheCall);
3002
3003 /// BuiltinPrefetch - Handle __builtin_prefetch.
3004 /// This is declared to take (const void*, ...) and can take two
3005 /// optional constant int args.
3006 bool BuiltinPrefetch(CallExpr *TheCall);
3007
3008 /// Handle __builtin_alloca_with_align. This is declared
3009 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
3010 /// than 8.
3011 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
3012
3013 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
3014 bool BuiltinArithmeticFence(CallExpr *TheCall);
3015
3016 /// BuiltinAssume - Handle __assume (MS Extension).
3017 /// __assume does not evaluate its arguments, and should warn if its argument
3018 /// has side effects.
3019 bool BuiltinAssume(CallExpr *TheCall);
3020
3021 /// Handle __builtin_assume_aligned. This is declared
3022 /// as (const void*, size_t, ...) and can take one optional constant int arg.
3023 bool BuiltinAssumeAligned(CallExpr *TheCall);
3024
3025 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
3026 /// This checks that the target supports __builtin_longjmp and
3027 /// that val is a constant 1.
3028 bool BuiltinLongjmp(CallExpr *TheCall);
3029
3030 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
3031 /// This checks that the target supports __builtin_setjmp.
3032 bool BuiltinSetjmp(CallExpr *TheCall);
3033
3034 /// We have a call to a function like __sync_fetch_and_add, which is an
3035 /// overloaded function based on the pointer type of its first argument.
3036 /// The main BuildCallExpr routines have already promoted the types of
3037 /// arguments because all of these calls are prototyped as void(...).
3038 ///
3039 /// This function goes through and does final semantic checking for these
3040 /// builtins, as well as generating any warnings.
3041 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
3042
3043 /// BuiltinNontemporalOverloaded - We have a call to
3044 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
3045 /// overloaded function based on the pointer type of its last argument.
3046 ///
3047 /// This function goes through and does final semantic checking for these
3048 /// builtins.
3049 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
3050 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
3052
3053 /// \param FPOnly restricts the arguments to floating-point types.
3054 bool BuiltinElementwiseMath(CallExpr *TheCall,
3057 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
3058
3059 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
3060
3061 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
3063 bool BuiltinCountedByRef(CallExpr *TheCall);
3064
3065 // Matrix builtin handling.
3066 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
3067 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
3068 ExprResult CallResult);
3069 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
3070 ExprResult CallResult);
3071
3072 /// CheckFormatArguments - Check calls to printf and scanf (and similar
3073 /// functions) for correct use of format strings.
3074 /// Returns true if a format string has been fully checked.
3075 bool CheckFormatArguments(const FormatAttr *Format,
3076 ArrayRef<const Expr *> Args, bool IsCXXMember,
3077 VariadicCallType CallType, SourceLocation Loc,
3078 SourceRange Range,
3079 llvm::SmallBitVector &CheckedVarArgs);
3080 bool CheckFormatString(const FormatMatchesAttr *Format,
3081 ArrayRef<const Expr *> Args, bool IsCXXMember,
3082 VariadicCallType CallType, SourceLocation Loc,
3083 SourceRange Range,
3084 llvm::SmallBitVector &CheckedVarArgs);
3085 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
3086 FormatArgumentPassingKind FAPK,
3087 StringLiteral *ReferenceFormatString,
3088 unsigned format_idx, unsigned firstDataArg,
3090 SourceLocation Loc, SourceRange range,
3091 llvm::SmallBitVector &CheckedVarArgs);
3092
3093 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
3094
3095 /// Warn when using the wrong abs() function.
3096 void CheckAbsoluteValueFunction(const CallExpr *Call,
3097 const FunctionDecl *FDecl);
3098
3099 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
3100
3101 /// Check for dangerous or invalid arguments to memset().
3102 ///
3103 /// This issues warnings on known problematic, dangerous or unspecified
3104 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
3105 /// function calls.
3106 ///
3107 /// \param Call The call expression to diagnose.
3108 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
3109 IdentifierInfo *FnName);
3110
3111 bool CheckSizeofMemaccessArgument(const Expr *SizeOfArg, const Expr *Dest,
3112 IdentifierInfo *FnName);
3113 // Warn if the user has made the 'size' argument to strlcpy or strlcat
3114 // be the size of the source, instead of the destination.
3115 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
3116
3117 // Warn on anti-patterns as the 'size' argument to strncat.
3118 // The correct size argument should look like following:
3119 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
3120 void CheckStrncatArguments(const CallExpr *Call,
3121 const IdentifierInfo *FnName);
3122
3123 /// Alerts the user that they are attempting to free a non-malloc'd object.
3124 void CheckFreeArguments(const CallExpr *E);
3125
3126 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
3127 SourceLocation ReturnLoc, bool isObjCMethod = false,
3128 const AttrVec *Attrs = nullptr,
3129 const FunctionDecl *FD = nullptr);
3130
3131 /// Diagnoses "dangerous" implicit conversions within the given
3132 /// expression (which is a full expression). Implements -Wconversion
3133 /// and -Wsign-compare.
3134 ///
3135 /// \param CC the "context" location of the implicit conversion, i.e.
3136 /// the most location of the syntactic entity requiring the implicit
3137 /// conversion
3138 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
3139
3140 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
3141 /// Input argument E is a logical expression.
3143
3144 /// Diagnose when expression is an integer constant expression and its
3145 /// evaluation results in integer overflow
3146 void CheckForIntOverflow(const Expr *E);
3147 void CheckUnsequencedOperations(const Expr *E);
3148
3149 /// Perform semantic checks on a completed expression. This will either
3150 /// be a full-expression or a default argument expression.
3151 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
3152 bool IsConstexpr = false);
3153
3154 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
3155 Expr *Init);
3156
3157 /// A map from magic value to type information.
3158 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
3159 TypeTagForDatatypeMagicValues;
3160
3161 /// Peform checks on a call of a function with argument_with_type_tag
3162 /// or pointer_with_type_tag attributes.
3163 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
3164 const ArrayRef<const Expr *> ExprArgs,
3165 SourceLocation CallSiteLoc);
3166
3167 /// Check if we are taking the address of a packed field
3168 /// as this may be a problem if the pointer value is dereferenced.
3169 void CheckAddressOfPackedMember(Expr *rhs);
3170
3171 /// Helper class that collects misaligned member designations and
3172 /// their location info for delayed diagnostics.
3173 struct MisalignedMember {
3174 Expr *E;
3175 RecordDecl *RD;
3176 ValueDecl *MD;
3177 CharUnits Alignment;
3178
3179 MisalignedMember() : E(), RD(), MD() {}
3180 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
3181 CharUnits Alignment)
3182 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
3183 explicit MisalignedMember(Expr *E)
3184 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
3185
3186 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
3187 };
3188
3189 /// Adds an expression to the set of gathered misaligned members.
3190 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
3191 CharUnits Alignment);
3192 ///@}
3193
3194 //
3195 //
3196 // -------------------------------------------------------------------------
3197 //
3198 //
3199
3200 /// \name C++ Coroutines
3201 /// Implementations are in SemaCoroutine.cpp
3202 ///@{
3203
3204public:
3205 /// The C++ "std::coroutine_traits" template, which is defined in
3206 /// <coroutine_traits>
3208
3210 StringRef Keyword);
3214
3217 UnresolvedLookupExpr *Lookup);
3219 Expr *Awaiter, bool IsImplicit = false);
3221 UnresolvedLookupExpr *Lookup);
3224 bool IsImplicit = false);
3229
3230 // As a clang extension, enforces that a non-coroutine function must be marked
3231 // with [[clang::coro_wrapper]] if it returns a type marked with
3232 // [[clang::coro_return_type]].
3233 // Expects that FD is not a coroutine.
3235 /// Lookup 'coroutine_traits' in std namespace and std::experimental
3236 /// namespace. The namespace found is recorded in Namespace.
3238 SourceLocation FuncLoc);
3239 /// Check that the expression co_await promise.final_suspend() shall not be
3240 /// potentially-throwing.
3241 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
3242
3243 ///@}
3244
3245 //
3246 //
3247 // -------------------------------------------------------------------------
3248 //
3249 //
3250
3251 /// \name C++ Scope Specifiers
3252 /// Implementations are in SemaCXXScopeSpec.cpp
3253 ///@{
3254
3255public:
3256 // Marks SS invalid if it represents an incomplete type.
3258 // Complete an enum decl, maybe without a scope spec.
3260 CXXScopeSpec *SS = nullptr);
3261
3262 /// Compute the DeclContext that is associated with the given type.
3263 ///
3264 /// \param T the type for which we are attempting to find a DeclContext.
3265 ///
3266 /// \returns the declaration context represented by the type T,
3267 /// or NULL if the declaration context cannot be computed (e.g., because it is
3268 /// dependent and not the current instantiation).
3270
3271 /// Compute the DeclContext that is associated with the given
3272 /// scope specifier.
3273 ///
3274 /// \param SS the C++ scope specifier as it appears in the source
3275 ///
3276 /// \param EnteringContext when true, we will be entering the context of
3277 /// this scope specifier, so we can retrieve the declaration context of a
3278 /// class template or class template partial specialization even if it is
3279 /// not the current instantiation.
3280 ///
3281 /// \returns the declaration context represented by the scope specifier @p SS,
3282 /// or NULL if the declaration context cannot be computed (e.g., because it is
3283 /// dependent and not the current instantiation).
3285 bool EnteringContext = false);
3287
3288 /// If the given nested name specifier refers to the current
3289 /// instantiation, return the declaration that corresponds to that
3290 /// current instantiation (C++0x [temp.dep.type]p1).
3291 ///
3292 /// \param NNS a dependent nested name specifier.
3294
3295 /// The parser has parsed a global nested-name-specifier '::'.
3296 ///
3297 /// \param CCLoc The location of the '::'.
3298 ///
3299 /// \param SS The nested-name-specifier, which will be updated in-place
3300 /// to reflect the parsed nested-name-specifier.
3301 ///
3302 /// \returns true if an error occurred, false otherwise.
3304
3305 /// The parser has parsed a '__super' nested-name-specifier.
3306 ///
3307 /// \param SuperLoc The location of the '__super' keyword.
3308 ///
3309 /// \param ColonColonLoc The location of the '::'.
3310 ///
3311 /// \param SS The nested-name-specifier, which will be updated in-place
3312 /// to reflect the parsed nested-name-specifier.
3313 ///
3314 /// \returns true if an error occurred, false otherwise.
3316 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
3317
3318 /// Determines whether the given declaration is an valid acceptable
3319 /// result for name lookup of a nested-name-specifier.
3320 /// \param SD Declaration checked for nested-name-specifier.
3321 /// \param IsExtension If not null and the declaration is accepted as an
3322 /// extension, the pointed variable is assigned true.
3324 bool *CanCorrect = nullptr);
3325
3326 /// If the given nested-name-specifier begins with a bare identifier
3327 /// (e.g., Base::), perform name lookup for that identifier as a
3328 /// nested-name-specifier within the given scope, and return the result of
3329 /// that name lookup.
3331
3332 /// Keeps information about an identifier in a nested-name-spec.
3333 ///
3335 /// The type of the object, if we're parsing nested-name-specifier in
3336 /// a member access expression.
3338
3339 /// The identifier preceding the '::'.
3341
3342 /// The location of the identifier.
3344
3345 /// The location of the '::'.
3347
3348 /// Creates info object for the most typical case.
3350 SourceLocation ColonColonLoc,
3353 CCLoc(ColonColonLoc) {}
3354
3356 SourceLocation ColonColonLoc, QualType ObjectType)
3358 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
3359 };
3360
3361 /// Build a new nested-name-specifier for "identifier::", as described
3362 /// by ActOnCXXNestedNameSpecifier.
3363 ///
3364 /// \param S Scope in which the nested-name-specifier occurs.
3365 /// \param IdInfo Parser information about an identifier in the
3366 /// nested-name-spec.
3367 /// \param EnteringContext If true, enter the context specified by the
3368 /// nested-name-specifier.
3369 /// \param SS Optional nested name specifier preceding the identifier.
3370 /// \param ScopeLookupResult Provides the result of name lookup within the
3371 /// scope of the nested-name-specifier that was computed at template
3372 /// definition time.
3373 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
3374 /// error recovery and what kind of recovery is performed.
3375 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
3376 /// are allowed. The bool value pointed by this parameter is set to
3377 /// 'true' if the identifier is treated as if it was followed by ':',
3378 /// not '::'.
3379 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3380 ///
3381 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
3382 /// that it contains an extra parameter \p ScopeLookupResult, which provides
3383 /// the result of name lookup within the scope of the nested-name-specifier
3384 /// that was computed at template definition time.
3385 ///
3386 /// If ErrorRecoveryLookup is true, then this call is used to improve error
3387 /// recovery. This means that it should not emit diagnostics, it should
3388 /// just return true on failure. It also means it should only return a valid
3389 /// scope if it *knows* that the result is correct. It should not return in a
3390 /// dependent context, for example. Nor will it extend \p SS with the scope
3391 /// specifier.
3392 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3393 bool EnteringContext, CXXScopeSpec &SS,
3394 NamedDecl *ScopeLookupResult,
3395 bool ErrorRecoveryLookup,
3396 bool *IsCorrectedToColon = nullptr,
3397 bool OnlyNamespace = false);
3398
3399 /// The parser has parsed a nested-name-specifier 'identifier::'.
3400 ///
3401 /// \param S The scope in which this nested-name-specifier occurs.
3402 ///
3403 /// \param IdInfo Parser information about an identifier in the
3404 /// nested-name-spec.
3405 ///
3406 /// \param EnteringContext Whether we're entering the context nominated by
3407 /// this nested-name-specifier.
3408 ///
3409 /// \param SS The nested-name-specifier, which is both an input
3410 /// parameter (the nested-name-specifier before this type) and an
3411 /// output parameter (containing the full nested-name-specifier,
3412 /// including this new type).
3413 ///
3414 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
3415 /// are allowed. The bool value pointed by this parameter is set to 'true'
3416 /// if the identifier is treated as if it was followed by ':', not '::'.
3417 ///
3418 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3419 ///
3420 /// \returns true if an error occurred, false otherwise.
3421 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3422 bool EnteringContext, CXXScopeSpec &SS,
3423 bool *IsCorrectedToColon = nullptr,
3424 bool OnlyNamespace = false);
3425
3426 /// The parser has parsed a nested-name-specifier
3427 /// 'template[opt] template-name < template-args >::'.
3428 ///
3429 /// \param S The scope in which this nested-name-specifier occurs.
3430 ///
3431 /// \param SS The nested-name-specifier, which is both an input
3432 /// parameter (the nested-name-specifier before this type) and an
3433 /// output parameter (containing the full nested-name-specifier,
3434 /// including this new type).
3435 ///
3436 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
3437 /// \param TemplateName the template name.
3438 /// \param TemplateNameLoc The location of the template name.
3439 /// \param LAngleLoc The location of the opening angle bracket ('<').
3440 /// \param TemplateArgs The template arguments.
3441 /// \param RAngleLoc The location of the closing angle bracket ('>').
3442 /// \param CCLoc The location of the '::'.
3443 ///
3444 /// \param EnteringContext Whether we're entering the context of the
3445 /// nested-name-specifier.
3446 ///
3447 ///
3448 /// \returns true if an error occurred, false otherwise.
3450 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
3451 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
3452 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
3453 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
3454
3456 SourceLocation ColonColonLoc);
3457
3459 const DeclSpec &DS,
3460 SourceLocation ColonColonLoc,
3461 QualType Type);
3462
3463 /// IsInvalidUnlessNestedName - This method is used for error recovery
3464 /// purposes to determine whether the specified identifier is only valid as
3465 /// a nested name specifier, for example a namespace name. It is
3466 /// conservatively correct to always return false from this method.
3467 ///
3468 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
3470 NestedNameSpecInfo &IdInfo,
3471 bool EnteringContext);
3472
3473 /// Given a C++ nested-name-specifier, produce an annotation value
3474 /// that the parser can use later to reconstruct the given
3475 /// nested-name-specifier.
3476 ///
3477 /// \param SS A nested-name-specifier.
3478 ///
3479 /// \returns A pointer containing all of the information in the
3480 /// nested-name-specifier \p SS.
3482
3483 /// Given an annotation pointer for a nested-name-specifier, restore
3484 /// the nested-name-specifier structure.
3485 ///
3486 /// \param Annotation The annotation pointer, produced by
3487 /// \c SaveNestedNameSpecifierAnnotation().
3488 ///
3489 /// \param AnnotationRange The source range corresponding to the annotation.
3490 ///
3491 /// \param SS The nested-name-specifier that will be updated with the contents
3492 /// of the annotation pointer.
3493 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
3494 SourceRange AnnotationRange,
3495 CXXScopeSpec &SS);
3496
3497 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
3498
3499 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
3500 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
3501 /// After this method is called, according to [C++ 3.4.3p3], names should be
3502 /// looked up in the declarator-id's scope, until the declarator is parsed and
3503 /// ActOnCXXExitDeclaratorScope is called.
3504 /// The 'SS' should be a non-empty valid CXXScopeSpec.
3506
3507 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
3508 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
3509 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
3510 /// Used to indicate that names should revert to being looked up in the
3511 /// defining scope.
3513
3514 ///@}
3515
3516 //
3517 //
3518 // -------------------------------------------------------------------------
3519 //
3520 //
3521
3522 /// \name Declarations
3523 /// Implementations are in SemaDecl.cpp
3524 ///@{
3525
3526public:
3528
3529 /// The index of the first InventedParameterInfo that refers to the current
3530 /// context.
3532
3533 /// A RAII object to temporarily push a declaration context.
3535 private:
3536 Sema &S;
3537 DeclContext *SavedContext;
3538 ProcessingContextState SavedContextState;
3539 QualType SavedCXXThisTypeOverride;
3540 unsigned SavedFunctionScopesStart;
3541 unsigned SavedInventedParameterInfosStart;
3542
3543 public:
3544 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3545 : S(S), SavedContext(S.CurContext),
3546 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3547 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3548 SavedFunctionScopesStart(S.FunctionScopesStart),
3549 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3550 assert(ContextToPush && "pushing null context");
3551 S.CurContext = ContextToPush;
3552 if (NewThisContext)
3553 S.CXXThisTypeOverride = QualType();
3554 // Any saved FunctionScopes do not refer to this context.
3555 S.FunctionScopesStart = S.FunctionScopes.size();
3556 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3557 }
3558
3559 void pop() {
3560 if (!SavedContext)
3561 return;
3562 S.CurContext = SavedContext;
3563 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3564 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3565 S.FunctionScopesStart = SavedFunctionScopesStart;
3566 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3567 SavedContext = nullptr;
3568 }
3569
3571 ContextRAII(const ContextRAII &) = delete;
3573 };
3574
3575 void DiagnoseInvalidJumps(Stmt *Body);
3576
3577 /// The function definitions which were renamed as part of typo-correction
3578 /// to match their respective declarations. We want to keep track of them
3579 /// to ensure that we don't emit a "redefinition" error if we encounter a
3580 /// correctly named definition after the renamed definition.
3582
3583 /// A cache of the flags available in enumerations with the flag_enum
3584 /// attribute.
3585 mutable llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3586
3587 /// A cache of enumerator values for enums checked by -Wassign-enum.
3588 llvm::DenseMap<const EnumDecl *, llvm::SmallVector<llvm::APSInt>>
3590
3591 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3592 /// declared. Rare. May alias another identifier, declared or undeclared.
3593 ///
3594 /// For aliases, the target identifier is used as a key for eventual
3595 /// processing when the target is declared. For the single-identifier form,
3596 /// the sole identifier is used as the key. Each entry is a `SetVector`
3597 /// (ordered by parse order) of aliases (identified by the alias name) in case
3598 /// of multiple aliases to the same undeclared identifier.
3599 llvm::MapVector<
3601 llvm::SetVector<
3603 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3605
3606 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3607 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3608 /// to define functions that occur in multiple standards to call the version
3609 /// in the currently selected standard.
3610 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>
3612
3613 /// Set containing all typedefs that are likely unused.
3616
3617 /// Store UnusedLocalTypedefNameCandidates in \p Sorted in a deterministic
3618 /// order.
3621
3622 typedef LazyVector<const DeclaratorDecl *,
3625
3626 /// The set of file scoped decls seen so far that have not been used
3627 /// and must warn if not used. Only contains the first declaration.
3629
3631 2, 2>
3633
3634 /// All the tentative definitions encountered in the TU.
3636
3637 /// All the external declarations encoutered and used in the TU.
3639
3640 /// Generally null except when we temporarily switch decl contexts,
3641 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3643
3644 /// Is the module scope we are in a C++ Header Unit?
3646 return ModuleScopes.empty() ? false
3647 : ModuleScopes.back().Module->isHeaderUnit();
3648 }
3649
3650 /// Get the module owning an entity.
3651 Module *getOwningModule(const Decl *Entity) {
3652 return Entity->getOwningModule();
3653 }
3654
3655 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3656
3658 /// Returns the TypeDeclType for the given type declaration,
3659 /// as ASTContext::getTypeDeclType would, but
3660 /// performs the required semantic checks for name lookup of said entity.
3661 void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD,
3662 SourceLocation NameLoc);
3663
3664 /// If the identifier refers to a type name within this scope,
3665 /// return the declaration of that type.
3666 ///
3667 /// This routine performs ordinary name lookup of the identifier II
3668 /// within the given scope, with optional C++ scope specifier SS, to
3669 /// determine whether the name refers to a type. If so, returns an
3670 /// opaque pointer (actually a QualType) corresponding to that
3671 /// type. Otherwise, returns NULL.
3673 Scope *S, CXXScopeSpec *SS = nullptr,
3674 bool isClassName = false, bool HasTrailingDot = false,
3675 ParsedType ObjectType = nullptr,
3676 bool IsCtorOrDtorName = false,
3677 bool WantNontrivialTypeSourceInfo = false,
3678 bool IsClassTemplateDeductionContext = true,
3679 ImplicitTypenameContext AllowImplicitTypename =
3681 IdentifierInfo **CorrectedII = nullptr);
3682
3683 /// isTagName() - This method is called *for error recovery purposes only*
3684 /// to determine if the specified name is a valid tag name ("struct foo"). If
3685 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3686 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3687 /// diagnose cases in C where the user forgot to specify the tag.
3689
3690 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3691 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3692 /// then downgrade the missing typename error to a warning.
3693 /// This is needed for MSVC compatibility; Example:
3694 /// @code
3695 /// template<class T> class A {
3696 /// public:
3697 /// typedef int TYPE;
3698 /// };
3699 /// template<class T> class B : public A<T> {
3700 /// public:
3701 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3702 /// };
3703 /// @endcode
3704 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3706 Scope *S, CXXScopeSpec *SS,
3707 ParsedType &SuggestedType,
3708 bool IsTemplateName = false);
3709
3710 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3711 /// type name has failed in a dependent context. In these situations, we
3712 /// automatically form a DependentTypeName that will retry lookup in a related
3713 /// scope during instantiation.
3715 SourceLocation NameLoc,
3716 bool IsTemplateTypeArg);
3717
3718 class NameClassification {
3720 union {
3725 };
3726
3727 explicit NameClassification(NameClassificationKind Kind) : Kind(Kind) {}
3728
3729 public:
3732
3735
3736 static NameClassification Error() {
3737 return NameClassification(NameClassificationKind::Error);
3738 }
3739
3740 static NameClassification Unknown() {
3741 return NameClassification(NameClassificationKind::Unknown);
3742 }
3743
3744 static NameClassification OverloadSet(ExprResult E) {
3745 NameClassification Result(NameClassificationKind::OverloadSet);
3746 Result.Expr = E;
3747 return Result;
3748 }
3749
3750 static NameClassification NonType(NamedDecl *D) {
3751 NameClassification Result(NameClassificationKind::NonType);
3752 Result.NonTypeDecl = D;
3753 return Result;
3754 }
3755
3756 static NameClassification UndeclaredNonType() {
3757 return NameClassification(NameClassificationKind::UndeclaredNonType);
3758 }
3759
3760 static NameClassification DependentNonType() {
3761 return NameClassification(NameClassificationKind::DependentNonType);
3762 }
3763
3764 static NameClassification TypeTemplate(TemplateName Name) {
3765 NameClassification Result(NameClassificationKind::TypeTemplate);
3766 Result.Template = Name;
3767 return Result;
3768 }
3769
3770 static NameClassification VarTemplate(TemplateName Name) {
3771 NameClassification Result(NameClassificationKind::VarTemplate);
3772 Result.Template = Name;
3773 return Result;
3774 }
3775
3776 static NameClassification FunctionTemplate(TemplateName Name) {
3778 Result.Template = Name;
3779 return Result;
3780 }
3781
3782 static NameClassification Concept(TemplateName Name) {
3783 NameClassification Result(NameClassificationKind::Concept);
3784 Result.Template = Name;
3785 return Result;
3786 }
3787
3788 static NameClassification UndeclaredTemplate(TemplateName Name) {
3790 Result.Template = Name;
3791 return Result;
3792 }
3793
3794 NameClassificationKind getKind() const { return Kind; }
3795
3798 return Expr;
3799 }
3800
3802 assert(Kind == NameClassificationKind::Type);
3803 return Type;
3804 }
3805
3807 assert(Kind == NameClassificationKind::NonType);
3808 return NonTypeDecl;
3809 }
3810
3819
3821 switch (Kind) {
3823 return TNK_Type_template;
3825 return TNK_Function_template;
3827 return TNK_Var_template;
3829 return TNK_Concept_template;
3832 default:
3833 llvm_unreachable("unsupported name classification.");
3834 }
3835 }
3836 };
3837
3838 /// Perform name lookup on the given name, classifying it based on
3839 /// the results of name lookup and the following token.
3840 ///
3841 /// This routine is used by the parser to resolve identifiers and help direct
3842 /// parsing. When the identifier cannot be found, this routine will attempt
3843 /// to correct the typo and classify based on the resulting name.
3844 ///
3845 /// \param S The scope in which we're performing name lookup.
3846 ///
3847 /// \param SS The nested-name-specifier that precedes the name.
3848 ///
3849 /// \param Name The identifier. If typo correction finds an alternative name,
3850 /// this pointer parameter will be updated accordingly.
3851 ///
3852 /// \param NameLoc The location of the identifier.
3853 ///
3854 /// \param NextToken The token following the identifier. Used to help
3855 /// disambiguate the name.
3856 ///
3857 /// \param CCC The correction callback, if typo correction is desired.
3858 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3859 IdentifierInfo *&Name, SourceLocation NameLoc,
3860 const Token &NextToken,
3861 CorrectionCandidateCallback *CCC = nullptr);
3862
3863 /// Act on the result of classifying a name as an undeclared (ADL-only)
3864 /// non-type declaration.
3866 SourceLocation NameLoc);
3867 /// Act on the result of classifying a name as an undeclared member of a
3868 /// dependent base class.
3870 IdentifierInfo *Name,
3871 SourceLocation NameLoc,
3872 bool IsAddressOfOperand);
3873 /// Act on the result of classifying a name as a specific non-type
3874 /// declaration.
3877 SourceLocation NameLoc,
3878 const Token &NextToken);
3879 /// Act on the result of classifying a name as an overload set.
3881
3882 /// Describes the detailed kind of a template name. Used in diagnostics.
3894
3895 /// Determine whether it's plausible that E was intended to be a
3896 /// template-name.
3898 if (!getLangOpts().CPlusPlus || E.isInvalid())
3899 return false;
3900 Dependent = false;
3901 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3902 return !DRE->hasExplicitTemplateArgs();
3903 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3904 return !ME->hasExplicitTemplateArgs();
3905 Dependent = true;
3906 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3907 return !DSDRE->hasExplicitTemplateArgs();
3908 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3909 return !DSME->hasExplicitTemplateArgs();
3910 // Any additional cases recognized here should also be handled by
3911 // diagnoseExprIntendedAsTemplateName.
3912 return false;
3913 }
3914
3915 void warnOnReservedIdentifier(const NamedDecl *D);
3917
3918 void ProcessPragmaExport(DeclaratorDecl *newDecl);
3919
3921
3923 MultiTemplateParamsArg TemplateParameterLists);
3924
3925 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3926 /// true if we were successful.
3928 SourceLocation Loc,
3929 unsigned FailedFoldDiagID);
3930
3931 /// Register the given locally-scoped extern "C" declaration so
3932 /// that it can be found later for redeclarations. We include any extern "C"
3933 /// declaration that is not visible in the translation unit here, not just
3934 /// function-scope declarations.
3936
3937 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3938 /// If T is the name of a class, then each of the following shall have a
3939 /// name different from T:
3940 /// - every static data member of class T;
3941 /// - every member function of class T
3942 /// - every member of class T that is itself a type;
3943 /// \returns true if the declaration name violates these rules.
3945
3946 /// Diagnose a declaration whose declarator-id has the given
3947 /// nested-name-specifier.
3948 ///
3949 /// \param SS The nested-name-specifier of the declarator-id.
3950 ///
3951 /// \param DC The declaration context to which the nested-name-specifier
3952 /// resolves.
3953 ///
3954 /// \param Name The name of the entity being declared.
3955 ///
3956 /// \param Loc The location of the name of the entity being declared.
3957 ///
3958 /// \param IsMemberSpecialization Whether we are declaring a member
3959 /// specialization.
3960 ///
3961 /// \param TemplateId The template-id, if any.
3962 ///
3963 /// \returns true if we cannot safely recover from this error, false
3964 /// otherwise.
3967 TemplateIdAnnotation *TemplateId,
3968 bool IsMemberSpecialization);
3969
3971
3972 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3973
3975 unsigned &IntVal);
3976
3977 /// Diagnose function specifiers on a declaration of an identifier that
3978 /// does not identify a function.
3979 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3980
3981 /// Return the declaration shadowed by the given typedef \p D, or null
3982 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3984 const LookupResult &R);
3985
3986 /// Return the declaration shadowed by the given variable \p D, or null
3987 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3989
3990 /// Return the declaration shadowed by the given variable \p D, or null
3991 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3993 const LookupResult &R);
3994 /// Diagnose variable or built-in function shadowing. Implements
3995 /// -Wshadow.
3996 ///
3997 /// This method is called whenever a VarDecl is added to a "useful"
3998 /// scope.
3999 ///
4000 /// \param ShadowedDecl the declaration that is shadowed by the given variable
4001 /// \param R the lookup of the name
4002 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
4003 const LookupResult &R);
4004
4005 /// Check -Wshadow without the advantage of a previous lookup.
4006 void CheckShadow(Scope *S, VarDecl *D);
4007
4008 /// Warn if 'E', which is an expression that is about to be modified, refers
4009 /// to a shadowing declaration.
4011
4012 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
4013 /// when these variables are captured by the lambda.
4015
4016 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
4017 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
4018 TypedefNameDecl *NewTD);
4021 TypeSourceInfo *TInfo,
4023
4024 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
4025 /// declares a typedef-name, either using the 'typedef' type specifier or via
4026 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
4030 TypeSourceInfo *TInfo,
4032 MultiTemplateParamsArg TemplateParamLists,
4033 bool &AddToScope,
4035
4036private:
4037 // Perform a check on an AsmLabel to verify its consistency and emit
4038 // diagnostics in case of an error.
4039 void CheckAsmLabel(Scope *S, Expr *AsmLabelExpr, StorageClass SC,
4040 TypeSourceInfo *TInfo, VarDecl *);
4041
4042public:
4043 /// Perform semantic checking on a newly-created variable
4044 /// declaration.
4045 ///
4046 /// This routine performs all of the type-checking required for a
4047 /// variable declaration once it has been built. It is used both to
4048 /// check variables after they have been parsed and their declarators
4049 /// have been translated into a declaration, and to check variables
4050 /// that have been instantiated from a template.
4051 ///
4052 /// Sets NewVD->isInvalidDecl() if an error was encountered.
4053 ///
4054 /// Returns true if the variable declaration is a redeclaration.
4055 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
4056 void CheckVariableDeclarationType(VarDecl *NewVD);
4057 void CheckCompleteVariableDeclaration(VarDecl *VD);
4058
4059 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
4060 TypeSourceInfo *TInfo,
4061 LookupResult &Previous,
4062 MultiTemplateParamsArg TemplateParamLists,
4063 bool &AddToScope);
4064
4065 /// Attach the ABI tag a standard calling convention variant requires, as an
4066 /// implicit abi_tag attribute. Call this once the function type is final.
4067 void addImplicitCallingConvAbiTag(FunctionDecl *FD);
4068
4069 /// AddOverriddenMethods - See if a method overrides any in the base classes,
4070 /// and if so, check that it's a valid override and remember it.
4071 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
4072
4073 /// Perform semantic checking of a new function declaration.
4074 ///
4075 /// Performs semantic analysis of the new function declaration
4076 /// NewFD. This routine performs all semantic checking that does not
4077 /// require the actual declarator involved in the declaration, and is
4078 /// used both for the declaration of functions as they are parsed
4079 /// (called via ActOnDeclarator) and for the declaration of functions
4080 /// that have been instantiated via C++ template instantiation (called
4081 /// via InstantiateDecl).
4082 ///
4083 /// \param IsMemberSpecialization whether this new function declaration is
4084 /// a member specialization (that replaces any definition provided by the
4085 /// previous declaration).
4086 ///
4087 /// This sets NewFD->isInvalidDecl() to true if there was an error.
4088 ///
4089 /// \returns true if the function declaration is a redeclaration.
4090 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
4091 LookupResult &Previous,
4092 bool IsMemberSpecialization, bool DeclIsDefn);
4093
4094 /// Checks if the new declaration declared in dependent context must be
4095 /// put in the same redeclaration chain as the specified declaration.
4096 ///
4097 /// \param D Declaration that is checked.
4098 /// \param PrevDecl Previous declaration found with proper lookup method for
4099 /// the same declaration name.
4100 /// \returns True if D must be added to the redeclaration chain which PrevDecl
4101 /// belongs to.
4102 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
4103
4104 /// Determines if we can perform a correct type check for \p D as a
4105 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
4106 /// best-effort check.
4107 ///
4108 /// \param NewD The new declaration.
4109 /// \param OldD The old declaration.
4110 /// \param NewT The portion of the type of the new declaration to check.
4111 /// \param OldT The portion of the type of the old declaration to check.
4112 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
4113 QualType NewT, QualType OldT);
4114 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
4115 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
4116
4117 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
4118 /// containing class. Otherwise it will return implicit SectionAttr if the
4119 /// function is a definition and there is an active value on CodeSegStack
4120 /// (from the current #pragma code-seg value).
4121 ///
4122 /// \param FD Function being declared.
4123 /// \param IsDefinition Whether it is a definition or just a declaration.
4124 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
4125 /// nullptr if no attribute should be added.
4126 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
4127 bool IsDefinition);
4128
4129 /// Common checks for a parameter-declaration that should apply to both
4130 /// function parameters and non-type template parameters.
4131 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
4132
4133 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
4134 /// to introduce parameters into function prototype scope.
4135 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
4136 SourceLocation ExplicitThisLoc = {});
4137
4138 /// Synthesizes a variable for a parameter arising from a
4139 /// typedef.
4140 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
4141 QualType T);
4142 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
4143 SourceLocation NameLoc,
4144 const IdentifierInfo *Name, QualType T,
4145 TypeSourceInfo *TSInfo, StorageClass SC);
4146
4147 /// Emit diagnostics if the initializer or any of its explicit or
4148 /// implicitly-generated subexpressions require copying or
4149 /// default-initializing a type that is or contains a C union type that is
4150 /// non-trivial to copy or default-initialize.
4151 void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
4152
4153 // These flags are passed to checkNonTrivialCUnion.
4159
4160 /// Emit diagnostics if a non-trivial C union type or a struct that contains
4161 /// a non-trivial C union is used in an invalid context.
4163 NonTrivialCUnionContext UseContext,
4164 unsigned NonTrivialKind);
4165
4166 /// Certain globally-unique variables might be accidentally duplicated if
4167 /// built into multiple shared libraries with hidden visibility. This can
4168 /// cause problems if the variable is mutable, its initialization is
4169 /// effectful, or its address is taken.
4172
4173 /// AddInitializerToDecl - Adds the initializer Init to the
4174 /// declaration dcl. If DirectInit is true, this is C++ direct
4175 /// initialization rather than copy initialization.
4176 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
4177 void ActOnUninitializedDecl(Decl *dcl);
4178
4179 /// ActOnInitializerError - Given that there was an error parsing an
4180 /// initializer for the given declaration, try to at least re-establish
4181 /// invariants such as whether a variable's type is either dependent or
4182 /// complete.
4183 void ActOnInitializerError(Decl *Dcl);
4184
4185 void ActOnCXXForRangeDecl(Decl *D, bool InExpansionStmt);
4187 IdentifierInfo *Ident,
4188 ParsedAttributes &Attrs);
4189
4190 /// Check if VD needs to be dllexport/dllimport due to being in a
4191 /// dllexport/import function.
4194
4195 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
4196 /// any semantic actions necessary after any initializer has been attached.
4197 void FinalizeDeclaration(Decl *D);
4199 ArrayRef<Decl *> Group);
4200
4201 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
4202 /// group, performing any necessary semantic checking.
4204
4205 /// Should be called on all declarations that might have attached
4206 /// documentation comments.
4207 void ActOnDocumentableDecl(Decl *D);
4209
4210 enum class FnBodyKind {
4211 /// C++26 [dcl.fct.def.general]p1
4212 /// function-body:
4213 /// ctor-initializer[opt] compound-statement
4214 /// function-try-block
4216 /// = default ;
4218 /// deleted-function-body
4219 ///
4220 /// deleted-function-body:
4221 /// = delete ;
4222 /// = delete ( unevaluated-string ) ;
4224 };
4225
4227 SourceLocation LocAfterDecls);
4229 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
4230 SkipBodyInfo *SkipBody = nullptr);
4232 MultiTemplateParamsArg TemplateParamLists,
4233 SkipBodyInfo *SkipBody = nullptr,
4234 FnBodyKind BodyKind = FnBodyKind::Other);
4236 SkipBodyInfo *SkipBody = nullptr,
4237 FnBodyKind BodyKind = FnBodyKind::Other);
4239
4240 /// Determine whether we can delay parsing the body of a function or
4241 /// function template until it is used, assuming we don't care about emitting
4242 /// code for that function.
4243 ///
4244 /// This will be \c false if we may need the body of the function in the
4245 /// middle of parsing an expression (where it's impractical to switch to
4246 /// parsing a different function), for instance, if it's constexpr in C++11
4247 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
4248 bool canDelayFunctionBody(const Declarator &D);
4249
4250 /// Determine whether we can skip parsing the body of a function
4251 /// definition, assuming we don't care about analyzing its body or emitting
4252 /// code for that function.
4253 ///
4254 /// This will be \c false only if we may need the body of the function in
4255 /// order to parse the rest of the program (for instance, if it is
4256 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
4257 bool canSkipFunctionBody(Decl *D);
4258
4259 /// Given the set of return statements within a function body,
4260 /// compute the variables that are subject to the named return value
4261 /// optimization.
4262 ///
4263 /// Each of the variables that is subject to the named return value
4264 /// optimization will be marked as NRVO variables in the AST, and any
4265 /// return statement that has a marked NRVO variable as its NRVO candidate can
4266 /// use the named return value optimization.
4267 ///
4268 /// This function applies a very simplistic algorithm for NRVO: if every
4269 /// return statement in the scope of a variable has the same NRVO candidate,
4270 /// that candidate is an NRVO variable.
4272
4273 /// Performs semantic analysis at the end of a function body.
4274 ///
4275 /// \param RetainFunctionScopeInfo If \c true, the client is responsible for
4276 /// releasing the associated \p FunctionScopeInfo. This is useful when
4277 /// building e.g. LambdaExprs.
4279 bool IsInstantiation = false,
4280 bool RetainFunctionScopeInfo = false);
4283
4284 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
4285 /// attribute for which parsing is delayed.
4287
4288 /// Diagnose any unused parameters in the given sequence of
4289 /// ParmVarDecl pointers.
4291
4292 /// Diagnose whether the size of parameters or return value of a
4293 /// function or obj-c method definition is pass-by-value and larger than a
4294 /// specified threshold.
4295 void
4297 QualType ReturnTy, NamedDecl *D);
4298
4300 SourceLocation RParenLoc);
4301
4304
4305 void ActOnPopScope(SourceLocation Loc, Scope *S);
4306
4307 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4308 /// no declarator (e.g. "struct foo;") is parsed.
4310 const ParsedAttributesView &DeclAttrs,
4311 RecordDecl *&AnonRecord);
4312
4313 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4314 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
4315 /// parameters to cope with template friend declarations.
4317 const ParsedAttributesView &DeclAttrs,
4318 MultiTemplateParamsArg TemplateParams,
4319 bool IsExplicitInstantiation,
4320 RecordDecl *&AnonRecord,
4321 SourceLocation EllipsisLoc = {});
4322
4323 /// BuildAnonymousStructOrUnion - Handle the declaration of an
4324 /// anonymous structure or union. Anonymous unions are a C++ feature
4325 /// (C++ [class.union]) and a C11 feature; anonymous structures
4326 /// are a C11 feature and GNU C++ extension.
4327 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
4328 RecordDecl *Record,
4329 const PrintingPolicy &Policy);
4330
4331 /// Called once it is known whether
4332 /// a tag declaration is an anonymous union or struct.
4334
4335 /// Emit diagnostic warnings for placeholder members.
4336 /// We can only do that after the class is fully constructed,
4337 /// as anonymous union/structs can insert placeholders
4338 /// in their parent scope (which might be a Record).
4340
4341 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
4342 /// Microsoft C anonymous structure.
4343 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
4344 /// Example:
4345 ///
4346 /// struct A { int a; };
4347 /// struct B { struct A; int b; };
4348 ///
4349 /// void foo() {
4350 /// B var;
4351 /// var.a = 3;
4352 /// }
4353 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
4354 RecordDecl *Record);
4355
4356 /// Given a non-tag type declaration, returns an enum useful for indicating
4357 /// what kind of non-tag type this is.
4358 NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK);
4359
4360 /// Determine whether a tag with a given kind is acceptable
4361 /// as a redeclaration of the given tag declaration.
4362 ///
4363 /// \returns true if the new tag kind is acceptable, false otherwise.
4365 bool isDefinition, SourceLocation NewTagLoc,
4366 const IdentifierInfo *Name);
4367
4368 /// This is invoked when we see 'struct foo' or 'struct {'. In the
4369 /// former case, Name will be non-null. In the later case, Name will be null.
4370 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
4371 /// a reference/declaration/definition of a tag.
4372 ///
4373 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
4374 /// trailing-type-specifier) other than one in an alias-declaration.
4375 ///
4376 /// \param SkipBody If non-null, will be set to indicate if the caller should
4377 /// skip the definition of this tag and treat it as if it were a declaration.
4378 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
4379 SourceLocation KWLoc, CXXScopeSpec &SS,
4380 IdentifierInfo *Name, SourceLocation NameLoc,
4381 const ParsedAttributesView &Attr, AccessSpecifier AS,
4382 SourceLocation ModulePrivateLoc,
4383 MultiTemplateParamsArg TemplateParameterLists,
4384 bool &OwnedDecl, bool &IsDependent,
4385 SourceLocation ScopedEnumKWLoc,
4386 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
4387 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
4388 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
4389
4390 /// ActOnField - Each field of a C struct/union is passed into this in order
4391 /// to create a FieldDecl object for it.
4392 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
4393 Declarator &D, Expr *BitfieldWidth);
4394
4395 /// HandleField - Analyze a field of a C struct or a C++ data member.
4396 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
4397 Declarator &D, Expr *BitfieldWidth,
4398 InClassInitStyle InitStyle, AccessSpecifier AS);
4399
4400 /// Build a new FieldDecl and check its well-formedness.
4401 ///
4402 /// This routine builds a new FieldDecl given the fields name, type,
4403 /// record, etc. \p PrevDecl should refer to any previous declaration
4404 /// with the same name and in the same scope as the field to be
4405 /// created.
4406 ///
4407 /// \returns a new FieldDecl.
4408 ///
4409 /// \todo The Declarator argument is a hack. It will be removed once
4410 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
4411 TypeSourceInfo *TInfo, RecordDecl *Record,
4412 SourceLocation Loc, bool Mutable,
4413 Expr *BitfieldWidth, InClassInitStyle InitStyle,
4414 SourceLocation TSSL, AccessSpecifier AS,
4415 NamedDecl *PrevDecl, Declarator *D = nullptr);
4416
4418
4419 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
4420 /// class and class extensions. For every class \@interface and class
4421 /// extension \@interface, if the last ivar is a bitfield of any type,
4422 /// then add an implicit `char :0` ivar to the end of that interface.
4423 void ActOnLastBitfield(SourceLocation DeclStart,
4424 SmallVectorImpl<Decl *> &AllIvarDecls);
4425
4426 // This is used for both record definitions and ObjC interface declarations.
4427 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
4428 ArrayRef<Decl *> Fields, SourceLocation LBrac,
4429 SourceLocation RBrac, const ParsedAttributesView &AttrList);
4430
4431 /// ActOnTagStartDefinition - Invoked when we have entered the
4432 /// scope of a tag's definition (e.g., for an enumeration, class,
4433 /// struct, or union).
4434 void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
4435
4436 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
4437 /// Differently from C++, actually parse the body and reject / error out
4438 /// in case of a structural mismatch.
4439 bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody);
4440
4442
4443 /// Invoked when we enter a tag definition that we're skipping.
4445
4446 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
4447 /// C++ record definition's base-specifiers clause and are starting its
4448 /// member declarations.
4450 SourceLocation FinalLoc,
4451 bool IsFinalSpelledSealed,
4452 bool IsAbstract,
4453 SourceLocation LBraceLoc);
4454
4455 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
4456 /// the definition of a tag (enumeration, class, struct, or union).
4458 SourceRange BraceRange);
4459
4462
4464
4465 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
4466 /// error parsing the definition of a tag.
4468
4470 EnumConstantDecl *LastEnumConst,
4471 SourceLocation IdLoc, IdentifierInfo *Id,
4472 Expr *val);
4473
4474 /// Check that this is a valid underlying type for an enum declaration.
4476
4477 /// Check whether this is a valid redeclaration of a previous enumeration.
4478 /// \return true if the redeclaration was invalid.
4479 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
4480 QualType EnumUnderlyingTy, bool IsFixed,
4481 const EnumDecl *Prev);
4482
4483 /// Determine whether the body of an anonymous enumeration should be skipped.
4484 /// \param II The name of the first enumerator.
4486 SourceLocation IILoc);
4487
4488 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
4489 SourceLocation IdLoc, IdentifierInfo *Id,
4490 const ParsedAttributesView &Attrs,
4491 SourceLocation EqualLoc, Expr *Val,
4492 SkipBodyInfo *SkipBody = nullptr);
4493 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
4494 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
4495 const ParsedAttributesView &Attr);
4496
4497 /// Set the current declaration context until it gets popped.
4498 void PushDeclContext(Scope *S, DeclContext *DC);
4499 void PopDeclContext();
4500
4501 /// EnterDeclaratorContext - Used when we must lookup names in the context
4502 /// of a declarator's nested name specifier.
4505
4506 /// Enter a template parameter scope, after it's been associated with a
4507 /// particular DeclContext. Causes lookup within the scope to chain through
4508 /// enclosing contexts in the correct order.
4510
4511 /// Push the parameters of D, which must be a function, into scope.
4514
4515 /// Add this decl to the scope shadowed decl chains.
4516 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4517
4518 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4519 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4520 /// true if 'D' belongs to the given declaration context.
4521 ///
4522 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4523 /// enclosing namespace set of the context, rather than contained
4524 /// directly within it.
4525 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4526 bool AllowInlineNamespace = false) const;
4527
4528 /// Determine whether a tag-like declaration found by lookup can be
4529 /// redeclared in the given scope. If lookup found a using-shadow, also
4530 /// consider the scope of the declaration named by the using-shadow.
4532 Scope *S = nullptr,
4533 bool AllowInlineNamespace = false) const;
4534
4535 /// Finds the scope corresponding to the given decl context, if it
4536 /// happens to be an enclosing scope. Otherwise return NULL.
4538
4539 /// Subroutines of ActOnDeclarator().
4541 TypeSourceInfo *TInfo);
4543
4544 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4546 NamedDecl *New, Decl *Old,
4548
4549 /// CheckAttributesOnDeducedType - Calls Sema functions for attributes that
4550 /// requires the type to be deduced.
4552
4553 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4554 /// same name and scope as a previous declaration 'Old'. Figure out
4555 /// how to resolve this situation, merging decls or emitting
4556 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4558 LookupResult &OldDecls);
4559
4560 /// CleanupMergedEnum - We have just merged the decl 'New' by making another
4561 /// definition visible.
4562 /// This method performs any necessary cleanup on the parser state to discard
4563 /// child nodes from newly parsed decl we are retiring.
4564 void CleanupMergedEnum(Scope *S, Decl *New);
4565
4566 /// MergeFunctionDecl - We just parsed a function 'New' from
4567 /// declarator D which has the same name and scope as a previous
4568 /// declaration 'Old'. Figure out how to resolve this situation,
4569 /// merging decls or emitting diagnostics as appropriate.
4570 ///
4571 /// In C++, New and Old must be declarations that are not
4572 /// overloaded. Use IsOverload to determine whether New and Old are
4573 /// overloaded, and to select the Old declaration that New should be
4574 /// merged with.
4575 ///
4576 /// Returns true if there was an error, false otherwise.
4578 bool MergeTypeWithOld, bool NewDeclIsDefn);
4579
4580 /// Completes the merge of two function declarations that are
4581 /// known to be compatible.
4582 ///
4583 /// This routine handles the merging of attributes and other
4584 /// properties of function declarations from the old declaration to
4585 /// the new declaration, once we know that New is in fact a
4586 /// redeclaration of Old.
4587 ///
4588 /// \returns false
4590 Scope *S, bool MergeTypeWithOld);
4592
4593 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4594 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4595 /// situation, merging decls or emitting diagnostics as appropriate.
4596 ///
4597 /// Tentative definition rules (C99 6.9.2p2) are checked by
4598 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4599 /// definitions here, since the initializer hasn't been attached.
4601
4602 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4603 /// scope as a previous declaration 'Old'. Figure out how to merge their
4604 /// types, emitting diagnostics as appropriate.
4605 ///
4606 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4607 /// back to here in AddInitializerToDecl. We can't check them before the
4608 /// initializer is attached.
4609 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4610
4611 /// We've just determined that \p Old and \p New both appear to be definitions
4612 /// of the same variable. Either diagnose or fix the problem.
4613 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4615
4616 /// Filters out lookup results that don't fall within the given scope
4617 /// as determined by isDeclInScope.
4619 bool ConsiderLinkage, bool AllowInlineNamespace);
4620
4621 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4622 /// have compatible owning modules.
4624
4625 /// [module.interface]p6:
4626 /// A redeclaration of an entity X is implicitly exported if X was introduced
4627 /// by an exported declaration; otherwise it shall not be exported.
4629
4630 /// A wrapper function for checking the semantic restrictions of
4631 /// a redeclaration within a module.
4633
4634 /// Check the redefinition in C++20 Modules.
4635 ///
4636 /// [basic.def.odr]p14:
4637 /// For any definable item D with definitions in multiple translation units,
4638 /// - if D is a non-inline non-templated function or variable, or
4639 /// - if the definitions in different translation units do not satisfy the
4640 /// following requirements,
4641 /// the program is ill-formed; a diagnostic is required only if the
4642 /// definable item is attached to a named module and a prior definition is
4643 /// reachable at the point where a later definition occurs.
4644 /// - Each such definition shall not be attached to a named module
4645 /// ([module.unit]).
4646 /// - Each such definition shall consist of the same sequence of tokens, ...
4647 /// ...
4648 ///
4649 /// Return true if the redefinition is not allowed. Return false otherwise.
4650 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4651
4653
4654 /// If it's a file scoped decl that must warn if not used, keep track
4655 /// of it.
4657
4658 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4660
4663 DiagReceiverTy DiagReceiver);
4664 void DiagnoseUnusedDecl(const NamedDecl *ND);
4665
4666 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4667 /// unless they are marked attr(unused).
4668 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4669
4670 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4671 /// variable.
4672 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4673
4674 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4675 /// from S, where a non-field would be declared. This routine copes
4676 /// with the difference between C and C++ scoping rules in structs and
4677 /// unions. For example, the following code is well-formed in C but
4678 /// ill-formed in C++:
4679 /// @code
4680 /// struct S6 {
4681 /// enum { BAR } e;
4682 /// };
4683 ///
4684 /// void test_S6() {
4685 /// struct S6 a;
4686 /// a.e = BAR;
4687 /// }
4688 /// @endcode
4689 /// For the declaration of BAR, this routine will return a different
4690 /// scope. The scope S will be the scope of the unnamed enumeration
4691 /// within S6. In C++, this routine will return the scope associated
4692 /// with S6, because the enumeration's scope is a transparent
4693 /// context but structures can contain non-field names. In C, this
4694 /// routine will return the translation unit scope, since the
4695 /// enumeration's scope is a transparent context and structures cannot
4696 /// contain non-field names.
4698
4700 SourceLocation Loc);
4701
4702 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4703 /// file scope. lazily create a decl for it. ForRedeclaration is true
4704 /// if we're creating this built-in in anticipation of redeclaring the
4705 /// built-in.
4706 NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S,
4707 bool ForRedeclaration, SourceLocation Loc);
4708
4709 /// Get the outermost AttributedType node that sets a calling convention.
4710 /// Valid types should not have multiple attributes with different CCs.
4711 const AttributedType *getCallingConvAttributedType(QualType T) const;
4712
4713 /// GetNameForDeclarator - Determine the full declaration name for the
4714 /// given Declarator.
4716
4717 /// Retrieves the declaration name from a parsed unqualified-id.
4719
4720 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4721 /// we are currently parsing the initializer.
4723
4724 /// Look for a locally scoped extern "C" declaration by the given name.
4726
4729
4730 /// Adjust the \c DeclContext for a function or variable that might be a
4731 /// function-local external declaration.
4733
4735
4736 /// Checks if the variant/multiversion functions are compatible.
4738 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4739 const PartialDiagnostic &NoProtoDiagID,
4740 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4741 const PartialDiagnosticAt &NoSupportDiagIDAt,
4742 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4743 bool ConstexprSupported, bool CLinkageMayDiffer);
4744
4745 /// type checking declaration initializers (C99 6.7.8)
4747 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4748
4751 SourceRange Range, bool DirectInit,
4752 Expr *Init);
4753
4755 Expr *Init);
4756
4758
4759 // Heuristically tells if the function is `get_return_object` member of a
4760 // coroutine promise_type by matching the function name.
4761 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4762 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4763
4764 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4765 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4767 Scope *S);
4768
4769 /// If this function is a C++ replaceable global allocation function
4770 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4771 /// adds any function attributes that we know a priori based on the standard.
4772 ///
4773 /// We need to check for duplicate attributes both here and where user-written
4774 /// attributes are applied to declarations.
4776 FunctionDecl *FD);
4777
4778 /// Adds any function attributes that we know a priori based on
4779 /// the declaration of this function.
4780 ///
4781 /// These attributes can apply both to implicitly-declared builtins
4782 /// (like __builtin___printf_chk) or to library-declared functions
4783 /// like NSLog or printf.
4784 ///
4785 /// We need to check for duplicate attributes both here and where user-written
4786 /// attributes are applied to declarations.
4788
4789 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4790 /// the correct width, and that the field type is valid.
4791 /// Returns false on success.
4793 const IdentifierInfo *FieldName, QualType FieldTy,
4794 bool IsMsStruct, Expr *BitWidth);
4795
4796 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4797 /// enum. If AllowMask is true, then we also allow the complement of a valid
4798 /// value, to be used as a mask.
4799 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4800 bool AllowMask) const;
4801
4802 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4803 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4804 SourceLocation WeakNameLoc);
4805
4806 /// ActOnPragmaRedefineExtname - Called on well formed
4807 /// \#pragma redefine_extname oldname newname.
4809 IdentifierInfo *AliasName,
4810 SourceLocation PragmaLoc,
4811 SourceLocation WeakNameLoc,
4812 SourceLocation AliasNameLoc);
4813
4814 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4815 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4816 SourceLocation PragmaLoc,
4817 SourceLocation WeakNameLoc,
4818 SourceLocation AliasNameLoc);
4819
4820 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4823 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4824 OMPDiscarded, // Discarded due to OpenMP hostness
4825 TemplateDiscarded, // Discarded due to uninstantiated templates
4827 };
4828 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4829 bool Final = false);
4830
4831 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4833
4834 /// Function or variable declarations to be checked for whether the deferred
4835 /// diagnostics should be emitted.
4837
4838private:
4839 /// Map of current shadowing declarations to shadowed declarations. Warn if
4840 /// it looks like the user is trying to modify the shadowing declaration.
4841 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4842
4843 // We need this to handle
4844 //
4845 // typedef struct {
4846 // void *foo() { return 0; }
4847 // } A;
4848 //
4849 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4850 // for example. If 'A', foo will have external linkage. If we have '*A',
4851 // foo will have no linkage. Since we can't know until we get to the end
4852 // of the typedef, this function finds out if D might have non-external
4853 // linkage. Callers should verify at the end of the TU if it D has external
4854 // linkage or not.
4855 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4856
4857#include "clang/Sema/AttrIsTypeDependent.inc"
4858
4859 ///@}
4860
4861 //
4862 //
4863 // -------------------------------------------------------------------------
4864 //
4865 //
4866
4867 /// \name Declaration Attribute Handling
4868 /// Implementations are in SemaDeclAttr.cpp
4869 ///@{
4870
4871public:
4872 /// Describes the kind of priority given to an availability attribute.
4873 ///
4874 /// The sum of priorities deteremines the final priority of the attribute.
4875 /// The final priority determines how the attribute will be merged.
4876 /// An attribute with a lower priority will always remove higher priority
4877 /// attributes for the specified platform when it is being applied. An
4878 /// attribute with a higher priority will not be applied if the declaration
4879 /// already has an availability attribute with a lower priority for the
4880 /// specified platform. The final prirority values are not expected to match
4881 /// the values in this enumeration, but instead should be treated as a plain
4882 /// integer value. This enumeration just names the priority weights that are
4883 /// used to calculate that final vaue.
4885 /// The availability attribute was specified explicitly next to the
4886 /// declaration.
4888
4889 /// The availability attribute was applied using '#pragma clang attribute'.
4891
4892 /// The availability attribute for a specific platform was inferred from
4893 /// an availability attribute for another platform.
4895
4896 /// The availability attribute was inferred from an 'anyAppleOS'
4897 /// availability attribute.
4899
4900 /// The availability attribute was inferred from an 'anyAppleOS'
4901 /// availability attribute that was applied using '#pragma clang attribute'.
4902 /// This has the lowest priority.
4904 };
4905
4906 /// Describes the reason a calling convention specification was ignored, used
4907 /// for diagnostics.
4914
4915 /// A helper function to provide Attribute Location for the Attr types
4916 /// AND the ParsedAttr.
4917 template <typename AttrInfo>
4918 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4919 getAttrLoc(const AttrInfo &AL) {
4920 return AL.getLocation();
4921 }
4923
4924 /// If Expr is a valid integer constant, get the value of the integer
4925 /// expression and return success or failure. May output an error.
4926 ///
4927 /// Negative argument is implicitly converted to unsigned, unless
4928 /// \p StrictlyUnsigned is true.
4929 template <typename AttrInfo>
4930 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4931 unsigned Idx = UINT_MAX,
4932 bool StrictlyUnsigned = false) {
4933 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4934 if (Expr->isTypeDependent() ||
4936 if (Idx != UINT_MAX)
4937 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4938 << &AI << Idx << AANT_ArgumentIntegerConstant
4939 << Expr->getSourceRange();
4940 else
4941 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4943 return false;
4944 }
4945
4946 if (!I->isIntN(32)) {
4947 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4948 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4949 return false;
4950 }
4951
4952 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4953 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4954 << &AI << /*non-negative*/ 1;
4955 return false;
4956 }
4957
4958 Val = (uint32_t)I->getZExtValue();
4959 return true;
4960 }
4961
4962 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4963 /// \#pragma weak during processing of other Decls.
4964 /// I couldn't figure out a clean way to generate these in-line, so
4965 /// we store them here and handle separately -- which is a hack.
4966 /// It would be best to refactor this.
4968
4969 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4971
4973 2, 2>
4975
4976 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4977 /// us to associate a raw vector type with one of the ext_vector type names.
4978 /// This is only necessary for issuing pretty diagnostics.
4980
4981 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4982 /// and return false, otherwise set \p Str to the value of the string literal
4983 /// and return true.
4985 const Expr *E, StringRef &Str,
4986 SourceLocation *ArgLocation = nullptr);
4987
4988 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4989 /// If not emit an error and return false. If the argument is an identifier it
4990 /// will emit an error with a fixit hint and treat it as if it was a string
4991 /// literal.
4992 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4993 StringRef &Str,
4994 SourceLocation *ArgLocation = nullptr);
4995
4996 /// Determine if type T is a valid subject for a nonnull and similar
4997 /// attributes. Dependent types are considered valid so they can be checked
4998 /// during instantiation time. By default, we look through references (the
4999 /// behavior used by nonnull), but if the second parameter is true, then we
5000 /// treat a reference type as valid.
5001 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
5002
5003 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
5004 /// declaration.
5005 void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
5006 Expr *OE);
5007
5008 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
5009 /// declaration.
5010 void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI,
5011 Expr *ParamExpr);
5012
5013 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
5014 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
5015
5016 AvailabilityAttr *
5018 const IdentifierInfo *Platform, bool Implicit,
5019 VersionTuple Introduced, VersionTuple Deprecated,
5020 VersionTuple Obsoleted, bool IsUnavailable,
5021 StringRef Message, bool IsStrict, StringRef Replacement,
5022 AvailabilityMergeKind AMK, int Priority,
5023 const IdentifierInfo *IIEnvironment,
5024 const IdentifierInfo *InferredPlatformII = nullptr);
5025
5026 AvailabilityAttr *mergeAndInferAvailabilityAttr(
5027 NamedDecl *D, const AttributeCommonInfo &CI,
5028 const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced,
5029 VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable,
5030 StringRef Message, bool IsStrict, StringRef Replacement,
5031 AvailabilityMergeKind AMK, int Priority,
5032 const IdentifierInfo *IIEnvironment,
5033 const IdentifierInfo *InferredPlatformII);
5034
5035 TypeVisibilityAttr *
5037 TypeVisibilityAttr::VisibilityType Vis);
5038 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
5039 VisibilityAttr::VisibilityType Vis);
5041 VisibilityAttr::VisibilityType Type);
5042 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
5043 StringRef Name);
5044
5045 /// Used to implement to perform semantic checking on
5046 /// attribute((section("foo"))) specifiers.
5047 ///
5048 /// In this case, "foo" is passed in to be checked. If the section
5049 /// specifier is invalid, return an Error that indicates the problem.
5050 ///
5051 /// This is a simple quality of implementation feature to catch errors
5052 /// and give good diagnostics in cases when the assembler or code generator
5053 /// would otherwise reject the section specifier.
5054 llvm::Error isValidSectionSpecifier(StringRef Str);
5055 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
5056 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
5057 StringRef Name);
5058
5059 // Check for things we'd like to warn about. Multiversioning issues are
5060 // handled later in the process, once we know how many exist.
5061 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
5062
5063 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
5064 StringRef NewUserDiagnostic);
5065 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
5066 const IdentifierInfo *Format, int FormatIdx,
5067 int FirstArg);
5068 FormatMatchesAttr *mergeFormatMatchesAttr(Decl *D,
5069 const AttributeCommonInfo &CI,
5070 const IdentifierInfo *Format,
5071 int FormatIdx,
5072 StringLiteral *FormatStr);
5073 ModularFormatAttr *mergeModularFormatAttr(Decl *D,
5074 const AttributeCommonInfo &CI,
5075 const IdentifierInfo *ModularImplFn,
5076 StringRef ImplName,
5078
5079 PersonalityAttr *mergePersonalityAttr(Decl *D, FunctionDecl *Routine,
5080 const AttributeCommonInfo &CI);
5081
5082 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
5083 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
5084 bool IsPackExpansion);
5086 bool IsPackExpansion);
5087
5088 /// AddAlignValueAttr - Adds an align_value attribute to a particular
5089 /// declaration.
5090 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
5091
5092 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
5093 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
5096
5098 bool BestCase,
5099 MSInheritanceModel SemanticSpelling);
5100
5102
5103 /// AddModeAttr - Adds a mode attribute to a particular declaration.
5104 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI,
5105 const IdentifierInfo *Name, bool InInstantiation = false);
5106 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
5107 const AttributeCommonInfo &CI,
5108 const IdentifierInfo *Ident);
5109 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
5110 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
5111 const AttributeCommonInfo &CI);
5112 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
5113 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
5114 const InternalLinkageAttr &AL);
5115
5116 /// Check validaty of calling convention attribute \p attr. If \p FD
5117 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
5118 /// target. Otherwise, it is specified by \p CFT.
5120 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
5122
5123 /// Checks a regparm attribute, returning true if it is ill-formed and
5124 /// otherwise setting numParams to the appropriate value.
5125 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
5126
5127 /// Create a CUDALaunchBoundsAttr attribute. By default, the function only
5128 /// supports nvptx target architectures and skips MaxBlocks if it is previous
5129 /// to sm_90. Use \p IgnoreArch to skip the architecture check.
5130 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
5131 Expr *MaxThreads,
5132 Expr *MinBlocks, Expr *MaxBlocks,
5133 bool IgnoreArch = false);
5134
5135 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
5136 /// declaration.
5137 void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI,
5138 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
5139
5140 /// Add a cluster_dims attribute to a particular declaration.
5141 CUDAClusterDimsAttr *createClusterDimsAttr(const AttributeCommonInfo &CI,
5142 Expr *X, Expr *Y, Expr *Z);
5143 void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X,
5144 Expr *Y, Expr *Z);
5145 /// Add a no_cluster attribute to a particular declaration.
5146 void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI);
5147
5148 enum class RetainOwnershipKind { NS, CF, OS };
5149
5150 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
5151 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
5152
5153 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
5154
5155 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
5156 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
5157 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
5158 const AttributeCommonInfo &CI,
5159 bool BestCase,
5160 MSInheritanceModel Model);
5161
5162 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
5163 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
5164 const EnforceTCBLeafAttr &AL);
5165
5166 /// Helper for delayed processing TransparentUnion or
5167 /// BPFPreserveAccessIndexAttr attribute.
5169 const ParsedAttributesView &AttrList);
5170
5171 // Options for ProcessDeclAttributeList().
5175
5178 Result.IncludeCXX11Attributes = Val;
5179 return Result;
5180 }
5181
5184 Result.IgnoreTypeAttributes = Val;
5185 return Result;
5186 }
5187
5188 // Should C++11 attributes be processed?
5190
5191 // Should any type attributes encountered be ignored?
5192 // If this option is false, a diagnostic will be emitted for any type
5193 // attributes of a kind that does not "slide" from the declaration to
5194 // the decl-specifier-seq.
5196 };
5197
5198 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
5199 /// attribute list to the specified decl, ignoring any type attributes.
5201 const ParsedAttributesView &AttrList,
5202 const ProcessDeclAttributeOptions &Options =
5204
5205 /// Annotation attributes are the only attributes allowed after an access
5206 /// specifier.
5208 const ParsedAttributesView &AttrList);
5209
5210 /// checkUnusedDeclAttributes - Given a declarator which is not being
5211 /// used to build a declaration, complain about any decl attributes
5212 /// which might be lying around on it.
5214
5215 void DiagnoseUnknownAttribute(const ParsedAttr &AL);
5216
5217 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
5218 /// \#pragma weak needs a non-definition decl and source may not have one.
5220 SourceLocation Loc);
5221
5222 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5223 /// applied to it, possibly with an alias.
5224 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
5225
5226 void ProcessPragmaWeak(Scope *S, Decl *D);
5227 // Decl attributes - this routine is the top level dispatcher.
5228 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
5229
5231
5232 /// Given a set of delayed diagnostics, re-emit them as if they had
5233 /// been delayed in the current context instead of in the given pool.
5234 /// Essentially, this just moves them to the current pool.
5236
5237 /// Check that the type is a plain record with one field being a pointer
5238 /// type and the other field being an integer. This matches the common
5239 /// implementation of std::span or sized_allocation_t in P0901R11.
5240 bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty);
5241
5242 /// Check if IdxExpr is a valid parameter index for a function or
5243 /// instance method D. May output an error.
5244 ///
5245 /// \returns true if IdxExpr is a valid index.
5246 template <typename AttrInfo>
5248 const Decl *D, const AttrInfo &AI, unsigned AttrArgNum,
5249 const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis = false,
5250 bool CanIndexVariadicArguments = false) {
5252
5253 // In C++ the implicit 'this' function parameter also counts.
5254 // Parameters are counted from one.
5255 bool HP = hasFunctionProto(D);
5256 bool HasImplicitThisParam = hasImplicitObjectParameter(D);
5257 bool IV = HP && isFunctionOrMethodVariadic(D);
5258 unsigned NumParams =
5259 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
5260
5261 std::optional<llvm::APSInt> IdxInt;
5262 if (IdxExpr->isTypeDependent() ||
5263 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
5264 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
5265 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
5266 << IdxExpr->getSourceRange();
5267 return false;
5268 }
5269
5270 constexpr unsigned Limit = 1 << ParamIdx::IdxBitWidth;
5271 unsigned IdxSource = IdxInt->getLimitedValue(Limit);
5272 if (IdxSource < 1 || IdxSource == Limit ||
5273 ((!IV || !CanIndexVariadicArguments) && IdxSource > NumParams)) {
5274 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
5275 << &AI << AttrArgNum << IdxExpr->getSourceRange();
5276 return false;
5277 }
5278 if (HasImplicitThisParam && !CanIndexImplicitThis) {
5279 if (IdxSource == 1) {
5280 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
5281 << &AI << IdxExpr->getSourceRange();
5282 return false;
5283 }
5284 }
5285
5286 Idx = ParamIdx(IdxSource, D);
5287 return true;
5288 }
5289
5290 ///@}
5291
5292 //
5293 //
5294 // -------------------------------------------------------------------------
5295 //
5296 //
5297
5298 /// \name C++ Declarations
5299 /// Implementations are in SemaDeclCXX.cpp
5300 ///@{
5301
5302public:
5304
5305 /// Called before parsing a function declarator belonging to a function
5306 /// declaration.
5308 unsigned TemplateParameterDepth);
5309
5310 /// Called after parsing a function declarator belonging to a function
5311 /// declaration.
5313
5314 // Act on C++ namespaces
5316 SourceLocation NamespaceLoc,
5317 SourceLocation IdentLoc, IdentifierInfo *Ident,
5318 SourceLocation LBrace,
5319 const ParsedAttributesView &AttrList,
5320 UsingDirectiveDecl *&UsingDecl, bool IsNested);
5321
5322 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
5323 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
5324 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
5325
5327
5328 /// Retrieve the special "std" namespace, which may require us to
5329 /// implicitly define the namespace.
5331
5333 EnumDecl *getStdAlignValT() const;
5334
5337 QualType AllocType, SourceLocation);
5338
5340 const IdentifierInfo *MemberOrBase);
5341
5343 /// The '<=>' operator was used in an expression and a builtin operator
5344 /// was selected.
5346 /// A defaulted 'operator<=>' needed the comparison category. This
5347 /// typically only applies to 'std::strong_ordering', due to the implicit
5348 /// fallback return value.
5350 /// A builtin needed 'std::strong_ordering' (eg. '__builtin_type_order').
5352 };
5353
5354 /// Lookup the specified comparison category types in the standard
5355 /// library, an check the VarDecls possibly returned by the operator<=>
5356 /// builtins for that type.
5357 ///
5358 /// \return The type of the comparison category type corresponding to the
5359 /// specified Kind, or a null type if an error occurs
5361 SourceLocation Loc,
5363
5364 /// Tests whether Ty is an instance of std::initializer_list and, if
5365 /// it is and Element is not NULL, assigns the element type to Element.
5366 bool isStdInitializerList(QualType Ty, QualType *Element);
5367
5368 /// Tests whether Ty is an instance of std::type_identity and, if
5369 /// it is and TypeArgument is not NULL, assigns the element type to Element.
5370 /// If MalformedDecl is not null, and type_identity was ruled out due to being
5371 /// incorrectly structured despite having the correct name, the faulty Decl
5372 /// will be assigned to MalformedDecl.
5373 bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument,
5374 const Decl **MalformedDecl = nullptr);
5375
5376 /// Looks for the std::initializer_list template and instantiates it
5377 /// with Element, or emits an error if it's not found.
5378 ///
5379 /// \returns The instantiated template, or null on error.
5381
5382 /// Looks for the std::type_identity template and instantiates it
5383 /// with Type, or returns a null type if type_identity has not been declared
5384 ///
5385 /// \returns The instantiated template, or null if std::type_identity is not
5386 /// declared
5388
5389 /// Determine whether Ctor is an initializer-list constructor, as
5390 /// defined in [dcl.init.list]p2.
5391 bool isInitListConstructor(const FunctionDecl *Ctor);
5392
5393 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
5394 SourceLocation NamespcLoc, CXXScopeSpec &SS,
5395 SourceLocation IdentLoc,
5396 IdentifierInfo *NamespcName,
5397 const ParsedAttributesView &AttrList);
5398
5400
5401 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
5402 SourceLocation AliasLoc, IdentifierInfo *Alias,
5403 CXXScopeSpec &SS, SourceLocation IdentLoc,
5404 IdentifierInfo *Ident);
5405
5406 /// Remove decls we can't actually see from a lookup being used to declare
5407 /// shadow using decls.
5408 ///
5409 /// \param S - The scope of the potential shadow decl
5410 /// \param Previous - The lookup of a potential shadow decl's name.
5411 void FilterUsingLookup(Scope *S, LookupResult &lookup);
5412
5413 /// Hides a using shadow declaration. This is required by the current
5414 /// using-decl implementation when a resolvable using declaration in a
5415 /// class is followed by a declaration which would hide or override
5416 /// one or more of the using decl's targets; for example:
5417 ///
5418 /// struct Base { void foo(int); };
5419 /// struct Derived : Base {
5420 /// using Base::foo;
5421 /// void foo(int);
5422 /// };
5423 ///
5424 /// The governing language is C++03 [namespace.udecl]p12:
5425 ///
5426 /// When a using-declaration brings names from a base class into a
5427 /// derived class scope, member functions in the derived class
5428 /// override and/or hide member functions with the same name and
5429 /// parameter types in a base class (rather than conflicting).
5430 ///
5431 /// There are two ways to implement this:
5432 /// (1) optimistically create shadow decls when they're not hidden
5433 /// by existing declarations, or
5434 /// (2) don't create any shadow decls (or at least don't make them
5435 /// visible) until we've fully parsed/instantiated the class.
5436 /// The problem with (1) is that we might have to retroactively remove
5437 /// a shadow decl, which requires several O(n) operations because the
5438 /// decl structures are (very reasonably) not designed for removal.
5439 /// (2) avoids this but is very fiddly and phase-dependent.
5440 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
5441
5442 /// Determines whether to create a using shadow decl for a particular
5443 /// decl, given the set of decls existing prior to this using lookup.
5445 const LookupResult &PreviousDecls,
5446 UsingShadowDecl *&PrevShadow);
5447
5448 /// Builds a shadow declaration corresponding to a 'using' declaration.
5451 UsingShadowDecl *PrevDecl);
5452
5453 /// Checks that the given using declaration is not an invalid
5454 /// redeclaration. Note that this is checking only for the using decl
5455 /// itself, not for any ill-formedness among the UsingShadowDecls.
5457 bool HasTypenameKeyword,
5458 const CXXScopeSpec &SS,
5459 SourceLocation NameLoc,
5460 const LookupResult &Previous);
5461
5462 /// Checks that the given nested-name qualifier used in a using decl
5463 /// in the current context is appropriately related to the current
5464 /// scope. If an error is found, diagnoses it and returns true.
5465 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
5466 /// the result of that lookup. UD is likewise nullptr, except when we have an
5467 /// already-populated UsingDecl whose shadow decls contain the same
5468 /// information (i.e. we're instantiating a UsingDecl with non-dependent
5469 /// scope).
5470 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
5471 const CXXScopeSpec &SS,
5472 const DeclarationNameInfo &NameInfo,
5473 SourceLocation NameLoc,
5474 const LookupResult *R = nullptr,
5475 const UsingDecl *UD = nullptr);
5476
5477 /// Builds a using declaration.
5478 ///
5479 /// \param IsInstantiation - Whether this call arises from an
5480 /// instantiation of an unresolved using declaration. We treat
5481 /// the lookup differently for these declarations.
5483 SourceLocation UsingLoc,
5484 bool HasTypenameKeyword,
5485 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5486 DeclarationNameInfo NameInfo,
5487 SourceLocation EllipsisLoc,
5488 const ParsedAttributesView &AttrList,
5489 bool IsInstantiation, bool IsUsingIfExists);
5491 SourceLocation UsingLoc,
5492 SourceLocation EnumLoc,
5493 SourceLocation NameLoc,
5494 TypeSourceInfo *EnumType, EnumDecl *ED);
5495 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
5496 ArrayRef<NamedDecl *> Expansions);
5497
5498 /// Additional checks for a using declaration referring to a constructor name.
5500
5501 /// Given a derived-class using shadow declaration for a constructor and the
5502 /// correspnding base class constructor, find or create the implicit
5503 /// synthesized derived class constructor to use for this initialization.
5506 ConstructorUsingShadowDecl *DerivedShadow);
5507
5509 SourceLocation UsingLoc,
5510 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5511 UnqualifiedId &Name, SourceLocation EllipsisLoc,
5512 const ParsedAttributesView &AttrList);
5514 SourceLocation UsingLoc,
5515 SourceLocation EnumLoc, SourceRange TyLoc,
5516 const IdentifierInfo &II, ParsedType Ty,
5517 const CXXScopeSpec &SS);
5519 MultiTemplateParamsArg TemplateParams,
5520 SourceLocation UsingLoc, UnqualifiedId &Name,
5521 const ParsedAttributesView &AttrList,
5522 TypeResult Type, Decl *DeclFromDeclSpec);
5523
5524 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
5525 /// including handling of its default argument expressions.
5526 ///
5527 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
5529 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5531 bool HadMultipleCandidates, bool IsListInitialization,
5532 bool IsStdInitListInitialization, bool RequiresZeroInit,
5533 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5534
5535 /// Build a CXXConstructExpr whose constructor has already been resolved if
5536 /// it denotes an inherited constructor.
5538 SourceLocation ConstructLoc, QualType DeclInitType,
5539 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5540 bool HadMultipleCandidates, bool IsListInitialization,
5541 bool IsStdInitListInitialization, bool RequiresZeroInit,
5542 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5543
5544 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
5545 // the constructor can be elidable?
5547 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5548 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5549 bool HadMultipleCandidates, bool IsListInitialization,
5550 bool IsStdInitListInitialization, bool RequiresZeroInit,
5551 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5552
5554 SourceLocation InitLoc);
5556 const InitializedEntity &Entity,
5557 Expr *InitExpr,
5558 SourceLocation InitLoc);
5559
5560 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
5561 /// constructed variable.
5562 void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit);
5563
5564 /// Helper class that collects exception specifications for
5565 /// implicitly-declared special member functions.
5567 // Pointer to allow copying
5568 Sema *Self;
5569 // We order exception specifications thus:
5570 // noexcept is the most restrictive, but is only used in C++11.
5571 // throw() comes next.
5572 // Then a throw(collected exceptions)
5573 // Finally no specification, which is expressed as noexcept(false).
5574 // throw(...) is used instead if any called function uses it.
5575 ExceptionSpecificationType ComputedEST;
5576 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5577 SmallVector<QualType, 4> Exceptions;
5578
5579 void ClearExceptions() {
5580 ExceptionsSeen.clear();
5581 Exceptions.clear();
5582 }
5583
5584 public:
5586 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5587 if (!Self.getLangOpts().CPlusPlus11)
5588 ComputedEST = EST_DynamicNone;
5589 }
5590
5591 /// Get the computed exception specification type.
5593 assert(!isComputedNoexcept(ComputedEST) &&
5594 "noexcept(expr) should not be a possible result");
5595 return ComputedEST;
5596 }
5597
5598 /// The number of exceptions in the exception specification.
5599 unsigned size() const { return Exceptions.size(); }
5600
5601 /// The set of exceptions in the exception specification.
5602 const QualType *data() const { return Exceptions.data(); }
5603
5604 /// Integrate another called method into the collected data.
5605 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5606
5607 /// Integrate an invoked expression into the collected data.
5608 void CalledExpr(Expr *E) { CalledStmt(E); }
5609
5610 /// Integrate an invoked statement into the collected data.
5611 void CalledStmt(Stmt *S);
5612
5613 /// Overwrite an EPI's exception specification with this
5614 /// computed exception specification.
5617 ESI.Type = getExceptionSpecType();
5618 if (ESI.Type == EST_Dynamic) {
5619 ESI.Exceptions = Exceptions;
5620 } else if (ESI.Type == EST_None) {
5621 /// C++11 [except.spec]p14:
5622 /// The exception-specification is noexcept(false) if the set of
5623 /// potential exceptions of the special member function contains "any"
5624 ESI.Type = EST_NoexceptFalse;
5625 ESI.NoexceptExpr =
5626 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5627 }
5628 return ESI;
5629 }
5630 };
5631
5632 /// Evaluate the implicit exception specification for a defaulted
5633 /// special member function.
5635
5636 /// Check the given exception-specification and update the
5637 /// exception specification information with the results.
5638 void checkExceptionSpecification(bool IsTopLevel,
5640 ArrayRef<ParsedType> DynamicExceptions,
5641 ArrayRef<SourceRange> DynamicExceptionRanges,
5642 Expr *NoexceptExpr,
5643 SmallVectorImpl<QualType> &Exceptions,
5645
5646 /// Add an exception-specification to the given member or friend function
5647 /// (or function template). The exception-specification was parsed
5648 /// after the function itself was declared.
5650 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5651 ArrayRef<ParsedType> DynamicExceptions,
5652 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5653
5654 class InheritedConstructorInfo;
5655
5656 /// Determine if a special member function should have a deleted
5657 /// definition when it is defaulted.
5659 InheritedConstructorInfo *ICI = nullptr,
5660 bool Diagnose = false);
5661
5662 /// Produce notes explaining why a defaulted function was defined as deleted.
5664
5665 /// Declare the implicit default constructor for the given class.
5666 ///
5667 /// \param ClassDecl The class declaration into which the implicit
5668 /// default constructor will be added.
5669 ///
5670 /// \returns The implicitly-declared default constructor.
5673
5674 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5675 /// defining this constructor as the default constructor.
5678
5679 /// Declare the implicit destructor for the given class.
5680 ///
5681 /// \param ClassDecl The class declaration into which the implicit
5682 /// destructor will be added.
5683 ///
5684 /// \returns The implicitly-declared destructor.
5686
5687 /// DefineImplicitDestructor - Checks for feasibility of
5688 /// defining this destructor as the default destructor.
5689 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5691
5692 /// Build an exception spec for destructors that don't have one.
5693 ///
5694 /// C++11 says that user-defined destructors with no exception spec get one
5695 /// that looks as if the destructor was implicitly declared.
5697
5698 /// Define the specified inheriting constructor.
5701
5702 /// Declare the implicit copy constructor for the given class.
5703 ///
5704 /// \param ClassDecl The class declaration into which the implicit
5705 /// copy constructor will be added.
5706 ///
5707 /// \returns The implicitly-declared copy constructor.
5709
5710 /// DefineImplicitCopyConstructor - Checks for feasibility of
5711 /// defining this constructor as the copy constructor.
5712 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5714
5715 /// Declare the implicit move constructor for the given class.
5716 ///
5717 /// \param ClassDecl The Class declaration into which the implicit
5718 /// move constructor will be added.
5719 ///
5720 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5721 /// declared.
5723
5724 /// DefineImplicitMoveConstructor - Checks for feasibility of
5725 /// defining this constructor as the move constructor.
5726 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5728
5729 /// Declare the implicit copy assignment operator for the given class.
5730 ///
5731 /// \param ClassDecl The class declaration into which the implicit
5732 /// copy assignment operator will be added.
5733 ///
5734 /// \returns The implicitly-declared copy assignment operator.
5736
5737 /// Defines an implicitly-declared copy assignment operator.
5738 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5739 CXXMethodDecl *MethodDecl);
5740
5741 /// Declare the implicit move assignment operator for the given class.
5742 ///
5743 /// \param ClassDecl The Class declaration into which the implicit
5744 /// move assignment operator will be added.
5745 ///
5746 /// \returns The implicitly-declared move assignment operator, or NULL if it
5747 /// wasn't declared.
5749
5750 /// Defines an implicitly-declared move assignment operator.
5751 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5752 CXXMethodDecl *MethodDecl);
5753
5754 /// Check a completed declaration of an implicit special member.
5756
5757 /// Determine whether the given function is an implicitly-deleted
5758 /// special member function.
5760
5761 /// Check whether 'this' shows up in the type of a static member
5762 /// function after the (naturally empty) cv-qualifier-seq would be.
5763 ///
5764 /// \returns true if an error occurred.
5766
5767 /// Whether this' shows up in the exception specification of a static
5768 /// member function.
5770
5771 /// Check whether 'this' shows up in the attributes of the given
5772 /// static member function.
5773 ///
5774 /// \returns true if an error occurred.
5776
5778 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5779
5781
5782 /// Given a constructor and the set of arguments provided for the
5783 /// constructor, convert the arguments and add any required default arguments
5784 /// to form a proper call to this constructor.
5785 ///
5786 /// \returns true if an error occurred, false otherwise.
5788 QualType DeclInitType, MultiExprArg ArgsPtr,
5789 SourceLocation Loc,
5790 SmallVectorImpl<Expr *> &ConvertedArgs,
5791 bool AllowExplicit = false,
5792 bool IsListInitialization = false);
5793
5794 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5795 /// initializer for the declaration 'Dcl'.
5796 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5797 /// static data member of class X, names should be looked up in the scope of
5798 /// class X.
5800
5801 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5802 /// initializer for the declaration 'Dcl'.
5803 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5804
5805 /// Define the "body" of the conversion from a lambda object to a
5806 /// function pointer.
5807 ///
5808 /// This routine doesn't actually define a sensible body; rather, it fills
5809 /// in the initialization expression needed to copy the lambda object into
5810 /// the block, and IR generation actually generates the real body of the
5811 /// block pointer conversion.
5812 void
5814 CXXConversionDecl *Conv);
5815
5816 /// Define the "body" of the conversion from a lambda object to a
5817 /// block pointer.
5818 ///
5819 /// This routine doesn't actually define a sensible body; rather, it fills
5820 /// in the initialization expression needed to copy the lambda object into
5821 /// the block, and IR generation actually generates the real body of the
5822 /// block pointer conversion.
5824 CXXConversionDecl *Conv);
5825
5826 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5827 /// linkage specification, including the language and (if present)
5828 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5829 /// language string literal. LBraceLoc, if valid, provides the location of
5830 /// the '{' brace. Otherwise, this linkage specification does not
5831 /// have any braces.
5833 Expr *LangStr, SourceLocation LBraceLoc);
5834
5835 /// ActOnFinishLinkageSpecification - Complete the definition of
5836 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5837 /// valid, it's the position of the closing '}' brace in a linkage
5838 /// specification that uses braces.
5840 SourceLocation RBraceLoc);
5841
5842 //===--------------------------------------------------------------------===//
5843 // C++ Classes
5844 //
5845
5846 /// Get the class that is directly named by the current context. This is the
5847 /// class for which an unqualified-id in this scope could name a constructor
5848 /// or destructor.
5849 ///
5850 /// If the scope specifier denotes a class, this will be that class.
5851 /// If the scope specifier is empty, this will be the class whose
5852 /// member-specification we are currently within. Otherwise, there
5853 /// is no such class.
5855
5856 /// isCurrentClassName - Determine whether the identifier II is the
5857 /// name of the class type currently being defined. In the case of
5858 /// nested classes, this will only return true if II is the name of
5859 /// the innermost class.
5860 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5861 const CXXScopeSpec *SS = nullptr);
5862
5863 /// Determine whether the identifier II is a typo for the name of
5864 /// the class type currently being defined. If so, update it to the identifier
5865 /// that should have been used.
5867
5868 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5870 SourceLocation ColonLoc,
5871 const ParsedAttributesView &Attrs);
5872
5873 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5874 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5875 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5876 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5877 /// present (but parsing it has been deferred).
5878 NamedDecl *
5880 MultiTemplateParamsArg TemplateParameterLists,
5881 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5882 InClassInitStyle InitStyle);
5883
5884 /// Enter a new C++ default initializer scope. After calling this, the
5885 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5886 /// parsing or instantiating the initializer failed.
5888
5889 /// This is invoked after parsing an in-class initializer for a
5890 /// non-static C++ class member, and after instantiating an in-class
5891 /// initializer in a class template. Such actions are deferred until the class
5892 /// is complete.
5894 SourceLocation EqualLoc,
5896
5897 /// Handle a C++ member initializer using parentheses syntax.
5899 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5900 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5901 const DeclSpec &DS, SourceLocation IdLoc,
5902 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5903 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5904
5905 /// Handle a C++ member initializer using braced-init-list syntax.
5906 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5907 CXXScopeSpec &SS,
5908 IdentifierInfo *MemberOrBase,
5909 ParsedType TemplateTypeTy,
5910 const DeclSpec &DS, SourceLocation IdLoc,
5911 Expr *InitList, SourceLocation EllipsisLoc);
5912
5913 /// Handle a C++ member initializer.
5914 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5915 CXXScopeSpec &SS,
5916 IdentifierInfo *MemberOrBase,
5917 ParsedType TemplateTypeTy,
5918 const DeclSpec &DS, SourceLocation IdLoc,
5919 Expr *Init, SourceLocation EllipsisLoc);
5920
5922 SourceLocation IdLoc);
5923
5925 TypeSourceInfo *BaseTInfo, Expr *Init,
5926 CXXRecordDecl *ClassDecl,
5927 SourceLocation EllipsisLoc);
5928
5930 CXXRecordDecl *ClassDecl);
5931
5934
5936 ArrayRef<CXXCtorInitializer *> Initializers = {});
5937
5938 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5939 /// mark all the non-trivial destructors of its members and bases as
5940 /// referenced.
5941 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5942 CXXRecordDecl *Record);
5943
5944 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5945 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5946 /// class. In the Microsoft C++ ABI, this is done any time a class's
5947 /// destructor is referenced.
5949 SourceLocation Location, CXXRecordDecl *ClassDecl,
5950 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5951 nullptr);
5952
5953 /// Do semantic checks to allow the complete destructor variant to be emitted
5954 /// when the destructor is defined in another translation unit. In the Itanium
5955 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5956 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5957 /// of the checks performed when emitting a regular destructor.
5958 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5959 CXXDestructorDecl *Dtor);
5960
5961 /// The list of classes whose vtables have been used within
5962 /// this translation unit, and the source locations at which the
5963 /// first use occurred.
5964 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5965
5966 /// The list of vtables that are required but have not yet been
5967 /// materialized.
5969
5970 /// The set of classes whose vtables have been used within
5971 /// this translation unit, and a bit that will be true if the vtable is
5972 /// required to be emitted (otherwise, it should be emitted only if needed
5973 /// by code generation).
5974 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5975
5976 /// Load any externally-stored vtable uses.
5978
5979 /// Note that the vtable for the given class was used at the
5980 /// given location.
5982 bool DefinitionRequired = false);
5983
5984 /// Mark the exception specifications of all virtual member functions
5985 /// in the given class as needed.
5987 const CXXRecordDecl *RD);
5988
5989 /// MarkVirtualMembersReferenced - Will mark all members of the given
5990 /// CXXRecordDecl referenced.
5992 bool ConstexprOnly = false);
5993
5994 /// Define all of the vtables that have been used in this
5995 /// translation unit and reference any virtual members used by those
5996 /// vtables.
5997 ///
5998 /// \returns true if any work was done, false otherwise.
5999 bool DefineUsedVTables();
6000
6001 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
6002 /// special functions, such as the default constructor, copy
6003 /// constructor, or destructor, to the given C++ class (C++
6004 /// [special]p1). This routine can only be executed just before the
6005 /// definition of the class is complete.
6007
6008 /// ActOnMemInitializers - Handle the member initializers for a constructor.
6009 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
6011 bool AnyErrors);
6012
6013 /// Check class-level dllimport/dllexport attribute. The caller must
6014 /// ensure that referenceDLLExportedClassMethods is called some point later
6015 /// when all outer classes of Class are complete.
6018
6020
6021 /// Perform propagation of DLL attributes from a derived class to a
6022 /// templated base class for MS compatibility.
6024 CXXRecordDecl *Class, Attr *ClassAttr,
6025 ClassTemplateSpecializationDecl *BaseTemplateSpec,
6026 SourceLocation BaseLoc);
6027
6028 /// Perform semantic checks on a class definition that has been
6029 /// completing, introducing implicitly-declared members, checking for
6030 /// abstract types, etc.
6031 ///
6032 /// \param S The scope in which the class was parsed. Null if we didn't just
6033 /// parse a class definition.
6034 /// \param Record The completed class.
6036
6037 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
6038 /// conditions that are needed for the attribute to have an effect.
6040
6041 /// Check that VTable Pointer authentication is only being set on the first
6042 /// first instantiation of the vtable
6044
6046 Decl *TagDecl, SourceLocation LBrac,
6047 SourceLocation RBrac,
6048 const ParsedAttributesView &AttrList);
6049
6050 /// Perform any semantic analysis which needs to be delayed until all
6051 /// pending class member declarations have been parsed.
6054
6055 /// This is used to implement the constant expression evaluation part of the
6056 /// attribute enable_if extension. There is nothing in standard C++ which
6057 /// would require reentering parameters.
6060 llvm::function_ref<Scope *()> EnterScope);
6062
6063 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
6064 /// parsing a top-level (non-nested) C++ class, and we are now
6065 /// parsing those parts of the given Method declaration that could
6066 /// not be parsed earlier (C++ [class.mem]p2), such as default
6067 /// arguments. This action should enter the scope of the given
6068 /// Method declaration as if we had just parsed the qualified method
6069 /// name. However, it should not bring the parameters into scope;
6070 /// that will be performed by ActOnDelayedCXXMethodParameter.
6072 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
6074
6075 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
6076 /// processing the delayed method declaration for Method. The method
6077 /// declaration is now considered finished. There may be a separate
6078 /// ActOnStartOfFunctionDef action later (not necessarily
6079 /// immediately!) for this method, if it was also defined inside the
6080 /// class body.
6083
6085
6086 bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
6087 StringEvaluationContext EvalContext,
6088 bool ErrorOnInvalidMessage);
6089 bool EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
6090 StringEvaluationContext EvalContext,
6091 bool ErrorOnInvalidMessage);
6092
6094 Expr *AssertExpr, Expr *AssertMessageExpr,
6095 SourceLocation RParenLoc);
6097 Expr *AssertExpr, Expr *AssertMessageExpr,
6098 SourceLocation RParenLoc, bool Failed);
6099
6100 /// Try to print more useful information about a failed static_assert
6101 /// with expression \E
6102 void DiagnoseStaticAssertDetails(const Expr *E);
6103
6104 /// If E represents a built-in type trait, or a known standard type trait,
6105 /// try to print more information about why the type type-trait failed.
6106 /// This assumes we already evaluated the expression to a false boolean value.
6107 void DiagnoseTypeTraitDetails(const Expr *E);
6108
6109 /// Handle a friend type declaration. This works in tandem with
6110 /// ActOnTag.
6111 ///
6112 /// Notes on friend class templates:
6113 ///
6114 /// We generally treat friend class declarations as if they were
6115 /// declaring a class. So, for example, the elaborated type specifier
6116 /// in a friend declaration is required to obey the restrictions of a
6117 /// class-head (i.e. no typedefs in the scope chain), template
6118 /// parameters are required to match up with simple template-ids, &c.
6119 /// However, unlike when declaring a template specialization, it's
6120 /// okay to refer to a template specialization without an empty
6121 /// template parameter declaration, e.g.
6122 /// friend class A<T>::B<unsigned>;
6123 /// We permit this as a special case; if there are any template
6124 /// parameters present at all, require proper matching, i.e.
6125 /// template <> template <class T> friend class A<int>::B;
6126 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
6127 MultiTemplateParamsArg TemplateParams,
6128 SourceLocation EllipsisLoc);
6130 MultiTemplateParamsArg TemplateParams);
6131
6132 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
6133 /// the well-formedness of the constructor declarator @p D with type @p
6134 /// R. If there are any errors in the declarator, this routine will
6135 /// emit diagnostics and set the invalid bit to true. In any case, the type
6136 /// will be updated to reflect a well-formed type for the constructor and
6137 /// returned.
6139 StorageClass &SC);
6140
6141 /// CheckConstructor - Checks a fully-formed constructor for
6142 /// well-formedness, issuing any diagnostics required. Returns true if
6143 /// the constructor declarator is invalid.
6145
6146 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
6147 /// the well-formednes of the destructor declarator @p D with type @p
6148 /// R. If there are any errors in the declarator, this routine will
6149 /// emit diagnostics and set the declarator to invalid. Even if this happens,
6150 /// will be updated to reflect a well-formed type for the destructor and
6151 /// returned.
6153 StorageClass &SC);
6154
6155 /// CheckDestructor - Checks a fully-formed destructor definition for
6156 /// well-formedness, issuing any diagnostics required. Returns true
6157 /// on error.
6159
6160 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
6161 /// well-formednes of the conversion function declarator @p D with
6162 /// type @p R. If there are any errors in the declarator, this routine
6163 /// will emit diagnostics and return true. Otherwise, it will return
6164 /// false. Either way, the type @p R will be updated to reflect a
6165 /// well-formed type for the conversion operator.
6167
6168 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
6169 /// the declaration of the given C++ conversion function. This routine
6170 /// is responsible for recording the conversion function in the C++
6171 /// class, if possible.
6173
6174 /// Check the validity of a declarator that we parsed for a deduction-guide.
6175 /// These aren't actually declarators in the grammar, so we need to check that
6176 /// the user didn't specify any pieces that are not part of the
6177 /// deduction-guide grammar. Return true on invalid deduction-guide.
6179 StorageClass &SC);
6180
6182
6185 SourceLocation DefaultLoc);
6187
6191 FunctionDecl *Spaceship);
6194
6196 QualType R, bool IsLambda,
6197 DeclContext *DC = nullptr);
6199 DeclarationName Name, QualType R);
6201
6202 //===--------------------------------------------------------------------===//
6203 // C++ Derived Classes
6204 //
6205
6206 /// Check the validity of a C++ base class specifier.
6207 ///
6208 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
6209 /// and returns NULL otherwise.
6211 SourceRange SpecifierRange, bool Virtual,
6212 AccessSpecifier Access,
6213 TypeSourceInfo *TInfo,
6214 SourceLocation EllipsisLoc);
6215
6216 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
6217 /// one entry in the base class list of a class specifier, for
6218 /// example:
6219 /// class foo : public bar, virtual private baz {
6220 /// 'public bar' and 'virtual private baz' are each base-specifiers.
6221 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
6222 const ParsedAttributesView &Attrs, bool Virtual,
6223 AccessSpecifier Access, ParsedType basetype,
6224 SourceLocation BaseLoc,
6225 SourceLocation EllipsisLoc);
6226
6227 /// Performs the actual work of attaching the given base class
6228 /// specifiers to a C++ class.
6231
6232 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
6233 /// class, after checking whether there are any duplicate base
6234 /// classes.
6235 void ActOnBaseSpecifiers(Decl *ClassDecl,
6237
6238 /// Determine whether the type \p Derived is a C++ class that is
6239 /// derived from the type \p Base.
6240 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6242 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6246 CXXBasePaths &Paths);
6247
6248 // FIXME: I don't like this name.
6249 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
6250
6252 SourceLocation Loc, SourceRange Range,
6253 CXXCastPath *BasePath = nullptr,
6254 bool IgnoreAccess = false);
6255
6256 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
6257 /// conversion (where Derived and Base are class types) is
6258 /// well-formed, meaning that the conversion is unambiguous (and
6259 /// that all of the base classes are accessible). Returns true
6260 /// and emits a diagnostic if the code is ill-formed, returns false
6261 /// otherwise. Loc is the location where this routine should point to
6262 /// if there is an error, and Range is the source range to highlight
6263 /// if there is an error.
6264 ///
6265 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
6266 /// diagnostic for the respective type of error will be suppressed, but the
6267 /// check for ill-formed code will still be performed.
6269 unsigned InaccessibleBaseID,
6270 unsigned AmbiguousBaseConvID,
6271 SourceLocation Loc, SourceRange Range,
6272 DeclarationName Name, CXXCastPath *BasePath,
6273 bool IgnoreAccess = false);
6274
6275 /// Builds a string representing ambiguous paths from a
6276 /// specific derived class to different subobjects of the same base
6277 /// class.
6278 ///
6279 /// This function builds a string that can be used in error messages
6280 /// to show the different paths that one can take through the
6281 /// inheritance hierarchy to go from the derived class to different
6282 /// subobjects of a base class. The result looks something like this:
6283 /// @code
6284 /// struct D -> struct B -> struct A
6285 /// struct D -> struct C -> struct A
6286 /// @endcode
6287 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
6288
6290 const CXXMethodDecl *Old);
6291
6292 /// CheckOverridingFunctionReturnType - Checks whether the return types are
6293 /// covariant, according to C++ [class.virtual]p5.
6295 const CXXMethodDecl *Old);
6296
6297 // Check that the overriding method has no explicit object parameter.
6299 const CXXMethodDecl *Old);
6300
6301 /// Mark the given method pure.
6302 ///
6303 /// \param Method the method to be marked pure.
6304 ///
6305 /// \param InitRange the source range that covers the "0" initializer.
6307
6308 /// CheckOverrideControl - Check C++11 override control semantics.
6310
6311 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
6312 /// not used in the declaration of an overriding method.
6314
6315 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
6316 /// function overrides a virtual member function marked 'final', according to
6317 /// C++11 [class.virtual]p4.
6319 const CXXMethodDecl *Old);
6320
6331
6332 struct TypeDiagnoser;
6333
6336 TypeDiagnoser &Diagnoser);
6337 template <typename... Ts>
6339 const Ts &...Args) {
6340 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
6341 return RequireNonAbstractType(Loc, T, Diagnoser);
6342 }
6343
6344 void DiagnoseAbstractType(const CXXRecordDecl *RD);
6345
6346 //===--------------------------------------------------------------------===//
6347 // C++ Overloaded Operators [C++ 13.5]
6348 //
6349
6350 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
6351 /// of this overloaded operator is well-formed. If so, returns false;
6352 /// otherwise, emits appropriate diagnostics and returns true.
6354
6355 /// CheckLiteralOperatorDeclaration - Check whether the declaration
6356 /// of this literal operator function is well-formed. If so, returns
6357 /// false; otherwise, emits appropriate diagnostics and returns true.
6359
6360 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
6361 /// found in an explicit(bool) specifier.
6363
6364 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
6365 /// Returns true if the explicit specifier is now resolved.
6367
6368 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
6369 /// C++ if/switch/while/for statement.
6370 /// e.g: "if (int x = f()) {...}"
6372
6373 // Emitting members of dllexported classes is delayed until the class
6374 // (including field initializers) is fully parsed.
6377
6378 /// Merge the exception specifications of two variable declarations.
6379 ///
6380 /// This is called when there's a redeclaration of a VarDecl. The function
6381 /// checks if the redeclaration might have an exception specification and
6382 /// validates compatibility and merges the specs if necessary.
6384
6385 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
6386 /// function, once we already know that they have the same
6387 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
6388 /// error, false otherwise.
6390
6391 /// Helpers for dealing with blocks and functions.
6393
6394 /// CheckExtraCXXDefaultArguments - Check for any extra default
6395 /// arguments in the declarator, which is not a function declaration
6396 /// or definition and therefore is not permitted to have default
6397 /// arguments. This routine should be invoked for every declarator
6398 /// that is not a function declaration or definition.
6400
6401 /// Perform semantic analysis for the variable declaration that
6402 /// occurs within a C++ catch clause, returning the newly-created
6403 /// variable.
6405 SourceLocation StartLoc,
6406 SourceLocation IdLoc,
6407 const IdentifierInfo *Id);
6408
6409 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
6410 /// handler.
6412
6414
6415 /// Handle a friend tag declaration where the scope specifier was
6416 /// templated.
6418 unsigned TagSpec, SourceLocation TagLoc,
6419 CXXScopeSpec &SS, IdentifierInfo *Name,
6420 SourceLocation NameLoc,
6421 SourceLocation EllipsisLoc,
6423 MultiTemplateParamsArg TempParamLists,
6424 TemplateIdAnnotation *TemplateId);
6425
6428 bool IsInstantiation);
6429
6431 NestedNameSpecifierLoc NNSLoc);
6432
6434 SourceLocation DeclStart, Declarator &D,
6435 Expr *BitfieldWidth,
6436 InClassInitStyle InitStyle,
6437 AccessSpecifier AS,
6438 const ParsedAttr &MSPropertyAttr);
6439
6440 /// Diagnose why the specified class does not have a trivial special member of
6441 /// the given kind.
6444
6445 /// Determine whether a defaulted or deleted special member function is
6446 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
6447 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
6451 bool Diagnose = false);
6452
6453 /// Handle a C++11 empty-declaration and attribute-declaration.
6455 SourceLocation SemiLoc);
6456
6458 /// Diagnose issues that are non-constant or that are extensions.
6460 /// Identify whether this function satisfies the formal rules for constexpr
6461 /// functions in the current lanugage mode (with no extensions).
6463 };
6464
6465 // Check whether a function declaration satisfies the requirements of a
6466 // constexpr function definition or a constexpr constructor definition. If so,
6467 // return true. If not, produce appropriate diagnostics (unless asked not to
6468 // by Kind) and return false.
6469 //
6470 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
6472 CheckConstexprKind Kind);
6473
6474 /// Diagnose methods which overload virtual methods in a base class
6475 /// without overriding any.
6477
6478 /// Check if a method overloads virtual methods in a base class without
6479 /// overriding any.
6480 void
6482 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6483 void
6485 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6486
6487 /// ActOnParamDefaultArgument - Check whether the default argument
6488 /// provided for a function parameter is well-formed. If so, attach it
6489 /// to the parameter declaration.
6490 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
6491 Expr *defarg);
6492
6493 /// ActOnParamUnparsedDefaultArgument - We've seen a default
6494 /// argument for a function parameter, but we can't parse it yet
6495 /// because we're inside a class definition. Note that this default
6496 /// argument will be parsed later.
6498 SourceLocation ArgLoc);
6499
6500 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
6501 /// the default argument for the parameter param failed.
6503 Expr *DefaultArg);
6505 SourceLocation EqualLoc);
6506 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6507 SourceLocation EqualLoc);
6508
6509 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6510 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6511 StringLiteral *Message = nullptr);
6512 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6513
6514 void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind,
6515 StringLiteral *DeletedMessage = nullptr);
6519
6520 NamedDecl *
6522 MultiTemplateParamsArg TemplateParamLists);
6525 RecordDecl *ClassDecl,
6526 const IdentifierInfo *Name);
6527
6529 SourceLocation Loc);
6531
6532 /// Stack containing information needed when in C++2a an 'auto' is encountered
6533 /// in a function declaration parameter type specifier in order to invent a
6534 /// corresponding template parameter in the enclosing abbreviated function
6535 /// template. This information is also present in LambdaScopeInfo, stored in
6536 /// the FunctionScopes stack.
6538
6539 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6540 std::unique_ptr<CXXFieldCollector> FieldCollector;
6541
6543 /// Set containing all declared private fields that are not used.
6545
6547
6548 /// PureVirtualClassDiagSet - a set of class declarations which we have
6549 /// emitted a list of pure virtual functions. Used to prevent emitting the
6550 /// same list more than once.
6551 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6552
6556
6557 /// All the delegating constructors seen so far in the file, used for
6558 /// cycle detection at the end of the TU.
6560
6561 /// The C++ "std" namespace, where the standard library resides.
6563
6564 /// The C++ "std::initializer_list" template, which is defined in
6565 /// <initializer_list>.
6567
6568 /// The C++ "std::type_identity" template, which is defined in
6569 /// <type_traits>.
6571
6572 // Contains the locations of the beginning of unparsed default
6573 // argument locations.
6574 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6575
6576 /// UndefinedInternals - all the used, undefined objects which require a
6577 /// definition in this translation unit.
6578 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6579
6580 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6582
6583 /// The C++ special members which we are currently in the process of
6584 /// declaring. If this process recursively triggers the declaration of the
6585 /// same special member, we should act as if it is not yet declared.
6587
6589
6590 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6591
6594 ParsingClassDepth++;
6596 }
6598 ParsingClassDepth--;
6600 }
6601
6603 CXXScopeSpec &SS,
6604 ParsedType TemplateTypeTy,
6605 IdentifierInfo *MemberOrBase);
6606
6607private:
6608 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6609 QualType ResultTy,
6610 ArrayRef<QualType> Args);
6611 // Helper for ActOnFields to check for all function pointer members.
6612 bool EntirelyFunctionPointers(const RecordDecl *Record);
6613
6614 // A cache representing if we've fully checked the various comparison category
6615 // types stored in ASTContext. The bit-index corresponds to the integer value
6616 // of a ComparisonCategoryType enumerator.
6617 llvm::SmallBitVector FullyCheckedComparisonCategories;
6618
6619 /// Check if there is a field shadowing.
6620 void CheckShadowInheritedFields(const SourceLocation &Loc,
6621 DeclarationName FieldName,
6622 const CXXRecordDecl *RD,
6623 bool DeclIsField = true);
6624
6625 ///@}
6626
6627 //
6628 //
6629 // -------------------------------------------------------------------------
6630 //
6631 //
6632
6633 /// \name C++ Exception Specifications
6634 /// Implementations are in SemaExceptionSpec.cpp
6635 ///@{
6636
6637public:
6638 /// All the overriding functions seen during a class definition
6639 /// that had their exception spec checks delayed, plus the overridden
6640 /// function.
6643
6644 /// All the function redeclarations seen during a class definition that had
6645 /// their exception spec checks delayed, plus the prior declaration they
6646 /// should be checked against. Except during error recovery, the new decl
6647 /// should always be a friend declaration, as that's the only valid way to
6648 /// redeclare a special member before its class is complete.
6651
6652 /// Determine if we're in a case where we need to (incorrectly) eagerly
6653 /// parse an exception specification to work around a libstdc++ bug.
6655
6656 /// Check the given noexcept-specifier, convert its expression, and compute
6657 /// the appropriate ExceptionSpecificationType.
6658 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6660
6661 CanThrowResult canThrow(const Stmt *E);
6662 /// Determine whether the callee of a particular function call can throw.
6663 /// E, D and Loc are all optional.
6664 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6667 const FunctionProtoType *FPT);
6670
6671 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6672 /// exception specification. Incomplete types, or pointers to incomplete types
6673 /// other than void are not allowed.
6674 ///
6675 /// \param[in,out] T The exception type. This will be decayed to a pointer
6676 /// type
6677 /// when the input is an array or a function type.
6679
6680 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6681 /// pointer to member to a function with an exception specification. This
6682 /// means that it is invalid to add another level of indirection.
6685
6686 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6687 /// exception specifications. Exception specifications are equivalent if
6688 /// they allow exactly the same set of exception types. It does not matter how
6689 /// that is achieved. See C++ [except.spec]p2.
6691 SourceLocation OldLoc,
6692 const FunctionProtoType *New,
6693 SourceLocation NewLoc);
6695 const PartialDiagnostic &NoteID,
6696 const FunctionProtoType *Old,
6697 SourceLocation OldLoc,
6698 const FunctionProtoType *New,
6699 SourceLocation NewLoc);
6700 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6701
6702 /// CheckExceptionSpecSubset - Check whether the second function type's
6703 /// exception specification is a subset (or equivalent) of the first function
6704 /// type. This is used by override and pointer assignment checks.
6706 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6707 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6708 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6709 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6710 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6711
6712 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6713 /// two functions have equivalent exception specs. This is part of the
6714 /// assignment and override compatibility check. We do not check the
6715 /// parameters of parameter function pointers recursively, as no sane
6716 /// programmer would even be able to write such a function type.
6718 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6719 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6720 SourceLocation TargetLoc, const FunctionProtoType *Source,
6721 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6722
6723 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6724
6725 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6726 /// spec is a subset of base spec.
6728 const CXXMethodDecl *Old);
6729
6730 ///@}
6731
6732 //
6733 //
6734 // -------------------------------------------------------------------------
6735 //
6736 //
6737
6738 /// \name Expressions
6739 /// Implementations are in SemaExpr.cpp
6740 ///@{
6741
6742public:
6743 /// Describes how the expressions currently being parsed are
6744 /// evaluated at run-time, if at all.
6746 /// The current expression and its subexpressions occur within an
6747 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6748 /// \c sizeof, where the type of the expression may be significant but
6749 /// no code will be generated to evaluate the value of the expression at
6750 /// run time.
6752
6753 /// The current expression occurs within a braced-init-list within
6754 /// an unevaluated operand. This is mostly like a regular unevaluated
6755 /// context, except that we still instantiate constexpr functions that are
6756 /// referenced here so that we can perform narrowing checks correctly.
6758
6759 /// The current expression occurs within a discarded statement.
6760 /// This behaves largely similarly to an unevaluated operand in preventing
6761 /// definitions from being required, but not in other ways.
6763
6764 /// The current expression occurs within an unevaluated
6765 /// operand that unconditionally permits abstract references to
6766 /// fields, such as a SIZE operator in MS-style inline assembly.
6768
6769 /// The current context is "potentially evaluated" in C++11 terms,
6770 /// but the expression is evaluated at compile-time (like the values of
6771 /// cases in a switch statement).
6773
6774 /// In addition of being constant evaluated, the current expression
6775 /// occurs in an immediate function context - either a consteval function
6776 /// or a consteval if statement.
6778
6779 /// The current expression is potentially evaluated at run time,
6780 /// which means that code may be generated to evaluate the value of the
6781 /// expression at run time.
6783
6784 /// The current expression is potentially evaluated, but any
6785 /// declarations referenced inside that expression are only used if
6786 /// in fact the current expression is used.
6787 ///
6788 /// This value is used when parsing default function arguments, for which
6789 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6790 /// through varargs) but do not want to mark declarations as "referenced"
6791 /// until the default argument is used.
6793 };
6794
6795 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6796 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6797 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6798 /// have been applied to all subexpressions of the enclosing full expression.
6799 /// This is cleared at the end of each full expression.
6802
6803 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6804
6805 /// Data structure used to record current or nested
6806 /// expression evaluation contexts.
6808 /// The expression evaluation context.
6810
6811 /// Whether the enclosing context needed a cleanup.
6813
6814 /// The number of active cleanup objects when we entered
6815 /// this expression evaluation context.
6817
6819
6820 /// The lambdas that are present within this context, if it
6821 /// is indeed an unevaluated context.
6823
6824 /// The declaration that provides context for lambda expressions
6825 /// and block literals if the normal declaration context does not
6826 /// suffice, e.g., in a default function argument.
6828
6829 /// Declaration for initializer if one is currently being
6830 /// parsed. Used when an expression has a possibly unreachable
6831 /// diagnostic to reference the declaration as a whole.
6833
6834 /// If we are processing a decltype type, a set of call expressions
6835 /// for which we have deferred checking the completeness of the return type.
6837
6838 /// If we are processing a decltype type, a set of temporary binding
6839 /// expressions for which we have deferred checking the destructor.
6841
6843
6844 /// Expressions appearing as the LHS of a volatile assignment in this
6845 /// context. We produce a warning for these when popping the context if
6846 /// they are not discarded-value expressions nor unevaluated operands.
6848
6849 /// Set of candidates for starting an immediate invocation.
6852
6853 /// Set of DeclRefExprs referencing a consteval function when used in a
6854 /// context not already known to be immediately invoked.
6856
6857 /// P2718R0 - Lifetime extension in range-based for loops.
6858 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6859 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6860 /// InLifetimeExtendingContext is true.
6862
6863 /// Small set of gathered accesses to potentially misaligned members
6864 /// due to the packed attribute.
6866
6867 /// \brief Describes whether we are in an expression constext which we have
6868 /// to handle differently.
6876
6877 // A context can be nested in both a discarded statement context and
6878 // an immediate function context, so they need to be tracked independently.
6882
6884
6885 // We are in a constant context, but we also allow
6886 // non constant expressions, for example for array bounds (which may be
6887 // VLAs).
6889
6890 /// Whether we are currently in a context in which all temporaries must be
6891 /// lifetime-extended, even if they're not bound to a reference (for
6892 /// example, in a for-range initializer).
6894
6895 /// Whether evaluating an expression for a switch case label.
6896 bool IsCaseExpr = false;
6897
6898 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6900
6901 // When evaluating immediate functions in the initializer of a default
6902 // argument or default member initializer, this is the declaration whose
6903 // default initializer is being evaluated and the location of the call
6904 // or constructor definition.
6908 : Loc(Loc), Decl(Decl), Context(Context) {
6909 assert(Decl && Context && "invalid initialization context");
6910 }
6911
6913 ValueDecl *Decl = nullptr;
6915 };
6916 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6917
6928
6934
6941
6946
6951 // C++23 [expr.const]p14:
6952 // An expression or conversion is in an immediate function
6953 // context if it is potentially evaluated and either:
6954 // * its innermost enclosing non-block scope is a function
6955 // parameter scope of an immediate function, or
6956 // * its enclosing statement is enclosed by the compound-
6957 // statement of a consteval if statement.
6960 }
6961
6969 };
6970
6972 assert(!ExprEvalContexts.empty() &&
6973 "Must be in an expression evaluation context");
6974 return ExprEvalContexts.back();
6975 }
6976
6978 assert(!ExprEvalContexts.empty() &&
6979 "Must be in an expression evaluation context");
6980 return ExprEvalContexts.back();
6981 }
6982
6984 assert(ExprEvalContexts.size() >= 2 &&
6985 "Must be in an expression evaluation context");
6986 return ExprEvalContexts[ExprEvalContexts.size() - 2];
6987 }
6988
6990 return const_cast<Sema *>(this)->parentEvaluationContext();
6991 }
6992
6997
6998 /// Increment when we find a reference; decrement when we find an ignored
6999 /// assignment. Ultimately the value is 0 if every reference is an ignored
7000 /// assignment.
7001 ///
7002 /// Uses canonical VarDecl as key so in-class decls and out-of-class defs of
7003 /// static data members get tracked as a single entry.
7004 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
7005
7006 /// Used to control the generation of ExprWithCleanups.
7008
7009 /// ExprCleanupObjects - This is the stack of objects requiring
7010 /// cleanup that are created by the current full expression.
7012
7013 /// Determine whether the use of this declaration is valid, without
7014 /// emitting diagnostics.
7015 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
7016 // A version of DiagnoseUseOfDecl that should be used if overload resolution
7017 // has been used to find this declaration, which means we don't have to bother
7018 // checking the trailing requires clause.
7020 return DiagnoseUseOfDecl(
7021 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
7022 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
7023 /*SkipTrailingRequiresClause=*/true);
7024 }
7025
7026 /// Determine whether the use of this declaration is valid, and
7027 /// emit any corresponding diagnostics.
7028 ///
7029 /// This routine diagnoses various problems with referencing
7030 /// declarations that can occur when using a declaration. For example,
7031 /// it might warn if a deprecated or unavailable declaration is being
7032 /// used, or produce an error (and return true) if a C++0x deleted
7033 /// function is being used.
7034 ///
7035 /// \returns true if there was an error (this declaration cannot be
7036 /// referenced), false otherwise.
7038 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
7039 bool ObjCPropertyAccess = false,
7040 bool AvoidPartialAvailabilityChecks = false,
7041 ObjCInterfaceDecl *ClassReceiver = nullptr,
7042 bool SkipTrailingRequiresClause = false);
7043
7044 /// Emit a note explaining that this function is deleted.
7046
7047 /// DiagnoseSentinelCalls - This routine checks whether a call or
7048 /// message-send is to a declaration with the sentinel attribute, and
7049 /// if so, it checks that the requirements of the sentinel are
7050 /// satisfied.
7052 ArrayRef<Expr *> Args);
7053
7055 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
7058
7060 ExpressionEvaluationContext NewContext, FunctionDecl *FD);
7061
7064 ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
7068
7070
7074
7075 /// Check whether E, which is either a discarded-value expression or an
7076 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
7077 /// lvalue, and if so, remove it from the list of volatile-qualified
7078 /// assignments that we are going to warn are deprecated.
7080
7082
7083 // Functions for marking a declaration referenced. These functions also
7084 // contain the relevant logic for marking if a reference to a function or
7085 // variable is an odr-use (in the C++11 sense). There are separate variants
7086 // for expressions referring to a decl; these exist because odr-use marking
7087 // needs to be delayed for some constant variables when we build one of the
7088 // named expressions.
7089 //
7090 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
7091 // should usually be true. This only needs to be set to false if the lack of
7092 // odr-use cannot be determined from the current context (for instance,
7093 // because the name denotes a virtual function and was written without an
7094 // explicit nested-name-specifier).
7095 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
7096
7097 /// Mark a function referenced, and check whether it is odr-used
7098 /// (C++ [basic.def.odr]p2, C99 6.9p3)
7100 bool MightBeOdrUse = true);
7101
7102 /// Mark a variable referenced, and check whether it is odr-used
7103 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
7104 /// used directly for normal expressions referring to VarDecl.
7106
7107 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
7108 ///
7109 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
7110 /// be handled with care if the DeclRefExpr is not newly-created.
7111 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
7112
7113 /// Perform reference-marking and odr-use handling for a MemberExpr.
7115
7116 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
7119 unsigned CapturingScopeIndex);
7120
7122 void CleanupVarDeclMarking();
7123
7124 /// Try to capture the given variable.
7125 ///
7126 /// \param Var The variable to capture.
7127 ///
7128 /// \param Loc The location at which the capture occurs.
7129 ///
7130 /// \param Kind The kind of capture, which may be implicit (for either a
7131 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
7132 ///
7133 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
7134 /// an explicit lambda capture.
7135 ///
7136 /// \param BuildAndDiagnose Whether we are actually supposed to add the
7137 /// captures or diagnose errors. If false, this routine merely check whether
7138 /// the capture can occur without performing the capture itself or complaining
7139 /// if the variable cannot be captured.
7140 ///
7141 /// \param CaptureType Will be set to the type of the field used to capture
7142 /// this variable in the innermost block or lambda. Only valid when the
7143 /// variable can be captured.
7144 ///
7145 /// \param DeclRefType Will be set to the type of a reference to the capture
7146 /// from within the current scope. Only valid when the variable can be
7147 /// captured.
7148 ///
7149 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
7150 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
7151 /// This is useful when enclosing lambdas must speculatively capture
7152 /// variables that may or may not be used in certain specializations of
7153 /// a nested generic lambda.
7154 ///
7155 /// \returns true if an error occurred (i.e., the variable cannot be
7156 /// captured) and false if the capture succeeded.
7158 TryCaptureKind Kind, SourceLocation EllipsisLoc,
7159 bool BuildAndDiagnose, QualType &CaptureType,
7160 QualType &DeclRefType,
7161 const unsigned *const FunctionScopeIndexToStopAt);
7162
7163 /// Try to capture the given variable.
7166 SourceLocation EllipsisLoc = SourceLocation());
7167
7168 /// Checks if the variable must be captured.
7170
7171 /// Given a variable, determine the type that a reference to that
7172 /// variable will have in the given scope.
7174
7175 /// Mark all of the declarations referenced within a particular AST node as
7176 /// referenced. Used when template instantiation instantiates a non-dependent
7177 /// type -- entities referenced by the type are now referenced.
7179
7180 /// Mark any declarations that appear within this expression or any
7181 /// potentially-evaluated subexpressions as "referenced".
7182 ///
7183 /// \param SkipLocalVariables If true, don't mark local variables as
7184 /// 'referenced'.
7185 /// \param StopAt Subexpressions that we shouldn't recurse into.
7187 bool SkipLocalVariables = false,
7188 ArrayRef<const Expr *> StopAt = {});
7189
7190 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
7191 /// conversion.
7192 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
7193
7194 /// Conditionally issue a diagnostic based on the statements's reachability
7195 /// analysis.
7196 ///
7197 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
7198 /// the function body is parsed, and then do a basic reachability analysis to
7199 /// determine if the statement is reachable. If it is unreachable, the
7200 /// diagnostic will not be emitted.
7201 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7202 const PartialDiagnostic &PD);
7203
7204 /// Conditionally issue a diagnostic based on the current
7205 /// evaluation context.
7206 ///
7207 /// \param Statement If Statement is non-null, delay reporting the
7208 /// diagnostic until the function body is parsed, and then do a basic
7209 /// reachability analysis to determine if the statement is reachable.
7210 /// If it is unreachable, the diagnostic will not be emitted.
7211 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
7212 const PartialDiagnostic &PD);
7213 /// Similar, but diagnostic is only produced if all the specified statements
7214 /// are reachable.
7215 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7216 const PartialDiagnostic &PD);
7217
7218 // Primary Expressions.
7219 SourceRange getExprRange(Expr *E) const;
7220
7221 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
7222 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
7223 bool HasTrailingLParen, bool IsAddressOfOperand,
7224 CorrectionCandidateCallback *CCC = nullptr,
7225 bool IsInlineAsmIdentifier = false);
7226
7227 /// Decomposes the given name into a DeclarationNameInfo, its location, and
7228 /// possibly a list of template arguments.
7229 ///
7230 /// If this produces template arguments, it is permitted to call
7231 /// DecomposeTemplateName.
7232 ///
7233 /// This actually loses a lot of source location information for
7234 /// non-standard name kinds; we should consider preserving that in
7235 /// some way.
7236 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
7237 TemplateArgumentListInfo &Buffer,
7238 DeclarationNameInfo &NameInfo,
7239 const TemplateArgumentListInfo *&TemplateArgs);
7240
7241 /// Diagnose a lookup that found results in an enclosing class during error
7242 /// recovery. This usually indicates that the results were found in a
7243 /// dependent base class that could not be searched as part of a template
7244 /// definition. Always issues a diagnostic (though this may be only a warning
7245 /// in MS compatibility mode).
7246 ///
7247 /// Return \c true if the error is unrecoverable, or \c false if the caller
7248 /// should attempt to recover using these lookup results.
7249 bool DiagnoseDependentMemberLookup(const LookupResult &R);
7250
7251 /// Diagnose an empty lookup.
7252 ///
7253 /// \return false if new lookup candidates were found
7254 bool
7255 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
7256 CorrectionCandidateCallback &CCC,
7257 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
7258 ArrayRef<Expr *> Args = {},
7259 DeclContext *LookupCtx = nullptr);
7260
7261 /// If \p D cannot be odr-used in the current expression evaluation context,
7262 /// return a reason explaining why. Otherwise, return NOUR_None.
7264
7265 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7266 SourceLocation Loc,
7267 const CXXScopeSpec *SS = nullptr);
7268 DeclRefExpr *
7269 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7270 const DeclarationNameInfo &NameInfo,
7271 const CXXScopeSpec *SS = nullptr,
7272 NamedDecl *FoundD = nullptr,
7273 SourceLocation TemplateKWLoc = SourceLocation(),
7274 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7275
7276 /// BuildDeclRefExpr - Build an expression that references a
7277 /// declaration that does not require a closure capture.
7278 DeclRefExpr *
7279 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7280 const DeclarationNameInfo &NameInfo,
7281 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
7282 SourceLocation TemplateKWLoc = SourceLocation(),
7283 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7284
7285 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
7286 bool HasTrailingLParen);
7287
7288 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
7289 /// declaration name, generally during template instantiation.
7290 /// There's a large number of things which don't need to be done along
7291 /// this path.
7293 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
7294 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
7295
7296 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
7297 bool NeedsADL,
7298 bool AcceptInvalidDecl = false);
7299
7300 /// Complete semantic analysis for a reference to the given declaration.
7302 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
7303 NamedDecl *FoundD = nullptr,
7304 const TemplateArgumentListInfo *TemplateArgs = nullptr,
7305 bool AcceptInvalidDecl = false);
7306
7307 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
7308 // where Tokens representing function local predefined macros (such as
7309 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
7310 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
7311
7312 ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK);
7313 ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind);
7314 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
7315
7316 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
7317
7318 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
7320 Scope *UDLScope = nullptr);
7321 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
7322 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
7323 MultiExprArg Val);
7324 ExprResult ActOnCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
7325 unsigned NumUserSpecifiedExprs,
7326 SourceLocation InitLoc,
7327 SourceLocation LParenLoc,
7328 SourceLocation RParenLoc);
7329
7330 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
7331 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
7332 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
7333 /// from multiple tokens. However, the common case is that StringToks points
7334 /// to one string.
7335 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
7336 Scope *UDLScope = nullptr);
7337
7338 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
7339
7340 /// ControllingExprOrType is either an opaque pointer coming out of a
7341 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
7342 /// into two so we don't take a void *, but that's awkward because one of
7343 /// the operands is either a ParsedType or an Expr *, which doesn't lend
7344 /// itself to generic code very well.
7345 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
7346 SourceLocation DefaultLoc,
7347 SourceLocation RParenLoc,
7348 bool PredicateIsExpr,
7349 void *ControllingExprOrType,
7350 ArrayRef<ParsedType> ArgTypes,
7351 ArrayRef<Expr *> ArgExprs);
7352 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
7353 /// it'd be better to split this interface into two so we don't take a
7354 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
7355 /// isn't a trivial change.
7356 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
7357 SourceLocation DefaultLoc,
7358 SourceLocation RParenLoc,
7359 bool PredicateIsExpr,
7360 void *ControllingExprOrType,
7361 ArrayRef<TypeSourceInfo *> Types,
7362 ArrayRef<Expr *> Exprs);
7363
7364 // Binary/Unary Operators. 'Tok' is the token for the operator.
7365 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
7366 Expr *InputExpr, bool IsAfterAmp = false);
7367 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
7368 Expr *Input, bool IsAfterAmp = false);
7369
7370 /// Unary Operators. 'Tok' is the token for the operator.
7371 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
7372 Expr *Input, bool IsAfterAmp = false);
7373
7374 /// Determine whether the given expression is a qualified member
7375 /// access expression, of a form that could be turned into a pointer to member
7376 /// with the address-of operator.
7377 bool isQualifiedMemberAccess(Expr *E);
7378 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
7379 const Expr *Op,
7380 const CXXMethodDecl *MD);
7381
7382 /// CheckAddressOfOperand - The operand of & must be either a function
7383 /// designator or an lvalue designating an object. If it is an lvalue, the
7384 /// object cannot be declared with storage class register or be a bit field.
7385 /// Note: The usual conversions are *not* applied to the operand of the &
7386 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
7387 /// In C++, the operand might be an overloaded function name, in which case
7388 /// we allow the '&' but retain the overloaded-function type.
7389 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
7390
7391 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
7392 /// _Alignas(type-name) .
7393 /// [dcl.align] An alignment-specifier of the form
7394 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
7395 ///
7396 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
7397 /// _Alignas(_Alignof(type-name)).
7398 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
7399 SourceLocation OpLoc, SourceRange R);
7400 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
7401 SourceLocation OpLoc, SourceRange R);
7402
7403 /// Build a sizeof or alignof expression given a type operand.
7404 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
7405 SourceLocation OpLoc,
7406 UnaryExprOrTypeTrait ExprKind,
7407 SourceRange R);
7408
7409 /// Build a sizeof or alignof expression given an expression
7410 /// operand.
7411 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
7412 UnaryExprOrTypeTrait ExprKind);
7413
7414 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
7415 /// expr and the same for @c alignof and @c __alignof
7416 /// Note that the ArgRange is invalid if isType is false.
7417 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
7418 UnaryExprOrTypeTrait ExprKind,
7419 bool IsType, void *TyOrEx,
7420 SourceRange ArgRange);
7421
7422 /// Check for operands with placeholder types and complain if found.
7423 /// Returns ExprError() if there was an error and no recovery was possible.
7425 bool CheckVecStepExpr(Expr *E);
7426
7427 /// Check the constraints on expression operands to unary type expression
7428 /// and type traits.
7429 ///
7430 /// Completes any types necessary and validates the constraints on the operand
7431 /// expression. The logic mostly mirrors the type-based overload, but may
7432 /// modify the expression as it completes the type for that expression through
7433 /// template instantiation, etc.
7434 bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind);
7435
7436 /// Check the constraints on operands to unary expression and type
7437 /// traits.
7438 ///
7439 /// This will complete any types necessary, and validate the various
7440 /// constraints on those operands.
7441 ///
7442 /// The UsualUnaryConversions() function is *not* called by this routine.
7443 /// C99 6.3.2.1p[2-4] all state:
7444 /// Except when it is the operand of the sizeof operator ...
7445 ///
7446 /// C++ [expr.sizeof]p4
7447 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
7448 /// standard conversions are not applied to the operand of sizeof.
7449 ///
7450 /// This policy is followed for all of the unary trait expressions.
7451 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
7452 SourceRange ExprRange,
7453 UnaryExprOrTypeTrait ExprKind,
7454 StringRef KWName);
7455
7456 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
7457 tok::TokenKind Kind, Expr *Input);
7458
7459 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
7460 MultiExprArg ArgExprs,
7461 SourceLocation RLoc);
7462 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
7463 Expr *Idx, SourceLocation RLoc);
7464
7465 ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx,
7466 SourceLocation RBLoc);
7467
7468 ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
7469 Expr *ColumnIdx,
7470 SourceLocation RBLoc);
7471
7472 /// ConvertArgumentsForCall - Converts the arguments specified in
7473 /// Args/NumArgs to the parameter types of the function FDecl with
7474 /// function prototype Proto. Call is the call expression itself, and
7475 /// Fn is the function expression. For a C++ member function, this
7476 /// routine does not attempt to convert the object argument. Returns
7477 /// true if the call is ill-formed.
7478 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
7479 const FunctionProtoType *Proto,
7480 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
7481 bool ExecConfig = false);
7482
7483 /// CheckStaticArrayArgument - If the given argument corresponds to a static
7484 /// array parameter, check that it is non-null, and that if it is formed by
7485 /// array-to-pointer decay, the underlying array is sufficiently large.
7486 ///
7487 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
7488 /// the array type derivation, then for each call to the function, the value
7489 /// of the corresponding actual argument shall provide access to the first
7490 /// element of an array with at least as many elements as specified by the
7491 /// size expression.
7492 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
7493 const Expr *ArgExpr);
7494
7495 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
7496 /// This provides the location of the left/right parens and a list of comma
7497 /// locations.
7498 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7499 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7500 Expr *ExecConfig = nullptr);
7501
7502 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
7503 /// This provides the location of the left/right parens and a list of comma
7504 /// locations.
7505 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7506 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7507 Expr *ExecConfig = nullptr,
7508 bool IsExecConfig = false,
7509 bool AllowRecovery = false);
7510
7511 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
7512 // with the specified CallArgs
7513 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
7514 MultiExprArg CallArgs);
7515
7517
7518 /// BuildResolvedCallExpr - Build a call to a resolved expression,
7519 /// i.e. an expression not of \p OverloadTy. The expression should
7520 /// unary-convert to an expression of function-pointer or
7521 /// block-pointer type.
7522 ///
7523 /// \param NDecl the declaration being called, if available
7525 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
7526 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
7527 Expr *Config = nullptr, bool IsExecConfig = false,
7528 ADLCallKind UsesADL = ADLCallKind::NotADL);
7529
7531 ParsedType &Ty, SourceLocation RParenLoc,
7532 Expr *CastExpr);
7533
7534 /// Prepares for a scalar cast, performing all the necessary stages
7535 /// except the final cast and returning the kind required.
7537
7538 /// Build an altivec or OpenCL literal.
7540 SourceLocation RParenLoc, Expr *E,
7541 TypeSourceInfo *TInfo);
7542
7543 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7544 /// the ParenListExpr into a sequence of comma binary operators.
7546
7548 SourceLocation RParenLoc, Expr *InitExpr);
7549
7551 TypeSourceInfo *TInfo,
7552 SourceLocation RParenLoc,
7553 Expr *LiteralExpr);
7554
7555 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7556 SourceLocation RBraceLoc);
7557
7558 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7559 SourceLocation RBraceLoc, bool IsExplicit);
7560
7561 /// Binary Operators. 'Tok' is the token for the operator.
7563 Expr *LHSExpr, Expr *RHSExpr);
7565 Expr *LHSExpr, Expr *RHSExpr,
7566 bool ForFoldExpression = false);
7567
7568 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7569 /// operator @p Opc at location @c TokLoc. This routine only supports
7570 /// built-in operations; ActOnBinOp handles overloaded operators.
7572 Expr *LHSExpr, Expr *RHSExpr,
7573 bool ForFoldExpression = false);
7575 UnresolvedSetImpl &Functions);
7576
7577 /// Look for instances where it is likely the comma operator is confused with
7578 /// another operator. There is an explicit list of acceptable expressions for
7579 /// the left hand side of the comma operator, otherwise emit a warning.
7580 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7581
7582 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7583 /// in the case of a the GNU conditional expr extension.
7585 SourceLocation ColonLoc, Expr *CondExpr,
7586 Expr *LHSExpr, Expr *RHSExpr);
7587
7588 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7590 LabelDecl *TheDecl);
7591
7592 void ActOnStartStmtExpr();
7593 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7594 SourceLocation RPLoc);
7596 SourceLocation RPLoc, unsigned TemplateDepth);
7597 // Handle the final expression in a statement expression.
7599 void ActOnStmtExprError();
7600
7601 /// __builtin_offsetof(type, a.b[123][456].c)
7603 TypeSourceInfo *TInfo,
7604 const Designation &Desig,
7605 SourceLocation RParenLoc);
7608 ParsedType ParsedArgTy,
7609 const Designation &Desig,
7610 SourceLocation RParenLoc);
7611
7612 // __builtin_choose_expr(constExpr, expr1, expr2)
7613 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7614 Expr *LHSExpr, Expr *RHSExpr,
7615 SourceLocation RPLoc);
7616
7617 // __builtin_va_arg(expr, type)
7619 SourceLocation RPLoc);
7621 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7622
7623 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7624 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7626 SourceLocation BuiltinLoc,
7627 SourceLocation RPLoc);
7628
7629 // #embed
7631 StringLiteral *BinaryData, StringRef FileName);
7632
7633 // Build a potentially resolved SourceLocExpr.
7635 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7636 DeclContext *ParentContext);
7637
7638 // __null
7640
7641 bool CheckCaseExpression(Expr *E);
7642
7643 //===------------------------- "Block" Extension ------------------------===//
7644
7645 /// ActOnBlockStart - This callback is invoked when a block literal is
7646 /// started.
7647 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7648
7649 /// ActOnBlockArguments - This callback allows processing of block arguments.
7650 /// If there are no arguments, this is still invoked.
7651 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7652 Scope *CurScope);
7653
7654 /// ActOnBlockError - If there is an error parsing a block, this callback
7655 /// is invoked to pop the information about the block from the action impl.
7656 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7657
7658 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7659 /// literal was successfully completed. ^(int x){...}
7661 Scope *CurScope);
7662
7663 //===---------------------------- Clang Extensions ----------------------===//
7664
7665 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7666 /// provided arguments.
7667 ///
7668 /// __builtin_convertvector( value, dst type )
7669 ///
7671 SourceLocation BuiltinLoc,
7672 SourceLocation RParenLoc);
7673
7674 //===---------------------------- OpenCL Features -----------------------===//
7675
7676 /// Parse a __builtin_astype expression.
7677 ///
7678 /// __builtin_astype( value, dst type )
7679 ///
7680 ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
7681 SourceLocation BuiltinLoc,
7682 SourceLocation RParenLoc);
7683
7684 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7686 SourceLocation BuiltinLoc,
7687 SourceLocation RParenLoc);
7688
7689 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7691 ArrayRef<Expr *> SubExprs,
7692 QualType T = QualType());
7693
7694 /// Cast a base object to a member's actual type.
7695 ///
7696 /// There are two relevant checks:
7697 ///
7698 /// C++ [class.access.base]p7:
7699 ///
7700 /// If a class member access operator [...] is used to access a non-static
7701 /// data member or non-static member function, the reference is ill-formed
7702 /// if the left operand [...] cannot be implicitly converted to a pointer to
7703 /// the naming class of the right operand.
7704 ///
7705 /// C++ [expr.ref]p7:
7706 ///
7707 /// If E2 is a non-static data member or a non-static member function, the
7708 /// program is ill-formed if the class of which E2 is directly a member is
7709 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7710 ///
7711 /// Note that the latter check does not consider access; the access of the
7712 /// "real" base class is checked as appropriate when checking the access of
7713 /// the member name.
7715 NestedNameSpecifier Qualifier,
7716 NamedDecl *FoundDecl,
7717 NamedDecl *Member);
7718
7719 /// CheckCallReturnType - Checks that a call expression's return type is
7720 /// complete. Returns true on failure. The location passed in is the location
7721 /// that best represents the call.
7722 bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
7723 CallExpr *CE, FunctionDecl *FD);
7724
7725 /// Emit a warning for all pending noderef expressions that we recorded.
7727
7728private:
7729 /// Shared logic for building default member initializer which used in a
7730 /// constructor or an aggregate initialization.
7731 ///
7732 ///
7733 /// The caller enters that evaluation context and decides whether the result
7734 /// is finished as a full-expression. \p NestedDefaultChecking and
7735 /// \p NeedRebuild have to be sampled before entering it.
7736 ExprResult BuildCXXDefaultInitInternal(SourceLocation Loc, FieldDecl *Field,
7737 const InitializedEntity &Entity,
7738 bool NestedDefaultChecking,
7739 bool NeedRebuild);
7740
7741public:
7745 const InitializedEntity &MemberEntity);
7746
7747 /// Instantiate or parse a C++ default argument expression as necessary.
7748 /// Return true on error.
7750 ParmVarDecl *Param, Expr *Init = nullptr,
7751 bool SkipImmediateInvocations = true);
7752
7753 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7754 /// the default expr if needed.
7756 ParmVarDecl *Param, Expr *Init = nullptr);
7757
7758 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7759 /// invocation.
7761
7763
7764 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7765 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7766
7767 /// Abstract base class used for diagnosing integer constant
7768 /// expression violations.
7770 public:
7772
7774
7775 virtual SemaDiagnosticBuilder
7776 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7778 SourceLocation Loc) = 0;
7781 };
7782
7783 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7784 /// and reports the appropriate diagnostics. Returns false on success.
7785 /// Can optionally return the value of the expression.
7788 VerifyICEDiagnoser &Diagnoser,
7792 unsigned DiagID,
7795 VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result = nullptr,
7799 AllowFoldKind CanFold = AllowFoldKind::No) {
7800 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7801 }
7802
7803 /// DiagnoseAssignmentAsCondition - Given that an expression is
7804 /// being used as a boolean condition, warn if it's an assignment.
7806
7807 /// Redundant parentheses over an equality comparison can indicate
7808 /// that the user intended an assignment used as condition.
7810
7812 public:
7814 FullExprArg(Sema &actions) : E(nullptr) {}
7815
7816 ExprResult release() { return E; }
7817
7818 Expr *get() const { return E; }
7819
7820 Expr *operator->() { return E; }
7821
7822 private:
7823 // FIXME: No need to make the entire Sema class a friend when it's just
7824 // Sema::MakeFullExpr that needs access to the constructor below.
7825 friend class Sema;
7826
7827 explicit FullExprArg(Expr *expr) : E(expr) {}
7828
7829 Expr *E;
7830 };
7831
7833 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7834 }
7836 return FullExprArg(
7837 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7838 }
7840 ExprResult FE =
7841 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7842 /*DiscardedValue*/ true);
7843 return FullExprArg(FE.get());
7844 }
7845
7846 class ConditionResult {
7847 Decl *ConditionVar;
7848 ExprResult Condition;
7849 bool Invalid;
7850 std::optional<bool> KnownValue;
7851
7852 friend class Sema;
7853 ConditionResult(Sema &S, Decl *ConditionVar, ExprResult Condition,
7854 bool IsConstexpr)
7855 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7856 if (IsConstexpr && Condition.get()) {
7857 if (std::optional<llvm::APSInt> Val =
7858 Condition.get()->getIntegerConstantExpr(S.Context)) {
7859 KnownValue = !!(*Val);
7860 }
7861 }
7862 }
7863 explicit ConditionResult(bool Invalid)
7864 : ConditionVar(nullptr), Condition(Invalid), Invalid(Invalid),
7865 KnownValue(std::nullopt) {}
7866
7867 public:
7868 ConditionResult() : ConditionResult(false) {}
7869 bool isInvalid() const { return Invalid; }
7870 std::pair<VarDecl *, Expr *> get() const {
7871 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7872 Condition.get());
7873 }
7874 std::optional<bool> getKnownValue() const { return KnownValue; }
7875 };
7877
7878 /// CheckBooleanCondition - Diagnose problems involving the use of
7879 /// the given expression as a boolean condition (e.g. in an if
7880 /// statement). Also performs the standard function and array
7881 /// decays, possibly changing the input variable.
7882 ///
7883 /// \param Loc - A location associated with the condition, e.g. the
7884 /// 'if' keyword.
7885 /// \return true iff there were any errors
7887 bool IsConstexpr = false);
7888
7889 enum class ConditionKind {
7890 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7891 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7892 Switch ///< An integral condition for a 'switch' statement.
7893 };
7894
7895 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7896 ConditionKind CK, bool MissingOK = false);
7897
7898 QualType CheckConditionalOperands( // C99 6.5.15
7899 ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK,
7900 ExprObjectKind &OK, SourceLocation QuestionLoc);
7901
7902 /// Emit a specialized diagnostic when one expression is a null pointer
7903 /// constant and the other is not a pointer. Returns true if a diagnostic is
7904 /// emitted.
7905 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7906 SourceLocation QuestionLoc);
7907
7908 /// type checking for vector binary operators.
7910 SourceLocation Loc, bool IsCompAssign,
7911 bool AllowBothBool, bool AllowBoolConversion,
7912 bool AllowBoolOperation, bool ReportInvalid);
7913
7914 /// Return a signed ext_vector_type that is of identical size and number of
7915 /// elements. For floating point vectors, return an integer type of identical
7916 /// size and number of elements. In the non ext_vector_type case, search from
7917 /// the largest type to the smallest type to avoid cases where long long ==
7918 /// long, where long gets picked over long long.
7921
7922 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7923 /// operates on extended vector types. Instead of producing an IntTy result,
7924 /// like a scalar comparison, a vector comparison produces a vector of integer
7925 /// types.
7927 SourceLocation Loc,
7928 BinaryOperatorKind Opc);
7930 SourceLocation Loc,
7931 BinaryOperatorKind Opc);
7933 SourceLocation Loc,
7934 BinaryOperatorKind Opc);
7936 SourceLocation Loc,
7937 BinaryOperatorKind Opc);
7939 SourceLocation Loc,
7940 BinaryOperatorKind Opc);
7941 // type checking for sizeless vector binary operators.
7943 SourceLocation Loc, bool IsCompAssign,
7944 ArithConvKind OperationKind);
7945
7946 /// Type checking for matrix binary operators.
7948 SourceLocation Loc,
7949 bool IsCompAssign);
7951 SourceLocation Loc, bool IsCompAssign);
7952
7953 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7954 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7955 /// VLST) allowed?
7956 ///
7957 /// This will also return false if the two given types do not make sense from
7958 /// the perspective of SVE bitcasts.
7959 bool isValidSveBitcast(QualType srcType, QualType destType);
7960
7961 /// Are the two types matrix types and do they have the same dimensions i.e.
7962 /// do they have the same number of rows and the same number of columns?
7964
7965 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7966
7967 /// Are the two types lax-compatible vector types? That is, given
7968 /// that one of them is a vector, do they have equal storage sizes,
7969 /// where the storage size is the number of elements times the element
7970 /// size?
7971 ///
7972 /// This will also return false if either of the types is neither a
7973 /// vector nor a real type.
7974 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
7975
7976 /// Is this a legal conversion between two types, one of which is
7977 /// known to be a vector type?
7978 bool isLaxVectorConversion(QualType srcType, QualType destType);
7979
7980 // This returns true if at least one of the types is an altivec vector.
7981 bool anyAltivecTypes(QualType srcType, QualType destType);
7982
7983 // type checking C++ declaration initializers (C++ [dcl.init]).
7984
7985 /// Check a cast of an unknown-any type. We intentionally only
7986 /// trigger this for C-style casts.
7989 ExprValueKind &VK, CXXCastPath &Path);
7990
7991 /// Force an expression with unknown-type to an expression of the
7992 /// given type.
7994
7995 /// Type-check an expression that's being passed to an
7996 /// __unknown_anytype parameter.
7998 QualType &paramType);
7999
8000 // CheckMatrixCast - Check type constraints for matrix casts.
8001 // We allow casting between matrixes of the same dimensions i.e. when they
8002 // have the same number of rows and column. Returns true if the cast is
8003 // invalid.
8004 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
8005 CastKind &Kind);
8006
8007 // CheckVectorCast - check type constraints for vectors.
8008 // Since vectors are an extension, there are no C standard reference for this.
8009 // We allow casting between vectors and integer datatypes of the same size.
8010 // returns true if the cast is invalid
8011 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
8012 CastKind &Kind);
8013
8014 /// Prepare `SplattedExpr` for a vector splat operation, adding
8015 /// implicit casts if necessary.
8016 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
8017
8018 /// Prepare `SplattedExpr` for a matrix splat operation, adding
8019 /// implicit casts if necessary.
8020 ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr);
8021
8022 // CheckExtVectorCast - check type constraints for extended vectors.
8023 // Since vectors are an extension, there are no C standard reference for this.
8024 // We allow casting between vectors and integer datatypes of the same size,
8025 // or vectors and the element type of that vector.
8026 // returns the cast expr
8028 CastKind &Kind);
8029
8031 return K == ConditionKind::Switch ? Context.IntTy : Context.BoolTy;
8032 }
8033
8034 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2), converts
8035 // functions and arrays to their respective pointers (C99 6.3.2.1), and
8036 // promotes floating-piont types according to the language semantics.
8038
8039 // UsualUnaryFPConversions - promotes floating-point types according to the
8040 // current language semantics.
8042
8043 /// CallExprUnaryConversions - a special case of an unary conversion
8044 /// performed on a function designator of a call expression.
8046
8047 // DefaultFunctionArrayConversion - converts functions and arrays
8048 // to their respective pointers (C99 6.3.2.1).
8050
8051 // DefaultFunctionArrayLvalueConversion - converts functions and
8052 // arrays to their respective pointers and performs the
8053 // lvalue-to-rvalue conversion.
8055 bool Diagnose = true);
8056
8057 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
8058 // the operand. This function is a no-op if the operand has a function type
8059 // or an array type.
8061
8062 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
8063 // do not have a prototype. Integer promotions are performed on each
8064 // argument, and arguments that have type float are promoted to double.
8066
8068 const FunctionProtoType *Proto,
8069 Expr *Fn);
8070
8071 /// Determine the degree of POD-ness for an expression.
8072 /// Incomplete types are considered POD, since this check can be performed
8073 /// when we're in an unevaluated context.
8075
8076 /// Check to see if the given expression is a valid argument to a variadic
8077 /// function, issuing a diagnostic if not.
8078 void checkVariadicArgument(const Expr *E, VariadicCallType CT);
8079
8080 /// GatherArgumentsForCall - Collector argument expressions for various
8081 /// form of call prototypes.
8083 SourceLocation CallLoc, FunctionDecl *FDecl,
8084 const FunctionProtoType *Proto, unsigned FirstParam,
8087 bool AllowExplicit = false, bool IsListInitialization = false);
8088
8089 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
8090 // will create a runtime trap if the resulting type is not a POD type.
8092 FunctionDecl *FDecl);
8093
8094 // Check that the usual arithmetic conversions can be performed on this pair
8095 // of expressions that might be of enumeration type.
8097 ArithConvKind ACK);
8098
8099 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
8100 // operands and then handles various conversions that are common to binary
8101 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
8102 // routine returns the first non-arithmetic type found. The client is
8103 // responsible for emitting appropriate error diagnostics.
8105 SourceLocation Loc, ArithConvKind ACK);
8106
8108 switch (ConvTy) {
8109 default:
8110 return false;
8114 return true;
8115 }
8116 llvm_unreachable("impossible");
8117 }
8118
8119 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
8120 /// assignment conversion type specified by ConvTy. This returns true if the
8121 /// conversion was invalid or false if the conversion was accepted.
8123 QualType DstType, QualType SrcType,
8124 Expr *SrcExpr, AssignmentAction Action,
8125 bool *Complained = nullptr);
8126
8127 /// CheckAssignmentConstraints - Perform type checking for assignment,
8128 /// argument passing, variable initialization, and function return values.
8129 /// C99 6.5.16.
8131 QualType LHSType,
8132 QualType RHSType);
8133
8134 /// Check assignment constraints and optionally prepare for a conversion of
8135 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
8136 /// is true.
8138 ExprResult &RHS, CastKind &Kind,
8139 bool ConvertRHS = true);
8140
8141 /// Check assignment constraints for an assignment of RHS to LHSType.
8142 ///
8143 /// \param LHSType The destination type for the assignment.
8144 /// \param RHS The source expression for the assignment.
8145 /// \param Diagnose If \c true, diagnostics may be produced when checking
8146 /// for assignability. If a diagnostic is produced, \p RHS will be
8147 /// set to ExprError(). Note that this function may still return
8148 /// without producing a diagnostic, even for an invalid assignment.
8149 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
8150 /// in an audited Core Foundation API and does not need to be checked
8151 /// for ARC retain issues.
8152 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
8153 /// conversions necessary to perform the assignment. If \c false,
8154 /// \p Diagnose must also be \c false.
8156 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
8157 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
8158
8159 // If the lhs type is a transparent union, check whether we
8160 // can initialize the transparent union with the given expression.
8162 ExprResult &RHS);
8163
8164 /// the following "Check" methods will return a valid/converted QualType
8165 /// or a null QualType (indicating an error diagnostic was issued).
8166
8167 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
8169 ExprResult &RHS);
8170
8171 /// Diagnose cases where a scalar was implicitly converted to a vector and
8172 /// diagnose the underlying types. Otherwise, diagnose the error
8173 /// as invalid vector logical operands for non-C++ cases.
8175 ExprResult &RHS);
8176
8178 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8179 BinaryOperatorKind Opc);
8180 QualType CheckRemainderOperands( // C99 6.5.5
8181 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8182 bool IsCompAssign = false);
8183 QualType CheckAdditionOperands( // C99 6.5.6
8184 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8185 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8187 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8188 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8189 QualType CheckShiftOperands( // C99 6.5.7
8190 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8191 BinaryOperatorKind Opc, bool IsCompAssign = false);
8193 QualType CheckCompareOperands( // C99 6.5.8/9
8194 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8195 BinaryOperatorKind Opc);
8196 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
8197 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8198 BinaryOperatorKind Opc);
8199 QualType CheckLogicalOperands( // C99 6.5.[13,14]
8200 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8201 BinaryOperatorKind Opc);
8202 // CheckAssignmentOperands is used for both simple and compound assignment.
8203 // For simple assignment, pass both expressions and a null converted type.
8204 // For compound assignment, pass both expressions and the converted type.
8205 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
8206 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
8207 BinaryOperatorKind Opc);
8208
8209 /// To be used for checking whether the arguments being passed to
8210 /// function exceeds the number of parameters expected for it.
8211 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
8212 bool PartialOverloading = false) {
8213 // We check whether we're just after a comma in code-completion.
8214 if (NumArgs > 0 && PartialOverloading)
8215 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
8216 return NumArgs > NumParams;
8217 }
8218
8219 /// Whether the AST is currently being rebuilt to correct immediate
8220 /// invocations. Immediate invocation candidates and references to consteval
8221 /// functions aren't tracked when this is set.
8223
8229
8230 /// Determines whether we are currently in a context that
8231 /// is not evaluated as per C++ [expr] p5.
8234 }
8235
8239
8243
8247
8254
8255 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8257 assert(!ExprEvalContexts.empty() &&
8258 "Must be in an expression evaluation context");
8259 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8261 Ctx.DelayedDefaultInitializationContext)
8262 return Ctx.DelayedDefaultInitializationContext;
8263 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8264 Ctx.isUnevaluated())
8265 break;
8266 }
8267 return std::nullopt;
8268 }
8269
8270 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8272 assert(!ExprEvalContexts.empty() &&
8273 "Must be in an expression evaluation context");
8274 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
8275 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8277 !Ctx.DelayedDefaultInitializationContext && Res)
8278 break;
8279 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8280 Ctx.isUnevaluated())
8281 break;
8282 Res = Ctx.DelayedDefaultInitializationContext;
8283 }
8284 return Res;
8285 }
8286
8287 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
8288 /// SelfAssigned when inside a CXXMethodDecl.
8289 const FieldDecl *
8291
8293
8294 template <typename... Ts>
8296 const Ts &...Args) {
8297 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8298 return RequireCompleteType(Loc, T, CompleteTypeKind::Normal, Diagnoser);
8299 }
8300
8301 template <typename... Ts>
8302 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
8303 const Ts &...Args) {
8304 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8306 }
8307
8308 /// Abstract class used to diagnose incomplete types.
8311
8312 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
8313 virtual ~TypeDiagnoser() {}
8314 };
8315
8316 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
8317 protected:
8318 unsigned DiagID;
8319 std::tuple<const Ts &...> Args;
8320
8321 template <std::size_t... Is>
8323 std::index_sequence<Is...>) const {
8324 // Apply all tuple elements to the builder in order.
8325 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
8326 (void)Dummy;
8327 }
8328
8329 public:
8330 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8331 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
8332 assert(DiagID != 0 && "no diagnostic for type diagnoser");
8333 }
8334
8335 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8336 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
8337 emit(DB, std::index_sequence_for<Ts...>());
8338 DB << T;
8339 }
8340 };
8341
8342 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
8343 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
8344 /// For example, a diagnostic with no other parameters would generally have
8345 /// the form "...%select{incomplete|sizeless}0 type %1...".
8346 template <typename... Ts>
8348 public:
8349 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8350 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
8351
8352 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8353 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
8354 this->emit(DB, std::index_sequence_for<Ts...>());
8355 DB << T->isSizelessType() << T;
8356 }
8357 };
8358
8359 /// Check an argument list for placeholders that we won't try to
8360 /// handle later.
8362
8363 /// The C++ "std::source_location::__impl" struct, defined in
8364 /// <source_location>.
8366
8367 /// A stack of expression evaluation contexts.
8369
8370 // Set of failed immediate invocations to avoid double diagnosing.
8372
8373 /// List of SourceLocations where 'self' is implicitly retained inside a
8374 /// block.
8377
8378 /// Do an explicit extend of the given block pointer if we're in ARC.
8380
8381 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
8384
8385private:
8386 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
8387
8388 /// Methods for marking which expressions involve dereferencing a pointer
8389 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
8390 /// they are parsed, meaning that a noderef pointer may not be accessed. For
8391 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
8392 /// `*p`, but need to check that `address of` is called on it. This requires
8393 /// keeping a container of all pending expressions and checking if the address
8394 /// of them are eventually taken.
8395 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
8396 void CheckAddressOfNoDeref(const Expr *E);
8397
8398 ///@}
8399
8400 //
8401 //
8402 // -------------------------------------------------------------------------
8403 //
8404 //
8405
8406 /// \name C++ Expressions
8407 /// Implementations are in SemaExprCXX.cpp
8408 ///@{
8409
8410public:
8411 /// The C++ "std::bad_alloc" class, which is defined by the C++
8412 /// standard library.
8414
8415 /// The C++ "std::align_val_t" enum class, which is defined by the C++
8416 /// standard library.
8418
8419 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
8421
8422 /// A flag to remember whether the implicit forms of operator new and delete
8423 /// have been declared.
8425
8426 /// Delete-expressions to be analyzed at the end of translation unit
8427 ///
8428 /// This list contains class members, and locations of delete-expressions
8429 /// that could not be proven as to whether they mismatch with new-expression
8430 /// used in initializer of the field.
8431 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
8432
8433 /// Handle the result of the special case name lookup for inheriting
8434 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
8435 /// constructor names in member using declarations, even if 'X' is not the
8436 /// name of the corresponding type.
8438 SourceLocation NameLoc,
8439 const IdentifierInfo &Name);
8440
8442 SourceLocation NameLoc, Scope *S,
8443 CXXScopeSpec &SS, bool EnteringContext);
8445 Scope *S, CXXScopeSpec &SS,
8446 ParsedType ObjectType, bool EnteringContext);
8447
8449 ParsedType ObjectType);
8450
8451 /// Build a C++ typeid expression with a type operand.
8452 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8453 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8454
8455 /// Build a C++ typeid expression with an expression operand.
8456 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8457 Expr *Operand, SourceLocation RParenLoc);
8458
8459 /// ActOnCXXTypeid - Parse typeid( something ).
8461 bool isType, void *TyOrExpr,
8462 SourceLocation RParenLoc);
8463
8464 /// Build a Microsoft __uuidof expression with a type operand.
8465 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8466 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8467
8468 /// Build a Microsoft __uuidof expression with an expression operand.
8469 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8470 Expr *Operand, SourceLocation RParenLoc);
8471
8472 /// ActOnCXXUuidof - Parse __uuidof( something ).
8474 bool isType, void *TyOrExpr,
8475 SourceLocation RParenLoc);
8476
8477 //// ActOnCXXThis - Parse 'this' pointer.
8479
8480 /// Check whether the type of 'this' is valid in the current context.
8482
8483 /// Build a CXXThisExpr and mark it referenced in the current context.
8484 Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
8486
8487 /// Try to retrieve the type of the 'this' pointer.
8488 ///
8489 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8491
8492 /// When non-NULL, the C++ 'this' expression is allowed despite the
8493 /// current context not being a non-static member function. In such cases,
8494 /// this provides the type used for 'this'.
8496
8497 /// RAII object used to temporarily allow the C++ 'this' expression
8498 /// to be used, with the given qualifiers on the current class type.
8500 Sema &S;
8501 QualType OldCXXThisTypeOverride;
8502 bool Enabled;
8503
8504 public:
8505 /// Introduce a new scope where 'this' may be allowed (when enabled),
8506 /// using the given declaration (which is either a class template or a
8507 /// class) along with the given qualifiers.
8508 /// along with the qualifiers placed on '*this'.
8509 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8510 bool Enabled = true);
8511
8515 };
8516
8517 /// Make sure the value of 'this' is actually available in the current
8518 /// context, if it is a potentially evaluated context.
8519 ///
8520 /// \param Loc The location at which the capture of 'this' occurs.
8521 ///
8522 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8523 /// capture list.
8524 ///
8525 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8526 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8527 /// This is useful when enclosing lambdas must speculatively capture
8528 /// 'this' that may or may not be used in certain specializations of
8529 /// a nested generic lambda (depending on whether the name resolves to
8530 /// a non-static member function or a static function).
8531 /// \return returns 'true' if failed, 'false' if success.
8533 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8534 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8535 bool ByCopy = false);
8536
8537 /// Determine whether the given type is the type of *this that is used
8538 /// outside of the body of a member function for a type that is currently
8539 /// being defined.
8541
8542 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8544
8545 /// Build a boolean-typed literal expression.
8547
8548 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8550
8551 //// ActOnCXXThrow - Parse throw expressions.
8554 bool IsThrownVarInScope);
8555
8556 /// CheckCXXThrowOperand - Validate the operand of a throw.
8557 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8558
8559 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8560 /// Can be interpreted either as function-style casting ("int(x)")
8561 /// or class type construction ("ClassType(x,y,z)")
8562 /// or creation of a value-initialized type ("int()").
8564 SourceLocation LParenOrBraceLoc,
8565 MultiExprArg Exprs,
8566 SourceLocation RParenOrBraceLoc,
8567 bool ListInitialization);
8568
8570 SourceLocation LParenLoc,
8571 MultiExprArg Exprs,
8572 SourceLocation RParenLoc,
8573 bool ListInitialization);
8574
8575 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8576 ///
8577 /// E.g.:
8578 /// @code new (memory) int[size][4] @endcode
8579 /// or
8580 /// @code ::new Foo(23, "hello") @endcode
8581 ///
8582 /// \param StartLoc The first location of the expression.
8583 /// \param UseGlobal True if 'new' was prefixed with '::'.
8584 /// \param PlacementLParen Opening paren of the placement arguments.
8585 /// \param PlacementArgs Placement new arguments.
8586 /// \param PlacementRParen Closing paren of the placement arguments.
8587 /// \param TypeIdParens If the type is in parens, the source range.
8588 /// \param D The type to be allocated, as well as array dimensions.
8589 /// \param Initializer The initializing expression or initializer-list, or
8590 /// null if there is none.
8591 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8592 SourceLocation PlacementLParen,
8593 MultiExprArg PlacementArgs,
8594 SourceLocation PlacementRParen,
8595 SourceRange TypeIdParens, Declarator &D,
8596 Expr *Initializer);
8598 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8599 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8600 SourceRange TypeIdParens, QualType AllocType,
8601 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8602 SourceRange DirectInitRange, Expr *Initializer);
8603
8604 /// Determine whether \p FD is an aligned allocation or deallocation
8605 /// function that is unavailable.
8607
8608 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8609 /// function that is unavailable.
8611 SourceLocation Loc);
8612
8613 /// Checks that a type is suitable as the allocated type
8614 /// in a new-expression.
8615 bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
8616 SourceRange R);
8617
8618 /// Finds the overloads of operator new and delete that are appropriate
8619 /// for the allocation.
8620 std::optional<ResolvedAllocation> FindAllocationFunctions(
8621 SourceLocation StartLoc, SourceRange Range,
8623 QualType AllocType, bool IsArray, const ImplicitAllocationParameters &IAP,
8624 MultiExprArg PlaceArgs, bool Diagnose = true);
8625
8626 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8627 /// delete. These are:
8628 /// @code
8629 /// // C++03:
8630 /// void* operator new(std::size_t) throw(std::bad_alloc);
8631 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8632 /// void operator delete(void *) throw();
8633 /// void operator delete[](void *) throw();
8634 /// // C++11:
8635 /// void* operator new(std::size_t);
8636 /// void* operator new[](std::size_t);
8637 /// void operator delete(void *) noexcept;
8638 /// void operator delete[](void *) noexcept;
8639 /// // C++1y:
8640 /// void* operator new(std::size_t);
8641 /// void* operator new[](std::size_t);
8642 /// void operator delete(void *) noexcept;
8643 /// void operator delete[](void *) noexcept;
8644 /// void operator delete(void *, std::size_t) noexcept;
8645 /// void operator delete[](void *, std::size_t) noexcept;
8646 /// @endcode
8647 /// Note that the placement and nothrow forms of new are *not* implicitly
8648 /// declared. Their use requires including <new>.
8651 ArrayRef<QualType> Params);
8652
8654 DeclarationName Name, FunctionDecl *&Operator,
8656 bool Diagnose = true);
8659 DeclarationName Name,
8660 bool Diagnose = true);
8662 CXXRecordDecl *RD,
8663 bool Diagnose,
8664 bool LookForGlobal,
8665 DeclarationName Name);
8666
8667 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8668 /// @code ::delete ptr; @endcode
8669 /// or
8670 /// @code delete [] ptr; @endcode
8671 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8672 bool ArrayForm, Expr *Operand);
8674 bool IsDelete, bool CallCanBeVirtual,
8675 bool WarnOnNonAbstractTypes,
8676 SourceLocation DtorLoc);
8677
8679 Expr *Operand, SourceLocation RParen);
8681 SourceLocation RParen);
8682
8684 SourceLocation OpLoc,
8685 tok::TokenKind OpKind,
8686 ParsedType &ObjectType,
8687 bool &MayBePseudoDestructor);
8688
8690 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8691 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8692 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8693
8695 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8696 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8697 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8698
8700 SourceLocation OpLoc,
8701 tok::TokenKind OpKind,
8702 SourceLocation TildeLoc,
8703 const DeclSpec &DS);
8704
8705 /// MaybeCreateExprWithCleanups - If the current full-expression
8706 /// requires any cleanups, surround it with a ExprWithCleanups node.
8707 /// Otherwise, just returns the passed-in expression.
8711
8712 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8713 return ActOnFinishFullExpr(
8714 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8715 }
8717 bool DiscardedValue, bool IsConstexpr = false,
8718 bool IsTemplateArgument = false);
8720
8721 /// Process the expression contained within a decltype. For such expressions,
8722 /// certain semantic checks on temporaries are delayed until this point, and
8723 /// are omitted for the 'topmost' call in the decltype expression. If the
8724 /// topmost call bound a temporary, strip that temporary off the expression.
8726
8727 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8728 bool IsUDSuffix);
8729
8731
8732 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8733 SourceLocation StmtLoc,
8734 ConditionKind CK);
8735
8736 /// Check the use of the given variable as a C++ condition in an if,
8737 /// while, do-while, or switch statement.
8739 SourceLocation StmtLoc, ConditionKind CK);
8740
8741 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8742 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8743
8744 /// Helper function to determine whether this is the (deprecated) C++
8745 /// conversion from a string literal to a pointer to non-const char or
8746 /// non-const wchar_t (for narrow and wide string literals,
8747 /// respectively).
8749
8750 /// PerformImplicitConversion - Perform an implicit conversion of the
8751 /// expression From to the type ToType using the pre-computed implicit
8752 /// conversion sequence ICS. Returns the converted
8753 /// expression. Action is the kind of conversion we're performing,
8754 /// used in the error message.
8756 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8757 AssignmentAction Action,
8759
8760 /// PerformImplicitConversion - Perform an implicit conversion of the
8761 /// expression From to the type ToType by following the standard
8762 /// conversion sequence SCS. Returns the converted
8763 /// expression. Flavor is the context in which we're performing this
8764 /// conversion, for use in error messages.
8766 const StandardConversionSequence &SCS,
8767 AssignmentAction Action,
8769
8770 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8771
8772 /// Parsed one of the type trait support pseudo-functions.
8773 ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
8775 SourceLocation RParenLoc);
8776 ExprResult BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
8778 SourceLocation RParenLoc);
8779
8780 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8781 /// pseudo-functions.
8782 ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc,
8783 ParsedType LhsTy, Expr *DimExpr,
8784 SourceLocation RParen);
8785
8786 ExprResult BuildArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc,
8787 TypeSourceInfo *TSInfo, Expr *DimExpr,
8788 SourceLocation RParen);
8789
8790 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8791 /// pseudo-functions.
8792 ExprResult ActOnExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc,
8793 Expr *Queried, SourceLocation RParen);
8794
8795 ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc,
8796 Expr *Queried, SourceLocation RParen);
8797
8800 bool isIndirect);
8802 ExprResult &RHS,
8803 SourceLocation QuestionLoc);
8804
8805 //// Determines if a type is trivially relocatable
8806 /// according to the C++26 rules.
8807 // FIXME: This is in Sema because it requires
8808 // overload resolution, can we move to ASTContext?
8811
8812 /// Check the operands of ?: under C++ semantics.
8813 ///
8814 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8815 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8816 ///
8817 /// This function also implements GCC's vector extension and the
8818 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8819 /// permit the use of a?b:c where the type of a is that of a integer vector
8820 /// with the same number of elements and size as the vectors of b and c. If
8821 /// one of either b or c is a scalar it is implicitly converted to match the
8822 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8823 /// c are scalars, then b and c are checked and converted to the type of a if
8824 /// possible.
8825 ///
8826 /// The expressions are evaluated differently for GCC's and OpenCL's
8827 /// extensions. For the GCC extension, the ?: operator is evaluated as
8828 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8829 /// For the OpenCL extensions, the ?: operator is evaluated as
8830 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8831 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8833 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8834 ExprObjectKind &OK, SourceLocation questionLoc);
8835
8836 /// Find a merged pointer type and convert the two expressions to it.
8837 ///
8838 /// This finds the composite pointer type for \p E1 and \p E2 according to
8839 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8840 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8841 /// ConvertArgs is \c true).
8842 ///
8843 /// \param Loc The location of the operator requiring these two expressions to
8844 /// be converted to the composite pointer type.
8845 ///
8846 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8847 /// type.
8849 bool ConvertArgs = true);
8851 ExprResult &E2, bool ConvertArgs = true) {
8852 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8853 QualType Composite =
8854 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8855 E1 = E1Tmp;
8856 E2 = E2Tmp;
8857 return Composite;
8858 }
8859
8860 /// MaybeBindToTemporary - If the passed in expression has a record type with
8861 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8862 /// it simply returns the passed in expression.
8864
8865 /// IgnoredValueConversions - Given that an expression's result is
8866 /// syntactically ignored, perform any conversions that are
8867 /// required.
8869
8871
8874 const DeclarationNameInfo &TargetNameInfo);
8875
8877 SourceLocation KeywordLoc,
8878 bool IsIfExists, CXXScopeSpec &SS,
8879 UnqualifiedId &Name);
8880
8883 ArrayRef<ParmVarDecl *> LocalParameters,
8884 Scope *BodyScope);
8888 CXXScopeSpec &SS,
8889 SourceLocation NameLoc,
8890 const IdentifierInfo *TypeName,
8891 TemplateIdAnnotation *TemplateId);
8893 SourceLocation NoexceptLoc);
8895 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8896 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8899 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8903 bool IsSatisfied, SourceLocation NoexceptLoc,
8910 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8911 const ASTConstraintSatisfaction &Satisfaction);
8914 SourceLocation LParenLoc,
8915 ArrayRef<ParmVarDecl *> LocalParameters,
8916 SourceLocation RParenLoc,
8918 SourceLocation ClosingBraceLoc);
8919
8920private:
8921 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8922 bool IsDelete);
8923
8924 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8925 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8926 bool DeleteWasArrayForm);
8927
8928 std::optional<AllocationArgumentSet>
8929 resolveAllocationArguments(LookupResult &R,
8931 ArrayRef<Expr *> PlacementArguments);
8932
8933 // Attempts to construct the type identity argument for the call to a
8934 // type aware operator new. Returns null on failure.
8935 Expr *tryGetTypeIdentityArgument(QualType Type, SourceLocation);
8936
8937 Expr *AllocationSizeExpr = nullptr;
8938 Expr *AllocationAlignmentExpr = nullptr;
8939 llvm::DenseMap<QualType, Expr *> AllocationTypeIdentityArguments;
8940
8941 ///@}
8942
8943 //
8944 //
8945 // -------------------------------------------------------------------------
8946 //
8947 //
8948
8949 /// \name Member Access Expressions
8950 /// Implementations are in SemaExprMember.cpp
8951 ///@{
8952
8953public:
8954 /// Check whether an expression might be an implicit class member access.
8956 bool IsAddressOfOperand);
8957
8958 /// Builds an expression which might be an implicit member expression.
8960 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8961 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8962
8963 /// Builds an implicit member access expression. The current context
8964 /// is known to be an instance method, and the given unqualified lookup
8965 /// set is known to contain only instance members, at least one of which
8966 /// is from an appropriate type.
8968 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8969 LookupResult &R,
8970 const TemplateArgumentListInfo *TemplateArgs,
8971 bool IsDefiniteInstance, const Scope *S);
8972
8974 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8975 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8976 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8977 const TemplateArgumentListInfo *TemplateArgs);
8978
8979 /// The main callback when the parser finds something like
8980 /// expression . [nested-name-specifier] identifier
8981 /// expression -> [nested-name-specifier] identifier
8982 /// where 'identifier' encompasses a fairly broad spectrum of
8983 /// possibilities, including destructor and operator references.
8984 ///
8985 /// \param OpKind either tok::arrow or tok::period
8986 /// \param ObjCImpDecl the current Objective-C \@implementation
8987 /// decl; this is an ugly hack around the fact that Objective-C
8988 /// \@implementations aren't properly put in the context chain
8990 tok::TokenKind OpKind, CXXScopeSpec &SS,
8991 SourceLocation TemplateKWLoc,
8992 UnqualifiedId &Member, Decl *ObjCImpDecl);
8993
8994 MemberExpr *
8995 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
8996 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
8997 ValueDecl *Member, DeclAccessPair FoundDecl,
8998 bool HadMultipleCandidates,
8999 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
9001 const TemplateArgumentListInfo *TemplateArgs = nullptr);
9002
9003 // Check whether the declarations we found through a nested-name
9004 // specifier in a member expression are actually members of the base
9005 // type. The restriction here is:
9006 //
9007 // C++ [expr.ref]p2:
9008 // ... In these cases, the id-expression shall name a
9009 // member of the class or of one of its base classes.
9010 //
9011 // So it's perfectly legitimate for the nested-name specifier to name
9012 // an unrelated class, and for us to find an overload set including
9013 // decls from classes which are not superclasses, as long as the decl
9014 // we actually pick through overload resolution is from a superclass.
9015 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
9016 const CXXScopeSpec &SS,
9017 const LookupResult &R);
9018
9019 // This struct is for use by ActOnMemberAccess to allow
9020 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
9021 // changing the access operator from a '.' to a '->' (to see if that is the
9022 // change needed to fix an error about an unknown member, e.g. when the class
9023 // defines a custom operator->).
9029
9031 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
9032 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
9033 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
9034 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
9035 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9036
9039 bool IsArrow, const CXXScopeSpec &SS,
9040 SourceLocation TemplateKWLoc,
9041 NamedDecl *FirstQualifierInScope, LookupResult &R,
9042 const TemplateArgumentListInfo *TemplateArgs,
9043 const Scope *S, bool SuppressQualifierCheck = false,
9044 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9045
9046 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
9047 SourceLocation OpLoc,
9048 const CXXScopeSpec &SS, FieldDecl *Field,
9049 DeclAccessPair FoundDecl,
9050 const DeclarationNameInfo &MemberNameInfo);
9051
9052 /// Perform conversions on the LHS of a member access expression.
9054
9056 const CXXScopeSpec &SS, SourceLocation nameLoc,
9057 IndirectFieldDecl *indirectField,
9058 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
9059 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
9060
9061private:
9062 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
9063
9064 ///@}
9065
9066 //
9067 //
9068 // -------------------------------------------------------------------------
9069 //
9070 //
9071
9072 /// \name Initializers
9073 /// Implementations are in SemaInit.cpp
9074 ///@{
9075
9076public:
9077 /// Stack of types that correspond to the parameter entities that are
9078 /// currently being copy-initialized. Can be empty.
9080
9081 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
9083
9084 bool IsStringInit(Expr *Init, const ArrayType *AT);
9085
9086 /// Determine whether we can perform aggregate initialization for the purposes
9087 /// of overload resolution.
9089 const InitializedEntity &Entity, InitListExpr *From);
9090
9092 SourceLocation EqualOrColonLoc,
9093 bool GNUSyntax, ExprResult Init);
9094
9095 /// Check that the lifetime of the initializer (and its subobjects) is
9096 /// sufficient for initializing the entity, and perform lifetime extension
9097 /// (when permitted) if not.
9099
9102 bool BoundToLvalueReference);
9103
9104 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
9105 /// it as an xvalue. In C++98, the result will still be a prvalue, because
9106 /// we don't have xvalues there.
9108
9112
9116 SourceLocation EqualLoc, ExprResult Init,
9117 bool TopLevelOfInitList = false,
9118 bool AllowExplicit = false);
9119
9121 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9122 const InitializationKind &Kind, MultiExprArg Init);
9123
9124 ///@}
9125
9126 //
9127 //
9128 // -------------------------------------------------------------------------
9129 //
9130 //
9131
9132 /// \name C++ Lambda Expressions
9133 /// Implementations are in SemaLambda.cpp
9134 ///@{
9135
9136public:
9137 /// Create a new lambda closure type.
9139 TypeSourceInfo *Info,
9140 unsigned LambdaDependencyKind,
9141 LambdaCaptureDefault CaptureDefault);
9142
9143 /// Number lambda for linkage purposes if necessary.
9145 std::optional<CXXRecordDecl::LambdaNumbering>
9146 NumberingOverride = std::nullopt);
9147
9148 /// Endow the lambda scope info with the relevant properties.
9149 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
9150 SourceRange IntroducerRange,
9151 LambdaCaptureDefault CaptureDefault,
9152 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
9153 bool Mutable);
9154
9157
9159 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
9160 TemplateParameterList *TemplateParams);
9161
9162 void
9164 SourceLocation CallOperatorLoc,
9165 const AssociatedConstraint &TrailingRequiresClause,
9166 TypeSourceInfo *MethodTyInfo,
9167 ConstexprSpecKind ConstexprKind, StorageClass SC,
9169 bool HasExplicitResultType);
9170
9171 /// Returns true if the explicit object parameter was invalid.
9173 SourceLocation CallLoc);
9174
9175 /// Perform initialization analysis of the init-capture and perform
9176 /// any implicit conversions such as an lvalue-to-rvalue conversion if
9177 /// not being used to initialize a reference.
9179 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
9180 IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init) {
9182 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
9184 }
9186 SourceLocation EllipsisLoc,
9187 UnsignedOrNone NumExpansions,
9188 IdentifierInfo *Id,
9189 bool DirectInit, Expr *&Init);
9190
9191 /// Create a dummy variable within the declcontext of the lambda's
9192 /// call operator, for name lookup purposes for a lambda init capture.
9193 ///
9194 /// CodeGen handles emission of lambda captures, ignoring these dummy
9195 /// variables appropriately.
9197 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
9198 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
9199
9200 /// Add an init-capture to a lambda scope.
9201 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
9202
9203 /// Note that we have finished the explicit captures for the
9204 /// given lambda.
9206
9207 /// Deduce a block or lambda's return type based on the return
9208 /// statements present in the body.
9210
9211 /// Once the Lambdas capture are known, we can start to create the closure,
9212 /// call operator method, and keep track of the captures.
9213 /// We do the capture lookup here, but they are not actually captured until
9214 /// after we know what the qualifiers of the call operator are.
9216 Scope *CurContext);
9217
9218 /// This is called after parsing the explicit template parameter list
9219 /// on a lambda (if it exists) in C++2a.
9221 SourceLocation LAngleLoc,
9222 ArrayRef<NamedDecl *> TParams,
9223 SourceLocation RAngleLoc,
9224 ExprResult RequiresClause);
9225
9227 SourceLocation MutableLoc);
9228
9230 Scope *LambdaScope,
9232
9233 /// ActOnStartOfLambdaDefinition - This is called just before we start
9234 /// parsing the body of a lambda; it analyzes the explicit captures and
9235 /// arguments, and sets up various data-structures for the body of the
9236 /// lambda.
9238 Declarator &ParamInfo, const DeclSpec &DS);
9239
9240 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
9241 /// is invoked to pop the information about the lambda.
9242 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
9243 bool IsInstantiation = false);
9244
9245 /// ActOnLambdaExpr - This is called when the body of a lambda expression
9246 /// was successfully completed.
9248
9249 /// Does copying/destroying the captured variable have side effects?
9250 bool CaptureHasSideEffects(const sema::Capture &From);
9251
9252 /// Diagnose if an explicit lambda capture is unused. Returns true if a
9253 /// diagnostic is emitted.
9254 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
9255 SourceRange FixItRange,
9256 const sema::Capture &From);
9257
9258 /// Build a FieldDecl suitable to hold the given capture.
9260 bool IsOpenMP = false);
9261
9262 /// Initialize the given capture with a suitable expression.
9264 SourceLocation ImplicitCaptureLoc,
9265 bool IsOpenMPMapping = false);
9266
9267 /// Complete a lambda-expression having processed and attached the
9268 /// lambda body.
9270
9271 /// Get the return type to use for a lambda's conversion function(s) to
9272 /// function pointer type, given the type of the call operator.
9273 QualType
9275 CallingConv CC);
9276
9278 SourceLocation ConvLocation,
9279 CXXConversionDecl *Conv, Expr *Src);
9280
9282 : private FunctionScopeRAII {
9283 public:
9285 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
9287 bool ShouldAddDeclsFromParentScope = true);
9288 };
9289
9290 /// Compute the mangling number context for a lambda expression or
9291 /// block literal. Also return the extra mangling decl if any.
9292 ///
9293 /// \param DC - The DeclContext containing the lambda expression or
9294 /// block literal.
9295 std::tuple<MangleNumberingContext *, Decl *>
9297
9298 ///@}
9299
9300 //
9301 //
9302 // -------------------------------------------------------------------------
9303 //
9304 //
9305
9306 /// \name Name Lookup
9307 ///
9308 /// These routines provide name lookup that is used during semantic
9309 /// analysis to resolve the various kinds of names (identifiers,
9310 /// overloaded operator names, constructor names, etc.) into zero or
9311 /// more declarations within a particular scope. The major entry
9312 /// points are LookupName, which performs unqualified name lookup,
9313 /// and LookupQualifiedName, which performs qualified name lookup.
9314 ///
9315 /// All name lookup is performed based on some specific criteria,
9316 /// which specify what names will be visible to name lookup and how
9317 /// far name lookup should work. These criteria are important both
9318 /// for capturing language semantics (certain lookups will ignore
9319 /// certain names, for example) and for performance, since name
9320 /// lookup is often a bottleneck in the compilation of C++. Name
9321 /// lookup criteria is specified via the LookupCriteria enumeration.
9322 ///
9323 /// The results of name lookup can vary based on the kind of name
9324 /// lookup performed, the current language, and the translation
9325 /// unit. In C, for example, name lookup will either return nothing
9326 /// (no entity found) or a single declaration. In C++, name lookup
9327 /// can additionally refer to a set of overloaded functions or
9328 /// result in an ambiguity. All of the possible results of name
9329 /// lookup are captured by the LookupResult class, which provides
9330 /// the ability to distinguish among them.
9331 ///
9332 /// Implementations are in SemaLookup.cpp
9333 ///@{
9334
9335public:
9336 /// Tracks whether we are in a context where typo correction is
9337 /// disabled.
9339
9340 /// The number of typos corrected by CorrectTypo.
9342
9343 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
9344 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
9345
9346 /// A cache containing identifiers for which typo correction failed and
9347 /// their locations, so that repeated attempts to correct an identifier in a
9348 /// given location are ignored if typo correction already failed for it.
9350
9351 /// SpecialMemberOverloadResult - The overloading result for a special member
9352 /// function.
9353 ///
9354 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
9355 /// integer are used to determine whether overload resolution succeeded.
9357 public:
9359
9360 private:
9361 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
9362
9363 public:
9366 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
9367
9368 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
9369 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
9370
9371 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
9372 void setKind(Kind K) { Pair.setInt(K); }
9373 };
9374
9375 using SpecialMemberCacheKey = std::pair<const CXXRecordDecl *, unsigned>;
9376
9377 /// A cache of special member function overload resolution results
9378 /// for C++ records.
9379 llvm::DenseMap<SpecialMemberCacheKey, SpecialMemberOverloadResult>
9381
9383
9384 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
9385 // TODO: make this is a typesafe union.
9388
9389 /// Describes the kind of name lookup to perform.
9391 /// Ordinary name lookup, which finds ordinary names (functions,
9392 /// variables, typedefs, etc.) in C and most kinds of names
9393 /// (functions, variables, members, types, etc.) in C++.
9395 /// Tag name lookup, which finds the names of enums, classes,
9396 /// structs, and unions.
9398 /// Label name lookup.
9400 /// Member name lookup, which finds the names of
9401 /// class/struct/union members.
9403 /// Look up of an operator name (e.g., operator+) for use with
9404 /// operator overloading. This lookup is similar to ordinary name
9405 /// lookup, but will ignore any declarations that are class members.
9407 /// Look up a name following ~ in a destructor name. This is an ordinary
9408 /// lookup, but prefers tags to typedefs.
9410 /// Look up of a name that precedes the '::' scope resolution
9411 /// operator in C++. This lookup completely ignores operator, object,
9412 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9414 /// Look up a namespace name within a C++ using directive or
9415 /// namespace alias definition, ignoring non-namespace names (C++
9416 /// [basic.lookup.udir]p1).
9418 /// Look up all declarations in a scope with the given name,
9419 /// including resolved using declarations. This is appropriate
9420 /// for checking redeclarations for a using declaration.
9422 /// Look up an ordinary name that is going to be redeclared as a
9423 /// name with linkage. This lookup ignores any declarations that
9424 /// are outside of the current scope unless they have linkage. See
9425 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9427 /// Look up a friend of a local class. This lookup does not look
9428 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9430 /// Look up the name of an Objective-C protocol.
9432 /// Look up implicit 'self' parameter of an objective-c method.
9434 /// Look up the name of an OpenMP user-defined reduction operation.
9436 /// Look up the name of an OpenMP user-defined mapper.
9438 /// Look up any declaration with any name.
9440 };
9441
9442 /// The possible outcomes of name lookup for a literal operator.
9444 /// The lookup resulted in an error.
9446 /// The lookup found no match but no diagnostic was issued.
9448 /// The lookup found a single 'cooked' literal operator, which
9449 /// expects a normal literal to be built and passed to it.
9451 /// The lookup found a single 'raw' literal operator, which expects
9452 /// a string literal containing the spelling of the literal token.
9454 /// The lookup found an overload set of literal operator templates,
9455 /// which expect the characters of the spelling of the literal token to be
9456 /// passed as a non-type template argument pack.
9458 /// The lookup found an overload set of literal operator templates,
9459 /// which expect the character type and characters of the spelling of the
9460 /// string literal token to be passed as template arguments.
9462 };
9463
9464 SpecialMemberOverloadResult
9466 bool VolatileArg, bool RValueThis, bool ConstThis,
9467 bool VolatileThis);
9468
9470
9471 /// Look up a name, looking for a single declaration. Return
9472 /// null if the results were absent, ambiguous, or overloaded.
9473 ///
9474 /// It is preferable to use the elaborated form and explicitly handle
9475 /// ambiguity and overloaded.
9477 Scope *S, DeclarationName Name, SourceLocation Loc,
9478 LookupNameKind NameKind,
9480
9481 /// Lookup a builtin function, when name lookup would otherwise
9482 /// fail.
9483 bool LookupBuiltin(LookupResult &R);
9484 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9485
9486 /// Perform unqualified name lookup starting from a given
9487 /// scope.
9488 ///
9489 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9490 /// used to find names within the current scope. For example, 'x' in
9491 /// @code
9492 /// int x;
9493 /// int f() {
9494 /// return x; // unqualified name look finds 'x' in the global scope
9495 /// }
9496 /// @endcode
9497 ///
9498 /// Different lookup criteria can find different names. For example, a
9499 /// particular scope can have both a struct and a function of the same
9500 /// name, and each can be found by certain lookup criteria. For more
9501 /// information about lookup criteria, see the documentation for the
9502 /// class LookupCriteria.
9503 ///
9504 /// @param S The scope from which unqualified name lookup will
9505 /// begin. If the lookup criteria permits, name lookup may also search
9506 /// in the parent scopes.
9507 ///
9508 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9509 /// look up and the lookup kind), and is updated with the results of lookup
9510 /// including zero or more declarations and possibly additional information
9511 /// used to diagnose ambiguities.
9512 ///
9513 /// @returns \c true if lookup succeeded and false otherwise.
9514 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9515 bool ForceNoCPlusPlus = false);
9516
9517 /// Perform qualified name lookup into a given context.
9518 ///
9519 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9520 /// names when the context of those names is explicit specified, e.g.,
9521 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9522 ///
9523 /// Different lookup criteria can find different names. For example, a
9524 /// particular scope can have both a struct and a function of the same
9525 /// name, and each can be found by certain lookup criteria. For more
9526 /// information about lookup criteria, see the documentation for the
9527 /// class LookupCriteria.
9528 ///
9529 /// \param R captures both the lookup criteria and any lookup results found.
9530 ///
9531 /// \param LookupCtx The context in which qualified name lookup will
9532 /// search. If the lookup criteria permits, name lookup may also search
9533 /// in the parent contexts or (for C++ classes) base classes.
9534 ///
9535 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9536 /// occurs as part of unqualified name lookup.
9537 ///
9538 /// \returns true if lookup succeeded, false if it failed.
9539 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9540 bool InUnqualifiedLookup = false);
9541
9542 /// Performs qualified name lookup or special type of lookup for
9543 /// "__super::" scope specifier.
9544 ///
9545 /// This routine is a convenience overload meant to be called from contexts
9546 /// that need to perform a qualified name lookup with an optional C++ scope
9547 /// specifier that might require special kind of lookup.
9548 ///
9549 /// \param R captures both the lookup criteria and any lookup results found.
9550 ///
9551 /// \param LookupCtx The context in which qualified name lookup will
9552 /// search.
9553 ///
9554 /// \param SS An optional C++ scope-specifier.
9555 ///
9556 /// \returns true if lookup succeeded, false if it failed.
9557 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9558 CXXScopeSpec &SS);
9559
9560 /// Performs name lookup for a name that was parsed in the
9561 /// source code, and may contain a C++ scope specifier.
9562 ///
9563 /// This routine is a convenience routine meant to be called from
9564 /// contexts that receive a name and an optional C++ scope specifier
9565 /// (e.g., "N::M::x"). It will then perform either qualified or
9566 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9567 /// respectively) on the given name and return those results. It will
9568 /// perform a special type of lookup for "__super::" scope specifier.
9569 ///
9570 /// @param S The scope from which unqualified name lookup will
9571 /// begin.
9572 ///
9573 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9574 ///
9575 /// @param EnteringContext Indicates whether we are going to enter the
9576 /// context of the scope-specifier SS (if present).
9577 ///
9578 /// @returns True if any decls were found (but possibly ambiguous)
9580 QualType ObjectType, bool AllowBuiltinCreation = false,
9581 bool EnteringContext = false);
9582
9583 /// Perform qualified name lookup into all base classes of the given
9584 /// class.
9585 ///
9586 /// \param R captures both the lookup criteria and any lookup results found.
9587 ///
9588 /// \param Class The context in which qualified name lookup will
9589 /// search. Name lookup will search in all base classes merging the results.
9590 ///
9591 /// @returns True if any decls were found (but possibly ambiguous)
9593
9595 UnresolvedSetImpl &Functions);
9596
9597 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9598 /// If GnuLabelLoc is a valid source location, then this is a definition
9599 /// of an __label__ label name, otherwise it is a normal label definition
9600 /// or use. If IsLabelStmt is true, then this is the label of a
9601 /// labeled-statement.
9603 SourceLocation GnuLabelLoc = SourceLocation(),
9604 bool IsLabelStmt = false);
9605
9606 /// Perform a name lookup for a label with the specified name; this does not
9607 /// create a new label if the lookup fails.
9609
9610 /// Look up the constructors for the given class.
9612
9613 /// Look up the default constructor for the given class.
9615
9616 /// Look up the copying constructor for the given class.
9618 unsigned Quals);
9619
9620 /// Look up the copying assignment operator for the given class.
9622 bool RValueThis, unsigned ThisQuals);
9623
9624 /// Look up the moving constructor for the given class.
9626 unsigned Quals);
9627
9628 /// Look up the moving assignment operator for the given class.
9630 bool RValueThis, unsigned ThisQuals);
9631
9632 /// Look for the destructor of the given class.
9633 ///
9634 /// During semantic analysis, this routine should be used in lieu of
9635 /// CXXRecordDecl::getDestructor().
9636 ///
9637 /// \returns The destructor for this class.
9639
9640 /// Force the declaration of any implicitly-declared members of this
9641 /// class.
9643
9644 /// Make a merged definition of an existing hidden definition \p ND
9645 /// visible at the specified location.
9647
9648 /// Check ODR hashes for C/ObjC when merging types from modules.
9649 /// Differently from C++, actually parse the body and reject in case
9650 /// of a mismatch.
9651 template <typename T,
9652 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9654 if (Duplicate->getODRHash() != Previous->getODRHash())
9655 return false;
9656
9657 // Make the previous decl visible.
9659 return true;
9660 }
9661
9662 /// Get the set of additional modules that should be checked during
9663 /// name lookup. A module and its imports become visible when instanting a
9664 /// template defined within it.
9665 llvm::DenseSet<Module *> &getLookupModules();
9666
9667 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9669
9670 /// Determine if the template parameter \p D has a visible default argument.
9671 bool
9673 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9674 /// Determine if the template parameter \p D has a reachable default argument.
9676 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9677 /// Determine if the template parameter \p D has a reachable default argument.
9681
9682 /// Determine if there is a visible declaration of \p D that is an explicit
9683 /// specialization declaration for a specialization of a template. (For a
9684 /// member specialization, use hasVisibleMemberSpecialization.)
9686 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9687 /// Determine if there is a reachable declaration of \p D that is an explicit
9688 /// specialization declaration for a specialization of a template. (For a
9689 /// member specialization, use hasReachableMemberSpecialization.)
9691 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9692
9693 /// Determine if there is a visible declaration of \p D that is a member
9694 /// specialization declaration (as opposed to an instantiated declaration).
9696 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9697 /// Determine if there is a reachable declaration of \p D that is a member
9698 /// specialization declaration (as opposed to an instantiated declaration).
9700 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9701
9702 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9703
9704 /// Determine whether any declaration of an entity is visible.
9705 bool
9707 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9708 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9709 }
9710
9713 /// Determine whether any declaration of an entity is reachable.
9714 bool
9716 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9717 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9718 }
9720 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9721
9722 void diagnoseTypo(const TypoCorrection &Correction,
9723 const PartialDiagnostic &TypoDiag,
9724 bool ErrorRecovery = true);
9725
9726 /// Diagnose a successfully-corrected typo. Separated from the correction
9727 /// itself to allow external validation of the result, etc.
9728 ///
9729 /// \param Correction The result of performing typo correction.
9730 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9731 /// string added to it (and usually also a fixit).
9732 /// \param PrevNote A note to use when indicating the location of the entity
9733 /// to which we are correcting. Will have the correction string added
9734 /// to it.
9735 /// \param ErrorRecovery If \c true (the default), the caller is going to
9736 /// recover from the typo as if the corrected string had been typed.
9737 /// In this case, \c PDiag must be an error, and we will attach a fixit
9738 /// to it.
9739 void diagnoseTypo(const TypoCorrection &Correction,
9740 const PartialDiagnostic &TypoDiag,
9741 const PartialDiagnostic &PrevNote,
9742 bool ErrorRecovery = true);
9743
9744 /// Find the associated classes and namespaces for
9745 /// argument-dependent lookup for a call with the given set of
9746 /// arguments.
9747 ///
9748 /// This routine computes the sets of associated classes and associated
9749 /// namespaces searched by argument-dependent lookup
9750 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9752 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9753 AssociatedNamespaceSet &AssociatedNamespaces,
9754 AssociatedClassSet &AssociatedClasses);
9755
9756 /// Produce a diagnostic describing the ambiguity that resulted
9757 /// from name lookup.
9758 ///
9759 /// \param Result The result of the ambiguous lookup to be diagnosed.
9761
9762 /// LookupLiteralOperator - Determine which literal operator should be used
9763 /// for a user-defined literal, per C++11 [lex.ext].
9764 ///
9765 /// Normal overload resolution is not used to select which literal operator to
9766 /// call for a user-defined literal. Look up the provided literal operator
9767 /// name, and filter the results to the appropriate set for the given argument
9768 /// types.
9771 bool AllowRaw, bool AllowTemplate,
9772 bool AllowStringTemplate, bool DiagnoseMissing,
9773 StringLiteral *StringLit = nullptr);
9774
9776 ArrayRef<Expr *> Args, ADLResult &Functions);
9777
9778 void LookupVisibleDecls(Scope *S, LookupNameKind Kind,
9780 bool IncludeGlobalScope = true,
9781 bool LoadExternal = true);
9782 void LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,
9784 bool IncludeGlobalScope = true,
9785 bool IncludeDependentBases = false,
9786 bool LoadExternal = true);
9787
9788 /// Try to "correct" a typo in the source code by finding
9789 /// visible declarations whose names are similar to the name that was
9790 /// present in the source code.
9791 ///
9792 /// \param TypoName the \c DeclarationNameInfo structure that contains
9793 /// the name that was present in the source code along with its location.
9794 ///
9795 /// \param LookupKind the name-lookup criteria used to search for the name.
9796 ///
9797 /// \param S the scope in which name lookup occurs.
9798 ///
9799 /// \param SS the nested-name-specifier that precedes the name we're
9800 /// looking for, if present.
9801 ///
9802 /// \param CCC A CorrectionCandidateCallback object that provides further
9803 /// validation of typo correction candidates. It also provides flags for
9804 /// determining the set of keywords permitted.
9805 ///
9806 /// \param MemberContext if non-NULL, the context in which to look for
9807 /// a member access expression.
9808 ///
9809 /// \param EnteringContext whether we're entering the context described by
9810 /// the nested-name-specifier SS.
9811 ///
9812 /// \param OPT when non-NULL, the search for visible declarations will
9813 /// also walk the protocols in the qualified interfaces of \p OPT.
9814 ///
9815 /// \returns a \c TypoCorrection containing the corrected name if the typo
9816 /// along with information such as the \c NamedDecl where the corrected name
9817 /// was declared, and any additional \c NestedNameSpecifier needed to access
9818 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9820 Sema::LookupNameKind LookupKind, Scope *S,
9822 CorrectTypoKind Mode,
9823 DeclContext *MemberContext = nullptr,
9824 bool EnteringContext = false,
9825 const ObjCObjectPointerType *OPT = nullptr,
9826 bool RecordFailure = true);
9827
9828 /// Kinds of missing import. Note, the values of these enumerators correspond
9829 /// to %select values in diagnostics.
9837
9838 /// Diagnose that the specified declaration needs to be visible but
9839 /// isn't, and suggest a module import that would resolve the problem.
9841 MissingImportKind MIK, bool Recover = true);
9843 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9844 MissingImportKind MIK, bool Recover);
9845
9846 /// Called on #pragma clang __debug dump II
9848
9849 /// Called on #pragma clang __debug dump E
9850 void ActOnPragmaDump(Expr *E);
9851
9852private:
9853 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9854 //
9855 // The boolean value will be true to indicate that the namespace was loaded
9856 // from an AST/PCH file, or false otherwise.
9857 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9858
9859 /// Whether we have already loaded known namespaces from an extenal
9860 /// source.
9861 bool LoadedExternalKnownNamespaces;
9862
9863 bool CppLookupName(LookupResult &R, Scope *S);
9864
9865 /// Determine if we could use all the declarations in the module.
9866 bool isUsableModule(const Module *M);
9867
9868 /// Helper for CorrectTypo used to create and populate a new
9869 /// TypoCorrectionConsumer. Returns nullptr if typo correction should be
9870 /// skipped entirely.
9871 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9872 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9874 DeclContext *MemberContext, bool EnteringContext,
9875 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9876
9877 /// Cache for module units which is usable for current module.
9878 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9879
9880 /// Record the typo correction failure and return an empty correction.
9881 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9882 bool RecordFailure = true) {
9883 if (RecordFailure)
9884 TypoCorrectionFailures[Typo].insert(TypoLoc);
9885 return TypoCorrection();
9886 }
9887
9888 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9889
9890 /// Determine whether two declarations should be linked together, given that
9891 /// the old declaration might not be visible and the new declaration might
9892 /// not have external linkage.
9893 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9894 const NamedDecl *New) {
9895 if (isVisible(Old))
9896 return true;
9897 // See comment in below overload for why it's safe to compute the linkage
9898 // of the new declaration here.
9899 if (New->isExternallyDeclarable()) {
9900 assert(Old->isExternallyDeclarable() &&
9901 "should not have found a non-externally-declarable previous decl");
9902 return true;
9903 }
9904 return false;
9905 }
9906 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9907
9908 ///@}
9909
9910 //
9911 //
9912 // -------------------------------------------------------------------------
9913 //
9914 //
9915
9916 /// \name Modules
9917 /// Implementations are in SemaModule.cpp
9918 ///@{
9919
9920public:
9921 /// Get the module unit whose scope we are currently within.
9923 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9924 }
9925
9926 /// Is the module scope we are an implementation unit?
9928 if (ModuleScopes.empty())
9929 return false;
9930 const Module *M = ModuleScopes.back().Module;
9932 }
9933
9934 // When loading a non-modular PCH files, this is used to restore module
9935 // visibility.
9937 VisibleModules.setVisible(Mod, ImportLoc);
9938 }
9939
9940 enum class ModuleDeclKind {
9941 Interface, ///< 'export module X;'
9942 Implementation, ///< 'module X;'
9943 PartitionInterface, ///< 'export module X:Y;'
9944 PartitionImplementation, ///< 'module X:Y;'
9945 };
9946
9947 /// An enumeration to represent the transition of states in parsing module
9948 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9949 /// an error in state transition, the state is set to NotACXX20Module.
9951 FirstDecl, ///< Parsing the first decl in a TU.
9952 GlobalFragment, ///< after 'module;' but before 'module X;'
9953 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9954 ImportFinished, ///< after any non-import decl.
9955 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9956 ///< non-import decl.
9957 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9958 ///< non-import decl has already been seen.
9959 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9960 };
9961
9962 /// The parser has processed a module-declaration that begins the definition
9963 /// of a module interface or implementation.
9965 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9966 ModuleIdPath Path, ModuleIdPath Partition,
9967 ModuleImportState &ImportState,
9968 bool SeenNoTrivialPPDirective);
9969
9970 /// The parser has processed a global-module-fragment declaration that begins
9971 /// the definition of the global module fragment of the current module unit.
9972 /// \param ModuleLoc The location of the 'module' keyword.
9974
9975 /// The parser has processed a private-module-fragment declaration that begins
9976 /// the definition of the private module fragment of the current module unit.
9977 /// \param ModuleLoc The location of the 'module' keyword.
9978 /// \param PrivateLoc The location of the 'private' keyword.
9980 SourceLocation PrivateLoc);
9981
9982 /// The parser has processed a module import declaration.
9983 ///
9984 /// \param StartLoc The location of the first token in the declaration. This
9985 /// could be the location of an '@', 'export', or 'import'.
9986 /// \param ExportLoc The location of the 'export' keyword, if any.
9987 /// \param ImportLoc The location of the 'import' keyword.
9988 /// \param Path The module toplevel name as an access path.
9989 /// \param IsPartition If the name is for a partition.
9991 SourceLocation ExportLoc,
9992 SourceLocation ImportLoc, ModuleIdPath Path,
9993 bool IsPartition = false);
9995 SourceLocation ExportLoc,
9996 SourceLocation ImportLoc, Module *M,
9997 ModuleIdPath Path = {});
9998
9999 /// The parser has processed a module import translated from a
10000 /// #include or similar preprocessing directive.
10001 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
10002 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
10003
10004 /// The parsed has entered a submodule.
10005 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
10006 /// The parser has left a submodule.
10007 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
10008
10009 /// Create an implicit import of the given module at the given
10010 /// source location, for error recovery, if possible.
10011 ///
10012 /// This routine is typically used when an entity found by name lookup
10013 /// is actually hidden within a module that we know about but the user
10014 /// has forgotten to import.
10015 void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
10016 Module *Mod);
10017
10018 /// We have parsed the start of an export declaration, including the '{'
10019 /// (if present).
10020 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
10021 SourceLocation LBraceLoc);
10022
10023 /// Complete the definition of an export declaration.
10024 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
10025 SourceLocation RBraceLoc);
10026
10027private:
10028 /// The parser has begun a translation unit to be compiled as a C++20
10029 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
10030 void HandleStartOfHeaderUnit();
10031
10032 struct ModuleScope {
10033 SourceLocation BeginLoc;
10034 clang::Module *Module = nullptr;
10035 VisibleModuleSet OuterVisibleModules;
10036 };
10037 /// The modules we're currently parsing.
10038 llvm::SmallVector<ModuleScope, 16> ModuleScopes;
10039
10040 /// For an interface unit, this is the implicitly imported interface unit.
10041 clang::Module *ThePrimaryInterface = nullptr;
10042
10043 /// The explicit global module fragment of the current translation unit.
10044 /// The explicit Global Module Fragment, as specified in C++
10045 /// [module.global.frag].
10046 clang::Module *TheGlobalModuleFragment = nullptr;
10047
10048 /// The implicit global module fragments of the current translation unit.
10049 ///
10050 /// The contents in the implicit global module fragment can't be discarded.
10051 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
10052
10053 /// Namespace definitions that we will export when they finish.
10054 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
10055
10056 /// In a C++ standard module, inline declarations require a definition to be
10057 /// present at the end of a definition domain. This set holds the decls to
10058 /// be checked at the end of the TU.
10059 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
10060
10061 /// Helper function to judge if we are in module purview.
10062 /// Return false if we are not in a module.
10063 bool isCurrentModulePurview() const;
10064
10065 /// Enter the scope of the explicit global module fragment.
10066 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
10067 /// Leave the scope of the explicit global module fragment.
10068 void PopGlobalModuleFragment();
10069
10070 /// Enter the scope of an implicit global module fragment.
10071 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
10072 /// Leave the scope of an implicit global module fragment.
10073 void PopImplicitGlobalModuleFragment();
10074
10075 VisibleModuleSet VisibleModules;
10076
10077 /// Whether we had imported any named modules.
10078 bool HadImportedNamedModules = false;
10079 /// The set of instantiations we need to check if they references TU-local
10080 /// entity from TUs. This only makes sense if we imported any named modules.
10081 llvm::SmallVector<std::pair<FunctionDecl *, SourceLocation>>
10082 PendingCheckReferenceForTULocal;
10083 /// Implement [basic.link]p18, which requires that we can't use TU-local
10084 /// entities from other TUs (ignoring header units).
10085 void checkReferenceToTULocalFromOtherTU(FunctionDecl *FD,
10086 SourceLocation PointOfInstantiation);
10087 /// Implement [basic.link]p17, which diagnose for non TU local exposure in
10088 /// module interface or module partition.
10089 void checkExposure(const TranslationUnitDecl *TU);
10090
10091 ///@}
10092
10093 //
10094 //
10095 // -------------------------------------------------------------------------
10096 //
10097 //
10098
10099 /// \name C++ Overloading
10100 /// Implementations are in SemaOverload.cpp
10101 ///@{
10102
10103public:
10104 /// Whether deferrable diagnostics should be deferred.
10105 bool DeferDiags = false;
10106
10107 /// RAII class to control scope of DeferDiags.
10109 Sema &S;
10110 bool SavedDeferDiags = false;
10111
10112 public:
10114 : S(S), SavedDeferDiags(S.DeferDiags) {
10115 S.DeferDiags = SavedDeferDiags || DeferDiags;
10116 }
10117 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
10120 };
10121
10122 /// Flag indicating if Sema is building a recovery call expression.
10123 ///
10124 /// This flag is used to avoid building recovery call expressions
10125 /// if Sema is already doing so, which would cause infinite recursions.
10127
10128 /// Determine whether the given New declaration is an overload of the
10129 /// declarations in Old. This routine returns OverloadKind::Match or
10130 /// OverloadKind::NonFunction if New and Old cannot be overloaded, e.g., if
10131 /// New has the same signature as some function in Old (C++ 1.3.10) or if the
10132 /// Old declarations aren't functions (or function templates) at all. When it
10133 /// does return OverloadKind::Match or OverloadKind::NonFunction, MatchedDecl
10134 /// will point to the decl that New cannot be overloaded with. This decl may
10135 /// be a UsingShadowDecl on top of the underlying declaration.
10136 ///
10137 /// Example: Given the following input:
10138 ///
10139 /// void f(int, float); // #1
10140 /// void f(int, int); // #2
10141 /// int f(int, int); // #3
10142 ///
10143 /// When we process #1, there is no previous declaration of "f", so IsOverload
10144 /// will not be used.
10145 ///
10146 /// When we process #2, Old contains only the FunctionDecl for #1. By
10147 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
10148 /// they have different signatures), so this routine returns
10149 /// OverloadKind::Overload; MatchedDecl is unchanged.
10150 ///
10151 /// When we process #3, Old is an overload set containing #1 and #2. We
10152 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
10153 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
10154 /// types of functions are not part of the signature), IsOverload returns
10155 /// OverloadKind::Match and MatchedDecl will be set to point to the
10156 /// FunctionDecl for #2.
10157 ///
10158 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
10159 /// class by a using declaration. The rules for whether to hide shadow
10160 /// declarations ignore some properties which otherwise figure into a function
10161 /// template's signature.
10163 const LookupResult &OldDecls, NamedDecl *&OldDecl,
10164 bool UseMemberUsingDeclRules);
10166 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10167
10168 // Checks whether MD constitutes an override the base class method BaseMD.
10169 // When checking for overrides, the object object members are ignored.
10170 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
10171 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10172
10173 enum class AllowedExplicit {
10174 /// Allow no explicit functions to be used.
10176 /// Allow explicit conversion functions but not explicit constructors.
10178 /// Allow both explicit conversion functions and explicit constructors.
10180 };
10181
10183 Expr *From, QualType ToType, bool SuppressUserConversions,
10184 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
10185 bool AllowObjCWritebackConversion);
10186
10187 /// PerformImplicitConversion - Perform an implicit conversion of the
10188 /// expression From to the type ToType. Returns the
10189 /// converted expression. Flavor is the kind of conversion we're
10190 /// performing, used in the error message. If @p AllowExplicit,
10191 /// explicit user-defined conversions are permitted.
10193 AssignmentAction Action,
10194 bool AllowExplicit = false);
10195
10196 /// IsIntegralPromotion - Determines whether the conversion from the
10197 /// expression From (whose potentially-adjusted type is FromType) to
10198 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
10199 /// sets PromotedType to the promoted type.
10200 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
10201
10202 /// IsFloatingPointPromotion - Determines whether the conversion from
10203 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
10204 /// returns true and sets PromotedType to the promoted type.
10205 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
10206
10207 /// Determine if a conversion is a complex promotion.
10208 ///
10209 /// A complex promotion is defined as a complex -> complex conversion
10210 /// where the conversion between the underlying real types is a
10211 /// floating-point or integral promotion.
10212 bool IsComplexPromotion(QualType FromType, QualType ToType);
10213
10214 /// IsOverflowBehaviorTypePromotion - Determines whether the conversion from
10215 /// FromType to ToType involves an OverflowBehaviorType FromType being
10216 /// promoted to an OverflowBehaviorType ToType which has a larger bitwidth.
10217 /// If so, returns true and sets FromType to ToType.
10218 bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType);
10219
10220 /// IsOverflowBehaviorTypeConversion - Determines whether the conversion from
10221 /// FromType to ToType necessarily involves both an OverflowBehaviorType and
10222 /// a non-OverflowBehaviorType. If so, returns true and sets FromType to
10223 /// ToType.
10224 bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType);
10225
10226 /// IsPointerConversion - Determines whether the conversion of the
10227 /// expression From, which has the (possibly adjusted) type FromType,
10228 /// can be converted to the type ToType via a pointer conversion (C++
10229 /// 4.10). If so, returns true and places the converted type (that
10230 /// might differ from ToType in its cv-qualifiers at some level) into
10231 /// ConvertedType.
10232 ///
10233 /// This routine also supports conversions to and from block pointers
10234 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
10235 /// pointers to interfaces. FIXME: Once we've determined the
10236 /// appropriate overloading rules for Objective-C, we may want to
10237 /// split the Objective-C checks into a different routine; however,
10238 /// GCC seems to consider all of these conversions to be pointer
10239 /// conversions, so for now they live here. IncompatibleObjC will be
10240 /// set if the conversion is an allowed Objective-C conversion that
10241 /// should result in a warning.
10242 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
10243 bool InOverloadResolution, QualType &ConvertedType,
10244 bool &IncompatibleObjC);
10245
10246 /// isObjCPointerConversion - Determines whether this is an
10247 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
10248 /// with the same arguments and return values.
10249 bool isObjCPointerConversion(QualType FromType, QualType ToType,
10250 QualType &ConvertedType, bool &IncompatibleObjC);
10251 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
10252 QualType &ConvertedType);
10253
10254 /// FunctionParamTypesAreEqual - This routine checks two function proto types
10255 /// for equality of their parameter types. Caller has already checked that
10256 /// they have same number of parameters. If the parameters are different,
10257 /// ArgPos will have the parameter index of the first different parameter.
10258 /// If `Reversed` is true, the parameters of `NewType` will be compared in
10259 /// reverse order. That's useful if one of the functions is being used as a
10260 /// C++20 synthesized operator overload with a reversed parameter order.
10263 unsigned *ArgPos = nullptr,
10264 bool Reversed = false);
10265
10267 const FunctionProtoType *NewType,
10268 unsigned *ArgPos = nullptr,
10269 bool Reversed = false);
10270
10271 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
10272 const FunctionDecl *NewFunction,
10273 unsigned *ArgPos = nullptr,
10274 bool Reversed = false);
10275
10276 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
10277 /// function types. Catches different number of parameter, mismatch in
10278 /// parameter types, and different return types.
10280 QualType ToType);
10281
10282 /// CheckPointerConversion - Check the pointer conversion from the
10283 /// expression From to the type ToType. This routine checks for
10284 /// ambiguous or inaccessible derived-to-base pointer
10285 /// conversions for which IsPointerConversion has already returned
10286 /// true. It returns true and produces a diagnostic if there was an
10287 /// error, or returns false otherwise.
10288 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
10289 CXXCastPath &BasePath, bool IgnoreBaseAccess,
10290 bool Diagnose = true);
10291
10292 /// IsMemberPointerConversion - Determines whether the conversion of the
10293 /// expression From, which has the (possibly adjusted) type FromType, can be
10294 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
10295 /// If so, returns true and places the converted type (that might differ from
10296 /// ToType in its cv-qualifiers at some level) into ConvertedType.
10297 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
10298 bool InOverloadResolution,
10299 QualType &ConvertedType);
10300
10310 /// CheckMemberPointerConversion - Check the member pointer conversion from
10311 /// the expression From to the type ToType. This routine checks for ambiguous
10312 /// or virtual or inaccessible base-to-derived member pointer conversions for
10313 /// which IsMemberPointerConversion has already returned true. It produces a
10314 // diagnostic if there was an error.
10316 QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
10317 CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
10318 bool IgnoreBaseAccess, MemberPointerConversionDirection Direction);
10319
10320 /// IsQualificationConversion - Determines whether the conversion from
10321 /// an rvalue of type FromType to ToType is a qualification conversion
10322 /// (C++ 4.4).
10323 ///
10324 /// \param ObjCLifetimeConversion Output parameter that will be set to
10325 /// indicate when the qualification conversion involves a change in the
10326 /// Objective-C object lifetime.
10327 bool IsQualificationConversion(QualType FromType, QualType ToType,
10328 bool CStyle, bool &ObjCLifetimeConversion);
10329
10330 /// Determine whether the conversion from FromType to ToType is a valid
10331 /// conversion of ExtInfo/ExtProtoInfo on the nested function type.
10332 /// More precisely, this method checks whether FromType can be transformed
10333 /// into an exact match for ToType, by transforming its extended function
10334 /// type information in legal manner (e.g. by strictly stripping "noreturn"
10335 /// or "noexcept", or by stripping "noescape" for arguments).
10336 bool IsFunctionConversion(QualType FromType, QualType ToType) const;
10337
10338 /// Same as `IsFunctionConversion`, but if this would return true, it sets
10339 /// `ResultTy` to `ToType`.
10340 bool TryFunctionConversion(QualType FromType, QualType ToType,
10341 QualType &ResultTy) const;
10342
10345 DeclarationName Name,
10346 OverloadCandidateSet &CandidateSet,
10347 FunctionDecl *Fn, MultiExprArg Args,
10348 bool IsMember = false);
10349
10351 FunctionDecl *Fun);
10353 Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl,
10355
10356 /// PerformContextuallyConvertToBool - Perform a contextual conversion
10357 /// of the expression From to bool (C++0x [conv]p3).
10359
10360 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
10361 /// conversion of the expression From to an Objective-C pointer type.
10362 /// Returns a valid but null ExprResult if no conversion sequence exists.
10364
10366 CCEKind CCE,
10367 NamedDecl *Dest = nullptr);
10368
10370 llvm::APSInt &Value, CCEKind CCE);
10372 APValue &Value, CCEKind CCE,
10373 NamedDecl *Dest = nullptr);
10374
10375 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10376 /// That is a converted constant expression
10377 /// (which was built with BuildConvertedConstantExpression)
10380 CCEKind CCE, bool RequireInt,
10381 const APValue &PreNarrowingValue);
10382
10383 /// Abstract base class used to perform a contextual implicit
10384 /// conversion from an expression to any type passing a filter.
10386 public:
10389
10393
10394 /// Determine whether the specified type is a valid destination type
10395 /// for this conversion.
10396 virtual bool match(QualType T) = 0;
10397
10398 /// Emits a diagnostic complaining that the expression does not have
10399 /// integral or enumeration type.
10401 QualType T) = 0;
10402
10403 /// Emits a diagnostic when the expression has incomplete class type.
10404 virtual SemaDiagnosticBuilder
10406
10407 /// Emits a diagnostic when the only matching conversion function
10408 /// is explicit.
10410 SourceLocation Loc,
10411 QualType T,
10412 QualType ConvTy) = 0;
10413
10414 /// Emits a note for the explicit conversion function.
10415 virtual SemaDiagnosticBuilder
10417
10418 /// Emits a diagnostic when there are multiple possible conversion
10419 /// functions.
10421 QualType T) = 0;
10422
10423 /// Emits a note for one of the candidate conversions.
10424 virtual SemaDiagnosticBuilder
10426
10427 /// Emits a diagnostic when we picked a conversion function
10428 /// (for cases when we are not allowed to pick a conversion function).
10430 SourceLocation Loc,
10431 QualType T,
10432 QualType ConvTy) = 0;
10433
10435 };
10436
10438 bool AllowScopedEnumerations;
10439
10440 public:
10441 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10442 bool SuppressConversion)
10444 AllowScopedEnumerations(AllowScopedEnumerations) {}
10445
10446 /// Match an integral or (possibly scoped) enumeration type.
10447 bool match(QualType T) override;
10448
10450 QualType T) override {
10451 return diagnoseNotInt(S, Loc, T);
10452 }
10453
10454 /// Emits a diagnostic complaining that the expression does not have
10455 /// integral or enumeration type.
10457 QualType T) = 0;
10458 };
10459
10460 /// Perform a contextual implicit conversion.
10463 ContextualImplicitConverter &Converter);
10464
10465 /// ReferenceCompareResult - Expresses the result of comparing two
10466 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10467 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10469 /// Ref_Incompatible - The two types are incompatible, so direct
10470 /// reference binding is not possible.
10472 /// Ref_Related - The two types are reference-related, which means
10473 /// that their unqualified forms (T1 and T2) are either the same
10474 /// or T1 is a base class of T2.
10476 /// Ref_Compatible - The two types are reference-compatible.
10478 };
10479
10480 // Fake up a scoped enumeration that still contextually converts to bool.
10482 /// The conversions that would be performed on an lvalue of type T2 when
10483 /// binding a reference of type T1 to it, as determined when evaluating
10484 /// whether T1 is reference-compatible with T2.
10495 };
10497
10498 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10499 /// determine whether they are reference-compatible,
10500 /// reference-related, or incompatible, for use in C++ initialization by
10501 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10502 /// type, and the first type (T1) is the pointee type of the reference
10503 /// type being initialized.
10506 ReferenceConversions *Conv = nullptr);
10507
10508 /// AddOverloadCandidate - Adds the given function to the set of
10509 /// candidate functions, using the given function call arguments. If
10510 /// @p SuppressUserConversions, then don't allow user-defined
10511 /// conversions via constructors or conversion operators.
10512 ///
10513 /// \param PartialOverloading true if we are performing "partial" overloading
10514 /// based on an incomplete set of function arguments. This feature is used by
10515 /// code completion.
10518 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10519 bool PartialOverloading = false, bool AllowExplicit = true,
10520 bool AllowExplicitConversion = false,
10521 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10522 ConversionSequenceList EarlyConversions = {},
10524 bool AggregateCandidateDeduction = false, bool StrictPackMatch = false);
10525
10526 /// Add all of the function declarations in the given function set to
10527 /// the overload candidate set.
10529 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10530 OverloadCandidateSet &CandidateSet,
10531 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10532 bool SuppressUserConversions = false, bool PartialOverloading = false,
10533 bool FirstArgumentIsBase = false);
10534
10535 /// AddMethodCandidate - Adds a named decl (which is some kind of
10536 /// method) as a method candidate to the given overload set.
10537 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10538 Expr::Classification ObjectClassification,
10539 ArrayRef<Expr *> Args,
10540 OverloadCandidateSet &CandidateSet,
10541 bool SuppressUserConversion = false,
10542 OverloadCandidateParamOrder PO = {});
10543
10544 /// AddMethodCandidate - Adds the given C++ member function to the set
10545 /// of candidate functions, using the given function call arguments
10546 /// and the object argument (@c Object). For example, in a call
10547 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10548 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10549 /// allow user-defined conversions via constructors or conversion
10550 /// operators.
10551 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10552 CXXRecordDecl *ActingContext, QualType ObjectType,
10553 Expr::Classification ObjectClassification,
10554 ArrayRef<Expr *> Args,
10555 OverloadCandidateSet &CandidateSet,
10556 bool SuppressUserConversions = false,
10557 bool PartialOverloading = false,
10558 ConversionSequenceList EarlyConversions = {},
10560 bool StrictPackMatch = false);
10561
10562 /// Add a C++ member function template as a candidate to the candidate
10563 /// set, using template argument deduction to produce an appropriate member
10564 /// function template specialization.
10566 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10567 CXXRecordDecl *ActingContext,
10568 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10569 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10570 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10571 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10572
10573 /// Add a C++ function template specialization as a candidate
10574 /// in the candidate set, using template argument deduction to produce
10575 /// an appropriate function template specialization.
10577 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10578 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10579 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10580 bool PartialOverloading = false, bool AllowExplicit = true,
10581 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10583 bool AggregateCandidateDeduction = false);
10584
10586 /// Do not consider any user-defined conversions when constructing the
10587 /// initializing sequence.
10589
10590 /// Before constructing the initializing sequence, we check whether the
10591 /// parameter type and argument type contain any user defined conversions.
10592 /// If so, do not initialize them. This effectively bypasses some undesired
10593 /// instantiation before checking constaints, which might otherwise result
10594 /// in non-SFINAE errors e.g. recursive constraints.
10596
10603 };
10604
10605 /// Check that implicit conversion sequences can be formed for each argument
10606 /// whose corresponding parameter has a non-dependent type, per DR1391's
10607 /// [temp.deduct.call]p10.
10610 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10612 CheckNonDependentConversionsFlag UserConversionFlag,
10613 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10614 Expr::Classification ObjectClassification = {},
10615 OverloadCandidateParamOrder PO = {});
10616
10617 /// AddConversionCandidate - Add a C++ conversion function as a
10618 /// candidate in the candidate set (C++ [over.match.conv],
10619 /// C++ [over.match.copy]). From is the expression we're converting from,
10620 /// and ToType is the type that we're eventually trying to convert to
10621 /// (which may or may not be the same type as the type that the
10622 /// conversion function produces).
10624 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10625 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10626 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10627 bool AllowExplicit, bool AllowResultConversion = true,
10628 bool StrictPackMatch = false);
10629
10630 /// Adds a conversion function template specialization
10631 /// candidate to the overload set, using template argument deduction
10632 /// to deduce the template arguments of the conversion function
10633 /// template from the type that we are converting to (C++
10634 /// [temp.deduct.conv]).
10636 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10637 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10638 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10639 bool AllowExplicit, bool AllowResultConversion = true);
10640
10641 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10642 /// converts the given @c Object to a function pointer via the
10643 /// conversion function @c Conversion, and then attempts to call it
10644 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10645 /// the type of function that we'll eventually be calling.
10646 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10647 DeclAccessPair FoundDecl,
10648 CXXRecordDecl *ActingContext,
10649 const FunctionProtoType *Proto, Expr *Object,
10650 ArrayRef<Expr *> Args,
10651 OverloadCandidateSet &CandidateSet);
10652
10653 /// Add all of the non-member operator function declarations in the given
10654 /// function set to the overload candidate set.
10656 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10657 OverloadCandidateSet &CandidateSet,
10658 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10659
10660 /// Add overload candidates for overloaded operators that are
10661 /// member functions.
10662 ///
10663 /// Add the overloaded operator candidates that are member functions
10664 /// for the operator Op that was used in an operator expression such
10665 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10666 /// CandidateSet will store the added overload candidates. (C++
10667 /// [over.match.oper]).
10669 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10670 OverloadCandidateSet &CandidateSet,
10672
10673 /// AddBuiltinCandidate - Add a candidate for a built-in
10674 /// operator. ResultTy and ParamTys are the result and parameter types
10675 /// of the built-in candidate, respectively. Args and NumArgs are the
10676 /// arguments being passed to the candidate. IsAssignmentOperator
10677 /// should be true when this built-in candidate is an assignment
10678 /// operator. NumContextualBoolArguments is the number of arguments
10679 /// (at the beginning of the argument list) that will be contextually
10680 /// converted to bool.
10681 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10682 OverloadCandidateSet &CandidateSet,
10683 bool IsAssignmentOperator = false,
10684 unsigned NumContextualBoolArguments = 0);
10685
10686 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10687 /// operator overloads to the candidate set (C++ [over.built]), based
10688 /// on the operator @p Op and the arguments given. For example, if the
10689 /// operator is a binary '+', this routine might add "int
10690 /// operator+(int, int)" to cover integer addition.
10692 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10693 OverloadCandidateSet &CandidateSet);
10694
10695 /// Add function candidates found via argument-dependent lookup
10696 /// to the set of overloading candidates.
10697 ///
10698 /// This routine performs argument-dependent name lookup based on the
10699 /// given function name (which may also be an operator name) and adds
10700 /// all of the overload candidates found by ADL to the overload
10701 /// candidate set (C++ [basic.lookup.argdep]).
10703 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10704 TemplateArgumentListInfo *ExplicitTemplateArgs,
10705 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10706
10707 /// Check the enable_if expressions on the given function. Returns the first
10708 /// failing attribute, or NULL if they were all successful.
10709 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10710 ArrayRef<Expr *> Args,
10711 bool MissingImplicitThis = false);
10712
10713 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10714 /// non-ArgDependent DiagnoseIfAttrs.
10715 ///
10716 /// Argument-dependent diagnose_if attributes should be checked each time a
10717 /// function is used as a direct callee of a function call.
10718 ///
10719 /// Returns true if any errors were emitted.
10720 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10721 const Expr *ThisArg,
10722 ArrayRef<const Expr *> Args,
10723 SourceLocation Loc);
10724
10725 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10726 /// ArgDependent DiagnoseIfAttrs.
10727 ///
10728 /// Argument-independent diagnose_if attributes should be checked on every use
10729 /// of a function.
10730 ///
10731 /// Returns true if any errors were emitted.
10732 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10733 SourceLocation Loc);
10734
10735 /// Determine if \p A and \p B are equivalent internal linkage declarations
10736 /// from different modules, and thus an ambiguity error can be downgraded to
10737 /// an extension warning.
10738 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10739 const NamedDecl *B);
10741 SourceLocation Loc, const NamedDecl *D,
10742 ArrayRef<const NamedDecl *> Equiv);
10743
10744 // Emit as a 'note' the specific overload candidate
10746 const NamedDecl *Found, const FunctionDecl *Fn,
10748 QualType DestType = QualType(), bool TakingAddress = false);
10749
10750 // Emit as a series of 'note's all template and non-templates identified by
10751 // the expression Expr
10752 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10753 bool TakingAddress = false);
10754
10755 /// Returns whether the given function's address can be taken or not,
10756 /// optionally emitting a diagnostic if the address can't be taken.
10757 ///
10758 /// Returns false if taking the address of the function is illegal.
10759 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10760 bool Complain = false,
10761 SourceLocation Loc = SourceLocation());
10762
10763 // [PossiblyAFunctionType] --> [Return]
10764 // NonFunctionType --> NonFunctionType
10765 // R (A) --> R(A)
10766 // R (*)(A) --> R (A)
10767 // R (&)(A) --> R (A)
10768 // R (S::*)(A) --> R (A)
10769 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10770
10771 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10772 /// an overloaded function (C++ [over.over]), where @p From is an
10773 /// expression with overloaded function type and @p ToType is the type
10774 /// we're trying to resolve to. For example:
10775 ///
10776 /// @code
10777 /// int f(double);
10778 /// int f(int);
10779 ///
10780 /// int (*pfd)(double) = f; // selects f(double)
10781 /// @endcode
10782 ///
10783 /// This routine returns the resulting FunctionDecl if it could be
10784 /// resolved, and NULL otherwise. When @p Complain is true, this
10785 /// routine will emit diagnostics if there is an error.
10786 FunctionDecl *
10787 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10788 bool Complain, DeclAccessPair &Found,
10789 bool *pHadMultipleCandidates = nullptr);
10790
10791 /// Given an expression that refers to an overloaded function, try to
10792 /// resolve that function to a single function that can have its address
10793 /// taken. This will modify `Pair` iff it returns non-null.
10794 ///
10795 /// This routine can only succeed if from all of the candidates in the
10796 /// overload set for SrcExpr that can have their addresses taken, there is one
10797 /// candidate that is more constrained than the rest.
10798 FunctionDecl *
10799 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10800
10801 /// Given an overloaded function, tries to turn it into a non-overloaded
10802 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10803 /// will perform access checks, diagnose the use of the resultant decl, and,
10804 /// if requested, potentially perform a function-to-pointer decay.
10805 ///
10806 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10807 /// Otherwise, returns true. This may emit diagnostics and return true.
10809 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10810
10811 /// Given an expression that refers to an overloaded function, try to
10812 /// resolve that overloaded function expression down to a single function.
10813 ///
10814 /// This routine can only resolve template-ids that refer to a single function
10815 /// template, where that template-id refers to a single template whose
10816 /// template arguments are either provided by the template-id or have
10817 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10818 ///
10819 /// If no template-ids are found, no diagnostics are emitted and NULL is
10820 /// returned.
10822 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10823 TemplateSpecCandidateSet *FailedTSC = nullptr,
10824 bool ForTypeDeduction = false);
10825
10826 // Resolve and fix an overloaded expression that can be resolved
10827 // because it identifies a single function template specialization.
10828 //
10829 // Last three arguments should only be supplied if Complain = true
10830 //
10831 // Return true if it was logically possible to so resolve the
10832 // expression, regardless of whether or not it succeeded. Always
10833 // returns true if 'complain' is set.
10835 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10836 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10837 QualType DestTypeForComplaining = QualType(),
10838 unsigned DiagIDForComplaining = 0);
10839
10840 /// Add the overload candidates named by callee and/or found by argument
10841 /// dependent lookup to the given overload set.
10842 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10843 ArrayRef<Expr *> Args,
10844 OverloadCandidateSet &CandidateSet,
10845 bool PartialOverloading = false);
10846
10847 /// Add the call candidates from the given set of lookup results to the given
10848 /// overload set. Non-function lookup results are ignored.
10850 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10851 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10852
10853 // An enum used to represent the different possible results of building a
10854 // range-based for loop.
10860
10861 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10862 /// given LookupResult is non-empty, it is assumed to describe a member which
10863 /// will be invoked. Otherwise, the function will be found via argument
10864 /// dependent lookup.
10865 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10866 /// otherwise CallExpr is set to ExprError() and some non-success value
10867 /// is returned.
10869 SourceLocation RangeLoc,
10870 const DeclarationNameInfo &NameInfo,
10871 LookupResult &MemberLookup,
10872 OverloadCandidateSet *CandidateSet,
10873 Expr *Range, ExprResult *CallExpr);
10874
10875 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10876 /// (which eventually refers to the declaration Func) and the call
10877 /// arguments Args/NumArgs, attempt to resolve the function call down
10878 /// to a specific function. If overload resolution succeeds, returns
10879 /// the call expression produced by overload resolution.
10880 /// Otherwise, emits diagnostics and returns ExprError.
10882 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10883 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10884 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10885
10886 /// Constructs and populates an OverloadedCandidateSet from
10887 /// the given function.
10888 /// \returns true when an the ExprResult output parameter has been set.
10890 MultiExprArg Args, SourceLocation RParenLoc,
10891 OverloadCandidateSet *CandidateSet,
10893
10897 const UnresolvedSetImpl &Fns,
10898 bool PerformADL = true);
10899
10900 /// Perform lookup for an overloaded unary operator.
10903 const UnresolvedSetImpl &Fns,
10904 ArrayRef<Expr *> Args, bool RequiresADL = true);
10905
10906 /// Create a unary operation that may resolve to an overloaded
10907 /// operator.
10908 ///
10909 /// \param OpLoc The location of the operator itself (e.g., '*').
10910 ///
10911 /// \param Opc The UnaryOperatorKind that describes this operator.
10912 ///
10913 /// \param Fns The set of non-member functions that will be
10914 /// considered by overload resolution. The caller needs to build this
10915 /// set based on the context using, e.g.,
10916 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10917 /// set should not contain any member functions; those will be added
10918 /// by CreateOverloadedUnaryOp().
10919 ///
10920 /// \param Input The input argument.
10923 const UnresolvedSetImpl &Fns, Expr *input,
10924 bool RequiresADL = true);
10925
10926 /// Perform lookup for an overloaded binary operator.
10929 const UnresolvedSetImpl &Fns,
10930 ArrayRef<Expr *> Args, bool RequiresADL = true);
10931
10932 /// Create a binary operation that may resolve to an overloaded
10933 /// operator.
10934 ///
10935 /// \param OpLoc The location of the operator itself (e.g., '+').
10936 ///
10937 /// \param Opc The BinaryOperatorKind that describes this operator.
10938 ///
10939 /// \param Fns The set of non-member functions that will be
10940 /// considered by overload resolution. The caller needs to build this
10941 /// set based on the context using, e.g.,
10942 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10943 /// set should not contain any member functions; those will be added
10944 /// by CreateOverloadedBinOp().
10945 ///
10946 /// \param LHS Left-hand argument.
10947 /// \param RHS Right-hand argument.
10948 /// \param PerformADL Whether to consider operator candidates found by ADL.
10949 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10950 /// C++20 operator rewrites.
10951 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10952 /// the function in question. Such a function is never a candidate in
10953 /// our overload resolution. This also enables synthesizing a three-way
10954 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10956 const UnresolvedSetImpl &Fns, Expr *LHS,
10957 Expr *RHS, bool RequiresADL = true,
10958 bool AllowRewrittenCandidates = true,
10959 FunctionDecl *DefaultedFn = nullptr);
10961 const UnresolvedSetImpl &Fns,
10962 Expr *LHS, Expr *RHS,
10963 FunctionDecl *DefaultedFn);
10964
10966 SourceLocation RLoc, Expr *Base,
10967 MultiExprArg Args);
10968
10969 /// BuildCallToMemberFunction - Build a call to a member
10970 /// function. MemExpr is the expression that refers to the member
10971 /// function (and includes the object parameter), Args/NumArgs are the
10972 /// arguments to the function call (not including the object
10973 /// parameter). The caller needs to validate that the member
10974 /// expression refers to a non-static member function or an overloaded
10975 /// member function.
10977 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10978 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10979 bool IsExecConfig = false, bool AllowRecovery = false);
10980
10981 /// BuildCallToObjectOfClassType - Build a call to an object of class
10982 /// type (C++ [over.call.object]), which can end up invoking an
10983 /// overloaded function call operator (@c operator()) or performing a
10984 /// user-defined conversion on the object argument.
10986 SourceLocation LParenLoc,
10987 MultiExprArg Args,
10988 SourceLocation RParenLoc);
10989
10990 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
10991 /// (if one exists), where @c Base is an expression of class type and
10992 /// @c Member is the name of the member we're trying to find.
10994 SourceLocation OpLoc,
10995 bool *NoArrowOperatorFound = nullptr);
10996
10999 bool HadMultipleCandidates);
11000
11001 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
11002 /// to a literal operator described by the provided lookup results.
11005 SourceLocation LitEndLoc,
11006 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
11007
11008 /// FixOverloadedFunctionReference - E is an expression that refers to
11009 /// a C++ overloaded function (possibly with some parentheses and
11010 /// perhaps a '&' around it). We have resolved the overloaded function
11011 /// to the function declaration Fn, so patch up the expression E to
11012 /// refer (possibly indirectly) to Fn. Returns the new expr.
11014 FunctionDecl *Fn);
11016 DeclAccessPair FoundDecl,
11017 FunctionDecl *Fn);
11018
11019 /// - Returns a selector which best matches given argument list or
11020 /// nullptr if none could be found
11022 bool IsInstance,
11024
11025 ///@}
11026
11027 //
11028 //
11029 // -------------------------------------------------------------------------
11030 //
11031 //
11032
11033 /// \name Statements
11034 /// Implementations are in SemaStmt.cpp
11035 ///@{
11036
11037public:
11038 /// Stack of active SEH __finally scopes. Can be empty.
11040
11041 /// Stack of '_Defer' statements that are currently being parsed, as well
11042 /// as the locations of their '_Defer' keywords. Can be empty.
11044
11045 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
11047
11049 bool HasLeadingEmptyMacro = false);
11050
11052 SourceLocation EndLoc);
11054
11055 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
11056 /// whose result is unused, warn.
11057 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
11058
11059 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
11063 ArrayRef<Stmt *> Elts, bool isStmtExpr);
11064
11066
11069 SourceLocation DotDotDotLoc, ExprResult RHS,
11070 SourceLocation ColonLoc);
11071
11072 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
11073 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
11074
11076 SourceLocation ColonLoc, Stmt *SubStmt,
11077 Scope *CurScope);
11079 SourceLocation ColonLoc, Stmt *SubStmt);
11080
11082 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
11084 Stmt *SubStmt);
11085
11086 /// Check whether the given statement can have musttail applied to it,
11087 /// issuing a diagnostic and returning false if not. In the success case,
11088 /// the statement is rewritten to remove implicit nodes from the return
11089 /// value.
11090 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
11091
11093 SourceLocation LParenLoc, Stmt *InitStmt,
11094 ConditionResult Cond, SourceLocation RParenLoc,
11095 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11097 SourceLocation LParenLoc, Stmt *InitStmt,
11098 ConditionResult Cond, SourceLocation RParenLoc,
11099 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11100
11102
11104 SourceLocation LParenLoc, Stmt *InitStmt,
11105 ConditionResult Cond,
11106 SourceLocation RParenLoc);
11108 Stmt *Body);
11109
11110 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
11111 /// integer not in the range of enum values.
11112 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
11113 Expr *SrcExpr);
11114
11116 ConditionResult Cond, SourceLocation RParenLoc,
11117 Stmt *Body);
11119 SourceLocation WhileLoc, SourceLocation CondLParen,
11120 Expr *Cond, SourceLocation CondRParen);
11121
11123 Stmt *First, ConditionResult Second,
11124 FullExprArg Third, SourceLocation RParenLoc,
11125 Stmt *Body);
11126
11127 /// In an Objective C collection iteration statement:
11128 /// for (x in y)
11129 /// x can be an arbitrary l-value expression. Bind it up as a
11130 /// full-expression.
11132
11134 /// Initial building of a for-range statement.
11136 /// Instantiation or recovery rebuild of a for-range statement. Don't
11137 /// attempt any typo-correction.
11139 /// Determining whether a for-range statement could be built. Avoid any
11140 /// unnecessary or irreversible actions.
11142 };
11143
11144 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
11145 ///
11146 /// C++11 [stmt.ranged]:
11147 /// A range-based for statement is equivalent to
11148 ///
11149 /// {
11150 /// auto && __range = range-init;
11151 /// for ( auto __begin = begin-expr,
11152 /// __end = end-expr;
11153 /// __begin != __end;
11154 /// ++__begin ) {
11155 /// for-range-declaration = *__begin;
11156 /// statement
11157 /// }
11158 /// }
11159 ///
11160 /// The body of the loop is not available yet, since it cannot be analysed
11161 /// until we have determined the type of the for-range-declaration.
11163 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
11164 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
11165 SourceLocation RParenLoc, BuildForRangeKind Kind,
11166 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11167
11168 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
11169 StmtResult BuildCXXForRangeStmt(
11170 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
11171 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
11172 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
11173 BuildForRangeKind Kind,
11174 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11175
11176 /// Set the type of a for-range declaration whose for-range or expansion
11177 /// initialiser is dependent.
11178 void ActOnDependentForRangeInitializer(VarDecl *LoopVar,
11179 BuildForRangeKind BFRK);
11180
11181 /// Holds the 'begin' and 'end' variables of a range-based for loop or
11182 /// expansion statement; begin-expr and end-expr are also provided; the
11183 /// latter are used in some diagnostics.
11185 VarDecl *BeginVar = nullptr;
11186 VarDecl *EndVar = nullptr;
11187 Expr *BeginExpr = nullptr;
11188 Expr *EndExpr = nullptr;
11189 bool isValid() const { return BeginVar != nullptr && EndVar != nullptr; }
11190 };
11191
11192 /// Determine begin-expr and end-expr and build variable declarations for
11193 /// them as per [stmt.ranged].
11194 ForRangeBeginEndInfo BuildCXXForRangeBeginEndVars(
11195 Scope *S, VarDecl *RangeVar, SourceLocation ColonLoc,
11196 SourceLocation CoawaitLoc,
11197 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps,
11198 BuildForRangeKind Kind, bool IsConstexpr,
11199 StmtResult *RebuildResult = nullptr,
11200 llvm::function_ref<StmtResult()> RebuildWithDereference = {},
11201 IdentifierInfo *BeginName = nullptr, IdentifierInfo *EndName = nullptr);
11202
11203 /// Helper used by the expansion statements and for-range code to build
11204 /// a variable declaration for e.g. 'begin' and 'end'.
11205 VarDecl *BuildForRangeVarDecl(SourceLocation Loc, QualType Type,
11206 IdentifierInfo *Name, bool IsConstexpr);
11207
11208 /// Build the range variable of a range-based for loop or iterating
11209 /// expansion statement and return its DeclStmt.
11210 StmtResult BuildCXXForRangeRangeVar(Scope *S, Expr *Range, QualType Type,
11211 bool IsConstexpr = false);
11212
11213 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
11214 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
11215 /// body cannot be performed until after the type of the range variable is
11216 /// determined.
11217 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
11218
11219 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
11220 LabelDecl *TheDecl);
11221 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
11222 SourceLocation StarLoc, Expr *DestExp);
11223 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope,
11224 LabelDecl *Label, SourceLocation LabelLoc);
11225 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope,
11226 LabelDecl *Label, SourceLocation LabelLoc);
11227
11228 void ActOnStartOfDeferStmt(SourceLocation DeferLoc, Scope *CurScope);
11229 void ActOnDeferStmtError(Scope *CurScope);
11230 StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope);
11231
11234
11237
11238 bool isMoveEligible() const { return S != None; };
11240 };
11242
11243 /// Determine whether the given expression might be move-eligible or
11244 /// copy-elidable in either a (co_)return statement or throw expression,
11245 /// without considering function return type, if applicable.
11246 ///
11247 /// \param E The expression being returned from the function or block,
11248 /// being thrown, or being co_returned from a coroutine. This expression
11249 /// might be modified by the implementation.
11250 ///
11251 /// \param Mode Overrides detection of current language mode
11252 /// and uses the rules for C++23.
11253 ///
11254 /// \returns An aggregate which contains the Candidate and isMoveEligible
11255 /// and isCopyElidable methods. If Candidate is non-null, it means
11256 /// isMoveEligible() would be true under the most permissive language
11257 /// standard.
11258 NamedReturnInfo getNamedReturnInfo(
11260
11261 /// Determine whether the given NRVO candidate variable is move-eligible or
11262 /// copy-elidable, without considering function return type.
11263 ///
11264 /// \param VD The NRVO candidate variable.
11265 ///
11266 /// \returns An aggregate which contains the Candidate and isMoveEligible
11267 /// and isCopyElidable methods. If Candidate is non-null, it means
11268 /// isMoveEligible() would be true under the most permissive language
11269 /// standard.
11270 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
11271
11272 /// Updates given NamedReturnInfo's move-eligible and
11273 /// copy-elidable statuses, considering the function
11274 /// return type criteria as applicable to return statements.
11275 ///
11276 /// \param Info The NamedReturnInfo object to update.
11277 ///
11278 /// \param ReturnType This is the return type of the function.
11279 /// \returns The copy elision candidate, in case the initial return expression
11280 /// was copy elidable, or nullptr otherwise.
11281 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
11282 QualType ReturnType);
11283
11284 /// Perform the initialization of a potentially-movable value, which
11285 /// is the result of return value.
11286 ///
11287 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
11288 /// treat returned lvalues as rvalues in certain cases (to prefer move
11289 /// construction), then falls back to treating them as lvalues if that failed.
11292 const NamedReturnInfo &NRInfo, Expr *Value,
11293 bool SupressSimplerImplicitMoves = false);
11294
11296
11297 /// Deduce the return type for a function from a returned expression, per
11298 /// C++1y [dcl.spec.auto]p6.
11300 SourceLocation ReturnLoc, Expr *RetExpr,
11301 const AutoType *AT);
11302
11303 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11304 Scope *CurScope);
11305 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11306 bool AllowRecovery = false);
11307
11308 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
11309 /// for capturing scopes.
11311 NamedReturnInfo &NRInfo,
11312 bool SupressSimplerImplicitMoves);
11313
11314 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
11315 /// and creates a proper catch handler from them.
11317 Stmt *HandlerBlock);
11318
11319 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
11320 /// handlers and creates a try statement from them.
11322 ArrayRef<Stmt *> Handlers);
11323
11324 void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry);
11325
11326 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
11327 SourceLocation TryLoc, Stmt *TryBlock,
11328 Stmt *Handler);
11330 Stmt *Block);
11335
11337 bool IsIfExists,
11338 NestedNameSpecifierLoc QualifierLoc,
11339 DeclarationNameInfo NameInfo,
11340 Stmt *Nested);
11342 bool IsIfExists, CXXScopeSpec &SS,
11343 UnqualifiedId &Name, Stmt *Nested);
11344
11345 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11346 CapturedRegionKind Kind, unsigned NumParams);
11347 typedef std::pair<StringRef, QualType> CapturedParamNameType;
11348 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11349 CapturedRegionKind Kind,
11351 unsigned OpenMPCaptureLevel = 0);
11355 SourceLocation Loc,
11356 unsigned NumParams);
11357
11359 VarDecl *RangeVar, ArrayRef<MaterializeTemporaryExpr *> Temporaries);
11360
11361private:
11362 /// Check whether the given statement can have musttail applied to it,
11363 /// issuing a diagnostic and returning false if not.
11364 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
11365
11366 ///@}
11367
11368 //
11369 //
11370 // -------------------------------------------------------------------------
11371 //
11372 //
11373
11374 /// \name `inline asm` Statement
11375 /// Implementations are in SemaStmtAsm.cpp
11376 ///@{
11377
11378public:
11379 ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel);
11380 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
11381 bool IsVolatile, unsigned NumOutputs,
11382 unsigned NumInputs, IdentifierInfo **Names,
11383 MultiExprArg Constraints, MultiExprArg Exprs,
11384 Expr *AsmString, MultiExprArg Clobbers,
11385 unsigned NumLabels, SourceLocation RParenLoc);
11386
11388 llvm::InlineAsmIdentifierInfo &Info);
11390 SourceLocation TemplateKWLoc,
11391 UnqualifiedId &Id,
11392 bool IsUnevaluatedContext);
11393 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
11394 SourceLocation AsmLoc);
11396 SourceLocation AsmLoc);
11398 ArrayRef<Token> AsmToks, StringRef AsmString,
11399 unsigned NumOutputs, unsigned NumInputs,
11400 ArrayRef<StringRef> Constraints,
11401 ArrayRef<StringRef> Clobbers,
11402 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
11403 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
11404 SourceLocation Location, bool AlwaysCreate);
11405
11406 ///@}
11407
11408 //
11409 //
11410 // -------------------------------------------------------------------------
11411 //
11412 //
11413
11414 /// \name Statement Attribute Handling
11415 /// Implementations are in SemaStmtAttr.cpp
11416 ///@{
11417
11418public:
11419 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11420 const AttributeCommonInfo &A);
11421 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11422 const AttributeCommonInfo &A);
11423
11424 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11426
11427 /// Process the attributes before creating an attributed statement. Returns
11428 /// the semantic attributes that have been processed.
11429 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11431
11433 SourceRange Range);
11435 const IdentifierInfo *AttrName,
11436 SourceRange Range);
11437
11438 ///@}
11439
11440 //
11441 //
11442 // -------------------------------------------------------------------------
11443 //
11444 //
11445
11446 /// \name C++ Templates
11447 /// Implementations are in SemaTemplate.cpp
11448 ///@{
11449
11450public:
11451 // Saves the current floating-point pragma stack and clear it in this Sema.
11453 public:
11455 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11456 S.FpPragmaStack.Stack.clear();
11457 }
11458 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11461
11462 private:
11463 Sema &S;
11465 };
11466
11468 CurFPFeatures = FPO;
11469 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11470 }
11471
11477
11482
11483 typedef llvm::MapVector<const FunctionDecl *,
11484 std::unique_ptr<LateParsedTemplate>>
11487
11488 /// Determine the number of levels of enclosing template parameters. This is
11489 /// only usable while parsing. Note that this does not include dependent
11490 /// contexts in which no template parameters have yet been declared, such as
11491 /// in a terse function template or generic lambda before the first 'auto' is
11492 /// encountered.
11493 unsigned getTemplateDepth(Scope *S) const;
11494
11496 bool AllowFunctionTemplates = true,
11497 bool AllowDependent = true);
11499 bool AllowFunctionTemplates = true,
11500 bool AllowDependent = true,
11501 bool AllowNonTemplateFunctions = false);
11502 /// Try to interpret the lookup result D as a template-name.
11503 ///
11504 /// \param D A declaration found by name lookup.
11505 /// \param AllowFunctionTemplates Whether function templates should be
11506 /// considered valid results.
11507 /// \param AllowDependent Whether unresolved using declarations (that might
11508 /// name templates) should be considered valid results.
11510 bool AllowFunctionTemplates = true,
11511 bool AllowDependent = true);
11512
11514 /// Whether and why a template name is required in this lookup.
11516 public:
11517 /// Template name is required if TemplateKWLoc is valid.
11519 : TemplateKW(TemplateKWLoc) {}
11520 /// Template name is unconditionally required.
11522
11524 return TemplateKW.value_or(SourceLocation());
11525 }
11526 bool hasTemplateKeyword() const {
11527 return getTemplateKeywordLoc().isValid();
11528 }
11529 bool isRequired() const { return TemplateKW != SourceLocation(); }
11530 explicit operator bool() const { return isRequired(); }
11531
11532 private:
11533 std::optional<SourceLocation> TemplateKW;
11534 };
11535
11537 /// This is not assumed to be a template name.
11539 /// This is assumed to be a template name because lookup found nothing.
11541 /// This is assumed to be a template name because lookup found one or more
11542 /// functions (but no function templates).
11544 };
11545
11546 bool
11548 QualType ObjectType, bool EnteringContext,
11549 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11550 AssumedTemplateKind *ATK = nullptr,
11551 bool AllowTypoCorrection = true);
11552
11554 bool hasTemplateKeyword,
11555 const UnqualifiedId &Name,
11556 ParsedType ObjectType, bool EnteringContext,
11558 bool &MemberOfUnknownSpecialization,
11559 bool AllowTypoCorrection = true);
11560
11561 /// Try to resolve an undeclared template name as a type template.
11562 ///
11563 /// Sets II to the identifier corresponding to the template name, and updates
11564 /// Name to a corresponding (typo-corrected) type template name and TNK to
11565 /// the corresponding kind, if possible.
11567 TemplateNameKind &TNK,
11568 SourceLocation NameLoc,
11569 IdentifierInfo *&II);
11570
11571 /// Determine whether a particular identifier might be the name in a C++1z
11572 /// deduction-guide declaration.
11573 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11574 SourceLocation NameLoc, CXXScopeSpec &SS,
11575 ParsedTemplateTy *Template = nullptr);
11576
11578 SourceLocation IILoc, Scope *S,
11579 const CXXScopeSpec *SS,
11580 TemplateTy &SuggestedTemplate,
11581 TemplateNameKind &SuggestedKind);
11582
11583 /// Determine whether we would be unable to instantiate this template (because
11584 /// it either has no definition, or is in the process of being instantiated).
11586 SourceLocation PointOfInstantiation, NamedDecl *Instantiation,
11587 bool InstantiatedFromMember, const NamedDecl *Pattern,
11588 const NamedDecl *PatternDef, TemplateSpecializationKind TSK,
11589 bool Complain = true, bool *Unreachable = nullptr);
11590
11591 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11592 /// that the template parameter 'PrevDecl' is being shadowed by a new
11593 /// declaration at location Loc. Returns true to indicate that this is
11594 /// an error, and false otherwise.
11595 ///
11596 /// \param Loc The location of the declaration that shadows a template
11597 /// parameter.
11598 ///
11599 /// \param PrevDecl The template parameter that the declaration shadows.
11600 ///
11601 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11602 /// a warning for compatibility with older versions of clang.
11603 /// Ignored when MSVC compatibility is enabled.
11605 bool SupportedForCompatibility = false);
11606
11607 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11608 /// the parameter D to reference the templated declaration and return a
11609 /// pointer to the template declaration. Otherwise, do nothing to D and return
11610 /// null.
11612
11613 /// ActOnTypeParameter - Called when a C++ template type parameter
11614 /// (e.g., "typename T") has been parsed. Typename specifies whether
11615 /// the keyword "typename" was used to declare the type parameter
11616 /// (otherwise, "class" was used), and KeyLoc is the location of the
11617 /// "class" or "typename" keyword. ParamName is the name of the
11618 /// parameter (NULL indicates an unnamed template parameter) and
11619 /// ParamNameLoc is the location of the parameter name (if any).
11620 /// If the type parameter has a default argument, it will be added
11621 /// later via ActOnTypeParameterDefault.
11623 SourceLocation EllipsisLoc,
11624 SourceLocation KeyLoc,
11625 IdentifierInfo *ParamName,
11626 SourceLocation ParamNameLoc, unsigned Depth,
11627 unsigned Position, SourceLocation EqualLoc,
11628 ParsedType DefaultArg, bool HasTypeConstraint);
11629
11631
11632 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11634 TemplateTypeParmDecl *ConstrainedParameter,
11635 SourceLocation EllipsisLoc);
11636 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11638 TemplateTypeParmDecl *ConstrainedParameter,
11639 SourceLocation EllipsisLoc,
11640 bool AllowUnexpandedPack);
11641
11642 /// Attach a type-constraint to a template parameter.
11643 /// \returns true if an error occurred. This can happen if the
11644 /// immediately-declared constraint could not be formed (e.g. incorrect number
11645 /// of arguments for the named concept).
11647 DeclarationNameInfo NameInfo,
11648 TemplateName NamedConcept, NamedDecl *FoundDecl,
11649 const TemplateArgumentListInfo *TemplateArgs,
11650 TemplateTypeParmDecl *ConstrainedParameter,
11651 SourceLocation EllipsisLoc);
11652
11654 NonTypeTemplateParmDecl *NewConstrainedParm,
11655 NonTypeTemplateParmDecl *OrigConstrainedParm,
11656 SourceLocation EllipsisLoc);
11657
11658 /// Require the given type to be a structural type, and diagnose if it is not.
11659 ///
11660 /// \return \c true if an error was produced.
11662
11663 /// Check that the type of a non-type template parameter is
11664 /// well-formed.
11665 ///
11666 /// \returns the (possibly-promoted) parameter type if valid;
11667 /// otherwise, produces a diagnostic and returns a NULL type.
11669 SourceLocation Loc);
11671
11673 unsigned Depth, unsigned Position,
11674 SourceLocation EqualLoc,
11675 Expr *DefaultArg);
11676
11677 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11678 /// parameter (e.g. T in template <template <typename> class T> class array)
11679 /// has been parsed. S is the current scope.
11681 Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind,
11682 bool TypenameKeyword, TemplateParameterList *Params,
11683 SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11684 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11685 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11686
11687 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11688 /// constrained by RequiresClause, that contains the template parameters in
11689 /// Params.
11691 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11692 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11693 SourceLocation RAngleLoc, Expr *RequiresClause);
11694
11695 /// The context in which we are checking a template parameter list.
11697 // For this context, Class, Variable, TypeAlias, and non-pack Template
11698 // Template Parameters are treated uniformly.
11700
11707 };
11708
11709 /// Checks the validity of a template parameter list, possibly
11710 /// considering the template parameter list from a previous
11711 /// declaration.
11712 ///
11713 /// If an "old" template parameter list is provided, it must be
11714 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11715 /// template parameter list.
11716 ///
11717 /// \param NewParams Template parameter list for a new template
11718 /// declaration. This template parameter list will be updated with any
11719 /// default arguments that are carried through from the previous
11720 /// template parameter list.
11721 ///
11722 /// \param OldParams If provided, template parameter list from a
11723 /// previous declaration of the same template. Default template
11724 /// arguments will be merged from the old template parameter list to
11725 /// the new template parameter list.
11726 ///
11727 /// \param TPC Describes the context in which we are checking the given
11728 /// template parameter list.
11729 ///
11730 /// \param SkipBody If we might have already made a prior merged definition
11731 /// of this template visible, the corresponding body-skipping information.
11732 /// Default argument redefinition is not an error when skipping such a body,
11733 /// because (under the ODR) we can assume the default arguments are the same
11734 /// as the prior merged definition.
11735 ///
11736 /// \returns true if an error occurred, false otherwise.
11738 TemplateParameterList *OldParams,
11740 SkipBodyInfo *SkipBody = nullptr);
11741
11742 /// Match the given template parameter lists to the given scope
11743 /// specifier, returning the template parameter list that applies to the
11744 /// name.
11745 ///
11746 /// \param DeclStartLoc the start of the declaration that has a scope
11747 /// specifier or a template parameter list.
11748 ///
11749 /// \param DeclLoc The location of the declaration itself.
11750 ///
11751 /// \param SS the scope specifier that will be matched to the given template
11752 /// parameter lists. This scope specifier precedes a qualified name that is
11753 /// being declared.
11754 ///
11755 /// \param TemplateId The template-id following the scope specifier, if there
11756 /// is one. Used to check for a missing 'template<>'.
11757 ///
11758 /// \param ParamLists the template parameter lists, from the outermost to the
11759 /// innermost template parameter lists.
11760 ///
11761 /// \param IsFriend Whether to apply the slightly different rules for
11762 /// matching template parameters to scope specifiers in friend
11763 /// declarations.
11764 ///
11765 /// \param IsMemberSpecialization will be set true if the scope specifier
11766 /// denotes a fully-specialized type, and therefore this is a declaration of
11767 /// a member specialization.
11768 ///
11769 /// \returns the template parameter list, if any, that corresponds to the
11770 /// name that is preceded by the scope specifier @p SS. This template
11771 /// parameter list may have template parameters (if we're declaring a
11772 /// template) or may have no template parameters (if we're declaring a
11773 /// template specialization), or may be NULL (if what we're declaring isn't
11774 /// itself a template).
11776 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11777 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11778 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11779 bool &IsMemberSpecialization, bool &Invalid,
11780 bool SuppressDiagnostic = false);
11781
11782 /// Returns the template parameter list with all default template argument
11783 /// information.
11785
11787 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11788 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11789 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11790 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11791 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11792 TemplateParameterList **OuterTemplateParamLists,
11793 bool IsMemberSpecialization, SkipBodyInfo *SkipBody = nullptr);
11794
11795 /// Translates template arguments as provided by the parser
11796 /// into template arguments used by semantic analysis.
11799
11800 /// Convert a parsed type into a parsed template argument. This is mostly
11801 /// trivial, except that we may have parsed a C++17 deduced class template
11802 /// specialization type, in which case we should form a template template
11803 /// argument instead of a type template argument.
11805
11807
11810 SourceLocation TemplateLoc,
11811 TemplateArgumentListInfo &TemplateArgs,
11812 Scope *Scope, bool ForNestedNameSpecifier);
11813
11815 ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword,
11816 SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS,
11817 SourceLocation TemplateKWLoc, TemplateTy Template,
11818 const IdentifierInfo *TemplateII,
11819 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11820 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11821 bool IsCtorOrDtorName = false, bool IsClassName = false,
11822 ImplicitTypenameContext AllowImplicitTypename =
11824
11825 /// Parsed an elaborated-type-specifier that refers to a template-id,
11826 /// such as \c class T::template apply<U>.
11828 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11829 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11830 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11831 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11832
11835 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11837
11838 /// Get the specialization of the given variable template corresponding to
11839 /// the specified argument list, or a null-but-valid result if the arguments
11840 /// are dependent.
11842 SourceLocation TemplateLoc,
11843 SourceLocation TemplateNameLoc,
11844 const TemplateArgumentListInfo &TemplateArgs,
11845 bool SetWrittenArgs);
11846
11847 /// Form a reference to the specialization of the given variable template
11848 /// corresponding to the specified argument list, or a null-but-valid result
11849 /// if the arguments are dependent.
11851 const DeclarationNameInfo &NameInfo,
11853 SourceLocation TemplateLoc,
11854 const TemplateArgumentListInfo *TemplateArgs);
11855
11857 const DeclarationNameInfo &NameInfo, TemplateName Template,
11858 const TemplateArgumentListInfo *TemplateArgs);
11859
11861 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11862 const DeclarationNameInfo &ConceptNameInfo,
11863 NamedDecl *FoundDecl, TemplateDecl *NamedConcept,
11864 const TemplateArgumentListInfo *TemplateArgs,
11865 bool DoCheckConstraintSatisfaction = true);
11866
11869 bool TemplateKeyword, TemplateDecl *TD,
11870 SourceLocation Loc);
11871
11873 SourceLocation TemplateKWLoc, LookupResult &R,
11874 bool RequiresADL,
11875 const TemplateArgumentListInfo *TemplateArgs);
11876
11877 // We actually only call this from template instantiation.
11880 const DeclarationNameInfo &NameInfo,
11881 const TemplateArgumentListInfo *TemplateArgs,
11882 bool IsAddressOfOperand);
11883
11885 return Pack.pack_size() - 1 - *ArgPackSubstIndex;
11886 }
11887
11890 Arg = Arg.pack_elements()[*ArgPackSubstIndex];
11891 if (Arg.isPackExpansion())
11892 Arg = Arg.getPackExpansionPattern();
11893 return Arg;
11894 }
11895
11897 BuildSubstNonTypeTemplateParmExpr(Decl *AssociatedDecl, unsigned Index,
11898 QualType ParamType, SourceLocation loc,
11899 TemplateArgument Replacement,
11900 UnsignedOrNone PackIndex, bool Final);
11901
11902 /// Form a template name from a name that is syntactically required to name a
11903 /// template, either due to use of the 'template' keyword or because a name in
11904 /// this syntactic context is assumed to name a template (C++
11905 /// [temp.names]p2-4).
11906 ///
11907 /// This action forms a template name given the name of the template and its
11908 /// optional scope specifier. This is used when the 'template' keyword is used
11909 /// or when the parsing context unambiguously treats a following '<' as
11910 /// introducing a template argument list. Note that this may produce a
11911 /// non-dependent template name if we can perform the lookup now and identify
11912 /// the named template.
11913 ///
11914 /// For example, given "x.MetaFun::template apply", the scope specifier
11915 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11916 /// of the "template" keyword, and "apply" is the \p Name.
11918 SourceLocation TemplateKWLoc,
11919 const UnqualifiedId &Name,
11920 ParsedType ObjectType,
11921 bool EnteringContext, TemplateTy &Template,
11922 bool AllowInjectedClassName = false);
11923
11925 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11926 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11928 MultiTemplateParamsArg TemplateParameterLists,
11929 SkipBodyInfo *SkipBody = nullptr);
11930
11931 /// Check the non-type template arguments of a class template
11932 /// partial specialization according to C++ [temp.class.spec]p9.
11933 ///
11934 /// \param TemplateNameLoc the location of the template name.
11935 /// \param PrimaryTemplate the template parameters of the primary class
11936 /// template.
11937 /// \param NumExplicit the number of explicitly-specified template arguments.
11938 /// \param TemplateArgs the template arguments of the class template
11939 /// partial specialization.
11940 ///
11941 /// \returns \c true if there was an error, \c false otherwise.
11943 TemplateDecl *PrimaryTemplate,
11944 unsigned NumExplicitArgs,
11950
11952 MultiTemplateParamsArg TemplateParameterLists,
11953 Declarator &D);
11954
11955 /// Diagnose cases where we have an explicit template specialization
11956 /// before/after an explicit template instantiation, producing diagnostics
11957 /// for those cases where they are required and determining whether the
11958 /// new specialization/instantiation will have any effect.
11959 ///
11960 /// \param NewLoc the location of the new explicit specialization or
11961 /// instantiation.
11962 ///
11963 /// \param NewTSK the kind of the new explicit specialization or
11964 /// instantiation.
11965 ///
11966 /// \param PrevDecl the previous declaration of the entity.
11967 ///
11968 /// \param PrevTSK the kind of the old explicit specialization or
11969 /// instantiatin.
11970 ///
11971 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11972 /// declaration was instantiated (either implicitly or explicitly).
11973 ///
11974 /// \param HasNoEffect will be set to true to indicate that the new
11975 /// specialization or instantiation has no effect and should be ignored.
11976 ///
11977 /// \returns true if there was an error that should prevent the introduction
11978 /// of the new declaration into the AST, false otherwise.
11980 SourceLocation NewLoc,
11981 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11982 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11983 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11984
11985 /// Perform semantic analysis for the given dependent function
11986 /// template specialization.
11987 ///
11988 /// The only possible way to get a dependent function template specialization
11989 /// is with a friend declaration, like so:
11990 ///
11991 /// \code
11992 /// template <class T> void foo(T);
11993 /// template <class T> class A {
11994 /// friend void foo<>(T);
11995 /// };
11996 /// \endcode
11997 ///
11998 /// There really isn't any useful analysis we can do here, so we
11999 /// just store the information.
12001 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
12003
12004 /// Perform semantic analysis for the given function template
12005 /// specialization.
12006 ///
12007 /// This routine performs all of the semantic analysis required for an
12008 /// explicit function template specialization. On successful completion,
12009 /// the function declaration \p FD will become a function template
12010 /// specialization.
12011 ///
12012 /// \param FD the function declaration, which will be updated to become a
12013 /// function template specialization.
12014 ///
12015 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
12016 /// if any. Note that this may be valid info even when 0 arguments are
12017 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
12018 /// as it anyway contains info on the angle brackets locations.
12019 ///
12020 /// \param Previous the set of declarations that may be specialized by
12021 /// this function specialization.
12022 ///
12023 /// \param QualifiedFriend whether this is a lookup for a qualified friend
12024 /// declaration with no explicit template argument list that might be
12025 /// befriending a function template specialization.
12027 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
12028 LookupResult &Previous, bool QualifiedFriend = false);
12029
12030 /// Perform semantic analysis for the given non-template member
12031 /// specialization.
12032 ///
12033 /// This routine performs all of the semantic analysis required for an
12034 /// explicit member function specialization. On successful completion,
12035 /// the function declaration \p FD will become a member function
12036 /// specialization.
12037 ///
12038 /// \param Member the member declaration, which will be updated to become a
12039 /// specialization.
12040 ///
12041 /// \param Previous the set of declarations, one of which may be specialized
12042 /// by this function specialization; the set will be modified to contain the
12043 /// redeclared member.
12046
12047 // Explicit instantiation of a class template specialization
12049 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
12050 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
12051 TemplateTy Template, SourceLocation TemplateNameLoc,
12052 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
12053 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
12054
12055 // Explicit instantiation of a member class of a class template.
12057 SourceLocation TemplateLoc,
12058 unsigned TagSpec, SourceLocation KWLoc,
12059 CXXScopeSpec &SS, IdentifierInfo *Name,
12060 SourceLocation NameLoc,
12061 const ParsedAttributesView &Attr);
12062
12064 SourceLocation TemplateLoc,
12065 Declarator &D);
12066
12067 /// If the given template parameter has a default template
12068 /// argument, substitute into that default template argument and
12069 /// return the corresponding template argument.
12071 TemplateDecl *Template, SourceLocation TemplateKWLoc,
12072 SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param,
12073 ArrayRef<TemplateArgument> SugaredConverted,
12074 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
12075
12076 /// Returns the top most location responsible for the definition of \p N.
12077 /// If \p N is a a template specialization, this is the location
12078 /// of the top of the instantiation stack.
12079 /// Otherwise, the location of \p N is returned.
12081
12082 /// Specifies the context in which a particular template
12083 /// argument is being checked.
12085 /// The template argument was specified in the code or was
12086 /// instantiated with some deduced template arguments.
12088
12089 /// The template argument was deduced via template argument
12090 /// deduction.
12092
12093 /// The template argument was deduced from an array bound
12094 /// via template argument deduction.
12096 };
12097
12105
12106 /// The checked, converted argument will be added to the
12107 /// end of these vectors.
12109
12110 /// The check is being performed in the context of partial ordering.
12112
12113 /// If true, assume these template arguments are
12114 /// the injected template arguments for a template template parameter.
12115 /// This will relax the requirement that all its possible uses are valid:
12116 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
12117 /// during instantiation.
12119
12120 /// Is set to true when, in the context of TTP matching, a pack parameter
12121 /// matches non-pack arguments.
12122 bool StrictPackMatch = false;
12123 };
12124
12125 /// Check that the given template argument corresponds to the given
12126 /// template parameter.
12127 ///
12128 /// \param Param The template parameter against which the argument will be
12129 /// checked.
12130 ///
12131 /// \param Arg The template argument, which may be updated due to conversions.
12132 ///
12133 /// \param Template The template in which the template argument resides.
12134 ///
12135 /// \param TemplateLoc The location of the template name for the template
12136 /// whose argument list we're matching.
12137 ///
12138 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
12139 /// the template argument list.
12140 ///
12141 /// \param ArgumentPackIndex The index into the argument pack where this
12142 /// argument will be placed. Only valid if the parameter is a parameter pack.
12143 ///
12144 /// \param CTAK Describes how we arrived at this particular template argument:
12145 /// explicitly written, deduced, etc.
12146 ///
12147 /// \returns true on error, false otherwise.
12149 NamedDecl *Template, SourceLocation TemplateLoc,
12150 SourceLocation RAngleLoc,
12151 unsigned ArgumentPackIndex,
12154
12155 /// Check that the given template arguments can be provided to
12156 /// the given template, converting the arguments along the way.
12157 ///
12158 /// \param Template The template to which the template arguments are being
12159 /// provided.
12160 ///
12161 /// \param TemplateLoc The location of the template name in the source.
12162 ///
12163 /// \param TemplateArgs The list of template arguments. If the template is
12164 /// a template template parameter, this function may extend the set of
12165 /// template arguments to also include substituted, defaulted template
12166 /// arguments.
12167 ///
12168 /// \param PartialTemplateArgs True if the list of template arguments is
12169 /// intentionally partial, e.g., because we're checking just the initial
12170 /// set of template arguments.
12171 ///
12172 /// \param Converted Will receive the converted, canonicalized template
12173 /// arguments.
12174 ///
12175 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
12176 /// contain the converted forms of the template arguments as written.
12177 /// Otherwise, \p TemplateArgs will not be modified.
12178 ///
12179 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
12180 /// receive true if the cause for the error is the associated constraints of
12181 /// the template not being satisfied by the template arguments.
12182 ///
12183 /// \param DefaultArgs any default arguments from template specialization
12184 /// deduction.
12185 ///
12186 /// \returns true if an error occurred, false otherwise.
12188 SourceLocation TemplateLoc,
12189 TemplateArgumentListInfo &TemplateArgs,
12190 const DefaultArguments &DefaultArgs,
12191 bool PartialTemplateArgs,
12193 bool UpdateArgsWithConversions = true,
12194 bool *ConstraintsNotSatisfied = nullptr);
12195
12198 SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
12199 const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
12200 CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions = true,
12201 bool *ConstraintsNotSatisfied = nullptr);
12202
12205 SmallVectorImpl<TemplateArgument> &SugaredConverted,
12206 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
12207
12208 /// Check a template argument against its corresponding
12209 /// template type parameter.
12210 ///
12211 /// This routine implements the semantics of C++ [temp.arg.type]. It
12212 /// returns true if an error occurred, and false otherwise.
12214
12215 /// Check a template argument against its corresponding
12216 /// non-type template parameter.
12217 ///
12218 /// This routine implements the semantics of C++ [temp.arg.nontype].
12219 /// If an error occurred, it returns ExprError(); otherwise, it
12220 /// returns the converted template argument. \p ParamType is the
12221 /// type of the non-type template parameter after it has been instantiated.
12223 QualType InstantiatedParamType, Expr *Arg,
12224 TemplateArgument &SugaredConverted,
12225 TemplateArgument &CanonicalConverted,
12226 bool StrictCheck,
12228
12229 /// Check a template argument against its corresponding
12230 /// template template parameter.
12231 ///
12232 /// This routine implements the semantics of C++ [temp.arg.template].
12233 /// It returns true if an error occurred, and false otherwise.
12235 TemplateParameterList *Params,
12237 bool PartialOrdering,
12238 bool *StrictPackMatch);
12239
12242 const TemplateArgumentLoc &Arg);
12243
12245 std::optional<SourceRange> ParamRange = {});
12247
12248 /// Given a non-type template argument that refers to a
12249 /// declaration and the type of its corresponding non-type template
12250 /// parameter, produce an expression that properly refers to that
12251 /// declaration.
12252 /// FIXME: This is used in some contexts where the resulting expression
12253 /// doesn't need to live too long. It would be useful if this function
12254 /// could return a temporary expression.
12256 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc);
12259 SourceLocation Loc);
12260
12261 /// Enumeration describing how template parameter lists are compared
12262 /// for equality.
12264 /// We are matching the template parameter lists of two templates
12265 /// that might be redeclarations.
12266 ///
12267 /// \code
12268 /// template<typename T> struct X;
12269 /// template<typename T> struct X;
12270 /// \endcode
12272
12273 /// We are matching the template parameter lists of two template
12274 /// template parameters as part of matching the template parameter lists
12275 /// of two templates that might be redeclarations.
12276 ///
12277 /// \code
12278 /// template<template<int I> class TT> struct X;
12279 /// template<template<int Value> class Other> struct X;
12280 /// \endcode
12282
12283 /// We are determining whether the template-parameters are equivalent
12284 /// according to C++ [temp.over.link]/6. This comparison does not consider
12285 /// constraints.
12286 ///
12287 /// \code
12288 /// template<C1 T> void f(T);
12289 /// template<C2 T> void f(T);
12290 /// \endcode
12292 };
12293
12294 // A struct to represent the 'new' declaration, which is either itself just
12295 // the named decl, or the important information we need about it in order to
12296 // do constraint comparisons.
12298 const NamedDecl *ND = nullptr;
12299 const DeclContext *DC = nullptr;
12300 const DeclContext *LexicalDC = nullptr;
12301 SourceLocation Loc;
12302
12303 public:
12306 const DeclContext *LexicalDeclCtx,
12307 SourceLocation Loc)
12308
12309 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
12310 assert(DC && LexicalDC &&
12311 "Constructor only for cases where we have the information to put "
12312 "in here");
12313 }
12314
12315 // If this was constructed with no information, we cannot do substitution
12316 // for constraint comparison, so make sure we can check that.
12317 bool isInvalid() const { return !ND && !DC; }
12318
12319 const NamedDecl *getDecl() const { return ND; }
12320
12321 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
12322
12324 return ND ? ND->getLexicalDeclContext() : LexicalDC;
12325 }
12326
12328 return ND ? ND->getDeclContext() : DC;
12329 }
12330
12331 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
12332 };
12333
12334 /// Determine whether the given template parameter lists are
12335 /// equivalent.
12336 ///
12337 /// \param New The new template parameter list, typically written in the
12338 /// source code as part of a new template declaration.
12339 ///
12340 /// \param Old The old template parameter list, typically found via
12341 /// name lookup of the template declared with this template parameter
12342 /// list.
12343 ///
12344 /// \param Complain If true, this routine will produce a diagnostic if
12345 /// the template parameter lists are not equivalent.
12346 ///
12347 /// \param Kind describes how we are to match the template parameter lists.
12348 ///
12349 /// \param TemplateArgLoc If this source location is valid, then we
12350 /// are actually checking the template parameter list of a template
12351 /// argument (New) against the template parameter list of its
12352 /// corresponding template template parameter (Old). We produce
12353 /// slightly different diagnostics in this scenario.
12354 ///
12355 /// \returns True if the template parameter lists are equal, false
12356 /// otherwise.
12358 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
12359 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
12361 SourceLocation TemplateArgLoc = SourceLocation());
12362
12364 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
12366 SourceLocation TemplateArgLoc = SourceLocation()) {
12367 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
12368 Kind, TemplateArgLoc);
12369 }
12370
12371 /// Check whether a template can be declared within this scope.
12372 ///
12373 /// If the template declaration is valid in this scope, returns
12374 /// false. Otherwise, issues a diagnostic and returns true.
12375 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
12376
12377 /// Called when the parser has parsed a C++ typename
12378 /// specifier, e.g., "typename T::type".
12379 ///
12380 /// \param S The scope in which this typename type occurs.
12381 /// \param TypenameLoc the location of the 'typename' keyword
12382 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12383 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
12384 /// \param IdLoc the location of the identifier.
12385 /// \param IsImplicitTypename context where T::type refers to a type.
12387 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
12388 const IdentifierInfo &II, SourceLocation IdLoc,
12390
12391 /// Called when the parser has parsed a C++ typename
12392 /// specifier that ends in a template-id, e.g.,
12393 /// "typename MetaFun::template apply<T1, T2>".
12394 ///
12395 /// \param S The scope in which this typename type occurs.
12396 /// \param TypenameLoc the location of the 'typename' keyword
12397 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12398 /// \param TemplateLoc the location of the 'template' keyword, if any.
12399 /// \param TemplateName The template name.
12400 /// \param TemplateII The identifier used to name the template.
12401 /// \param TemplateIILoc The location of the template name.
12402 /// \param LAngleLoc The location of the opening angle bracket ('<').
12403 /// \param TemplateArgs The template arguments.
12404 /// \param RAngleLoc The location of the closing angle bracket ('>').
12406 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
12407 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
12408 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
12409 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
12410 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
12411
12413 SourceLocation KeywordLoc,
12414 NestedNameSpecifierLoc QualifierLoc,
12415 const IdentifierInfo &II, SourceLocation IILoc,
12416 TypeSourceInfo **TSI, bool DeducedTSTContext);
12417
12419 SourceLocation KeywordLoc,
12420 NestedNameSpecifierLoc QualifierLoc,
12421 const IdentifierInfo &II, SourceLocation IILoc,
12422 bool DeducedTSTContext = true);
12423
12424 /// Rebuilds a type within the context of the current instantiation.
12425 ///
12426 /// The type \p T is part of the type of an out-of-line member definition of
12427 /// a class template (or class template partial specialization) that was
12428 /// parsed and constructed before we entered the scope of the class template
12429 /// (or partial specialization thereof). This routine will rebuild that type
12430 /// now that we have entered the declarator's scope, which may produce
12431 /// different canonical types, e.g.,
12432 ///
12433 /// \code
12434 /// template<typename T>
12435 /// struct X {
12436 /// typedef T* pointer;
12437 /// pointer data();
12438 /// };
12439 ///
12440 /// template<typename T>
12441 /// typename X<T>::pointer X<T>::data() { ... }
12442 /// \endcode
12443 ///
12444 /// Here, the type "typename X<T>::pointer" will be created as a
12445 /// DependentNameType, since we do not know that we can look into X<T> when we
12446 /// parsed the type. This function will rebuild the type, performing the
12447 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
12448 /// canonical type is the same as the canonical type of T*, allowing the
12449 /// return types of the out-of-line definition and the declaration to match.
12451 SourceLocation Loc,
12452 DeclarationName Name);
12454
12456
12457 /// Rebuild the template parameters now that we know we're in a current
12458 /// instantiation.
12459 bool
12461
12462 /// Produces a formatted string that describes the binding of
12463 /// template parameters to template arguments.
12464 std::string
12466 const TemplateArgumentList &Args);
12467
12468 std::string
12470 const TemplateArgument *Args,
12471 unsigned NumArgs);
12472
12476
12477 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12478 /// was just parsed. This is only possible with an explicit scope
12479 /// specifier naming a dependent type.
12481 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12482 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12483 const TemplateArgumentListInfo *TemplateArgs);
12484
12487 SourceLocation TemplateKWLoc,
12488 const DeclarationNameInfo &NameInfo,
12489 const TemplateArgumentListInfo *TemplateArgs);
12490
12491 // Calculates whether the expression Constraint depends on an enclosing
12492 // template, for the purposes of [temp.friend] p9.
12493 // TemplateDepth is the 'depth' of the friend function, which is used to
12494 // compare whether a declaration reference is referring to a containing
12495 // template, or just the current friend function. A 'lower' TemplateDepth in
12496 // the AST refers to a 'containing' template. As the constraint is
12497 // uninstantiated, this is relative to the 'top' of the TU.
12498 bool
12500 unsigned TemplateDepth,
12501 const Expr *Constraint);
12502
12503 /// Find the failed Boolean condition within a given Boolean
12504 /// constant expression, and describe it with a string.
12505 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12506
12508
12510 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12511 const IdentifierInfo *Name, SourceLocation NameLoc);
12512
12514 Expr *ConstraintExpr,
12515 const ParsedAttributesView &Attrs);
12516
12518 bool &AddToScope);
12520
12521 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12522 const CXXScopeSpec &SS,
12523 const IdentifierInfo *Name,
12524 SourceLocation TagLoc, SourceLocation NameLoc);
12525
12527 CachedTokens &Toks);
12530
12531 /// We've found a use of a templated declaration that would trigger an
12532 /// implicit instantiation. Check that any relevant explicit specializations
12533 /// and partial specializations are visible/reachable, and diagnose if not.
12536
12537 ///@}
12538
12539 //
12540 //
12541 // -------------------------------------------------------------------------
12542 //
12543 //
12544
12545 /// \name C++ Template Argument Deduction
12546 /// Implementations are in SemaTemplateDeduction.cpp
12547 ///@{
12548
12549public:
12550 class SFINAETrap;
12551
12554 : S(S), Prev(std::exchange(S.CurrentSFINAEContext, Cur)) {}
12555
12556 protected:
12558 ~SFINAEContextBase() { S.CurrentSFINAEContext = Prev; }
12561
12562 private:
12563 SFINAETrap *Prev;
12564 };
12565
12569
12570 /// RAII class used to determine whether SFINAE has
12571 /// trapped any errors that occur during template argument
12572 /// deduction.
12573 class SFINAETrap : SFINAEContextBase {
12574 bool HasErrorOcurred = false;
12575 bool WithAccessChecking = false;
12576 bool PrevLastDiagnosticIgnored =
12577 S.getDiagnostics().isLastDiagnosticIgnored();
12578 sema::TemplateDeductionInfo *DeductionInfo = nullptr;
12579
12580 SFINAETrap(Sema &S, sema::TemplateDeductionInfo *Info,
12581 bool WithAccessChecking)
12582 : SFINAEContextBase(S, this), WithAccessChecking(WithAccessChecking),
12583 DeductionInfo(Info) {}
12584
12585 public:
12586 /// \param WithAccessChecking If true, discard all diagnostics (from the
12587 /// immediate context) instead of adding them to the currently active
12588 /// \ref TemplateDeductionInfo.
12589 explicit SFINAETrap(Sema &S, bool WithAccessChecking = false)
12590 : SFINAETrap(S, /*Info=*/nullptr, WithAccessChecking) {}
12591
12593 : SFINAETrap(S, &Info, /*WithAccessChecking=*/false) {}
12594
12596 S.getDiagnostics().setLastDiagnosticIgnored(PrevLastDiagnosticIgnored);
12597 }
12598
12599 SFINAETrap(const SFINAETrap &) = delete;
12600 SFINAETrap &operator=(const SFINAETrap &) = delete;
12601
12603 return DeductionInfo;
12604 }
12605
12606 /// Determine whether any SFINAE errors have been trapped.
12607 bool hasErrorOccurred() const { return HasErrorOcurred; }
12608 void setErrorOccurred() { HasErrorOcurred = true; }
12609
12610 bool withAccessChecking() const { return WithAccessChecking; }
12611 };
12612
12613 /// RAII class used to indicate that we are performing provisional
12614 /// semantic analysis to determine the validity of a construct, so
12615 /// typo-correction and diagnostics in the immediate context (not within
12616 /// implicitly-instantiated templates) should be suppressed.
12618 Sema &SemaRef;
12619 // FIXME: Using a SFINAETrap for this is a hack.
12620 SFINAETrap Trap;
12621 bool PrevDisableTypoCorrection;
12622
12623 public:
12624 explicit TentativeAnalysisScope(Sema &SemaRef)
12625 : SemaRef(SemaRef), Trap(SemaRef, /*ForValidityCheck=*/true),
12626 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12627 SemaRef.DisableTypoCorrection = true;
12628 }
12630 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12631 }
12632
12635 };
12636
12637 /// For each declaration that involved template argument deduction, the
12638 /// set of diagnostics that were suppressed during that template argument
12639 /// deduction.
12640 ///
12641 /// FIXME: Serialize this structure to the AST file.
12642 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12645
12646 /// Compare types for equality with respect to possibly compatible
12647 /// function types (noreturn adjustment, implicit calling conventions). If any
12648 /// of parameter and argument is not a function, just perform type comparison.
12649 ///
12650 /// \param P the template parameter type.
12651 ///
12652 /// \param A the argument type.
12654
12655 /// Allocate a TemplateArgumentLoc where all locations have
12656 /// been initialized to the given location.
12657 ///
12658 /// \param Arg The template argument we are producing template argument
12659 /// location information for.
12660 ///
12661 /// \param NTTPType For a declaration template argument, the type of
12662 /// the non-type template parameter that corresponds to this template
12663 /// argument. Can be null if no type sugar is available to add to the
12664 /// type from the template argument.
12665 ///
12666 /// \param Loc The source location to use for the resulting template
12667 /// argument.
12669 QualType NTTPType,
12670 SourceLocation Loc);
12671
12672 /// Get a template argument mapping the given template parameter to itself,
12673 /// e.g. for X in \c template<int X>, this would return an expression template
12674 /// argument referencing X.
12676 SourceLocation Location);
12677
12678 /// Adjust the type \p ArgFunctionType to match the calling convention,
12679 /// noreturn, and optionally the exception specification of \p FunctionType.
12680 /// Deduction often wants to ignore these properties when matching function
12681 /// types.
12683 bool AdjustExceptionSpec = false);
12684
12687 ArrayRef<TemplateArgument> TemplateArgs,
12689
12692 ArrayRef<TemplateArgument> TemplateArgs,
12694
12695 /// Deduce the template arguments of the given template from \p FromType.
12696 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12697 /// [over.match.class.deduct]p4.
12698 ///
12699 /// It only supports class or type alias templates.
12703
12708 bool NumberOfArgumentsMustMatch);
12709
12710 /// Substitute the explicitly-provided template arguments into the
12711 /// given function template according to C++ [temp.arg.explicit].
12712 ///
12713 /// \param FunctionTemplate the function template into which the explicit
12714 /// template arguments will be substituted.
12715 ///
12716 /// \param ExplicitTemplateArgs the explicitly-specified template
12717 /// arguments.
12718 ///
12719 /// \param Deduced the deduced template arguments, which will be populated
12720 /// with the converted and checked explicit template arguments.
12721 ///
12722 /// \param ParamTypes will be populated with the instantiated function
12723 /// parameters.
12724 ///
12725 /// \param FunctionType if non-NULL, the result type of the function template
12726 /// will also be instantiated and the pointed-to value will be updated with
12727 /// the instantiated function type.
12728 ///
12729 /// \param Info if substitution fails for any reason, this object will be
12730 /// populated with more information about the failure.
12731 ///
12732 /// \returns TemplateDeductionResult::Success if substitution was successful,
12733 /// or some failure condition.
12736 TemplateArgumentListInfo &ExplicitTemplateArgs,
12740
12741 /// brief A function argument from which we performed template argument
12742 // deduction for a call.
12755
12756 /// Finish template argument deduction for a function template,
12757 /// checking the deduced template arguments for completeness and forming
12758 /// the function template specialization.
12759 ///
12760 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12761 /// which the deduced argument types should be compared.
12762 /// \param CheckNonDependent Callback before substituting into the declaration
12763 /// with the deduced template arguments.
12764 /// \param OnlyInitializeNonUserDefinedConversions is used as a workaround for
12765 /// some breakages introduced by CWG2369, where non-user-defined conversions
12766 /// are checked first before the constraints.
12770 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12772 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
12773 bool PartialOverloading, bool PartialOrdering,
12774 bool ForOverloadSetAddressResolution,
12775 llvm::function_ref<bool(bool)> CheckNonDependent =
12776 [](bool /*OnlyInitializeNonUserDefinedConversions*/) {
12777 return false;
12778 });
12779
12780 /// Perform [temp.friend] p5 template argument deduction for a dependent
12781 /// friend declaration and a candidate class template specialization.
12783 ClassTemplateDecl *PatternCTD,
12784 ClassTemplateDecl *CandidateCTD,
12786 ArrayRef<TemplateArgument> PatternArgs,
12787 ArrayRef<TemplateArgument> CandidateArgs,
12788 SourceLocation Loc,
12789 TemplateSpecCandidateSet *FailedTSC,
12790 MultiLevelTemplateArgumentList &DeducedArgs);
12791
12792 /// Perform template argument deduction from a function call
12793 /// (C++ [temp.deduct.call]).
12794 ///
12795 /// \param FunctionTemplate the function template for which we are performing
12796 /// template argument deduction.
12797 ///
12798 /// \param ExplicitTemplateArgs the explicit template arguments provided
12799 /// for this call.
12800 ///
12801 /// \param Args the function call arguments
12802 ///
12803 /// \param Specialization if template argument deduction was successful,
12804 /// this will be set to the function template specialization produced by
12805 /// template argument deduction.
12806 ///
12807 /// \param Info the argument will be updated to provide additional information
12808 /// about template argument deduction.
12809 ///
12810 /// \param CheckNonDependent A callback to invoke to check conversions for
12811 /// non-dependent parameters, between deduction and substitution, per DR1391.
12812 /// If this returns true, substitution will be skipped and we return
12813 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12814 /// passed the parameter types (after substituting explicit template
12815 /// arguments).
12816 ///
12817 /// \returns the result of template argument deduction.
12820 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12822 bool PartialOverloading, bool AggregateDeductionCandidate,
12823 bool PartialOrdering, QualType ObjectType,
12824 Expr::Classification ObjectClassification,
12825 bool ForOverloadSetAddressResolution,
12826 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent);
12827
12828 /// Deduce template arguments when taking the address of a function
12829 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12830 /// a template.
12831 ///
12832 /// \param FunctionTemplate the function template for which we are performing
12833 /// template argument deduction.
12834 ///
12835 /// \param ExplicitTemplateArgs the explicitly-specified template
12836 /// arguments.
12837 ///
12838 /// \param ArgFunctionType the function type that will be used as the
12839 /// "argument" type (A) when performing template argument deduction from the
12840 /// function template's function type. This type may be NULL, if there is no
12841 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12842 ///
12843 /// \param Specialization if template argument deduction was successful,
12844 /// this will be set to the function template specialization produced by
12845 /// template argument deduction.
12846 ///
12847 /// \param Info the argument will be updated to provide additional information
12848 /// about template argument deduction.
12849 ///
12850 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12851 /// the address of a function template per [temp.deduct.funcaddr] and
12852 /// [over.over]. If \c false, we are looking up a function template
12853 /// specialization based on its signature, per [temp.deduct.decl].
12854 ///
12855 /// \returns the result of template argument deduction.
12858 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12860 bool IsAddressOfFunction = false);
12861
12862 /// Deduce template arguments for a templated conversion
12863 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12864 /// conversion function template specialization.
12867 Expr::Classification ObjectClassification, QualType ToType,
12869
12870 /// Deduce template arguments for a function template when there is
12871 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12872 ///
12873 /// \param FunctionTemplate the function template for which we are performing
12874 /// template argument deduction.
12875 ///
12876 /// \param ExplicitTemplateArgs the explicitly-specified template
12877 /// arguments.
12878 ///
12879 /// \param Specialization if template argument deduction was successful,
12880 /// this will be set to the function template specialization produced by
12881 /// template argument deduction.
12882 ///
12883 /// \param Info the argument will be updated to provide additional information
12884 /// about template argument deduction.
12885 ///
12886 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12887 /// the address of a function template in a context where we do not have a
12888 /// target type, per [over.over]. If \c false, we are looking up a function
12889 /// template specialization based on its signature, which only happens when
12890 /// deducing a function parameter type from an argument that is a template-id
12891 /// naming a function template specialization.
12892 ///
12893 /// \returns the result of template argument deduction.
12896 TemplateArgumentListInfo *ExplicitTemplateArgs,
12899 bool IsAddressOfFunction = false);
12900
12901 /// Substitute Replacement for \p auto in \p TypeWithAuto
12902 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12903 /// Substitute Replacement for auto in TypeWithAuto
12905 QualType Replacement);
12906
12907 // Substitute auto in TypeWithAuto for a Dependent auto type
12909
12910 // Substitute auto in TypeWithAuto for a Dependent auto type
12913
12914 /// Completely replace the \c auto in \p TypeWithAuto by
12915 /// \p Replacement. This does not retain any \c auto type sugar.
12916 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12918 QualType Replacement);
12919
12920 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12921 ///
12922 /// Note that this is done even if the initializer is dependent. (This is
12923 /// necessary to support partial ordering of templates using 'auto'.)
12924 /// A dependent type will be produced when deducing from a dependent type.
12925 ///
12926 /// \param Type the type pattern using the auto type-specifier.
12927 /// \param Init the initializer for the variable whose type is to be deduced.
12928 /// \param Result if type deduction was successful, this will be set to the
12929 /// deduced type.
12930 /// \param Info the argument will be updated to provide additional information
12931 /// about template argument deduction.
12932 /// \param DependentDeduction Set if we should permit deduction in
12933 /// dependent cases. This is necessary for template partial ordering
12934 /// with 'auto' template parameters. The template parameter depth to be
12935 /// used should be specified in the 'Info' parameter.
12936 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12937 /// does not satisfy the type-constraint in the auto
12938 /// type.
12942 bool DependentDeduction = false,
12943 bool IgnoreConstraints = false,
12944 TemplateSpecCandidateSet *FailedTSC = nullptr);
12945 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12947 bool Diagnose = true);
12948
12950 SourceLocation Loc);
12951
12952 /// Returns the more specialized class template partial specialization
12953 /// according to the rules of partial ordering of class template partial
12954 /// specializations (C++ [temp.class.order]).
12955 ///
12956 /// \param PS1 the first class template partial specialization
12957 ///
12958 /// \param PS2 the second class template partial specialization
12959 ///
12960 /// \returns the more specialized class template partial specialization. If
12961 /// neither partial specialization is more specialized, returns NULL.
12966
12969
12973
12976
12978 TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg,
12979 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
12980 bool PartialOrdering, bool *StrictPackMatch);
12981
12982 /// Mark which template parameters are used in a given expression.
12983 ///
12984 /// \param E the expression from which template parameters will be deduced.
12985 ///
12986 /// \param Used a bit vector whose elements will be set to \c true
12987 /// to indicate when the corresponding template parameter will be
12988 /// deduced.
12989 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12990 unsigned Depth, llvm::SmallBitVector &Used);
12991
12992 /// Mark which template parameters are named in a given expression.
12993 ///
12994 /// Unlike MarkUsedTemplateParameters, this excludes parameter that
12995 /// are used but not directly named by an expression - i.e. it excludes
12996 /// any template parameter that denotes the type of a referenced NTTP.
12997 ///
12998 /// \param Used a bit vector whose elements will be set to \c true
12999 /// to indicate when the corresponding template parameter will be
13000 /// deduced.
13002 const Expr *E, unsigned Depth, llvm::SmallBitVector &Used);
13003
13004 /// Mark which template parameters can be deduced from a given
13005 /// template argument list.
13006 ///
13007 /// \param TemplateArgs the template argument list from which template
13008 /// parameters will be deduced.
13009 ///
13010 /// \param Used a bit vector whose elements will be set to \c true
13011 /// to indicate when the corresponding template parameter will be
13012 /// deduced.
13013 void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
13014 bool OnlyDeduced, unsigned Depth,
13015 llvm::SmallBitVector &Used);
13016
13018 bool OnlyDeduced, unsigned Depth,
13019 llvm::SmallBitVector &Used);
13020
13022 unsigned Depth, llvm::SmallBitVector &Used);
13023
13024 void
13029
13030 /// Marks all of the template parameters that will be deduced by a
13031 /// call to the given function template.
13032 static void
13035 llvm::SmallBitVector &Deduced);
13036
13037 /// Returns the more specialized function template according
13038 /// to the rules of function template partial ordering (C++
13039 /// [temp.func.order]).
13040 ///
13041 /// \param FT1 the first function template
13042 ///
13043 /// \param FT2 the second function template
13044 ///
13045 /// \param TPOC the context in which we are performing partial ordering of
13046 /// function templates.
13047 ///
13048 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
13049 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
13050 /// when calling a member function.
13051 ///
13052 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
13053 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
13054 /// template from a member function
13055 ///
13056 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
13057 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
13058 /// template from a member function
13059 ///
13060 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
13061 /// candidate with a reversed parameter order. In this case, the corresponding
13062 /// P/A pairs between FT1 and FT2 are reversed.
13063 ///
13064 /// \returns the more specialized function template. If neither
13065 /// template is more specialized, returns NULL.
13068 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
13069 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false,
13070 bool PartialOverloading = false);
13071
13072 /// Retrieve the most specialized of the given function template
13073 /// specializations.
13074 ///
13075 /// \param SpecBegin the start iterator of the function template
13076 /// specializations that we will be comparing.
13077 ///
13078 /// \param SpecEnd the end iterator of the function template
13079 /// specializations, paired with \p SpecBegin.
13080 ///
13081 /// \param Loc the location where the ambiguity or no-specializations
13082 /// diagnostic should occur.
13083 ///
13084 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
13085 /// no matching candidates.
13086 ///
13087 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
13088 /// occurs.
13089 ///
13090 /// \param CandidateDiag partial diagnostic used for each function template
13091 /// specialization that is a candidate in the ambiguous ordering. One
13092 /// parameter in this diagnostic should be unbound, which will correspond to
13093 /// the string describing the template arguments for the function template
13094 /// specialization.
13095 ///
13096 /// \returns the most specialized function template specialization, if
13097 /// found. Otherwise, returns SpecEnd.
13098 UnresolvedSetIterator
13099 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
13100 TemplateSpecCandidateSet &FailedCandidates,
13101 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
13102 const PartialDiagnostic &AmbigDiag,
13103 const PartialDiagnostic &CandidateDiag,
13104 bool Complain = true, QualType TargetType = QualType());
13105
13106 /// Returns the more constrained function according to the rules of
13107 /// partial ordering by constraints (C++ [temp.constr.order]).
13108 ///
13109 /// \param FD1 the first function
13110 ///
13111 /// \param FD2 the second function
13112 ///
13113 /// \returns the more constrained function. If neither function is
13114 /// more constrained, returns NULL.
13115 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
13116 FunctionDecl *FD2);
13117
13118 ///@}
13119
13120 //
13121 //
13122 // -------------------------------------------------------------------------
13123 //
13124 //
13125
13126 /// \name C++ Template Deduction Guide
13127 /// Implementations are in SemaTemplateDeductionGuide.cpp
13128 ///@{
13129
13130 /// Declare implicit deduction guides for a class template if we've
13131 /// not already done so.
13132 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
13133 SourceLocation Loc);
13134
13135 CXXDeductionGuideDecl *DeclareAggregateDeductionGuideFromInitList(
13136 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
13137 SourceLocation Loc);
13138
13139 ///@}
13140
13141 //
13142 //
13143 // -------------------------------------------------------------------------
13144 //
13145 //
13146
13147 /// \name C++ Template Instantiation
13148 /// Implementations are in SemaTemplateInstantiate.cpp
13149 ///@{
13150
13151public:
13152 /// A helper class for building up ExtParameterInfos.
13155 bool HasInteresting = false;
13156
13157 public:
13158 /// Set the ExtParameterInfo for the parameter at the given index,
13159 ///
13161 assert(Infos.size() <= index);
13162 Infos.resize(index);
13163 Infos.push_back(info);
13164
13165 if (!HasInteresting)
13166 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
13167 }
13168
13169 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
13170 /// ExtParameterInfo array we've built up.
13172 getPointerOrNull(unsigned numParams) {
13173 if (!HasInteresting)
13174 return nullptr;
13175 Infos.resize(numParams);
13176 return Infos.data();
13177 }
13178 };
13179
13180 /// The current instantiation scope used to store local
13181 /// variables.
13183
13184 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
13186
13187 /// A mapping from parameters with unparsed default arguments to the
13188 /// set of instantiations of each parameter.
13189 ///
13190 /// This mapping is a temporary data structure used when parsing
13191 /// nested class templates or nested classes of class templates,
13192 /// where we might end up instantiating an inner class before the
13193 /// default arguments of its methods have been parsed.
13195
13196 using InstantiatingSpecializationsKey = llvm::PointerIntPair<Decl *, 2>;
13197
13204
13206 : S(S), Key(D->getCanonicalDecl(), unsigned(Kind)) {
13207 auto [_, Created] = S.InstantiatingSpecializations.insert(Key);
13208 if (!Created)
13209 Key = {};
13210 }
13211
13213 if (Key.getOpaqueValue()) {
13214 [[maybe_unused]] bool Erased =
13215 S.InstantiatingSpecializations.erase(Key);
13216 assert(Erased);
13217 }
13218 }
13219
13222
13223 operator bool() const { return Key.getOpaqueValue() == nullptr; }
13224
13225 private:
13226 Sema &S;
13228 };
13229
13230 /// A context in which code is being synthesized (where a source location
13231 /// alone is not sufficient to identify the context). This covers template
13232 /// instantiation and various forms of implicitly-generated functions.
13234 /// The kind of template instantiation we are performing
13236 /// We are instantiating a template declaration. The entity is
13237 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
13239
13240 /// We are instantiating a default argument for a template
13241 /// parameter. The Entity is the template parameter whose argument is
13242 /// being instantiated, the Template is the template, and the
13243 /// TemplateArgs/NumTemplateArguments provide the template arguments as
13244 /// specified.
13246
13247 /// We are instantiating a default argument for a function.
13248 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
13249 /// provides the template arguments as specified.
13251
13252 /// We are substituting explicit template arguments provided for
13253 /// a function template. The entity is a FunctionTemplateDecl.
13255
13256 /// We are substituting template argument determined as part of
13257 /// template argument deduction for either a class template
13258 /// partial specialization or a function template. The
13259 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
13260 /// a TemplateDecl.
13262
13263 /// We are substituting into a lambda expression.
13265
13266 /// We are substituting prior template arguments into a new
13267 /// template parameter. The template parameter itself is either a
13268 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
13270
13271 /// We are checking the validity of a default template argument that
13272 /// has been used when naming a template-id.
13274
13275 /// We are computing the exception specification for a defaulted special
13276 /// member function.
13278
13279 /// We are instantiating the exception specification for a function
13280 /// template which was deferred until it was needed.
13282
13283 /// We are instantiating a requirement of a requires expression.
13285
13286 /// We are checking the satisfaction of a nested requirement of a requires
13287 /// expression.
13289
13290 /// We are declaring an implicit special member function.
13292
13293 /// We are declaring an implicit 'operator==' for a defaulted
13294 /// 'operator<=>'.
13296
13297 /// We are defining a synthesized function (such as a defaulted special
13298 /// member).
13300
13301 // We are checking the constraints associated with a constrained entity or
13302 // the constraint expression of a concept. This includes the checks that
13303 // atomic constraints have the type 'bool' and that they can be constant
13304 // evaluated.
13306
13307 // We are substituting template arguments into a constraint expression.
13309
13310 // Instantiating a Requires Expression parameter clause.
13312
13313 // We are substituting into the parameter mapping of an atomic constraint
13314 // during normalization.
13316
13317 /// We are rewriting a comparison operator in terms of an operator<=>.
13319
13320 /// We are initializing a structured binding.
13322
13323 /// We are marking a class as __dllexport.
13325
13326 /// We are building an implied call from __builtin_dump_struct. The
13327 /// arguments are in CallArgs.
13329
13330 /// Added for Template instantiation observation.
13331 /// Memoization means we are _not_ instantiating a template because
13332 /// it is already instantiated (but we entered a context where we
13333 /// would have had to if it was not already instantiated).
13335
13336 /// We are building deduction guides for a class.
13338
13339 /// We are instantiating a type alias template declaration.
13341
13342 /// We are performing partial ordering for template template parameters.
13344
13345 /// We are performing name lookup for a function template or variable
13346 /// template named 'sycl_kernel_launch'.
13348
13349 /// We are performing overload resolution for a call to a function
13350 /// template or variable template named 'sycl_kernel_launch'.
13352
13353 /// We are instantiating an expansion statement.
13355 } Kind;
13356
13357 /// Whether we're substituting into constraints.
13359
13360 /// Whether we're substituting into the parameter mapping of a constraint.
13362
13363 /// The point of instantiation or synthesis within the source code.
13365
13366 /// The entity that is being synthesized.
13368
13369 /// The template (or partial specialization) in which we are
13370 /// performing the instantiation, for substitutions of prior template
13371 /// arguments.
13373
13374 union {
13375 /// The list of template arguments we are substituting, if they
13376 /// are not part of the entity.
13378
13379 /// The list of argument expressions in a synthesized call.
13380 const Expr *const *CallArgs;
13381 };
13382
13383 // FIXME: Wrap this union around more members, or perhaps store the
13384 // kind-specific members in the RAII object owning the context.
13385 union {
13386 /// The number of template arguments in TemplateArgs.
13388
13389 /// The number of expressions in CallArgs.
13390 unsigned NumCallArgs;
13391
13392 /// The special member being declared or defined.
13394 };
13395
13400
13401 /// The source range that covers the construct that cause
13402 /// the instantiation, e.g., the template-id that causes a class
13403 /// template instantiation.
13405
13410
13411 /// Determines whether this template is an actual instantiation
13412 /// that should be counted toward the maximum instantiation depth.
13413 bool isInstantiationRecord() const;
13414 };
13415
13416 /// A stack object to be created when performing template
13417 /// instantiation.
13418 ///
13419 /// Construction of an object of type \c InstantiatingTemplate
13420 /// pushes the current instantiation onto the stack of active
13421 /// instantiations. If the size of this stack exceeds the maximum
13422 /// number of recursive template instantiations, construction
13423 /// produces an error and evaluates true.
13424 ///
13425 /// Destruction of this object will pop the named instantiation off
13426 /// the stack.
13428 /// Note that we are instantiating a class template,
13429 /// function template, variable template, alias template,
13430 /// or a member thereof.
13431 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13432 Decl *Entity,
13433 SourceRange InstantiationRange = SourceRange());
13434
13436 /// Note that we are instantiating an exception specification
13437 /// of a function template.
13438 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13440 SourceRange InstantiationRange = SourceRange());
13441
13442 /// Note that we are instantiating a type alias template declaration.
13443 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13444 TypeAliasTemplateDecl *Entity,
13445 ArrayRef<TemplateArgument> TemplateArgs,
13446 SourceRange InstantiationRange = SourceRange());
13447
13448 /// Note that we are instantiating a default argument in a
13449 /// template-id.
13450 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13452 ArrayRef<TemplateArgument> TemplateArgs,
13453 SourceRange InstantiationRange = SourceRange());
13454
13455 /// Note that we are substituting either explicitly-specified or
13456 /// deduced template arguments during function template argument deduction.
13457 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13459 ArrayRef<TemplateArgument> TemplateArgs,
13461 SourceRange InstantiationRange = SourceRange());
13462
13463 /// Note that we are instantiating as part of template
13464 /// argument deduction for a class template declaration.
13465 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13467 ArrayRef<TemplateArgument> TemplateArgs,
13468 SourceRange InstantiationRange = SourceRange());
13469
13470 /// Note that we are instantiating as part of template
13471 /// argument deduction for a class template partial
13472 /// specialization.
13473 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13475 ArrayRef<TemplateArgument> TemplateArgs,
13476 SourceRange InstantiationRange = SourceRange());
13477
13478 /// Note that we are instantiating as part of template
13479 /// argument deduction for a variable template partial
13480 /// specialization.
13481 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13483 ArrayRef<TemplateArgument> TemplateArgs,
13484 SourceRange InstantiationRange = SourceRange());
13485
13486 /// Note that we are instantiating a default argument for a function
13487 /// parameter.
13488 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13489 ParmVarDecl *Param,
13490 ArrayRef<TemplateArgument> TemplateArgs,
13491 SourceRange InstantiationRange = SourceRange());
13492
13493 /// Note that we are substituting prior template arguments into a
13494 /// non-type parameter.
13495 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13497 ArrayRef<TemplateArgument> TemplateArgs,
13498 SourceRange InstantiationRange);
13499
13500 /// Note that we are substituting prior template arguments into a
13501 /// template template parameter.
13502 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13504 ArrayRef<TemplateArgument> TemplateArgs,
13505 SourceRange InstantiationRange);
13506
13507 /// Note that we are checking the default template argument
13508 /// against the template parameter for a given template-id.
13509 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13511 ArrayRef<TemplateArgument> TemplateArgs,
13512 SourceRange InstantiationRange);
13513
13515 /// \brief Note that we are checking the constraints associated with some
13516 /// constrained entity (a concept declaration or a template with associated
13517 /// constraints).
13518 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13520 ArrayRef<TemplateArgument> TemplateArgs,
13521 SourceRange InstantiationRange);
13522
13524 /// \brief Note that we are checking a constraint expression associated
13525 /// with a template declaration or as part of the satisfaction check of a
13526 /// concept.
13527 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13529 SourceRange InstantiationRange);
13530
13532 /// \brief Note that we are subtituting into the parameter mapping of an
13533 /// atomic constraint during constraint normalization.
13534 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13536 SourceRange InstantiationRange);
13537
13538 /// \brief Note that we are substituting template arguments into a part of
13539 /// a requirement of a requires expression.
13540 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13542 SourceRange InstantiationRange = SourceRange());
13543
13544 /// \brief Note that we are substituting the body of an expansion statement.
13545 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13546 CXXExpansionStmtPattern *ExpansionStmt,
13548 SourceRange InstantiationRange);
13549
13550 /// \brief Note that we are checking the satisfaction of the constraint
13551 /// expression inside of a nested requirement.
13552 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13554 SourceRange InstantiationRange = SourceRange());
13555
13556 /// \brief Note that we are checking a requires clause.
13557 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13558 const RequiresExpr *E,
13559 SourceRange InstantiationRange);
13560
13562 /// \brief Note that we are building deduction guides.
13563 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13565 SourceRange InstantiationRange = SourceRange());
13566
13568 /// \brief Note that we are partial ordering template template parameters.
13569 InstantiatingTemplate(Sema &SemaRef, SourceLocation ArgLoc,
13571 SourceRange InstantiationRange = SourceRange());
13572
13573 /// Note that we have finished instantiating this template.
13574 void Clear();
13575
13577
13578 /// Determines whether we have exceeded the maximum
13579 /// recursive template instantiations.
13580 bool isInvalid() const { return Invalid; }
13581
13582 private:
13583 Sema &SemaRef;
13584 bool Invalid;
13585
13588 SourceLocation PointOfInstantiation,
13589 SourceRange InstantiationRange, Decl *Entity,
13590 NamedDecl *Template = nullptr,
13591 ArrayRef<TemplateArgument> TemplateArgs = {});
13592
13594
13595 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13596 };
13597
13598 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13599 const MultiLevelTemplateArgumentList &TemplateArgs,
13600 TemplateArgumentLoc &Output,
13601 SourceLocation Loc = {},
13602 const DeclarationName &Entity = {});
13603 bool
13604 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13605 const MultiLevelTemplateArgumentList &TemplateArgs,
13606 TemplateArgumentListInfo &Outputs);
13607
13608 /// Substitute concept template arguments in the constraint expression
13609 /// of a concept-id. This is used to implement [temp.constr.normal].
13611 SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE,
13612 const Expr *ConstraintExpr,
13613 const MultiLevelTemplateArgumentList &MLTAL);
13614
13616 ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
13617 const MultiLevelTemplateArgumentList &TemplateArgs,
13618 TemplateArgumentListInfo &Out);
13619
13620 /// Retrieve the template argument list(s) that should be used to
13621 /// instantiate the definition of the given declaration.
13622 ///
13623 /// \param ND the declaration for which we are computing template
13624 /// instantiation arguments.
13625 ///
13626 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13627 /// the decl context where it will be created. In this case, the `Innermost`
13628 /// should likely be provided. If ND is non-null, this is ignored.
13629 ///
13630 /// \param Innermost if non-NULL, specifies a template argument list for the
13631 /// template declaration passed as ND.
13632 ///
13633 /// \param RelativeToPrimary true if we should get the template
13634 /// arguments relative to the primary template, even when we're
13635 /// dealing with a specialization. This is only relevant for function
13636 /// template specializations.
13637 ///
13638 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13639 /// instantiating the definition of the given declaration, \p ND. This is
13640 /// used to determine the proper set of template instantiation arguments for
13641 /// friend function template specializations.
13642 ///
13643 /// \param ForConstraintInstantiation when collecting arguments,
13644 /// ForConstraintInstantiation indicates we should continue looking when
13645 /// encountering a lambda generic call operator, and continue looking for
13646 /// arguments on an enclosing class template.
13647 ///
13648 /// \param SkipForSpecialization when specified, any template specializations
13649 /// in a traversal would be ignored.
13650 ///
13651 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13652 /// when encountering a specialized member function template, rather than
13653 /// returning immediately.
13654 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13655 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13656 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13657 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13658 bool ForConstraintInstantiation = false,
13659 bool SkipForSpecialization = false,
13660 bool ForDefaultArgumentSubstitution = false);
13661
13662 /// RAII object to handle the state changes required to synthesize
13663 /// a function body.
13665 Sema &S;
13666 Sema::ContextRAII SavedContext;
13667 bool PushedCodeSynthesisContext = false;
13668
13669 public:
13671 : S(S), SavedContext(S, DC) {
13672 auto *FD = dyn_cast<FunctionDecl>(DC);
13673 S.PushFunctionScope();
13674 S.PushExpressionEvaluationContextForFunction(
13676 if (FD)
13677 FD->setWillHaveBody(true);
13678 else
13679 assert(isa<ObjCMethodDecl>(DC));
13680 }
13681
13683 assert(!PushedCodeSynthesisContext);
13684
13687 Ctx.PointOfInstantiation = UseLoc;
13688 Ctx.Entity = cast<Decl>(S.CurContext);
13689 S.pushCodeSynthesisContext(Ctx);
13690
13691 PushedCodeSynthesisContext = true;
13692 }
13693
13695 if (PushedCodeSynthesisContext)
13696 S.popCodeSynthesisContext();
13697 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13698 FD->setWillHaveBody(false);
13699 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13700 }
13701 S.PopExpressionEvaluationContext();
13702 S.PopFunctionScopeInfo();
13703 }
13704
13708 };
13709
13710 /// RAII object to ensure that a code synthesis context is popped on scope
13711 /// exit.
13713 Sema &S;
13714
13715 public:
13717 : S(S) {
13718 S.pushCodeSynthesisContext(Ctx);
13719 }
13720
13721 ~ScopedCodeSynthesisContext() { S.popCodeSynthesisContext(); }
13725 };
13726
13727 /// List of active code synthesis contexts.
13728 ///
13729 /// This vector is treated as a stack. As synthesis of one entity requires
13730 /// synthesis of another, additional contexts are pushed onto the stack.
13732
13733 /// Specializations whose definitions are currently being instantiated.
13734 llvm::DenseSet<InstantiatingSpecializationsKey> InstantiatingSpecializations;
13735
13736 /// Non-dependent types used in templates that have already been instantiated
13737 /// by some template instantiation.
13738 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13739
13740 /// Extra modules inspected when performing a lookup during a template
13741 /// instantiation. Computed lazily.
13743
13744 /// Cache of additional modules that should be used for name lookup
13745 /// within the current template instantiation. Computed lazily; use
13746 /// getLookupModules() to get a complete set.
13747 llvm::DenseSet<Module *> LookupModulesCache;
13748
13749 /// Map from the most recent declaration of a namespace to the most
13750 /// recent visible declaration of that namespace.
13751 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13752
13754
13755 /// The number of \p CodeSynthesisContexts that are not template
13756 /// instantiations and, therefore, should not be counted as part of the
13757 /// instantiation depth.
13758 ///
13759 /// When the instantiation depth reaches the user-configurable limit
13760 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13761 // FIXME: Should we have a similar limit for other forms of synthesis?
13763
13764 /// The depth of the context stack at the point when the most recent
13765 /// error or warning was produced.
13766 ///
13767 /// This value is used to suppress printing of redundant context stacks
13768 /// when there are multiple errors or warnings in the same instantiation.
13769 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13771
13772 /// The current index into pack expansion arguments that will be
13773 /// used for substitution of parameter packs.
13774 ///
13775 /// The pack expansion index will be none to indicate that parameter packs
13776 /// should be instantiated as themselves. Otherwise, the index specifies
13777 /// which argument within the parameter pack will be used for substitution.
13779
13780 /// RAII object used to change the argument pack substitution index
13781 /// within a \c Sema object.
13782 ///
13783 /// See \c ArgPackSubstIndex for more information.
13785 Sema &Self;
13786 UnsignedOrNone OldSubstIndex;
13787
13788 public:
13790 : Self(Self),
13791 OldSubstIndex(std::exchange(Self.ArgPackSubstIndex, NewSubstIndex)) {}
13792
13793 ~ArgPackSubstIndexRAII() { Self.ArgPackSubstIndex = OldSubstIndex; }
13796 };
13797
13800
13811 /// Prints the current instantiation stack through a series of
13812 /// notes.
13817
13818 /// Returns a pointer to the current SFINAE context, if any.
13819 [[nodiscard]] SFINAETrap *getSFINAEContext() const {
13820 return CurrentSFINAEContext;
13821 }
13822 [[nodiscard]] bool isSFINAEContext() const {
13823 return CurrentSFINAEContext != nullptr;
13824 }
13825
13826 /// Perform substitution on the type T with a given set of template
13827 /// arguments.
13828 ///
13829 /// This routine substitutes the given template arguments into the
13830 /// type T and produces the instantiated type.
13831 ///
13832 /// \param T the type into which the template arguments will be
13833 /// substituted. If this type is not dependent, it will be returned
13834 /// immediately.
13835 ///
13836 /// \param Args the template arguments that will be
13837 /// substituted for the top-level template parameters within T.
13838 ///
13839 /// \param Loc the location in the source code where this substitution
13840 /// is being performed. It will typically be the location of the
13841 /// declarator (if we're instantiating the type of some declaration)
13842 /// or the location of the type in the source code (if, e.g., we're
13843 /// instantiating the type of a cast expression).
13844 ///
13845 /// \param Entity the name of the entity associated with a declaration
13846 /// being instantiated (if any). May be empty to indicate that there
13847 /// is no such entity (if, e.g., this is a type that occurs as part of
13848 /// a cast expression) or that the entity has no name (e.g., an
13849 /// unnamed function parameter).
13850 ///
13851 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13852 /// acceptable as the top level type of the result.
13853 ///
13854 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13855 /// whenever substitution would perform a replacement with a null or
13856 /// non-existent template argument.
13857 ///
13858 /// \returns If the instantiation succeeds, the instantiated
13859 /// type. Otherwise, produces diagnostics and returns a NULL type.
13861 const MultiLevelTemplateArgumentList &TemplateArgs,
13862 SourceLocation Loc, DeclarationName Entity,
13863 bool AllowDeducedTST = false);
13864
13866 const MultiLevelTemplateArgumentList &TemplateArgs,
13867 SourceLocation Loc, DeclarationName Entity,
13868 bool *IsIncompleteSubstitution = nullptr);
13869
13871 const MultiLevelTemplateArgumentList &TemplateArgs,
13872 SourceLocation Loc, DeclarationName Entity);
13873
13876 const MultiLevelTemplateArgumentList &TemplateArgs,
13877 SourceLocation Loc, DeclarationName Entity);
13878
13879 /// A form of SubstType intended specifically for instantiating the
13880 /// type of a FunctionDecl. Its purpose is solely to force the
13881 /// instantiation of default-argument expressions and to avoid
13882 /// instantiating an exception-specification.
13884 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13885 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13886 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13888 const MultiLevelTemplateArgumentList &Args);
13891 SmallVectorImpl<QualType> &ExceptionStorage,
13892 const MultiLevelTemplateArgumentList &Args);
13893 ParmVarDecl *
13895 const MultiLevelTemplateArgumentList &TemplateArgs,
13896 int indexAdjustment, UnsignedOrNone NumExpansions,
13897 bool ExpectParameterPack, bool EvaluateConstraints = true);
13898
13899 /// Substitute the given template arguments into the given set of
13900 /// parameters, producing the set of parameter types that would be generated
13901 /// from such a substitution.
13903 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13904 const MultiLevelTemplateArgumentList &TemplateArgs,
13905 SmallVectorImpl<QualType> &ParamTypes,
13907 ExtParameterInfoBuilder &ParamInfos);
13908
13909 /// Substitute the given template arguments into the default argument.
13911 const MultiLevelTemplateArgumentList &TemplateArgs,
13912 bool ForCallExpr = false);
13914 const MultiLevelTemplateArgumentList &TemplateArgs);
13915 /// Substitute an expression as if it is a address-of-operand, which makes it
13916 /// act like a CXXIdExpression rather than an attempt to call.
13918 const MultiLevelTemplateArgumentList &TemplateArgs);
13919
13920 // Must be used instead of SubstExpr at 'constraint checking' time.
13923 const MultiLevelTemplateArgumentList &TemplateArgs);
13924 // Unlike the above, this does not evaluate constraints.
13926 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13927
13928 /// Substitute the given template arguments into a list of
13929 /// expressions, expanding pack expansions if required.
13930 ///
13931 /// \param Exprs The list of expressions to substitute into.
13932 ///
13933 /// \param IsCall Whether this is some form of call, in which case
13934 /// default arguments will be dropped.
13935 ///
13936 /// \param TemplateArgs The set of template arguments to substitute.
13937 ///
13938 /// \param Outputs Will receive all of the substituted arguments.
13939 ///
13940 /// \returns true if an error occurred, false otherwise.
13941 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13942 const MultiLevelTemplateArgumentList &TemplateArgs,
13943 SmallVectorImpl<Expr *> &Outputs);
13944
13946 const MultiLevelTemplateArgumentList &TemplateArgs);
13947
13950 bool CXXDirectInit);
13951
13952 /// Perform substitution on the base class specifiers of the
13953 /// given class template specialization.
13954 ///
13955 /// Produces a diagnostic and returns true on error, returns false and
13956 /// attaches the instantiated base classes to the class template
13957 /// specialization if successful.
13958 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13959 const MultiLevelTemplateArgumentList &TemplateArgs);
13960
13961 /// Instantiate the definition of a class from a given pattern.
13962 ///
13963 /// \param PointOfInstantiation The point of instantiation within the
13964 /// source code.
13965 ///
13966 /// \param Instantiation is the declaration whose definition is being
13967 /// instantiated. This will be either a class template specialization
13968 /// or a member class of a class template specialization.
13969 ///
13970 /// \param Pattern is the pattern from which the instantiation
13971 /// occurs. This will be either the declaration of a class template or
13972 /// the declaration of a member class of a class template.
13973 ///
13974 /// \param TemplateArgs The template arguments to be substituted into
13975 /// the pattern.
13976 ///
13977 /// \param TSK the kind of implicit or explicit instantiation to perform.
13978 ///
13979 /// \param Complain whether to complain if the class cannot be instantiated
13980 /// due to the lack of a definition.
13981 ///
13982 /// \returns true if an error occurred, false otherwise.
13983 bool InstantiateClass(SourceLocation PointOfInstantiation,
13984 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13985 const MultiLevelTemplateArgumentList &TemplateArgs,
13986 TemplateSpecializationKind TSK, bool Complain = true);
13987
13988private:
13989 bool InstantiateClassImpl(SourceLocation PointOfInstantiation,
13990 CXXRecordDecl *Instantiation,
13991 CXXRecordDecl *Pattern,
13992 const MultiLevelTemplateArgumentList &TemplateArgs,
13993 TemplateSpecializationKind TSK, bool Complain);
13994
13995public:
13996 /// Instantiate the definition of an enum from a given pattern.
13997 ///
13998 /// \param PointOfInstantiation The point of instantiation within the
13999 /// source code.
14000 /// \param Instantiation is the declaration whose definition is being
14001 /// instantiated. This will be a member enumeration of a class
14002 /// temploid specialization, or a local enumeration within a
14003 /// function temploid specialization.
14004 /// \param Pattern The templated declaration from which the instantiation
14005 /// occurs.
14006 /// \param TemplateArgs The template arguments to be substituted into
14007 /// the pattern.
14008 /// \param TSK The kind of implicit or explicit instantiation to perform.
14009 ///
14010 /// \return \c true if an error occurred, \c false otherwise.
14011 bool InstantiateEnum(SourceLocation PointOfInstantiation,
14012 EnumDecl *Instantiation, EnumDecl *Pattern,
14013 const MultiLevelTemplateArgumentList &TemplateArgs,
14015
14016 /// Instantiate the definition of a field from the given pattern.
14017 ///
14018 /// \param PointOfInstantiation The point of instantiation within the
14019 /// source code.
14020 /// \param Instantiation is the declaration whose definition is being
14021 /// instantiated. This will be a class of a class temploid
14022 /// specialization, or a local enumeration within a function temploid
14023 /// specialization.
14024 /// \param Pattern The templated declaration from which the instantiation
14025 /// occurs.
14026 /// \param TemplateArgs The template arguments to be substituted into
14027 /// the pattern.
14028 ///
14029 /// \return \c true if an error occurred, \c false otherwise.
14031 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
14032 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
14033
14035 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec);
14036
14038 SourceLocation PointOfInstantiation,
14039 ClassTemplateSpecializationDecl *ClassTemplateSpec,
14040 TemplateSpecializationKind TSK, bool Complain,
14041 bool PrimaryStrictPackMatch);
14042
14043 /// Instantiates the definitions of all of the member
14044 /// of the given class, which is an instantiation of a class template
14045 /// or a member class of a template.
14046 void
14047 InstantiateClassMembers(SourceLocation PointOfInstantiation,
14048 CXXRecordDecl *Instantiation,
14049 const MultiLevelTemplateArgumentList &TemplateArgs,
14051
14052 /// Instantiate the definitions of all of the members of the
14053 /// given class template specialization, which was named as part of an
14054 /// explicit instantiation.
14056 SourceLocation PointOfInstantiation,
14057 ClassTemplateSpecializationDecl *ClassTemplateSpec,
14059
14062 const MultiLevelTemplateArgumentList &TemplateArgs);
14063
14064 /// Do template substitution on declaration name info.
14067 const MultiLevelTemplateArgumentList &TemplateArgs);
14069 SubstTemplateName(SourceLocation TemplateKWLoc,
14070 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
14071 SourceLocation NameLoc,
14072 const MultiLevelTemplateArgumentList &TemplateArgs);
14073
14075 const MultiLevelTemplateArgumentList &TemplateArgs,
14076 bool EvaluateConstraint);
14077
14078 /// Determine whether we are currently performing template instantiation.
14081 }
14082
14083 /// Determine whether we are currently performing constraint substitution.
14085 return !CodeSynthesisContexts.empty() &&
14086 CodeSynthesisContexts.back().InConstraintSubstitution;
14087 }
14088
14090 return !CodeSynthesisContexts.empty() &&
14091 CodeSynthesisContexts.back().InParameterMappingSubstitution &&
14093 }
14094
14095 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
14096
14097 /// \brief create a Requirement::SubstitutionDiagnostic with only a
14098 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
14101
14102 ///@}
14103
14104 //
14105 //
14106 // -------------------------------------------------------------------------
14107 //
14108 //
14109
14110 /// \name C++ Template Declaration Instantiation
14111 /// Implementations are in SemaTemplateInstantiateDecl.cpp
14112 ///@{
14113
14114public:
14115 /// An entity for which implicit template instantiation is required.
14116 ///
14117 /// The source location associated with the declaration is the first place in
14118 /// the source code where the declaration was "used". It is not necessarily
14119 /// the point of instantiation (which will be either before or after the
14120 /// namespace-scope declaration that triggered this implicit instantiation),
14121 /// However, it is the location that diagnostics should generally refer to,
14122 /// because users will need to know what code triggered the instantiation.
14123 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
14124
14125 /// The queue of implicit template instantiations that are required
14126 /// but have not yet been performed.
14127 std::deque<PendingImplicitInstantiation> PendingInstantiations;
14128
14129 /// Queue of implicit template instantiations that cannot be performed
14130 /// eagerly.
14132
14136
14137 /// The queue of implicit template instantiations that are required
14138 /// and must be performed within the current local scope.
14139 ///
14140 /// This queue is only used for member functions of local classes in
14141 /// templates, which must be instantiated in the same scope as their
14142 /// enclosing function, so that they can reference function-local
14143 /// types, static variables, enumerators, etc.
14144 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
14145
14147 public:
14149 : S(S), AtEndOfTU(AtEndOfTU) {
14150 SavedPendingLocalImplicitInstantiations.swap(
14151 S.PendingLocalImplicitInstantiations);
14152 }
14153
14154 void perform() {
14155 S.PerformPendingInstantiations(/*LocalOnly=*/true,
14156 /*AtEndOfTU=*/AtEndOfTU);
14157 }
14158
14160 assert(S.PendingLocalImplicitInstantiations.empty() &&
14161 "there shouldn't be any pending local implicit instantiations");
14162 SavedPendingLocalImplicitInstantiations.swap(
14163 S.PendingLocalImplicitInstantiations);
14164 }
14165
14169
14170 private:
14171 Sema &S;
14172 bool AtEndOfTU;
14173 std::deque<PendingImplicitInstantiation>
14174 SavedPendingLocalImplicitInstantiations;
14175 };
14176
14177 /// Records and restores the CurFPFeatures state on entry/exit of compound
14178 /// statements.
14180 public:
14185 FPOptionsOverride getOverrides() { return OldOverrides; }
14186
14187 private:
14188 Sema &S;
14189 FPOptions OldFPFeaturesState;
14190 FPOptionsOverride OldOverrides;
14191 LangOptions::FPEvalMethodKind OldEvalMethod;
14192 SourceLocation OldFPPragmaLocation;
14193 };
14194
14196 public:
14197 GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
14198 : S(S), Enabled(Enabled), AtEndOfTU(AtEndOfTU) {
14199 if (!Enabled)
14200 return;
14201
14202 S.SavedPendingInstantiations.emplace_back();
14203 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
14204
14205 S.SavedVTableUses.emplace_back();
14206 S.SavedVTableUses.back().swap(S.VTableUses);
14207 }
14208
14209 void perform() {
14210 if (Enabled) {
14211 S.DefineUsedVTables();
14212 S.PerformPendingInstantiations(/*LocalOnly=*/false,
14213 /*AtEndOfTU=*/AtEndOfTU);
14214 }
14215 }
14216
14218 if (!Enabled)
14219 return;
14220
14221 // Restore the set of pending vtables.
14222 assert(S.VTableUses.empty() &&
14223 "VTableUses should be empty before it is discarded.");
14224 S.VTableUses.swap(S.SavedVTableUses.back());
14225 S.SavedVTableUses.pop_back();
14226
14227 // Restore the set of pending implicit instantiations.
14228 if ((S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) &&
14229 AtEndOfTU) {
14230 assert(S.PendingInstantiations.empty() &&
14231 "PendingInstantiations should be empty before it is discarded.");
14232 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14233 S.SavedPendingInstantiations.pop_back();
14234 } else {
14235 // Template instantiations in the PCH may be delayed until the TU.
14236 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14237 S.PendingInstantiations.insert(
14238 S.PendingInstantiations.end(),
14239 S.SavedPendingInstantiations.back().begin(),
14240 S.SavedPendingInstantiations.back().end());
14241 S.SavedPendingInstantiations.pop_back();
14242 }
14243 }
14244
14246 delete;
14249
14250 private:
14251 Sema &S;
14252 bool Enabled;
14253 bool AtEndOfTU;
14254 };
14255
14257 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
14258
14269
14270 /// Recheck instantiated thread-safety attributes that could not be validated
14271 /// on the dependent pattern declaration.
14272 bool checkInstantiatedThreadSafetyAttrs(const Decl *D, const Attr *A);
14273
14274 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
14275 const Decl *Pattern, Decl *Inst,
14276 LateInstantiatedAttrVec *LateAttrs = nullptr,
14277 LocalInstantiationScope *OuterMostScope = nullptr);
14278
14279 /// Update instantiation attributes after template was late parsed.
14280 ///
14281 /// Some attributes are evaluated based on the body of template. If it is
14282 /// late parsed, such attributes cannot be evaluated when declaration is
14283 /// instantiated. This function is used to update instantiation attributes
14284 /// when template definition is ready.
14285 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
14286
14287 void
14289 const Decl *Pattern, Decl *Inst,
14290 LateInstantiatedAttrVec *LateAttrs = nullptr,
14291 LocalInstantiationScope *OuterMostScope = nullptr);
14292
14294 bool IsCopy = false);
14295
14297 ParmVarDecl *Param);
14298 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
14300
14301 /// Instantiate (or find existing instantiation of) a function template with a
14302 /// given set of template arguments.
14303 ///
14304 /// Usually this should not be used, and template argument deduction should be
14305 /// used in its place.
14308 SourceLocation Loc,
14311
14312 /// Instantiate the definition of the given function from its
14313 /// template.
14314 ///
14315 /// \param PointOfInstantiation the point at which the instantiation was
14316 /// required. Note that this is not precisely a "point of instantiation"
14317 /// for the function, but it's close.
14318 ///
14319 /// \param Function the already-instantiated declaration of a
14320 /// function template specialization or member function of a class template
14321 /// specialization.
14322 ///
14323 /// \param Recursive if true, recursively instantiates any functions that
14324 /// are required by this instantiation.
14325 ///
14326 /// \param DefinitionRequired if true, then we are performing an explicit
14327 /// instantiation where the body of the function is required. Complain if
14328 /// there is no such body.
14329 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
14331 bool Recursive = false,
14332 bool DefinitionRequired = false,
14333 bool AtEndOfTU = false);
14336 const TemplateArgumentList *PartialSpecArgs,
14338 SourceLocation PointOfInstantiation,
14339 LateInstantiatedAttrVec *LateAttrs = nullptr,
14340 LocalInstantiationScope *StartingScope = nullptr);
14341
14342 /// Instantiates a variable template specialization by completing it
14343 /// with appropriate type information and initializer.
14345 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
14346 const MultiLevelTemplateArgumentList &TemplateArgs);
14347
14348 /// BuildVariableInstantiation - Used after a new variable has been created.
14349 /// Sets basic variable data and decides whether to postpone the
14350 /// variable instantiation.
14351 void
14353 const MultiLevelTemplateArgumentList &TemplateArgs,
14354 LateInstantiatedAttrVec *LateAttrs,
14355 DeclContext *Owner,
14356 LocalInstantiationScope *StartingScope,
14357 bool InstantiatingVarTemplate = false,
14358 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
14359
14360 /// Instantiate the initializer of a variable.
14362 VarDecl *Var, VarDecl *OldVar,
14363 const MultiLevelTemplateArgumentList &TemplateArgs);
14364
14365 /// Instantiate the definition of the given variable from its
14366 /// template.
14367 ///
14368 /// \param PointOfInstantiation the point at which the instantiation was
14369 /// required. Note that this is not precisely a "point of instantiation"
14370 /// for the variable, but it's close.
14371 ///
14372 /// \param Var the already-instantiated declaration of a templated variable.
14373 ///
14374 /// \param Recursive if true, recursively instantiates any functions that
14375 /// are required by this instantiation.
14376 ///
14377 /// \param DefinitionRequired if true, then we are performing an explicit
14378 /// instantiation where a definition of the variable is required. Complain
14379 /// if there is no such definition.
14380 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
14381 VarDecl *Var, bool Recursive = false,
14382 bool DefinitionRequired = false,
14383 bool AtEndOfTU = false);
14384
14387 const MultiLevelTemplateArgumentList &TemplateArgs);
14388
14389 /// Find the instantiation of the given declaration within the
14390 /// current instantiation.
14391 ///
14392 /// This routine is intended to be used when \p D is a declaration
14393 /// referenced from within a template, that needs to mapped into the
14394 /// corresponding declaration within an instantiation. For example,
14395 /// given:
14396 ///
14397 /// \code
14398 /// template<typename T>
14399 /// struct X {
14400 /// enum Kind {
14401 /// KnownValue = sizeof(T)
14402 /// };
14403 ///
14404 /// bool getKind() const { return KnownValue; }
14405 /// };
14406 ///
14407 /// template struct X<int>;
14408 /// \endcode
14409 ///
14410 /// In the instantiation of X<int>::getKind(), we need to map the \p
14411 /// EnumConstantDecl for \p KnownValue (which refers to
14412 /// X<T>::<Kind>::KnownValue) to its instantiation
14413 /// (X<int>::<Kind>::KnownValue).
14414 /// \p FindInstantiatedDecl performs this mapping from within the
14415 /// instantiation of X<int>.
14416 NamedDecl *
14418 const MultiLevelTemplateArgumentList &TemplateArgs,
14419 bool FindingInstantiatedContext = false);
14420
14421 /// Finds the instantiation of the given declaration context
14422 /// within the current instantiation.
14423 ///
14424 /// \returns NULL if there was an error
14425 DeclContext *
14427 const MultiLevelTemplateArgumentList &TemplateArgs);
14428
14429 Decl *SubstDecl(Decl *D, DeclContext *Owner,
14430 const MultiLevelTemplateArgumentList &TemplateArgs);
14431
14432 /// Substitute the name and return type of a defaulted 'operator<=>' to form
14433 /// an implicit 'operator=='.
14435 FunctionDecl *Spaceship);
14436
14437 /// Performs template instantiation for all implicit template
14438 /// instantiations we have seen until this point.
14439 void PerformPendingInstantiations(bool LocalOnly = false,
14440 bool AtEndOfTU = true);
14441
14444 const MultiLevelTemplateArgumentList &TemplateArgs,
14445 bool EvaluateConstraints = true);
14446
14448 const DeclContext *Pattern,
14449 const MultiLevelTemplateArgumentList &TemplateArgs);
14450
14451private:
14452 /// Introduce the instantiated local variables into the local
14453 /// instantiation scope.
14454 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
14455 const FunctionDecl *PatternDecl,
14457 /// Introduce the instantiated function parameters into the local
14458 /// instantiation scope, and set the parameter names to those used
14459 /// in the template.
14460 bool addInstantiatedParametersToScope(
14461 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14463 const MultiLevelTemplateArgumentList &TemplateArgs);
14464
14465 /// Introduce the instantiated captures of the lambda into the local
14466 /// instantiation scope.
14467 bool addInstantiatedCapturesToScope(
14468 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14470 const MultiLevelTemplateArgumentList &TemplateArgs);
14471
14472 int ParsingClassDepth = 0;
14473
14474 class SavePendingParsedClassStateRAII {
14475 public:
14476 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14477
14478 ~SavePendingParsedClassStateRAII() {
14479 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14480 "there shouldn't be any pending delayed exception spec checks");
14481 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14482 "there shouldn't be any pending delayed exception spec checks");
14483 swapSavedState();
14484 }
14485
14486 SavePendingParsedClassStateRAII(const SavePendingParsedClassStateRAII &) =
14487 delete;
14488 SavePendingParsedClassStateRAII &
14489 operator=(const SavePendingParsedClassStateRAII &) = delete;
14490
14491 private:
14492 Sema &S;
14494 SavedOverridingExceptionSpecChecks;
14496 SavedEquivalentExceptionSpecChecks;
14497
14498 void swapSavedState() {
14499 SavedOverridingExceptionSpecChecks.swap(
14500 S.DelayedOverridingExceptionSpecChecks);
14501 SavedEquivalentExceptionSpecChecks.swap(
14502 S.DelayedEquivalentExceptionSpecChecks);
14503 }
14504 };
14505
14506 ///@}
14507
14508 //
14509 //
14510 // -------------------------------------------------------------------------
14511 //
14512 //
14513
14514 /// \name C++ Variadic Templates
14515 /// Implementations are in SemaTemplateVariadic.cpp
14516 ///@{
14517
14518public:
14519 /// Determine whether an unexpanded parameter pack might be permitted in this
14520 /// location. Useful for error recovery.
14522
14523 /// The context in which an unexpanded parameter pack is
14524 /// being diagnosed.
14525 ///
14526 /// Note that the values of this enumeration line up with the first
14527 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
14529 /// An arbitrary expression.
14531
14532 /// The base type of a class type.
14534
14535 /// The type of an arbitrary declaration.
14537
14538 /// The type of a data member.
14540
14541 /// The size of a bit-field.
14543
14544 /// The expression in a static assertion.
14546
14547 /// The fixed underlying type of an enumeration.
14549
14550 /// The enumerator value.
14552
14553 /// A using declaration.
14555
14556 /// A friend declaration.
14558
14559 /// A declaration qualifier.
14561
14562 /// An initializer.
14564
14565 /// A default argument.
14567
14568 /// The type of a non-type template parameter.
14570
14571 /// The type of an exception.
14573
14574 /// Explicit specialization.
14576
14577 /// Partial specialization.
14579
14580 /// Microsoft __if_exists.
14582
14583 /// Microsoft __if_not_exists.
14585
14586 /// Lambda expression.
14588
14589 /// Block expression.
14591
14592 /// A type constraint.
14594
14595 // A requirement in a requires-expression.
14597
14598 // A requires-clause.
14600 };
14601
14602 /// Diagnose unexpanded parameter packs.
14603 ///
14604 /// \param Loc The location at which we should emit the diagnostic.
14605 ///
14606 /// \param UPPC The context in which we are diagnosing unexpanded
14607 /// parameter packs.
14608 ///
14609 /// \param Unexpanded the set of unexpanded parameter packs.
14610 ///
14611 /// \returns true if an error occurred, false otherwise.
14615
14616 /// If the given type contains an unexpanded parameter pack,
14617 /// diagnose the error.
14618 ///
14619 /// \param Loc The source location where a diagnostc should be emitted.
14620 ///
14621 /// \param T The type that is being checked for unexpanded parameter
14622 /// packs.
14623 ///
14624 /// \returns true if an error occurred, false otherwise.
14627
14628 /// If the given expression contains an unexpanded parameter
14629 /// pack, diagnose the error.
14630 ///
14631 /// \param E The expression that is being checked for unexpanded
14632 /// parameter packs.
14633 ///
14634 /// \returns true if an error occurred, false otherwise.
14637
14638 /// If the given requirees-expression contains an unexpanded reference to one
14639 /// of its own parameter packs, diagnose the error.
14640 ///
14641 /// \param RE The requiress-expression that is being checked for unexpanded
14642 /// parameter packs.
14643 ///
14644 /// \returns true if an error occurred, false otherwise.
14646
14647 /// If the given nested-name-specifier contains an unexpanded
14648 /// parameter pack, diagnose the error.
14649 ///
14650 /// \param SS The nested-name-specifier that is being checked for
14651 /// unexpanded parameter packs.
14652 ///
14653 /// \returns true if an error occurred, false otherwise.
14656
14657 /// If the given name contains an unexpanded parameter pack,
14658 /// diagnose the error.
14659 ///
14660 /// \param NameInfo The name (with source location information) that
14661 /// is being checked for unexpanded parameter packs.
14662 ///
14663 /// \returns true if an error occurred, false otherwise.
14666
14667 /// If the given template name contains an unexpanded parameter pack,
14668 /// diagnose the error.
14669 ///
14670 /// \param Loc The location of the template name.
14671 ///
14672 /// \param Template The template name that is being checked for unexpanded
14673 /// parameter packs.
14674 ///
14675 /// \returns true if an error occurred, false otherwise.
14679
14680 /// If the given template argument contains an unexpanded parameter
14681 /// pack, diagnose the error.
14682 ///
14683 /// \param Arg The template argument that is being checked for unexpanded
14684 /// parameter packs.
14685 ///
14686 /// \returns true if an error occurred, false otherwise.
14689
14690 /// Collect the set of unexpanded parameter packs within the given
14691 /// template argument.
14692 ///
14693 /// \param Arg The template argument that will be traversed to find
14694 /// unexpanded parameter packs.
14696 TemplateArgument Arg,
14698
14699 /// Collect the set of unexpanded parameter packs within the given
14700 /// template argument.
14701 ///
14702 /// \param Arg The template argument that will be traversed to find
14703 /// unexpanded parameter packs.
14707
14708 /// Collect the set of unexpanded parameter packs within the given
14709 /// type.
14710 ///
14711 /// \param T The type that will be traversed to find
14712 /// unexpanded parameter packs.
14715
14716 /// Collect the set of unexpanded parameter packs within the given
14717 /// template name.
14718 ///
14719 /// \param Template The template name that will be traversed to find
14720 /// unexpanded parameter packs.
14724
14725 /// Collect the set of unexpanded parameter packs within the given
14726 /// type.
14727 ///
14728 /// \param TL The type that will be traversed to find
14729 /// unexpanded parameter packs.
14732
14733 /// Collect the set of unexpanded parameter packs within the given
14734 /// nested-name-specifier.
14735 ///
14736 /// \param NNS The nested-name-specifier that will be traversed to find
14737 /// unexpanded parameter packs.
14741
14742 /// Collect the set of unexpanded parameter packs within the given
14743 /// name.
14744 ///
14745 /// \param NameInfo The name that will be traversed to find
14746 /// unexpanded parameter packs.
14748 const DeclarationNameInfo &NameInfo,
14750
14751 /// Collect the set of unexpanded parameter packs within the given
14752 /// expression.
14755
14756 /// Invoked when parsing a template argument.
14757 ///
14758 /// \param Arg the template argument, which may already be invalid.
14759 ///
14760 /// If it is followed by ellipsis, this function is called before
14761 /// `ActOnPackExpansion`.
14764
14765 /// Invoked when parsing a template argument followed by an
14766 /// ellipsis, which creates a pack expansion.
14767 ///
14768 /// \param Arg The template argument preceding the ellipsis, which
14769 /// may already be invalid.
14770 ///
14771 /// \param EllipsisLoc The location of the ellipsis.
14773 SourceLocation EllipsisLoc);
14774
14775 /// Invoked when parsing a type followed by an ellipsis, which
14776 /// creates a pack expansion.
14777 ///
14778 /// \param Type The type preceding the ellipsis, which will become
14779 /// the pattern of the pack expansion.
14780 ///
14781 /// \param EllipsisLoc The location of the ellipsis.
14783
14784 /// Construct a pack expansion type from the pattern of the pack
14785 /// expansion.
14787 SourceLocation EllipsisLoc,
14788 UnsignedOrNone NumExpansions);
14789
14790 /// Construct a pack expansion type from the pattern of the pack
14791 /// expansion.
14792 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14793 SourceLocation EllipsisLoc,
14794 UnsignedOrNone NumExpansions);
14795
14796 /// Invoked when parsing an expression followed by an ellipsis, which
14797 /// creates a pack expansion.
14798 ///
14799 /// \param Pattern The expression preceding the ellipsis, which will become
14800 /// the pattern of the pack expansion.
14801 ///
14802 /// \param EllipsisLoc The location of the ellipsis.
14803 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14804
14805 /// Invoked when parsing an expression followed by an ellipsis, which
14806 /// creates a pack expansion.
14807 ///
14808 /// \param Pattern The expression preceding the ellipsis, which will become
14809 /// the pattern of the pack expansion.
14810 ///
14811 /// \param EllipsisLoc The location of the ellipsis.
14812 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14813 UnsignedOrNone NumExpansions);
14814
14815 /// Determine whether we could expand a pack expansion with the
14816 /// given set of parameter packs into separate arguments by repeatedly
14817 /// transforming the pattern.
14818 ///
14819 /// \param EllipsisLoc The location of the ellipsis that identifies the
14820 /// pack expansion.
14821 ///
14822 /// \param PatternRange The source range that covers the entire pattern of
14823 /// the pack expansion.
14824 ///
14825 /// \param Unexpanded The set of unexpanded parameter packs within the
14826 /// pattern.
14827 ///
14828 /// \param ShouldExpand Will be set to \c true if the transformer should
14829 /// expand the corresponding pack expansions into separate arguments. When
14830 /// set, \c NumExpansions must also be set.
14831 ///
14832 /// \param RetainExpansion Whether the caller should add an unexpanded
14833 /// pack expansion after all of the expanded arguments. This is used
14834 /// when extending explicitly-specified template argument packs per
14835 /// C++0x [temp.arg.explicit]p9.
14836 ///
14837 /// \param NumExpansions The number of separate arguments that will be in
14838 /// the expanded form of the corresponding pack expansion. This is both an
14839 /// input and an output parameter, which can be set by the caller if the
14840 /// number of expansions is known a priori (e.g., due to a prior substitution)
14841 /// and will be set by the callee when the number of expansions is known.
14842 /// The callee must set this value when \c ShouldExpand is \c true; it may
14843 /// set this value in other cases.
14844 ///
14845 /// \returns true if an error occurred (e.g., because the parameter packs
14846 /// are to be instantiated with arguments of different lengths), false
14847 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14848 /// must be set.
14850 SourceLocation EllipsisLoc, SourceRange PatternRange,
14852 const MultiLevelTemplateArgumentList &TemplateArgs,
14853 bool FailOnPackProducingTemplates, bool &ShouldExpand,
14854 bool &RetainExpansion, UnsignedOrNone &NumExpansions,
14855 bool Diagnose = true);
14856
14857 /// Determine the number of arguments in the given pack expansion
14858 /// type.
14859 ///
14860 /// This routine assumes that the number of arguments in the expansion is
14861 /// consistent across all of the unexpanded parameter packs in its pattern.
14862 ///
14863 /// Returns an empty Optional if the type can't be expanded.
14865 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14866
14869 const MultiLevelTemplateArgumentList &TemplateArgs);
14870
14871 /// Determine whether the given declarator contains any unexpanded
14872 /// parameter packs.
14873 ///
14874 /// This routine is used by the parser to disambiguate function declarators
14875 /// with an ellipsis prior to the ')', e.g.,
14876 ///
14877 /// \code
14878 /// void f(T...);
14879 /// \endcode
14880 ///
14881 /// To determine whether we have an (unnamed) function parameter pack or
14882 /// a variadic function.
14883 ///
14884 /// \returns true if the declarator contains any unexpanded parameter packs,
14885 /// false otherwise.
14887
14888 /// Returns the pattern of the pack expansion for a template argument.
14889 ///
14890 /// \param OrigLoc The template argument to expand.
14891 ///
14892 /// \param Ellipsis Will be set to the location of the ellipsis.
14893 ///
14894 /// \param NumExpansions Will be set to the number of expansions that will
14895 /// be generated from this pack expansion, if known a priori.
14898 SourceLocation &Ellipsis,
14899 UnsignedOrNone &NumExpansions) const;
14900
14901 /// Given a template argument that contains an unexpanded parameter pack, but
14902 /// which has already been substituted, attempt to determine the number of
14903 /// elements that will be produced once this argument is fully-expanded.
14904 ///
14905 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14906 /// avoid actually expanding the pack where possible.
14908
14909 /// Called when an expression computing the size of a parameter pack
14910 /// is parsed.
14911 ///
14912 /// \code
14913 /// template<typename ...Types> struct count {
14914 /// static const unsigned value = sizeof...(Types);
14915 /// };
14916 /// \endcode
14917 ///
14918 //
14919 /// \param OpLoc The location of the "sizeof" keyword.
14920 /// \param Name The name of the parameter pack whose size will be determined.
14921 /// \param NameLoc The source location of the name of the parameter pack.
14922 /// \param RParenLoc The location of the closing parentheses.
14924 IdentifierInfo &Name,
14925 SourceLocation NameLoc,
14926 SourceLocation RParenLoc);
14927
14928 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14929 SourceLocation EllipsisLoc,
14930 SourceLocation LSquareLoc, Expr *IndexExpr,
14931 SourceLocation RSquareLoc);
14932
14933 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14934 SourceLocation EllipsisLoc, Expr *IndexExpr,
14935 SourceLocation RSquareLoc,
14936 ArrayRef<Expr *> ExpandedExprs = {},
14937 bool FullySubstituted = false);
14938
14940 SourceLocation NameLoc,
14941 Expr *IndexExpr);
14942
14944 BuildPackIndexingTemplateName(TemplateName Pattern, Expr *IndexExpr,
14945 bool FullySubstituted = false,
14946 ArrayRef<TemplateName> Expansions = {});
14947
14950 SourceLocation NameLoc);
14951
14952 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14953 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14954 tok::TokenKind Operator,
14955 SourceLocation EllipsisLoc, Expr *RHS,
14956 SourceLocation RParenLoc);
14957 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14958 SourceLocation LParenLoc, Expr *LHS,
14959 BinaryOperatorKind Operator,
14960 SourceLocation EllipsisLoc, Expr *RHS,
14961 SourceLocation RParenLoc,
14962 UnsignedOrNone NumExpansions);
14963 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14964 BinaryOperatorKind Operator);
14965
14966 ///@}
14967
14968 //
14969 //
14970 // -------------------------------------------------------------------------
14971 //
14972 //
14973
14974 /// \name Constraints and Concepts
14975 /// Implementations are in SemaConcept.cpp
14976 ///@{
14977
14978public:
14979 ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI);
14980
14981 ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc,
14982 TypeSourceInfo *TSI);
14983
14984public:
14986 const llvm::FoldingSetNodeID &ID) {
14987 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14988 SatisfactionStack.emplace_back(Can, ID);
14989 }
14990
14991 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14992
14994 const llvm::FoldingSetNodeID &ID) const {
14995 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14996 return llvm::is_contained(SatisfactionStack,
14997 SatisfactionStackEntryTy{Can, ID});
14998 }
14999
15001 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
15002
15003 // Resets the current SatisfactionStack for cases where we are instantiating
15004 // constraints as a 'side effect' of normal instantiation in a way that is not
15005 // indicative of recursive definition.
15008 Sema &SemaRef;
15009
15010 public:
15012 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
15013 }
15014
15016 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
15017 }
15018
15022 };
15023
15026 SatisfactionStack.swap(NewSS);
15027 }
15028
15030 llvm::PointerUnion<const NamedDecl *,
15032
15033 /// Check whether the given expression is a valid constraint expression.
15034 /// A diagnostic is emitted if it is not, false is returned, and
15035 /// PossibleNonPrimary will be set to true if the failure might be due to a
15036 /// non-primary expression being used as an atomic constraint.
15037 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
15038 bool *PossibleNonPrimary = nullptr,
15039 bool IsTrailingRequiresClause = false);
15040
15041 /// \brief Check whether the given list of constraint expressions are
15042 /// satisfied (as if in a 'conjunction') given template arguments.
15043 /// \param Template the template-like entity that triggered the constraints
15044 /// check (either a concept or a constrained entity).
15045 /// \param ConstraintExprs a list of constraint expressions, treated as if
15046 /// they were 'AND'ed together.
15047 /// \param TemplateArgLists the list of template arguments to substitute into
15048 /// the constraint expression.
15049 /// \param TemplateIDRange The source range of the template id that
15050 /// caused the constraints check.
15051 /// \param Satisfaction if true is returned, will contain details of the
15052 /// satisfaction, with enough information to diagnose an unsatisfied
15053 /// expression.
15054 /// \returns true if an error occurred and satisfaction could not be checked,
15055 /// false otherwise.
15058 ArrayRef<AssociatedConstraint> AssociatedConstraints,
15059 const MultiLevelTemplateArgumentList &TemplateArgLists,
15060 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction,
15061 const ConceptReference *TopLevelConceptId = nullptr,
15062 Expr **ConvertedExpr = nullptr);
15063
15064 /// Check whether the given function decl's trailing requires clause is
15065 /// satisfied, if any. Returns false and updates Satisfaction with the
15066 /// satisfaction verdict if successful, emits a diagnostic and returns true if
15067 /// an error occurred and satisfaction could not be determined.
15068 ///
15069 /// \returns true if an error occurred, false otherwise.
15071 ConstraintSatisfaction &Satisfaction,
15072 SourceLocation UsageLoc = SourceLocation(),
15073 bool ForOverloadResolution = false);
15074
15075 // Calculates whether two constraint expressions are equal irrespective of a
15076 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
15077 // 'New', which are the "source" of the constraint, since this is necessary
15078 // for figuring out the relative 'depth' of the constraint. The depth of the
15079 // 'primary template' and the 'instantiated from' templates aren't necessarily
15080 // the same, such as a case when one is a 'friend' defined in a class.
15082 const Expr *OldConstr,
15084 const Expr *NewConstr);
15085
15086 // Calculates whether the friend function depends on an enclosing template for
15087 // the purposes of [temp.friend] p9.
15089
15090 /// \brief Ensure that the given template arguments satisfy the constraints
15091 /// associated with the given template, emitting a diagnostic if they do not.
15092 ///
15093 /// \param Template The template to which the template arguments are being
15094 /// provided.
15095 ///
15096 /// \param TemplateArgs The converted, canonicalized template arguments.
15097 ///
15098 /// \param TemplateIDRange The source range of the template id that
15099 /// caused the constraints check.
15100 ///
15101 /// \returns true if the constrains are not satisfied or could not be checked
15102 /// for satisfaction, false if the constraints are satisfied.
15105 const MultiLevelTemplateArgumentList &TemplateArgs,
15106 SourceRange TemplateIDRange);
15107
15108 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
15110 ArrayRef<TemplateArgument> TemplateArgs,
15111 ConstraintSatisfaction &Satisfaction);
15112
15113 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15114 /// unsatisfied.
15115 /// \param First whether this is the first time an unsatisfied constraint is
15116 /// diagnosed for this error.
15118 SourceLocation Loc = {},
15119 bool First = true);
15120
15121 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15122 /// unsatisfied.
15123 void
15125 bool First = true);
15126
15128 bool First = true);
15129
15132 ArrayRef<AssociatedConstraint> AssociatedConstraints);
15133
15134 /// \brief Check whether the given declaration's associated constraints are
15135 /// at least as constrained than another declaration's according to the
15136 /// partial ordering of constraints.
15137 ///
15138 /// \param Result If no error occurred, receives the result of true if D1 is
15139 /// at least constrained than D2, and false otherwise.
15140 ///
15141 /// \returns true if an error occurred, false otherwise.
15142 bool IsAtLeastAsConstrained(const NamedDecl *D1,
15144 const NamedDecl *D2,
15146 bool &Result);
15147
15148 /// If D1 was not at least as constrained as D2, but would've been if a pair
15149 /// of atomic constraints involved had been declared in a concept and not
15150 /// repeated in two separate places in code.
15151 /// \returns true if such a diagnostic was emitted, false otherwise.
15155
15156private:
15159
15160 UnsignedOrNone EvaluateFoldExpandedConstraintSize(
15161 const Expr *Pattern, const MultiLevelTemplateArgumentList &MLTAL);
15162
15163 /// Cache the satisfaction of an atomic constraint.
15164 /// The key is based on the unsubstituted expression and the parameter
15165 /// mapping. This lets us not substituting the mapping more than once,
15166 /// which is (very!) expensive.
15167 llvm::DenseMap<llvm::FoldingSetNodeID,
15169 UnsubstitutedConstraintSatisfactionCache;
15170
15171 /// Cache the instantiation results of template parameter mappings within
15172 /// concepts. Substituting into normalized concepts can be extremely expensive
15173 /// due to the redundancy of template parameters. This cache is intended for
15174 /// use by TemplateInstantiator to avoid redundant semantic checking.
15175 llvm::DenseMap<llvm::FoldingSetNodeID, TemplateArgumentLoc>
15176 *CurrentCachedTemplateArgs = nullptr;
15177
15178 /// Caches pairs of template-like decls whose associated constraints were
15179 /// checked for subsumption and whether or not the first's constraints did in
15180 /// fact subsume the second's.
15181 llvm::DenseMap<std::pair<const NamedDecl *, const NamedDecl *>, bool>
15182 SubsumptionCache;
15183 /// Caches the normalized associated constraints of declarations (concepts or
15184 /// constrained declarations). If an error occurred while normalizing the
15185 /// associated constraints of the template or concept, nullptr will be cached
15186 /// here.
15187 llvm::DenseMap<ConstrainedDeclOrNestedRequirement, NormalizedConstraint *>
15188 NormalizationCache;
15189
15190 /// Cache whether the associated constraint of a declaration
15191 /// is satisfied.
15192 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
15193 SatisfactionCache;
15194
15195 // The current stack of constraint satisfactions, so we can exit-early.
15197
15198 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to set up the
15199 /// LocalInstantiationScope of the current non-lambda function. For lambdas,
15200 /// use LambdaScopeForCallOperatorInstantiationRAII.
15201 bool
15202 SetupConstraintScope(FunctionDecl *FD,
15203 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15204 const MultiLevelTemplateArgumentList &MLTAL,
15206
15207 /// Used during constraint checking, sets up the constraint template argument
15208 /// lists, and calls SetupConstraintScope to set up the
15209 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
15210 std::optional<MultiLevelTemplateArgumentList>
15211 SetupConstraintCheckingTemplateArgumentsAndScope(
15212 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15214
15215 ///@}
15216
15217 //
15218 //
15219 // -------------------------------------------------------------------------
15220 //
15221 //
15222
15223 /// \name Types
15224 /// Implementations are in SemaType.cpp
15225 ///@{
15226
15227public:
15228 /// A mapping that describes the nullability we've seen in each header file.
15230
15231 static int getPrintable(int I) { return I; }
15232 static unsigned getPrintable(unsigned I) { return I; }
15233 static bool getPrintable(bool B) { return B; }
15234 static const char *getPrintable(const char *S) { return S; }
15235 static StringRef getPrintable(StringRef S) { return S; }
15236 static const std::string &getPrintable(const std::string &S) { return S; }
15237 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
15238 return II;
15239 }
15241 static QualType getPrintable(QualType T) { return T; }
15242 static SourceRange getPrintable(SourceRange R) { return R; }
15244 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
15246
15247 enum class CompleteTypeKind {
15248 /// Apply the normal rules for complete types. In particular,
15249 /// treat all sizeless types as incomplete.
15251
15252 /// Relax the normal rules for complete types so that they include
15253 /// sizeless built-in types.
15255
15256 // FIXME: Eventually we should flip the default to Normal and opt in
15257 // to AcceptSizeless rather than opt out of it.
15259 };
15260
15262 const DeclSpec *DS = nullptr);
15264 const DeclSpec *DS = nullptr);
15265
15266 /// Build a pointer type.
15267 ///
15268 /// \param T The type to which we'll be building a pointer.
15269 ///
15270 /// \param Loc The location of the entity whose type involves this
15271 /// pointer type or, if there is no such entity, the location of the
15272 /// type that will have pointer type.
15273 ///
15274 /// \param Entity The name of the entity that involves the pointer
15275 /// type, if known.
15276 ///
15277 /// \returns A suitable pointer type, if there are no
15278 /// errors. Otherwise, returns a NULL type.
15280 DeclarationName Entity);
15281
15282 /// Build a reference type.
15283 ///
15284 /// \param T The type to which we'll be building a reference.
15285 ///
15286 /// \param Loc The location of the entity whose type involves this
15287 /// reference type or, if there is no such entity, the location of the
15288 /// type that will have reference type.
15289 ///
15290 /// \param Entity The name of the entity that involves the reference
15291 /// type, if known.
15292 ///
15293 /// \returns A suitable reference type, if there are no
15294 /// errors. Otherwise, returns a NULL type.
15296 DeclarationName Entity);
15297
15298 /// Build an array type.
15299 ///
15300 /// \param T The type of each element in the array.
15301 ///
15302 /// \param ASM C99 array size modifier (e.g., '*', 'static').
15303 ///
15304 /// \param ArraySize Expression describing the size of the array.
15305 ///
15306 /// \param Brackets The range from the opening '[' to the closing ']'.
15307 ///
15308 /// \param Entity The name of the entity that involves the array
15309 /// type, if known.
15310 ///
15311 /// \returns A suitable array type, if there are no errors. Otherwise,
15312 /// returns a NULL type.
15314 unsigned Quals, SourceRange Brackets,
15315 DeclarationName Entity);
15317
15318 /// Build an ext-vector type.
15319 ///
15320 /// Run the required checks for the extended vector type.
15322 SourceLocation AttrLoc);
15323 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
15324 SourceLocation AttrLoc);
15325
15327 Expr *CountExpr,
15328 bool CountInBytes,
15329 bool OrNull);
15330
15331 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
15332 /// expression is uninstantiated. If instantiated it will apply the
15333 /// appropriate address space to the type. This function allows dependent
15334 /// template variables to be used in conjunction with the address_space
15335 /// attribute
15336 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
15337 SourceLocation AttrLoc);
15338
15339 /// Same as above, but constructs the AddressSpace index if not provided.
15341 SourceLocation AttrLoc);
15342
15344
15346
15347 /// Build a function type.
15348 ///
15349 /// This routine checks the function type according to C++ rules and
15350 /// under the assumption that the result type and parameter types have
15351 /// just been instantiated from a template. It therefore duplicates
15352 /// some of the behavior of GetTypeForDeclarator, but in a much
15353 /// simpler form that is only suitable for this narrow use case.
15354 ///
15355 /// \param T The return type of the function.
15356 ///
15357 /// \param ParamTypes The parameter types of the function. This array
15358 /// will be modified to account for adjustments to the types of the
15359 /// function parameters.
15360 ///
15361 /// \param Loc The location of the entity whose type involves this
15362 /// function type or, if there is no such entity, the location of the
15363 /// type that will have function type.
15364 ///
15365 /// \param Entity The name of the entity that involves the function
15366 /// type, if known.
15367 ///
15368 /// \param EPI Extra information about the function type. Usually this will
15369 /// be taken from an existing function with the same prototype.
15370 ///
15371 /// \returns A suitable function type, if there are no errors. The
15372 /// unqualified type will always be a FunctionProtoType.
15373 /// Otherwise, returns a NULL type.
15375 SourceLocation Loc, DeclarationName Entity,
15377
15378 /// Build a member pointer type \c T Class::*.
15379 ///
15380 /// \param T the type to which the member pointer refers.
15381 /// \param Class the class type into which the member pointer points.
15382 /// \param Loc the location where this type begins
15383 /// \param Entity the name of the entity that will have this member pointer
15384 /// type
15385 ///
15386 /// \returns a member pointer type, if successful, or a NULL type if there was
15387 /// an error.
15389 CXXRecordDecl *Cls, SourceLocation Loc,
15390 DeclarationName Entity);
15391
15392 /// Build a block pointer type.
15393 ///
15394 /// \param T The type to which we'll be building a block pointer.
15395 ///
15396 /// \param Loc The source location, used for diagnostics.
15397 ///
15398 /// \param Entity The name of the entity that involves the block pointer
15399 /// type, if known.
15400 ///
15401 /// \returns A suitable block pointer type, if there are no
15402 /// errors. Otherwise, returns a NULL type.
15404 DeclarationName Entity);
15405
15406 /// Build a paren type including \p T.
15409
15410 /// Build a Read-only Pipe type.
15411 ///
15412 /// \param T The type to which we'll be building a Pipe.
15413 ///
15414 /// \param Loc We do not use it for now.
15415 ///
15416 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15417 /// a NULL type.
15419
15420 /// Build a Write-only Pipe type.
15421 ///
15422 /// \param T The type to which we'll be building a Pipe.
15423 ///
15424 /// \param Loc We do not use it for now.
15425 ///
15426 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15427 /// a NULL type.
15429
15430 /// Build a bit-precise integer type.
15431 ///
15432 /// \param IsUnsigned Boolean representing the signedness of the type.
15433 ///
15434 /// \param BitWidth Size of this int type in bits, or an expression
15435 /// representing that.
15436 ///
15437 /// \param Loc Location of the keyword.
15438 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
15439
15440 /// GetTypeForDeclarator - Convert the type for the specified
15441 /// declarator to Type instances.
15442 ///
15443 /// The result of this call will never be null, but the associated
15444 /// type may be a null type if there's an unrecoverable error.
15447
15448 /// Package the given type and TSI into a ParsedType.
15451 TypeSourceInfo **TInfo = nullptr);
15452
15454
15455 // Check whether the size of array element of type \p EltTy is a multiple of
15456 // its alignment and return false if it isn't.
15458
15459 void
15460 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
15461 SourceLocation FallbackLoc,
15462 SourceLocation ConstQualLoc = SourceLocation(),
15463 SourceLocation VolatileQualLoc = SourceLocation(),
15464 SourceLocation RestrictQualLoc = SourceLocation(),
15465 SourceLocation AtomicQualLoc = SourceLocation(),
15466 SourceLocation UnalignedQualLoc = SourceLocation());
15467
15468 /// Retrieve the keyword associated
15470
15471 /// Adjust the calling convention of a method to be the ABI default if it
15472 /// wasn't specified explicitly. This handles method types formed from
15473 /// function type typedefs and typename template arguments.
15474 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
15475 bool IsCtorOrDtor, SourceLocation Loc);
15476
15477 // Check if there is an explicit attribute, but only look through parens.
15478 // The intent is to look for an attribute on the current declarator, but not
15479 // one that came from a typedef.
15481
15482 /// Check whether a nullability type specifier can be added to the given
15483 /// type through some means not written in source (e.g. API notes).
15484 ///
15485 /// \param Type The type to which the nullability specifier will be
15486 /// added. On success, this type will be updated appropriately.
15487 ///
15488 /// \param Nullability The nullability specifier to add.
15489 ///
15490 /// \param DiagLoc The location to use for diagnostics.
15491 ///
15492 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
15493 /// array type (e.g., because it will decay to a pointer).
15494 ///
15495 /// \param OverrideExisting Whether to override an existing, locally-specified
15496 /// nullability specifier rather than complaining about the conflict.
15497 ///
15498 /// \returns true if nullability cannot be applied, false otherwise.
15500 NullabilityKind Nullability,
15501 SourceLocation DiagLoc,
15502 bool AllowArrayTypes,
15503 bool OverrideExisting);
15504
15505 /// Check whether the given variable declaration has a size that fits within
15506 /// the address space it is declared in. This issues a diagnostic if not.
15507 ///
15508 /// \param VD The variable declaration to check the size of.
15509 ///
15510 /// \param AS The address space to check the size of \p VD against.
15511 ///
15512 /// \returns true if the variable's size fits within the address space, false
15513 /// otherwise.
15514 bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS);
15515
15516 /// Get the type of expression E, triggering instantiation to complete the
15517 /// type if necessary -- that is, if the expression refers to a templated
15518 /// static data member of incomplete array type.
15519 ///
15520 /// May still return an incomplete type if instantiation was not possible or
15521 /// if the type is incomplete for a different reason. Use
15522 /// RequireCompleteExprType instead if a diagnostic is expected for an
15523 /// incomplete expression type.
15525
15527
15528 /// Ensure that the type of the given expression is complete.
15529 ///
15530 /// This routine checks whether the expression \p E has a complete type. If
15531 /// the expression refers to an instantiable construct, that instantiation is
15532 /// performed as needed to complete its type. Furthermore
15533 /// Sema::RequireCompleteType is called for the expression's type (or in the
15534 /// case of a reference type, the referred-to type).
15535 ///
15536 /// \param E The expression whose type is required to be complete.
15537 /// \param Kind Selects which completeness rules should be applied.
15538 /// \param Diagnoser The object that will emit a diagnostic if the type is
15539 /// incomplete.
15540 ///
15541 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
15542 /// otherwise.
15544 TypeDiagnoser &Diagnoser);
15545 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
15546
15547 template <typename... Ts>
15548 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
15549 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15551 }
15552
15553 // Returns the underlying type of a decltype with the given expression.
15555
15557 /// If AsUnevaluated is false, E is treated as though it were an evaluated
15558 /// context, such as when building a type for decltype(auto).
15559 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
15560
15561 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
15562 SourceLocation Loc,
15563 SourceLocation EllipsisLoc);
15564 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
15565 SourceLocation Loc, SourceLocation EllipsisLoc,
15566 bool FullySubstituted = false,
15567 ArrayRef<QualType> Expansions = {});
15568
15569 using UTTKind = UnaryTransformType::UTTKind;
15571 SourceLocation Loc);
15577 SourceLocation Loc);
15579 SourceLocation Loc);
15581 SourceLocation Loc);
15582
15584 return BuiltinRemoveReference(BaseType, UTTKind::RemoveCVRef, Loc);
15585 }
15586
15588 SourceLocation Loc);
15590 SourceLocation Loc);
15591
15592 bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
15593
15594 /// Ensure that the type T is a literal type.
15595 ///
15596 /// This routine checks whether the type @p T is a literal type. If @p T is an
15597 /// incomplete type, an attempt is made to complete it. If @p T is a literal
15598 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
15599 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
15600 /// it the type @p T), along with notes explaining why the type is not a
15601 /// literal type, and returns true.
15602 ///
15603 /// @param Loc The location in the source that the non-literal type
15604 /// diagnostic should refer to.
15605 ///
15606 /// @param T The type that this routine is examining for literalness.
15607 ///
15608 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
15609 ///
15610 /// @returns @c true if @p T is not a literal type and a diagnostic was
15611 /// emitted, @c false otherwise.
15613 TypeDiagnoser &Diagnoser);
15614 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
15615
15616 template <typename... Ts>
15617 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID,
15618 const Ts &...Args) {
15619 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15620 return RequireLiteralType(Loc, T, Diagnoser);
15621 }
15622
15625 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
15626 }
15627
15628 /// Ensure that the type T is a complete type.
15629 ///
15630 /// This routine checks whether the type @p T is complete in any
15631 /// context where a complete type is required. If @p T is a complete
15632 /// type, returns false. If @p T is a class template specialization,
15633 /// this routine then attempts to perform class template
15634 /// instantiation. If instantiation fails, or if @p T is incomplete
15635 /// and cannot be completed, issues the diagnostic @p diag (giving it
15636 /// the type @p T) and returns true.
15637 ///
15638 /// @param Loc The location in the source that the incomplete type
15639 /// diagnostic should refer to.
15640 ///
15641 /// @param T The type that this routine is examining for completeness.
15642 ///
15643 /// @param Kind Selects which completeness rules should be applied.
15644 ///
15645 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
15646 /// @c false otherwise.
15648 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
15650 CompleteTypeKind Kind, unsigned DiagID);
15651
15653 TypeDiagnoser &Diagnoser) {
15654 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, Diagnoser);
15655 }
15656 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID) {
15657 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, DiagID);
15658 }
15659
15660 template <typename... Ts>
15661 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID,
15662 const Ts &...Args) {
15663 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15664 return RequireCompleteType(Loc, T, Diagnoser);
15665 }
15666
15667 /// Determine whether a declaration is visible to name lookup.
15668 bool isVisible(const NamedDecl *D) {
15669 return D->isUnconditionallyVisible() ||
15670 isAcceptableSlow(D, AcceptableKind::Visible);
15671 }
15672
15673 /// Determine whether a declaration is reachable.
15674 bool isReachable(const NamedDecl *D) {
15675 // All visible declarations are reachable.
15676 return D->isUnconditionallyVisible() ||
15677 isAcceptableSlow(D, AcceptableKind::Reachable);
15678 }
15679
15680 /// Determine whether a declaration is acceptable (visible/reachable).
15682 return Kind == AcceptableKind::Visible ? isVisible(D) : isReachable(D);
15683 }
15684
15685 /// Determine if \p D and \p Suggested have a structurally compatible
15686 /// layout as described in C11 6.2.7/1.
15687 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15688
15689 /// Determine if \p D has a visible definition. If not, suggest a declaration
15690 /// that should be made visible to expose the definition.
15691 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15692 bool OnlyNeedComplete = false);
15694 NamedDecl *Hidden;
15695 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15696 }
15697 /// Determine if \p D has a definition which allows we redefine it in current
15698 /// TU. \p Suggested is the definition that should be made visible to expose
15699 /// the definition.
15700 bool isRedefinitionAllowedFor(NamedDecl *D, SourceLocation NewDefinitionLoc,
15701 NamedDecl **Suggested, bool &Visible);
15703 bool &Visible) {
15704 NamedDecl *Hidden;
15705 return isRedefinitionAllowedFor(const_cast<NamedDecl *>(D), NewLoc, &Hidden,
15706 Visible);
15707 }
15708
15709 /// Determine if \p D has a reachable definition. If not, suggest a
15710 /// declaration that should be made reachable to expose the definition.
15711 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15712 bool OnlyNeedComplete = false);
15714 NamedDecl *Hidden;
15715 return hasReachableDefinition(D, &Hidden);
15716 }
15717
15718 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15719 AcceptableKind Kind,
15720 bool OnlyNeedComplete = false);
15722 NamedDecl *Hidden;
15723 return hasAcceptableDefinition(D, &Hidden, Kind);
15724 }
15725
15726 /// Determine if a definition at \p NewLoc coincides with \p PrevD.
15727 ///
15728 /// Including the same header as a non-modular and a modular allows to process
15729 /// its content twice despite guards against multiple inclusions. To handle
15730 /// such cases this method allows to detect if a currently-parsed decl is at
15731 /// the same location as an existing decl imported from a module.
15732 bool isFromSameSingleIncludeHeader(const Decl *PrevD, SourceLocation NewLoc);
15733
15734 /// Try to parse the conditional expression attached to an effect attribute
15735 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15736 /// optional on error.
15737 std::optional<FunctionEffectMode>
15738 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15739
15740 void ActOnCleanupAttr(Decl *D, const Attr *A);
15741 void ActOnInitPriorityAttr(Decl *D, const Attr *A);
15742
15743private:
15744 /// The implementation of RequireCompleteType
15745 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15746 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15747
15748 /// Nullability type specifiers.
15749 IdentifierInfo *Ident__Nonnull = nullptr;
15750 IdentifierInfo *Ident__Nullable = nullptr;
15751 IdentifierInfo *Ident__Nullable_result = nullptr;
15752 IdentifierInfo *Ident__Null_unspecified = nullptr;
15753
15754 ///@}
15755
15756 //
15757 //
15758 // -------------------------------------------------------------------------
15759 //
15760 //
15761
15762 /// \name FixIt Helpers
15763 /// Implementations are in SemaFixItUtils.cpp
15764 ///@{
15765
15766public:
15767 /// Get a string to suggest for zero-initialization of a type.
15769 SourceLocation Loc) const;
15770 std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const;
15771
15772 ///@}
15773
15774 //
15775 //
15776 // -------------------------------------------------------------------------
15777 //
15778 //
15779
15780 /// \name Function Effects
15781 /// Implementations are in SemaFunctionEffects.cpp
15782 ///@{
15783public:
15786
15789 std::optional<FunctionEffectWithCondition>
15790 Old; // Invalid when 'Kind' is 'Added'.
15791 std::optional<FunctionEffectWithCondition>
15792 New; // Invalid when 'Kind' is 'Removed'.
15793
15794 StringRef effectName() const {
15795 if (Old)
15796 return Old.value().Effect.name();
15797 return New.value().Effect.name();
15798 }
15799
15800 /// Describes the result of effects differing between a base class's virtual
15801 /// method and an overriding method in a subclass.
15802 enum class OverrideResult {
15805 Merge // Merge missing effect from base to derived.
15806 };
15807
15808 /// Return true if adding or removing the effect as part of a type
15809 /// conversion should generate a diagnostic.
15811 const FunctionEffectsRef &SrcFX,
15812 QualType DstType,
15813 const FunctionEffectsRef &DstFX) const;
15814
15815 /// Return true if adding or removing the effect in a redeclaration should
15816 /// generate a diagnostic.
15817 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15818 const FunctionEffectsRef &OldFX,
15819 const FunctionDecl &NewFunction,
15820 const FunctionEffectsRef &NewFX) const;
15821
15822 /// Return true if adding or removing the effect in a C++ virtual method
15823 /// override should generate a diagnostic.
15825 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15826 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15827 };
15828
15829 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15830 /// Caller should short-circuit by checking for equality first.
15832 const FunctionEffectsRef &New);
15833 };
15834
15835 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15836 /// FunctionEffectsRef to be verified.
15838
15839 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15840 /// are all null.
15842
15843public:
15844 /// Warn and return true if adding a function effect to a set would create a
15845 /// conflict.
15848 SourceLocation NewAttrLoc);
15849
15850 // Report a failure to merge function effects between declarations due to a
15851 // conflict.
15852 void
15854 SourceLocation NewLoc,
15855 SourceLocation OldLoc);
15856
15857 /// Inline checks from the start of maybeAddDeclWithEffects, to
15858 /// minimize performance impact on code not using effects.
15859 template <class FuncOrBlockDecl>
15860 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15861 if (Context.hasAnyFunctionEffects())
15862 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15864 }
15865
15866 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15867 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15868
15869 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15870 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15871
15873
15874 ///@}
15875
15876 //
15877 //
15878 // -------------------------------------------------------------------------
15879 //
15880 //
15881
15882 /// \name Expansion Statements
15883 /// Implementations are in SemaExpand.cpp
15884 ///@{
15885public:
15886 CXXExpansionStmtDecl *ActOnCXXExpansionStmtDecl(unsigned TemplateDepth,
15887 SourceLocation TemplateKWLoc);
15888
15892
15894 SourceLocation LBraceLoc,
15895 SourceLocation RBraceLoc);
15896
15898 CXXExpansionStmtDecl *ESD, Stmt *Init, Stmt *ExpansionVarStmt,
15899 Expr *ExpansionInitializer, SourceLocation LParenLoc,
15900 SourceLocation ColonLoc, SourceLocation RParenLoc,
15901 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps);
15902
15903 StmtResult FinishCXXExpansionStmt(Stmt *Expansion, Stmt *Body);
15904
15906 Stmt *ExpansionVar,
15907 SourceLocation LParenLoc,
15908 SourceLocation ColonLoc,
15909 SourceLocation RParenLoc);
15910
15912 CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVarStmt,
15913 Expr *ExpansionInitializer, SourceLocation LParenLoc,
15914 SourceLocation ColonLoc, SourceLocation RParenLoc,
15915 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
15916
15917 ExprResult BuildCXXExpansionSelectExpr(InitListExpr *Range, Expr *Idx);
15918
15919 std::optional<uint64_t>
15920 ComputeExpansionSize(CXXExpansionStmtPattern *Expansion);
15921 ///@}
15922};
15923
15927
15928/// Contains a late templated function.
15929/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15932 /// The template function declaration to be late parsed.
15934 /// Floating-point options in the point of definition.
15936};
15937
15938template <>
15940 PragmaMsStackAction Action,
15941 llvm::StringRef StackSlotLabel,
15943
15944} // end namespace clang
15945
15946#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 enumerations for traits support.
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.
Token Tok
The Token.
FormatToken * Previous
The previous token in the unwrapped line.
static const Decl * getCanonicalDecl(const Decl *D)
Result
Implement __builtin_bit_cast and related operations.
#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.
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.
llvm::json::Object Object
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:50
static void CheckFormatString(Sema &S, const FormatStringLiteral *FExpr, const StringLiteral *ReferenceFormatString, const Expr *OrigFormatExpr, ArrayRef< const Expr * > Args, Sema::FormatArgumentPassingKind APK, unsigned format_idx, unsigned firstDataArg, FormatStringType Type, bool inFunctionCall, VariadicCallType CallType, llvm::SmallBitVector &CheckedVarArgs, UncoveredArgHandler &UncoveredArg, bool IgnoreStringsWithoutSpecifiers)
static void CheckBoolLikeConversion(Sema &S, Expr *E, SourceLocation CC)
Check conversion of given expression to boolean.
Sema::AllowedExplicit AllowedExplicit
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.
C Language Family Type Representation.
Represents a member of a struct/union/class.
Definition Decl.h:3295
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:123
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:239
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:427
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:2765
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3813
Attr - This represents one attribute.
Definition Attr.h:46
Represents a C++ declaration that introduces decls from somewhere else.
Definition DeclCXX.h:3526
A binding in a decomposition declaration.
Definition DeclCXX.h:4215
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4810
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:2642
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2977
Represents a C++ base or member initializer.
Definition DeclCXX.h:2407
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2630
Represents a C++ destructor within a class.
Definition DeclCXX.h:2907
Represents a C++26 expansion statement declaration.
CXXExpansionStmtPattern - Represents an unexpanded C++ expansion statement.
Definition StmtCXX.h:675
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:2150
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:76
Represents the this expression in C++.
Definition ExprCXX.h:1158
CXXTryStmt - A C++ try block, including all handlers.
Definition StmtCXX.h:70
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2987
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:5082
CaseStmt - Represent a case statement.
Definition Stmt.h:1932
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3720
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:3707
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:1399
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1290
Captures information about "declaration specifiers".
Definition DeclSpec.h:220
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition Stmt.h:1643
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:871
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:854
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:995
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:781
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1952
A decomposition declaration.
Definition DeclCXX.h:4279
Captures a template argument whose value has been deduced via c++ template argument deduction.
Definition Template.h:339
A dependently-generated diagnostic.
Designation - Represent a full designation, which is a sequence of designators.
Definition Designator.h:221
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:3558
Represents an enum.
Definition Decl.h:4146
Store information needed for an explicit specifier.
Definition DeclCXX.h:1949
The return type of classify().
Definition Expr.h:340
This represents one expression.
Definition Expr.h:113
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:195
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) 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:822
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:283
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:3295
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:265
FileNullability & operator[](FileID file)
Definition Sema.h:276
FileNullability Nullability
Definition Sema.h:272
Declaration of a friend template.
Represents a function declaration or definition.
Definition Decl.h:2059
A mutable set of FunctionEffect::Kind.
Definition TypeBase.h:5263
SmallVector< Conflict > Conflicts
Definition TypeBase.h:5377
Kind
Identifies the particular effect.
Definition TypeBase.h:5025
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5209
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
Definition ExprCXX.h:4894
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5409
Declaration of a template function.
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition TypeBase.h:4631
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4605
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:623
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3602
Describes an C or C++ initializer list.
Definition Expr.h:5352
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:525
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:377
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4451
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4397
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:4973
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3408
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3744
Abstract interface for a module loader.
Describes a module or submodule.
Definition Module.h:340
bool isModulePartitionImplementation() const
Is this a module partition implementation unit.
Definition Module.h:877
Module(ModuleConstructorTag, StringRef Name, SourceLocation DefinitionLoc, Module *Parent, bool IsFramework, bool IsExplicit, unsigned VisibilityID)
Construct a new module or submodule.
Definition Module.cpp:36
bool isModuleImplementation() const
Is this a module implementation.
Definition Module.h:882
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:275
Represent a C++ namespace.
Definition Decl.h:593
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:1160
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition TypeBase.h:8080
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:1161
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition Attr.h:279
static constexpr unsigned IdxBitWidth
Definition Attr.h:281
ParenExpr - This represents a parenthesized expression, e.g.
Definition Expr.h:2226
Represents a parameter to a function.
Definition Decl.h:1820
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
ParsedAttributes - A collection of parsed attributes.
Definition ParsedAttr.h:950
Represents the parsed form of a C++ template argument.
void Emit(const DiagnosticBuilder &DB) const
PreferredTypeBuilder(ASTContext *Ctx, bool Enabled)
Definition Sema.h:299
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:335
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Stores the type being destroyed by a pseudo-destructor expression.
Definition ExprCXX.h:2698
A (possibly-)qualified type.
Definition TypeBase.h:938
The collection of all-type qualifiers we support.
Definition TypeBase.h:332
Represents a struct/union/class.
Definition Decl.h:4460
Represents the body of a requires-expression.
Definition DeclCXX.h:2119
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:1875
bool operator==(const AlignPackInfo &Info) const
Definition Sema.h:1935
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition Sema.h:1907
unsigned getPackNumber() const
Definition Sema.h:1925
bool IsXLStack() const
Definition Sema.h:1933
bool IsPackSet() const
Definition Sema.h:1927
AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
Definition Sema.h:1881
bool IsAlignAttr() const
Definition Sema.h:1921
bool IsPackAttr() const
Definition Sema.h:1919
bool operator!=(const AlignPackInfo &Info) const
Definition Sema.h:1941
AlignPackInfo(bool IsXL)
Definition Sema.h:1885
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Definition Sema.h:1892
Mode getAlignMode() const
Definition Sema.h:1923
ArgPackSubstIndexRAII(Sema &Self, UnsignedOrNone NewSubstIndex)
Definition Sema.h:13789
ArgPackSubstIndexRAII & operator=(const ArgPackSubstIndexRAII &)=delete
ArgPackSubstIndexRAII(const ArgPackSubstIndexRAII &)=delete
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8330
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8335
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition Sema.h:8322
std::tuple< const Ts &... > Args
Definition Sema.h:8319
CXXThisScopeRAII(const CXXThisScopeRAII &)=delete
CXXThisScopeRAII & operator=(const CXXThisScopeRAII &)=delete
CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals, bool Enabled=true)
Introduce a new scope where 'this' may be allowed (when enabled), using the given declaration (which ...
CompoundScopeRAII & operator=(const CompoundScopeRAII &)=delete
CompoundScopeRAII(Sema &S, bool IsStmtExpr=false)
Definition Sema.h:1315
CompoundScopeRAII(const CompoundScopeRAII &)=delete
std::pair< VarDecl *, Expr * > get() const
Definition Sema.h:7870
std::optional< bool > getKnownValue() const
Definition Sema.h:7874
A RAII object to temporarily push a declaration context.
Definition Sema.h:3534
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition Sema.h:3544
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:10385
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:10390
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.
DeferDiagsRAII(Sema &S, bool DeferDiags)
Definition Sema.h:10113
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:1384
DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool)
Enter a new scope.
Definition Sema.h:1403
void popUndelayed(DelayedDiagnosticsState state)
Undo a previous pushUndelayed().
Definition Sema.h:1427
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
Definition Sema.h:1396
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition Sema.h:1399
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:1413
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
Definition Sema.h:1419
A helper class for building up ExtParameterInfos.
Definition Sema.h:13153
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:13172
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition Sema.h:13160
FPFeaturesStateRAII(const FPFeaturesStateRAII &)=delete
FPOptionsOverride getOverrides()
Definition Sema.h:14185
FPFeaturesStateRAII & operator=(const FPFeaturesStateRAII &)=delete
FpPragmaStackSaveRAII(const FpPragmaStackSaveRAII &)=delete
FpPragmaStackSaveRAII & operator=(const FpPragmaStackSaveRAII &)=delete
FullExprArg(Sema &actions)
Definition Sema.h:7814
ExprResult release()
Definition Sema.h:7816
friend class Sema
Definition Sema.h:7825
Expr * get() const
Definition Sema.h:7818
GlobalEagerInstantiationScope(const GlobalEagerInstantiationScope &)=delete
GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
Definition Sema.h:14197
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:10449
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:10441
unsigned size() const
The number of exceptions in the exception specification.
Definition Sema.h:5599
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition Sema.h:5592
const QualType * data() const
The set of exceptions in the exception specification.
Definition Sema.h:5602
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:5608
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition Sema.h:5615
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:14148
LocalEagerInstantiationScope(const LocalEagerInstantiationScope &)=delete
static NameClassification DependentNonType()
Definition Sema.h:3760
static NameClassification VarTemplate(TemplateName Name)
Definition Sema.h:3770
ExprResult getExpression() const
Definition Sema.h:3796
NameClassification(const IdentifierInfo *Keyword)
Definition Sema.h:3733
static NameClassification Unknown()
Definition Sema.h:3740
static NameClassification OverloadSet(ExprResult E)
Definition Sema.h:3744
NameClassificationKind getKind() const
Definition Sema.h:3794
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition Sema.h:3788
static NameClassification FunctionTemplate(TemplateName Name)
Definition Sema.h:3776
NamedDecl * getNonTypeDecl() const
Definition Sema.h:3806
NameClassification(ParsedType Type)
Definition Sema.h:3730
TemplateName getTemplateName() const
Definition Sema.h:3811
ParsedType getType() const
Definition Sema.h:3801
TemplateNameKind getTemplateNameKind() const
Definition Sema.h:3820
static NameClassification NonType(NamedDecl *D)
Definition Sema.h:3750
static NameClassification Concept(TemplateName Name)
Definition Sema.h:3782
static NameClassification UndeclaredNonType()
Definition Sema.h:3756
static NameClassification TypeTemplate(TemplateName Name)
Definition Sema.h:3764
static NameClassification Error()
Definition Sema.h:3736
void operator()(sema::FunctionScopeInfo *Scope) const
Definition Sema.cpp:2628
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:11521
SourceLocation getTemplateKeywordLoc() const
Definition Sema.h:11523
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition Sema.h:11518
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12573
SFINAETrap & operator=(const SFINAETrap &)=delete
SFINAETrap(const SFINAETrap &)=delete
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition Sema.h:12607
SFINAETrap(Sema &S, bool WithAccessChecking=false)
Definition Sema.h:12589
bool withAccessChecking() const
Definition Sema.h:12610
sema::TemplateDeductionInfo * getDeductionInfo() const
Definition Sema.h:12602
SFINAETrap(Sema &S, sema::TemplateDeductionInfo &Info)
Definition Sema.h:12592
SatisfactionStackResetRAII(const SatisfactionStackResetRAII &)=delete
SatisfactionStackResetRAII & operator=(const SatisfactionStackResetRAII &)=delete
ScopedCodeSynthesisContext(Sema &S, const CodeSynthesisContext &Ctx)
Definition Sema.h:13716
ScopedCodeSynthesisContext & operator=(const ScopedCodeSynthesisContext &)=delete
ScopedCodeSynthesisContext(const ScopedCodeSynthesisContext &)=delete
A derivative of BoundTypeDiagnoser for which the diagnostic's type parameter is preceded by a 0/1 enu...
Definition Sema.h:8347
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8352
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8349
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition Sema.h:9365
CXXMethodDecl * getMethod() const
Definition Sema.h:9368
void setMethod(CXXMethodDecl *MD)
Definition Sema.h:9369
void addContextNote(SourceLocation UseLoc)
Definition Sema.h:13682
SynthesizedFunctionScope(const SynthesizedFunctionScope &)=delete
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition Sema.h:13670
SynthesizedFunctionScope & operator=(const SynthesizedFunctionScope &)=delete
SourceLocation getLocation() const
Definition Sema.h:12331
bool ContainsDecl(const NamedDecl *ND) const
Definition Sema.h:12321
const DeclContext * getDeclContext() const
Definition Sema.h:12327
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition Sema.h:12305
const NamedDecl * getDecl() const
Definition Sema.h:12319
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition Sema.h:12304
const DeclContext * getLexicalDeclContext() const
Definition Sema.h:12323
TentativeAnalysisScope(Sema &SemaRef)
Definition Sema.h:12624
TentativeAnalysisScope & operator=(const TentativeAnalysisScope &)=delete
TentativeAnalysisScope(const TentativeAnalysisScope &)=delete
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition Sema.h:7773
virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc)
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:863
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:1446
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:3638
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:13747
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:8256
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition SemaAttr.cpp:546
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13731
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:11039
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13182
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition Sema.cpp:2701
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1137
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:1589
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:14133
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void PopParsingClass(ParsingClassState state)
Definition Sema.h:6597
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:10126
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition Sema.cpp:1102
bool containsUnexpandedParameterPacks(Declarator &D)
Determine whether the given declarator contains any unexpanded parameter packs.
std::optional< QualType > BuiltinVectorMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::None)
std::optional< uint64_t > ComputeExpansionSize(CXXExpansionStmtPattern *Expansion)
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:6586
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)
bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc)
void ActOnPragmaExport(IdentifierInfo *IdentId, SourceLocation ExportNameLoc, Scope *curScope)
ActonPragmaExport - called on well-formed '#pragma export'.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs, SmallVectorImpl< const Attr * > &OutAttrs)
Process the attributes before creating an attributed statement.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition Sema.h:8302
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
llvm::DenseSet< Module * > & getLookupModules()
Get the set of additional modules that should be checked during name lookup.
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
bool isAlwaysConstantEvaluatedContext() const
Definition Sema.h:8224
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:970
bool isAttrContext() const
Definition Sema.h:6993
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 BuildBoolLiteral(SourceLocation Loc, bool Value)
Build a boolean-typed literal expression.
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:8295
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition Sema.cpp:2801
bool isFromSameSingleIncludeHeader(const Decl *PrevD, SourceLocation NewLoc)
Determine if a definition at NewLoc coincides with PrevD.
LookupNameKind
Describes the kind of name lookup to perform.
Definition Sema.h:9390
@ LookupLabel
Label name lookup.
Definition Sema.h:9399
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9394
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition Sema.h:9421
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition Sema.h:9413
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition Sema.h:9435
@ LookupLocalFriendName
Look up a friend of a local class.
Definition Sema.h:9429
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition Sema.h:9431
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition Sema.h:9426
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition Sema.h:9406
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition Sema.h:9433
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9417
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9402
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition Sema.h:9409
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9397
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition Sema.h:9437
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9439
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:418
llvm::DenseMap< IdentifierInfo *, SrcLocSet > IdentifierSourceLocations
Definition Sema.h:9344
UnaryTransformType::UTTKind UTTKind
Definition Sema.h:15569
bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend)
Check that the expression co_await promise.final_suspend() shall not be potentially-throwing.
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
void ActOnPragmaAttributePop(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
Called on well-formed '#pragma clang attribute pop'.
void ActOnPopScope(SourceLocation Loc, Scope *S)
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx, SourceLocation RBLoc)
QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement)
Completely replace the auto in TypeWithAuto by Replacement.
ExprResult ActOnConstantExpression(ExprResult Res)
void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name, StringRef Value)
ActOnPragmaDetectMismatch - Call on well-formed #pragma detect_mismatch.
Definition SemaAttr.cpp:671
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, Expr *Operand, SourceLocation RParen)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:6338
SemaM68k & M68k()
Definition Sema.h:1496
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:13801
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.
std::pair< const CXXRecordDecl *, unsigned > SpecialMemberCacheKey
Definition Sema.h:9375
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:1379
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
bool BuildTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc, bool AllowUnexpandedPack)
void deduceOpenCLAddressSpace(VarDecl *decl)
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the pragma attribute stack.
Definition Sema.h:2143
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:9830
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:4919
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:5148
OpaquePtr< QualType > TypeTy
Definition Sema.h:1297
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:169
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
TypeSourceInfo * SubstFriendType(TypeSourceInfo *TSI, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity)
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:370
void PrintContextStack()
Definition Sema.h:13810
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:657
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
SemaOpenMP & OpenMP()
Definition Sema.h:1531
void CheckDelegatingCtorCycles()
llvm::SmallSet< SourceLocation, 2 > SrcLocSet
Definition Sema.h:9343
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:2318
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6376
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition Sema.h:9706
bool FormatStringHasSArg(const StringLiteral *FExpr)
StmtResult BuildCXXForRangeRangeVar(Scope *S, Expr *Range, QualType Type, bool IsConstexpr=false)
Build the range variable of a range-based for loop or iterating expansion statement and return its De...
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:1367
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope)
bool BoundsSafetyCheckAssignmentToCountAttrPtr(QualType LHSTy, Expr *RHSExpr, AssignmentAction Action, SourceLocation Loc, const ValueDecl *Assignee, bool ShowFullyQualifiedAssigneeName)
Perform Bounds Safety Semantic checks for assigning to a __counted_by or __counted_by_or_null pointer...
void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode)
Called to set constant rounding mode for floating point operations.
llvm::DenseMap< const EnumDecl *, llvm::SmallVector< llvm::APSInt > > AssignEnumCache
A cache of enumerator values for enums checked by -Wassign-enum.
Definition Sema.h:3589
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:15237
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:1258
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:4821
void CheckFloatComparison(SourceLocation Loc, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
PragmaClangSection PragmaClangRodataSection
Definition Sema.h:1847
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:15693
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment, const IdentifierInfo *InferredPlatformII=nullptr)
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
Definition Sema.h:6559
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:5247
void emitAndClearUnusedLocalTypedefWarnings()
Definition Sema.cpp:1216
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:6540
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl)
Definition SemaStmt.cpp:86
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:1247
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:1471
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:376
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
Definition Sema.h:7890
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7892
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
Definition Sema.h:7891
void LateTemplateParserCB(void *P, LateParsedTemplate &LPT)
Callback to the parser to parse templated functions when needed.
Definition Sema.h:1348
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:15652
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition Sema.h:15243
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
Decl * ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
bool needsRebuildOfDefaultArgOrInit() const
Definition Sema.h:8244
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:9944
@ Interface
'export module X;'
Definition Sema.h:9941
@ Implementation
'module X;'
Definition Sema.h:9942
@ PartitionInterface
'export module X:Y;'
Definition Sema.h:9943
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition Sema.h:8382
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1240
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:9653
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition Sema.h:10468
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10471
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10477
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10475
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
Definition SemaAttr.cpp:318
void RefersToMemberWithReducedAlignment(Expr *E, llvm::function_ref< void(Expr *, RecordDecl *, FieldDecl *, CharUnits)> Action)
This function calls Action when it determines that E designates a misaligned member due to the packed...
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType)
Definition Sema.h:1805
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
@ AR_dependent
Definition Sema.h:1690
@ AR_accessible
Definition Sema.h:1688
@ AR_inaccessible
Definition Sema.h:1689
@ AR_delayed
Definition Sema.h:1691
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:15250
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
Definition Sema.h:15254
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:686
ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type, SourceLocation LParenLoc, Expr *CastExpr, SourceLocation RParenLoc)
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:934
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition Sema.h:6971
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2473
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,...
ExprResult BuildBuiltinBitCastExpr(SourceLocation KWLoc, TypeSourceInfo *TSI, Expr *Operand, SourceLocation RParenLoc)
Definition SemaCast.cpp:439
void AddTemplateParametersToLambdaCallOperator(CXXMethodDecl *CallOperator, CXXRecordDecl *Class, TemplateParameterList *TemplateParams)
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
class clang::Sema::DelayedDiagnostics DelayedDiagnostics
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
llvm::SmallPtrSet< ConstantExpr *, 4 > FailedImmediateInvocations
Definition Sema.h:8371
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition Sema.h:2078
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...
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
static SourceRange getPrintable(const Expr *E)
Definition Sema.h:15244
PragmaStack< StringLiteral * > CodeSegStack
Definition Sema.h:2072
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:15841
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2654
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:4979
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
Definition SemaStmt.cpp:486
SourceLocation getOptimizeOffPragmaLocation() const
Get the location for the currently active "\#pragma clang optimizeoff". If this location is invalid,...
Definition Sema.h:2152
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:6800
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
void ActOnPragmaMSComment(SourceLocation CommentLoc, PragmaMSCommentKind Kind, StringRef Arg)
ActOnPragmaMSComment - Called on well formed #pragma comment(kind, "arg").
Definition SemaAttr.cpp:663
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
QualType BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc)
Build an ext-vector type.
StmtResult BuildNonEnumeratingCXXExpansionStmtPattern(CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVarStmt, Expr *ExpansionInitializer, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
SmallVector< AlignPackIncludeState, 8 > AlignPackIncludeStack
Definition Sema.h:2067
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:11241
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:2753
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:4215
@ Default
= default ;
Definition Sema.h:4217
@ Delete
deleted-function-body
Definition Sema.h:4223
LiteralOperatorLookupResult LookupLiteralOperator(Scope *S, LookupResult &R, ArrayRef< QualType > ArgTys, bool AllowRaw, bool AllowTemplate, bool AllowStringTemplate, bool DiagnoseMissing, StringLiteral *StringLit=nullptr)
LookupLiteralOperator - Determine which literal operator should be used for a user-defined literal,...
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
bool RequireStructuralType(QualType T, SourceLocation Loc)
Require the given type to be a structural type, and diagnose if it is not.
ExprResult VerifyBitField(SourceLocation FieldLoc, const IdentifierInfo *FieldName, QualType FieldTy, bool IsMsStruct, Expr *BitWidth)
VerifyBitField - verifies that a bit field expression is an ICE and has the correct width,...
concepts::Requirement * ActOnSimpleRequirement(Expr *E)
bool CheckOverflowBehaviorTypeConversion(Expr *E, QualType T, SourceLocation CC)
Check for overflow behavior type related implicit conversion diagnostics.
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
Definition Sema.h:14095
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
Definition SemaStmt.cpp:49
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS)
Check whether the given variable declaration has a size that fits within the address space it is decl...
TemplateDeductionResult FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned NumExplicitlySpecified, FunctionDecl *&Specialization, sema::TemplateDeductionInfo &Info, SmallVectorImpl< OriginalCallArg > const *OriginalCallArgs, bool PartialOverloading, bool PartialOrdering, bool ForOverloadSetAddressResolution, llvm::function_ref< bool(bool)> CheckNonDependent=[](bool) { return false;})
Finish template argument deduction for a function template, checking the deduced template arguments f...
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
Definition Sema.cpp:1297
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:2079
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:1486
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.
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:888
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...
TemplateName BuildPackIndexingTemplateName(TemplateName Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< TemplateName > Expansions={})
PersonalityAttr * mergePersonalityAttr(Decl *D, FunctionDecl *Routine, const AttributeCommonInfo &CI)
bool IsInsideALocalClassWithinATemplateFunction()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition Sema.cpp:173
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
void ActOnCXXForRangeDecl(Decl *D, bool InExpansionStmt)
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)
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, const Designation &Desig, SourceLocation RParenLoc)
SemaSYCL & SYCL()
Definition Sema.h:1556
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:3028
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:6983
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:1768
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action, PragmaFloatControlKind Value)
ActOnPragmaFloatControl - Call on well-formed #pragma float_control.
Definition SemaAttr.cpp:706
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition SemaExpr.cpp:847
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition Sema.h:11486
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)
QualType CheckMatrixCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CheckTemplateArgumentKind
Specifies the context in which a particular template argument is being checked.
Definition Sema.h:12084
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition Sema.h:12095
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition Sema.h:12087
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition Sema.h:12091
bool SubstExprs(ArrayRef< Expr * > Exprs, bool IsCall, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< Expr * > &Outputs)
Substitute the given template arguments into a list of expressions, expanding pack expansions if requ...
BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, const ParsedAttributesView &Attrs, bool Virtual, AccessSpecifier Access, ParsedType basetype, SourceLocation BaseLoc, SourceLocation EllipsisLoc)
ActOnBaseSpecifier - Parsed a base specifier.
TypeSpecifierType isTagName(IdentifierInfo &II, Scope *S)
isTagName() - This method is called for error recovery purposes only to determine if the specified na...
Definition SemaDecl.cpp:689
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnPragmaMSPointersToMembers(LangOptions::PragmaMSPointersToMembersKind Kind, SourceLocation PragmaLoc)
ActOnPragmaMSPointersToMembers - called on well formed #pragma pointers_to_members(representation met...
Definition SemaAttr.cpp:760
bool CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old)
[module.interface]p6: A redeclaration of an entity X is implicitly exported if X was introduced by an...
void DiagnosePrecisionLossInComplexDivision()
ExprResult CheckUnevaluatedOperand(Expr *E)
void CheckTemplatePartialSpecialization(ClassTemplatePartialSpecializationDecl *Partial)
void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc, Expr *defarg)
ActOnParamDefaultArgument - Check whether the default argument provided for a function parameter is w...
bool DisableTypoCorrection
Tracks whether we are in a context where typo correction is disabled.
Definition Sema.h:9338
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
AvailabilityAttr * mergeAndInferAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment, const IdentifierInfo *InferredPlatformII)
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
SemaX86 & X86()
Definition Sema.h:1576
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.
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:13751
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:1304
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:8211
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:701
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:9349
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition Sema.h:7835
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:228
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:976
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow)
Perform conversions on the LHS of a member access expression.
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
llvm::DenseMap< IdentifierInfo *, PendingPragmaInfo > PendingExportedNames
Definition Sema.h:2360
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:932
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...
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateName NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
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:4441
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15617
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool CheckCaseExpression(Expr *E)
TypeResult ActOnPackIndexingDeducedTemplateSpecializationType(TemplateName Name, SourceLocation NameLoc)
void resetFPOptions(FPOptions FPO)
Definition Sema.h:11467
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition Sema.h:15721
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:9927
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:15233
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
SemaObjC & ObjC()
Definition Sema.h:1516
bool InOverflowBehaviorAssignmentContext
Track if we're currently analyzing overflow behavior types in assignment context.
Definition Sema.h:1371
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:2983
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:1441
TemplateName ActOnPackIndexingTemplateName(TemplateName Pattern, SourceLocation NameLoc, Expr *IndexExpr)
void CheckDelayedMemberExceptionSpecs()
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition SemaDecl.cpp:81
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
ExprResult BuildPackIndexingExpr(Expr *PackExpression, SourceLocation EllipsisLoc, Expr *IndexExpr, SourceLocation RSquareLoc, ArrayRef< Expr * > ExpandedExprs={}, bool FullySubstituted=false)
void InstantiateMemInitializers(CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl, const MultiLevelTemplateArgumentList &TemplateArgs)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ParsedType getDestructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
void ActOnPragmaMSAllocText(SourceLocation PragmaLocation, StringRef Section, const SmallVector< std::tuple< IdentifierInfo *, SourceLocation > > &Functions)
Called on well-formed #pragma alloc_text().
Definition SemaAttr.cpp:940
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition Sema.h:3207
bool captureSwiftVersionIndependentAPINotes()
Whether APINotes should be gathered for all applicable Swift language versions, without being applied...
Definition Sema.h:1671
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:2075
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void PrintInstantiationStack()
Definition Sema.h:13814
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:3628
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:768
bool isImmediateFunctionContext() const
Definition Sema.h:8236
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:935
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1077
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:676
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
Definition SemaExpr.cpp:778
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:6566
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:1433
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:6650
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:2071
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:777
void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, SourceLocation PragmaLoc)
ActOnPragmaOptionsAlign - Called on well formed #pragma options align.
Definition SemaAttr.cpp:377
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
Definition SemaExpr.cpp:897
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.
void LookupOverloadedUnaryOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded unary operator.
ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc, SourceLocation TildeLoc, UnqualifiedId &SecondTypeName)
bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S)
isMicrosoftMissingTypename - In Microsoft mode, within class scope, if a CXXScopeSpec's type is equal...
Definition SemaDecl.cpp:713
bool isConstantEvaluatedOverride
Used to change context to isConstantEvaluated without pushing a heavy ExpressionEvaluationContextReco...
Definition Sema.h:2639
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:6593
@ FRS_Success
Definition Sema.h:10856
@ FRS_DiagnosticIssued
Definition Sema.h:10858
@ FRS_NoViableFunction
Definition Sema.h:10857
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:14268
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:985
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
Definition Sema.h:9387
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:9341
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.
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)
friend class SubstituteParameterMappings
Definition Sema.h:15158
llvm::SmallVector< QualType, 4 > CurrentParameterCopyTypes
Stack of types that correspond to the parameter entities that are currently being copy-initialized.
Definition Sema.h:9079
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:15837
@ Conversions
Allow explicit conversion functions but not explicit constructors.
Definition Sema.h:10177
@ All
Allow both explicit conversion functions and explicit constructors.
Definition Sema.h:10179
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:1230
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition Sema.h:6581
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)
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, const Designation &Desig, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
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:1208
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:15029
Decl * BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy)
BuildAnonymousStructOrUnion - Handle the declaration of an anonymous structure or union.
bool CheckDeclCompatibleWithTemplateTemplate(TemplateDecl *Template, TemplateTemplateParmDecl *Param, const TemplateArgumentLoc &Arg)
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
void ActOnPragmaFPEvalMethod(SourceLocation Loc, LangOptions::FPEvalMethodKind Value)
Definition SemaAttr.cpp:679
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
Definition Sema.h:3651
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture, bool IsOpenMP=false)
Build a FieldDecl suitable to hold the given capture.
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:1773
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:2744
unsigned InventedParameterInfosStart
The index of the first InventedParameterInfo that refers to the current context.
Definition Sema.h:3531
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:2664
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:12263
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition Sema.h:12281
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition Sema.h:12271
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition Sema.h:12291
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:4970
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:1787
QualType BuiltinRemoveReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< TypeSourceInfo * > Types, ArrayRef< Expr * > Exprs)
ControllingExprOrType is either a TypeSourceInfo * or an Expr *.
ExprResult BuildCaptureInit(const sema::Capture &Capture, SourceLocation ImplicitCaptureLoc, bool IsOpenMPMapping=false)
Initialize the given capture with a suitable expression.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool StrictPackMatch=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
Definition Sema.h:8413
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
Definition SemaAttr.cpp:432
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
AssumedTemplateKind
Definition Sema.h:11536
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
Definition Sema.h:11543
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
Definition Sema.h:11540
bool CheckParamExceptionSpec(const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const FunctionProtoType *Target, bool SkipTargetFirstParameter, SourceLocation TargetLoc, const FunctionProtoType *Source, bool SkipSourceFirstParameter, SourceLocation SourceLoc)
CheckParamExceptionSpec - Check if the parameter and return types of the two functions have equivalen...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
Definition SemaAttr.cpp:838
StmtResult ActOnCXXExpansionStmtPattern(CXXExpansionStmtDecl *ESD, Stmt *Init, Stmt *ExpansionVarStmt, Expr *ExpansionInitializer, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps)
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:2746
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2492
ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS, NamedDecl *Found, SourceLocation NameLoc, const Token &NextToken)
Act on the result of classifying a name as a specific non-type declaration.
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl, ExprResult Operand, SourceLocation RParenLoc)
Definition SemaCast.cpp:427
SourceRange getExprRange(Expr *E) const
Definition SemaExpr.cpp:515
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:11472
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
Definition SemaAttr.cpp:170
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
Definition Sema.h:8271
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:15240
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition Sema.h:4659
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:1587
bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD)
void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI)
Add a no_cluster attribute to a particular declaration.
void addImplicitCallingConvAbiTag(FunctionDecl *FD)
Attach the ABI tag a standard calling convention variant requires, as an implicit abi_tag attribute.
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
Definition SemaStmt.cpp:406
FPOptions & getCurFPFeatures()
Definition Sema.h:930
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition Sema.h:8365
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:277
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:84
sema::LambdaScopeInfo * PushLambdaScope()
Definition Sema.cpp:2510
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 DiagnoseUnsatisfiedRequiresExpr(const RequiresExpr *RequiresExpr, bool First=true)
void PopCompoundScope()
Definition Sema.cpp:2643
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15661
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:14528
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition Sema.h:14548
@ UPPC_RequiresClause
Definition Sema.h:14599
@ UPPC_UsingDeclaration
A using declaration.
Definition Sema.h:14554
@ UPPC_IfExists
Microsoft __if_exists.
Definition Sema.h:14581
@ UPPC_Requirement
Definition Sema.h:14596
@ UPPC_ExceptionType
The type of an exception.
Definition Sema.h:14572
@ UPPC_EnumeratorValue
The enumerator value.
Definition Sema.h:14551
@ UPPC_Lambda
Lambda expression.
Definition Sema.h:14587
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition Sema.h:14584
@ UPPC_PartialSpecialization
Partial specialization.
Definition Sema.h:14578
@ UPPC_Initializer
An initializer.
Definition Sema.h:14563
@ UPPC_BaseType
The base type of a class type.
Definition Sema.h:14533
@ UPPC_FriendDeclaration
A friend declaration.
Definition Sema.h:14557
@ UPPC_DefaultArgument
A default argument.
Definition Sema.h:14566
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14536
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14530
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition Sema.h:14575
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition Sema.h:14560
@ UPPC_DataMemberType
The type of a data member.
Definition Sema.h:14539
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition Sema.h:14545
@ UPPC_Block
Block expression.
Definition Sema.h:14590
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition Sema.h:14542
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition Sema.h:14569
@ UPPC_TypeConstraint
A type constraint.
Definition Sema.h:14593
api_notes::APINotesManager APINotes
Definition Sema.h:1308
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:12643
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:928
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:13196
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:5968
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:2604
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:2114
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action, SourceLocation PragmaLoc, MSVtorDispMode Value)
Called on well formed #pragma vtordisp().
Definition SemaAttr.cpp:767
SemaCodeCompletion & CodeCompletion()
Definition Sema.h:1466
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
Definition SemaAttr.cpp:238
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
bool currentModuleIsHeaderUnit() const
Is the module scope we are in a C++ Header Unit?
Definition Sema.h:3645
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:1521
void SwapSatisfactionStack(llvm::SmallVectorImpl< SatisfactionStackEntryTy > &NewSS)
Definition Sema.h:15024
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:7062
@ ReuseLambdaContextDecl
Definition Sema.h:7062
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:936
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:1461
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:1350
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false)
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:1303
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:2161
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
bool SubstTemplateArgumentsInParameterMapping(ArrayRef< TemplateArgumentLoc > Args, SourceLocation BaseLoc, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Out)
ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, SourceLocation BuiltinLoc, SourceLocation RPLoc, DeclContext *ParentContext)
bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty, SourceLocation OpLoc, SourceRange R)
ActOnAlignasTypeArgument - Handle alignas(type-id) and _Alignas(type-name) .
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
threadSafety::BeforeSet * ThreadSafetyDeclCache
Definition Sema.h:1345
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
Definition Sema.h:2139
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
bool BuildCtorClosureDefaultArgs(SourceLocation Loc, CXXConstructorDecl *Ctor, bool IsCopy=false)
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:2279
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.
SemaDirectX & DirectX()
Definition Sema.h:1476
llvm::SmallSetVector< const NamedDecl *, 16 > NamedDeclSetType
Definition Sema.h:6542
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:1506
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:1588
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:1302
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,...
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition Sema.h:1236
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2719
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:1231
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
llvm::DenseMap< unsigned, CXXDeductionGuideDecl * > AggregateDeductionCandidates
Definition Sema.h:9082
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:966
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition SemaStmt.cpp:417
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition Sema.h:15674
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:6544
SemaHLSL & HLSL()
Definition Sema.h:1481
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:11485
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1234
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition Sema.h:9386
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:1237
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:6977
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:1848
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
static StringRef GetFormatStringTypeName(FormatStringType FST)
SemaMIPS & MIPS()
Definition Sema.h:1501
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
Definition Sema.cpp:140
void InstantiateVariableInitializer(VarDecl *Var, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the initializer of a variable.
void CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc, SourceLocation CallOperatorLoc, const AssociatedConstraint &TrailingRequiresClause, TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind, StorageClass SC, ArrayRef< ParmVarDecl * > Params, bool HasExplicitResultType)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
SemaRISCV & RISCV()
Definition Sema.h:1546
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:15860
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
Definition Sema.h:1837
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:5974
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.
bool convertArgumentToType(Expr *&Value, QualType Ty)
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
Definition SemaExpr.cpp:217
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:5342
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
Definition Sema.h:5345
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
Definition Sema.h:5349
@ Builtin
A builtin needed 'std::strong_ordering' (eg. '__builtin_type_order').
Definition Sema.h:5351
MemberPointerConversionDirection
Definition Sema.h:10309
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:14131
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition Sema.h:6537
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc, TypeSourceInfo *TSI)
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
Definition SemaExpr.cpp:79
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:2812
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:15235
SemaSwift & Swift()
Definition Sema.h:1561
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:2060
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:6642
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:7007
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition Sema.h:6574
StmtResult ActOnExprStmtError()
Definition SemaStmt.cpp:66
PragmaStack< StringLiteral * > BSSSegStack
Definition Sema.h:2070
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.
StmtResult BuildCXXEnumeratingExpansionStmtPattern(Decl *ESD, Stmt *Init, Stmt *ExpansionVar, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation RParenLoc)
bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)
void completeExprArrayBound(Expr *E)
DeclContext * getCurLexicalContext() const
Definition Sema.h:1141
std::function< TypeResult(StringRef, StringRef, SourceLocation)> ParseTypeFromStringCallback
Callback to the parser to parse a type expressed as a string.
Definition Sema.h:1359
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:2117
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:1780
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
ExprResult ActOnRequiresExpr(SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation ClosingBraceLoc)
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
bool hasExplicitCallingConv(QualType T)
NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc, const Token &NextToken, CorrectionCandidateCallback *CCC=nullptr)
Perform name lookup on the given name, classifying it based on the results of name lookup and the fol...
Definition SemaDecl.cpp:912
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
StmtResult ActOnNullStmt(SourceLocation SemiLoc, bool HasLeadingEmptyMacro=false)
Definition SemaStmt.cpp:71
OpenCLOptions OpenCLFeatures
Definition Sema.h:1299
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:11889
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
Definition Sema.h:14135
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:2164
ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
bool isRedefinitionAllowedFor(const NamedDecl *D, SourceLocation NewLoc, bool &Visible)
Definition Sema.h:15702
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:884
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:4836
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:10496
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition Sema.h:15229
ProcessingContextState ParsingClassState
Definition Sema.h:6592
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:1339
NamedDecl * lookupExternCFunctionOrVariable(IdentifierInfo *IdentId, SourceLocation NameLoc, Scope *curScope)
void checkUnsafeExprAssigns(SourceLocation Loc, Expr *LHS, Expr *RHS)
checkUnsafeExprAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained expressi...
void PushCompoundScope(bool IsStmtExpr)
Definition Sema.cpp:2638
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 ActOnCXXExpansionInitList(MultiExprArg SubExprs, SourceLocation LBraceLoc, SourceLocation RBraceLoc)
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:3072
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:3897
std::pair< const IdentifierInfo *, uint64_t > TypeTagMagicValue
A pair of ArgumentKind identifier and magic value.
Definition Sema.h:2719
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:15583
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.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
ExprResult BuildCXXAggregateDefaultInitExpr(SourceLocation Loc, FieldDecl *Field, const InitializedEntity &MemberEntity)
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...
bool DiagnosePackIndexingInFriendNNS(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc)
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
Definition Sema.h:7004
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
bool CheckExceptionSpecSubset(const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID, const FunctionProtoType *Superset, bool SkipSupersetFirstParameter, SourceLocation SuperLoc, const FunctionProtoType *Subset, bool SkipSubsetFirstParameter, SourceLocation SubLoc)
CheckExceptionSpecSubset - Check whether the second function type's exception specification is a subs...
bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypeConversion - Determines whether the conversion from FromType to ToType necessar...
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope)
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
TemplateDeductionResult SubstituteExplicitTemplateArguments(FunctionTemplateDecl *FunctionTemplate, TemplateArgumentListInfo &ExplicitTemplateArgs, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< QualType > &ParamTypes, QualType *FunctionType, sema::TemplateDeductionInfo &Info)
Substitute the explicitly-provided template arguments into the given function template according to C...
ExprResult ActOnCoawaitExpr(Scope *S, SourceLocation KwLoc, Expr *E)
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
Definition Sema.cpp:2456
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:11884
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:13194
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:4930
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:5964
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:648
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:15668
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8240
llvm::MapVector< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
Definition Sema.h:3611
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
Definition Sema.h:2113
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9922
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,...
LazyVector< TypedefNameDecl *, &ExternalSemaSource::ReadExtVectorDecls, 2, 2 > ExtVectorDeclsType
Definition Sema.h:4974
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:2574
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:8107
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:2674
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:7019
void ApplyForRangeOrExpansionStatementLifetimeExtension(VarDecl *RangeVar, ArrayRef< MaterializeTemporaryExpr * > Temporaries)
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:6551
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:1444
auto getDefaultDiagFunc()
Definition Sema.h:2320
void ActOnInitPriorityAttr(Decl *D, const Attr *A)
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount)
Checks that a call expression's argument count is at least the desired number.
bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypePromotion - Determines whether the conversion from FromType to ToType involves ...
ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path)
Check a cast of an unknown-any type.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
ExprResult ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, SourceLocation LAngleBracketLoc, Declarator &D, SourceLocation RAngleBracketLoc, SourceLocation LParenLoc, Expr *E, SourceLocation RParenLoc)
ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const,addrspace}_cast's.
Definition SemaCast.cpp:315
DeclGroupPtrTy ActOnPrivateModuleFragmentDecl(SourceLocation ModuleLoc, SourceLocation PrivateLoc)
The parser has processed a private-module-fragment declaration that begins the definition of the priv...
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
SuppressedDiagnosticsMap SuppressedDiagnostics
Definition Sema.h:12644
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6570
SemaOpenCL & OpenCL()
Definition Sema.h:1526
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:14144
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
QualType BuiltinDecay(QualType BaseType, SourceLocation Loc)
void ActOnPragmaMSStruct(PragmaMSStructKind Kind)
ActOnPragmaMSStruct - Called on well formed #pragma ms_struct [on|off].
Definition SemaAttr.cpp:659
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
Definition Sema.h:2244
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:931
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:15245
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:2649
@ FAPK_Elsewhere
Definition Sema.h:2653
@ FAPK_Fixed
Definition Sema.h:2650
@ FAPK_Variadic
Definition Sema.h:2651
@ FAPK_VAList
Definition Sema.h:2652
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:8232
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition Sema.h:13185
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1747
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...
LazyVector< const DeclaratorDecl *, &ExternalSemaSource::ReadUnusedFileScopedDecls, 2, 2 > UnusedFileScopedDeclsType
Definition Sema.h:3624
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:15681
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:15000
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc, Expr *DestExp)
bool GlobalNewDeleteDeclared
A flag to remember whether the implicit forms of operator new and delete have been declared.
Definition Sema.h:8424
TemplateNameKind ActOnTemplateName(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool AllowInjectedClassName=false)
Form a template name from a name that is syntactically required to name a template,...
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind, SourceLocation BuiltinLoc, SourceLocation RPLoc)
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
Definition Sema.h:3642
ExprResult CheckVarOrConceptTemplateTemplateId(const DeclarationNameInfo &NameInfo, TemplateName Template, const TemplateArgumentListInfo *TemplateArgs)
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition Sema.h:6803
ExprResult BuildSubstNonTypeTemplateParmExpr(Decl *AssociatedDecl, unsigned Index, QualType ParamType, SourceLocation loc, TemplateArgument Replacement, UnsignedOrNone PackIndex, bool Final)
bool MSStructPragmaOn
Definition Sema.h:1834
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:13762
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:14079
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition Sema.h:15656
SourceManager & getSourceManager() const
Definition Sema.h:933
void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
void ActOnCleanupAttr(Decl *D, const Attr *A)
QualType CXXThisTypeOverride
When non-NULL, the C++ 'this' expression is allowed despite the current context not being a non-stati...
Definition Sema.h:8495
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
static FormatStringType GetFormatStringType(StringRef FormatFlavor)
CallingConventionIgnoredReason
Describes the reason a calling convention specification was ignored, used for diagnostics.
Definition Sema.h:4908
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:651
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_enum attribute.
Definition Sema.h:3585
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:987
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:717
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:12363
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:2332
ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr=false)
CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
ExprResult CheckLValueToRValueConversionOperand(Expr *E)
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
QualType CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc)
void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, SourceLocation IncludeLoc)
Definition SemaAttr.cpp:593
Decl * ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc, Expr *LangStr, SourceLocation LBraceLoc)
ActOnStartLinkageSpecification - Parsed the beginning of a C++ linkage specification,...
bool ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc, QualType Type)
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount, unsigned MaxArgCount)
Checks that a call expression's argument count is in the desired range.
void FilterUsingLookup(Scope *S, LookupResult &lookup)
Remove decls we can't actually see from a lookup being used to declare shadow using decls.
bool inConstraintSubstitution() const
Determine whether we are currently performing constraint substitution.
Definition Sema.h:14084
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:6084
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.
CXXExpansionStmtDecl * ActOnCXXExpansionStmtDecl(unsigned TemplateDepth, SourceLocation TemplateKWLoc)
bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset, SourceLocation AsmLoc)
PragmaClangSection PragmaClangTextSection
Definition Sema.h:1849
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:7516
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.
NonTrivialCUnionKind
Definition Sema.h:4154
@ NTCUK_Destruct
Definition Sema.h:4156
@ NTCUK_Init
Definition Sema.h:4155
@ NTCUK_Copy
Definition Sema.h:4157
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:1380
void CheckLookupAccess(const LookupResult &R)
Checks access to all the declarations in the given result set.
concepts::ExprRequirement * BuildExprRequirement(Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc, concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement)
void ActOnPragmaFPValueChangingOption(SourceLocation Loc, PragmaFPKind Kind, bool IsEnabled)
Called on well formed #pragma clang fp reassociate or #pragma clang fp reciprocal.
QualType BuildAtomicType(QualType T, SourceLocation Loc)
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
Definition Sema.h:8381
PragmaClangSection PragmaClangDataSection
Definition Sema.h:1846
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.
LazyVector< VarDecl *, &ExternalSemaSource::ReadTentativeDefinitions, 2, 2 > TentativeDefinitionsType
Definition Sema.h:3632
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...
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:9178
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...
CXXExpansionStmtDecl * BuildCXXExpansionStmtDecl(DeclContext *Ctx, SourceLocation TemplateKWLoc, NonTypeTemplateParmDecl *NTTP)
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:2504
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:2059
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:6801
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
ExternalSemaSource * getExternalSource() const
Definition Sema.h:938
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:1244
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition Sema.h:2120
SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const
Returns the top most location responsible for the definition of N.
bool isSFINAEContext() const
Definition Sema.h:13822
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition Sema.h:8850
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, bool IsInstantiation=false)
ActOnLambdaError - If there is an error parsing a lambda, this callback is invoked to pop the informa...
static SourceRange getPrintable(SourceRange R)
Definition Sema.h:15242
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:13778
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:14985
ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI)
TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)
Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15623
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, const PartialDiagnostic &PD, const FunctionDecl *FD=nullptr)
Definition Sema.h:1147
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:3034
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void ProcessPragmaExport(DeclaratorDecl *newDecl)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void emitDeferredDiags()
Definition Sema.cpp:2144
void setFunctionHasMustTail()
Definition Sema.cpp:2669
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...
LabelDecl * LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc, SourceLocation GnuLabelLoc=SourceLocation(), bool IsLabelStmt=false)
LookupOrCreateLabel - Do a name lookup of a label with the specified name.
ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr, CastKind &Kind)
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition Sema.h:8420
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:14991
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:2659
RedeclarationKind forRedeclarationInCurContext() const
bool hasReachableDefinition(NamedDecl *D)
Definition Sema.h:15713
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:2641
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition Sema.h:6562
QualType buildLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions, IdentifierInfo *Id, bool DirectInit, Expr *&Init)
StmtResult ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block)
bool SubstTemplateArgument(const TemplateArgumentLoc &Input, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentLoc &Output, SourceLocation Loc={}, const DeclarationName &Entity={})
ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II, SourceLocation NameLoc, bool IsTemplateTypeArg)
Attempt to behave like MSVC in situations where lookup of an unqualified type name has failed in a de...
Definition SemaDecl.cpp:641
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
QualType BuiltinAddPointer(QualType BaseType, SourceLocation Loc)
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
bool BuiltinElementwiseTernaryMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::FloatTy)
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
Definition Sema.cpp:1231
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:1585
bool isRedefinitionAllowedFor(NamedDecl *D, SourceLocation NewDefinitionLoc, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
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:11347
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.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
Definition SemaDecl.cpp:276
ExprResult SubstConstraintExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition Sema.h:1582
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:1305
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:4722
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
PragmaAlignPackDiagnoseKind
Definition Sema.h:2222
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:7011
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:127
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1344
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:1894
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition Sema.h:14127
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:9950
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
Definition Sema.h:9957
@ ImportFinished
after any non-import decl.
Definition Sema.h:9954
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
Definition Sema.h:9955
@ FirstDecl
Parsing the first decl in a TU.
Definition Sema.h:9951
@ GlobalFragment
after 'module;' but before 'module X;'
Definition Sema.h:9952
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
Definition Sema.h:9959
@ ImportAllowed
after 'module X;' but before any non-import decl.
Definition Sema.h:9953
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:15241
bool checkInstantiatedThreadSafetyAttrs(const Decl *D, const Attr *A)
Recheck instantiated thread-safety attributes that could not be validated on the dependent pattern de...
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks, bool IgnoreArch=false)
Create a CUDALaunchBoundsAttr attribute.
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
Definition Sema.cpp:110
VarDecl * BuildForRangeVarDecl(SourceLocation Loc, QualType Type, IdentifierInfo *Name, bool IsConstexpr)
Helper used by the expansion statements and for-range code to build a variable declaration for e....
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void incrementMSManglingNumber() const
Definition Sema.h:1265
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:6745
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
Definition Sema.h:6767
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
Definition Sema.h:6757
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6772
@ DiscardedStatement
The current expression occurs within a discarded statement.
Definition Sema.h:6762
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6782
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6751
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6777
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
Definition Sema.h:6792
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:13770
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:4884
@ AP_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute.
Definition Sema.h:4898
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
Definition Sema.h:4890
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition Sema.h:4894
@ AP_PragmaClangAttribute_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute that was applied ...
Definition Sema.h:4903
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition Sema.h:4887
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:984
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:14089
SemaPPC & PPC()
Definition Sema.h:1536
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:2517
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:421
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
Definition SemaStmt.cpp:76
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
Definition Sema.h:4967
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:1263
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:14993
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:1349
bool CheckDependentFriend(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc, ArrayRef< TemplateParameterList * > TPLs, bool IsInstantiation)
void DiagnoseAmbiguousLookup(LookupResult &Result)
Produce a diagnostic describing the ambiguity that resulted from name lookup.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
QualType getCapturedDeclRefType(ValueDecl *Var, SourceLocation Loc)
Given a variable, determine the type that a reference to that variable will have in the given scope.
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC pragma optimize in scope, consider changing t...
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
Delete-expressions to be analyzed at the end of translation unit.
Definition Sema.h:8431
bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl)
Checks if the new declaration declared in dependent context must be put in the same redeclaration cha...
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Definition Sema.h:3635
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:10105
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:8222
SemaSystemZ & SystemZ()
Definition Sema.h:1566
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition Sema.cpp:124
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:3056
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.
llvm::SmallPtrSet< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Definition Sema.h:3615
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8368
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
void warnOnCTypeHiddenInCPlusPlus(const NamedDecl *D)
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
MemberPointerConversionResult
Definition Sema.h:10301
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:9936
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:674
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...
LazyVector< CXXConstructorDecl *, &ExternalSemaSource::ReadDelegatingConstructors, 2, 2 > DelegatingCtorDeclsType
Definition Sema.h:6555
QualType BuiltinChangeCVRQualifiers(QualType BaseType, UTTKind UKind, SourceLocation Loc)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
Definition Sema.h:1307
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:11513
@ TemplateNameIsRequired
Definition Sema.h:11513
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:797
ExprResult BuildCXXCtorDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
bool hasReachableExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is an explicit specialization declaration for...
Decl * BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS, RecordDecl *Record)
BuildMicrosoftCAnonymousStruct - Handle the declaration of an Microsoft C anonymous structure.
bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, SourceLocation NameLoc, CXXScopeSpec &SS, ParsedTemplateTy *Template=nullptr)
Determine whether a particular identifier might be the name in a C++1z deduction-guide declaration.
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, StringRef SlotLabel, Expr *Alignment)
ActOnPragmaPack - Called on well formed #pragma pack(...).
Definition SemaAttr.cpp:481
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnStartDelayedCXXMethodDeclaration - We have completed parsing a top-level (non-nested) C++ class,...
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:1306
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
void DiagnoseUnterminatedPragmaAlignPack()
Definition SemaAttr.cpp:632
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition Sema.h:7839
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:929
FPOptions CurFPFeatures
Definition Sema.h:1300
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:1352
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition Sema.h:6546
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.
ExprResult BuildCXXExpansionSelectExpr(InitListExpr *Range, Expr *Idx)
void addLifetimeBoundToImplicitThis(CXXMethodDecl *MD)
void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an initializer for the declaratio...
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
void LoadExternalExtnameUndeclaredIdentifiers()
Load pragma redefine_extname'd undeclared identifiers from the external source.
Definition Sema.cpp:1112
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:524
PragmaStack< StringLiteral * > DataSegStack
Definition Sema.h:2069
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)
friend class ConstraintSatisfactionChecker
Definition Sema.h:15157
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:3095
ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc, bool IsExplicit)
void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D)
Common checks for a parameter-declaration that should apply to both function parameters and non-type ...
std::unique_ptr< APINotesSelectorDiagnosticState > APINotesSelectorDiagnostics
Definition Sema.h:1310
ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< ParsedType > Args, SourceLocation RParenLoc)
Parsed one of the type trait support pseudo-functions.
StmtResult FinishCXXExpansionStmt(Stmt *Expansion, Stmt *Body)
TemplateParamListContext
The context in which we are checking a template parameter list.
Definition Sema.h:11696
@ TPC_TemplateTemplateParameterPack
Definition Sema.h:11706
@ TPC_FriendFunctionTemplate
Definition Sema.h:11704
@ TPC_ClassTemplateMember
Definition Sema.h:11702
@ TPC_FunctionTemplate
Definition Sema.h:11701
@ TPC_FriendClassTemplate
Definition Sema.h:11703
@ TPC_FriendFunctionTemplateDefinition
Definition Sema.h:11705
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:1456
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
friend class InitializationSequence
Definition Sema.h:1586
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:2148
bool isMainFileLoc(SourceLocation Loc) const
Determines whether the given source location is in the main file and we're in a context where we shou...
Definition Sema.cpp:979
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:7798
void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init)
CXXDeductionGuideDecl * DeclareAggregateDeductionGuideFromInitList(TemplateDecl *Template, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc)
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:6578
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition Sema.h:13742
void PrintStats() const
Print out statistics about the semantic analysis.
Definition Sema.cpp:691
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:15232
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:1832
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:1249
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
QualType BuildWritePipeType(QualType T, SourceLocation Loc)
Build a Write-only Pipe type.
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
Definition Sema.cpp:89
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
BuildForRangeKind
Definition Sema.h:11133
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11141
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11135
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11138
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
SemaNVPTX & NVPTX()
Definition Sema.h:1511
void checkIncorrectVTablePointerAuthenticationAttribute(CXXRecordDecl &RD)
Check that VTable Pointer authentication is only being set on the first first instantiation of the vt...
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool AllowTypoCorrection=true)
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:915
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:586
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:2089
@ PSK_ConstSeg
Definition Sema.h:2092
@ PSK_DataSeg
Definition Sema.h:2090
@ PSK_CodeSeg
Definition Sema.h:2093
@ PSK_BSSSeg
Definition Sema.h:2091
void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous, bool &AddToScope)
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
bool isTagRedeclarationInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
Determine whether a tag-like declaration found by lookup can be redeclared in the given scope.
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:646
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
Definition SemaCast.cpp:338
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
Definition Sema.h:6375
Decl * ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth)
ActOnField - Each field of a C struct/union is passed into this in order to create a FieldDecl object...
bool BuiltinConstantArgPower2(CallExpr *TheCall, unsigned ArgNum)
BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a constant expression representing ...
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
CodeAlignAttr * BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E)
ExprResult ActOnStmtExprResult(ExprResult E)
void BuildVariableInstantiation(VarDecl *NewVar, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs, LateInstantiatedAttrVec *LateAttrs, DeclContext *Owner, LocalInstantiationScope *StartingScope, bool InstantiatingVarTemplate=false, VarTemplateSpecializationDecl *PrevVTSD=nullptr)
BuildVariableInstantiation - Used after a new variable has been created.
ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Kind, Expr *Input)
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
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:3604
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2262
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)
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, bool IsMemberSpecialization, SkipBodyInfo *SkipBody=nullptr)
PragmaClangSection PragmaClangBSSSection
Definition Sema.h:1845
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:1363
QualType CheckMatrixLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel)
AbstractDiagSelID
Definition Sema.h:6321
@ AbstractSynthesizedIvarType
Definition Sema.h:6328
@ AbstractVariableType
Definition Sema.h:6325
@ AbstractReturnType
Definition Sema.h:6323
@ AbstractNone
Definition Sema.h:6322
@ AbstractFieldType
Definition Sema.h:6326
@ AbstractArrayType
Definition Sema.h:6329
@ AbstractParamType
Definition Sema.h:6324
@ AbstractIvarType
Definition Sema.h:6327
StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition SemaStmt.cpp:976
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.
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:1551
ParsedType getConstructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, bool EnteringContext)
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
void HandleDelayedAccessCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
Definition Sema.h:8417
ExprResult ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, bool IsAddressOfOperand)
Act on the result of classifying a name as an undeclared member of a dependent base class.
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(const NamedDecl *D1, ArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, ArrayRef< AssociatedConstraint > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
void getSortedUnusedLocalTypedefNameCandidates(SmallVectorImpl< const TypedefNameDecl * > &Sorted) const
Store UnusedLocalTypedefNameCandidates in Sorted in a deterministic order.
Definition Sema.cpp:1203
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.
std::optional< ResolvedAllocation > FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope, QualType AllocType, bool IsArray, const ImplicitAllocationParameters &IAP, MultiExprArg PlaceArgs, bool Diagnose=true)
Finds the overloads of operator new and delete that are appropriate for the allocation.
llvm::DenseMap< SpecialMemberCacheKey, SpecialMemberOverloadResult > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
Definition Sema.h:9380
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
void DiagnoseUnusedAPINotesSelectors()
Diagnose exact API notes selectors that were not matched by any declaration processed in this transla...
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists, TemplateIdAnnotation *TemplateId)
Handle a friend tag declaration where the scope specifier was templated.
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:8030
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:9443
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition Sema.h:9447
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition Sema.h:9453
@ LOLR_Error
The lookup resulted in an error.
Definition Sema.h:9445
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition Sema.h:9450
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition Sema.h:9461
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition Sema.h:9457
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:2689
const ExpressionEvaluationContextRecord & parentEvaluationContext() const
Definition Sema.h:6989
SemaLoongArch & LoongArch()
Definition Sema.h:1491
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:6457
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6462
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6459
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:14123
void CheckVariableDeclarationType(VarDecl *NewVD)
sema::CompoundScopeInfo & getCurCompoundScope() const
Definition SemaStmt.cpp:433
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:3048
OpaquePtr< TemplateName > TemplateTy
Definition Sema.h:1296
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
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:729
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:3581
void ActOnFinishOfCompoundStmt()
Definition SemaStmt.cpp:429
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:1793
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:15548
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:7876
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
Definition SemaStmt.cpp:437
void NoteTemplateParameterLocation(const NamedDecl &Decl)
SemaWasm & Wasm()
Definition Sema.h:1571
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:3527
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:13738
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 ...
SemaPseudoObject & PseudoObject()
Definition Sema.h:1541
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:2650
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition SemaStmt.cpp:614
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
Definition Sema.h:11478
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:7832
void PerformDependentDiagnostics(const DeclContext *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
void DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName=false)
Definition SemaDecl.cpp:732
void DiagnoseSizeOfParametersAndReturnValue(ArrayRef< ParmVarDecl * > Parameters, QualType ReturnTy, NamedDecl *D)
Diagnose whether the size of parameters or return value of a function or obj-c method definition is p...
void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD, SourceLocation NameLoc)
Returns the TypeDeclType for the given type declaration, as ASTContext::getTypeDeclType would,...
Definition SemaDecl.cpp:149
void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
Definition Sema.h:8376
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition Sema.h:1295
static int getPrintable(int I)
Definition Sema.h:15231
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:926
void ActOnDependentForRangeInitializer(VarDecl *LoopVar, BuildForRangeKind BFRK)
Set the type of a for-range declaration whose for-range or expansion initialiser is dependent.
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
Definition Sema.h:9715
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:13025
StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, Stmt *SubStmt, Scope *CurScope)
Definition SemaStmt.cpp:591
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:3883
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:15236
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:552
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:8248
ForRangeBeginEndInfo BuildCXXForRangeBeginEndVars(Scope *S, VarDecl *RangeVar, SourceLocation ColonLoc, SourceLocation CoawaitLoc, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps, BuildForRangeKind Kind, bool IsConstexpr, StmtResult *RebuildResult=nullptr, llvm::function_ref< StmtResult()> RebuildWithDereference={}, IdentifierInfo *BeginName=nullptr, IdentifierInfo *EndName=nullptr)
Determine begin-expr and end-expr and build variable declarations for them as per [stmt....
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:13753
SemaARM & ARM()
Definition Sema.h:1451
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:13734
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
Definition SemaAttr.cpp:365
bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, const LookupResult &R)
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
static const char * getPrintable(const char *S)
Definition Sema.h:15234
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
ExprResult ActOnDecltypeExpression(Expr *E)
Process the expression contained within a decltype.
SmallVector< std::pair< Scope *, SourceLocation >, 2 > CurrentDefer
Stack of '_Defer' statements that are currently being parsed, as well as the locations of their '_Def...
Definition Sema.h:11043
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:672
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
PragmaMsStackAction
Definition Sema.h:1851
@ PSK_Push_Set
Definition Sema.h:1857
@ PSK_Reset
Definition Sema.h:1852
@ PSK_Pop_Set
Definition Sema.h:1858
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:8712
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:13819
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:343
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1819
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3852
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.).
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:4770
The top declaration context.
Definition Decl.h:106
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:3648
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:8410
The base class of the type hierarchy.
Definition TypeBase.h:1879
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3802
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3697
Simple class containing the result of Sema::CorrectTypo.
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:1039
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h:3372
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition ExprCXX.h:4179
A set of unresolved declarations.
The iterator over UnresolvedSets.
Represents a C++ using-declaration.
Definition DeclCXX.h:3621
Represents C++ using-directive.
Definition DeclCXX.h:3126
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3429
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:713
Represents a variable declaration or definition.
Definition Decl.h:933
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:4266
Represents a C++11 virt-specifier-seq.
Definition DeclSpec.h:2832
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:791
Retains information about a captured region.
Definition ScopeInfo.h:817
Contains information about the compound statement currently being parsed.
Definition ScopeInfo.h:67
A collection of diagnostics which were delayed.
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
Retains information about a function, method, or block that is currently being parsed.
Definition ScopeInfo.h:104
Provides information about an attempted template argument deduction, whose success or failure was des...
#define UINT_MAX
Definition limits.h:64
Definition SPIR.cpp:47
Enums for the diagnostics of target, target_version and target_clones.
Definition Sema.h:849
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
llvm::DenseMap< int, SourceRange > ParsedSubjectMatchRuleSet
bool operator==(const ValueType &a, const ValueType &b)
void threadSafetyCleanup(BeforeSet *Cache)
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:33
Top level wrappers for InstallAPI frontend operations.
PragmaClangSectionAction
Definition Sema.h:470
TypeSpecifierType
Specifies the kind of type.
Definition Specifiers.h:56
ImplicitTypenameContext
Definition DeclSpec.h:1935
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
OverloadKind
Definition Sema.h:817
@ NonFunction
This is not an overload because the lookup results contain a non-function.
Definition Sema.h:828
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:824
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
Definition Sema.h:820
bool isa(CodeGen::Address addr)
Definition Address.h:330
OpaquePtr< TemplateName > ParsedTemplateTy
Definition Ownership.h:256
@ CPlusPlus
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
Definition Ownership.h:263
VariadicCallType
Definition Sema.h:507
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
Definition Sema.h:453
CUDAFunctionTarget
Definition Cuda.h:65
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:785
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
Definition Sema.h:793
PragmaMSCommentKind
Definition PragmaKinds.h:14
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition Specifiers.h:36
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
TryCaptureKind
Definition Sema.h:647
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
Definition Specifiers.h:40
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
Definition Sema.h:655
@ BitwiseOp
A bitwise operation.
Definition Sema.h:659
@ Arithmetic
An arithmetic operation.
Definition Sema.h:657
@ Conditional
A conditional (?:) operator.
Definition Sema.h:663
@ CompAssign
A compound assignment expression.
Definition Sema.h:665
@ Comparison
A comparison.
Definition Sema.h:661
NullabilityKind
Describes the nullability of a particular type.
Definition Specifiers.h:347
InClassInitStyle
In-class initialization styles for non-static data members.
Definition Specifiers.h:272
@ Success
Annotation was successful.
Definition Parser.h:65
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
Definition Parser.h:61
CXXConstructionKind
Definition ExprCXX.h:1544
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition Specifiers.h:150
PointerAuthDiscArgKind
Definition Sema.h:588
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
Definition Sema.h:598
@ TemplateTemplateArgument
Definition Sema.h:607
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
Definition Overload.h:84
NonTrivialCUnionContext
Definition Sema.h:526
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
Definition Sema.h:622
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:630
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
Definition Sema.h:636
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
Definition Sema.h:627
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
Definition Sema.h:633
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
Definition Sema.h:243
@ 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:919
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:124
@ AS_none
Definition Specifiers.h:128
LazyOffsetPtr< Decl, GlobalDeclID, &ExternalASTSource::GetExternalDecl > LazyDeclPtr
A lazy pointer to a declaration.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
ActionResult< Decl * > DeclResult
Definition Ownership.h:255
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
StorageClass
Storage classes.
Definition Specifiers.h:249
void inferNoReturnAttr(Sema &S, Decl *D)
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
Definition Overload.h:930
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
Definition Parser.h:142
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:41
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:2876
@ CopyInit
[a = b], [a = {b}]
Definition DeclSpec.h:2878
@ 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:472
@ Undefined
Keep undefined.
@ Result
The result type of a method or function.
Definition TypeBase.h:906
ActionResult< ParsedType > TypeResult
Definition Ownership.h:251
OffsetOfKind
Definition Sema.h:610
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition TypeBase.h:3810
SmallVector< ImplicitAllocationArguments, 3 > AllocationArgumentSet
Definition Sema.h:230
CorrectTypoKind
Definition Sema.h:812
ActionResult< CXXCtorInitializer * > MemInitResult
Definition Ownership.h:253
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
bool isFunctionOrMethodVariadic(const Decl *D)
Definition Attr.h:144
@ 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:683
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
Definition Sema.h:706
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
Definition Sema.h:781
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
Definition Sema.h:698
@ 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
@ CompatibleOBTDiscards
CompatibleOBTDiscards - Assignment discards overflow behavior.
Definition Sema.h:777
@ IncompatibleOBTKinds
IncompatibleOBTKinds - Assigning between incompatible OverflowBehaviorType kinds, e....
Definition Sema.h:774
@ CompatibleVoidPtrToNonVoidPtr
CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because a void * can implicitly convert...
Definition Sema.h:690
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
Definition Sema.h:732
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
Definition Sema.h:727
@ 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:685
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
Definition Sema.h:717
@ IncompatiblePointerDiscardsOverflowBehavior
IncompatiblePointerDiscardsOverflowBehavior - The assignment discards overflow behavior annotations b...
Definition Sema.h:737
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
Definition Sema.h:694
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
Definition Sema.h:702
@ 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:711
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
Definition Sema.h:723
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
Definition Sema.h:761
TagUseKind
Definition Sema.h:445
MSVtorDispMode
In the Microsoft ABI, this controls the placement of virtual displacement members used to implement v...
Definition LangOptions.h:39
PragmaClangSectionKind
pragma clang section kind
Definition Sema.h:461
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:6032
TUFragmentKind
Definition Sema.h:481
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...
@ On
Always emit colors regardless of the output stream.
NameClassificationKind
Describes the result of the name lookup and resolution performed by Sema::ClassifyName().
Definition Sema.h:549
@ FunctionTemplate
The name was classified as a function template name.
Definition Sema.h:581
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:556
@ DependentNonType
The name denotes a member of a dependent type that could not be resolved.
Definition Sema.h:570
@ UndeclaredTemplate
The name was classified as an ADL-only function template name.
Definition Sema.h:583
@ NonType
The name was classified as a specific non-type, non-template declaration.
Definition Sema.h:562
@ Unknown
This name is not a type or template in this context, but might be something else.
Definition Sema.h:552
@ Error
Classification failed; an error has been produced.
Definition Sema.h:554
@ Type
The name was classified as a type.
Definition Sema.h:558
@ TypeTemplate
The name was classified as a template whose specializations are types.
Definition Sema.h:577
@ Concept
The name was classified as a concept name.
Definition Sema.h:585
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition Sema.h:575
@ UndeclaredNonType
The name was classified as an ADL-only function name.
Definition Sema.h:566
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:579
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
Definition Decl.h:2030
LangAS
Defines the address space values used by the address space qualifier of QualType.
FormatStringType
Definition Sema.h:493
CastKind
CastKind - The kind of operation required for a conversion.
AllowFoldKind
Definition Sema.h:649
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:670
PragmaMSStructKind
Definition PragmaKinds.h:24
AssignmentAction
Definition Sema.h:217
@ Deduced
The normal deduced case.
Definition TypeBase.h:1818
CXXSpecialMemberKind
Kinds of C++ special members.
Definition Decl.h:2019
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:515
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:158
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
Definition Lambda.h:22
PragmaFloatControlKind
Definition PragmaKinds.h:29
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:133
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:136
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:147
TypeAwareAllocationMode
Definition ExprCXX.h:2255
IfExistsResult
Describes the result of an "if-exists" condition check.
Definition Sema.h:797
@ Exists
The symbol exists.
Definition Sema.h:799
@ DoesNotExist
The symbol does not exist.
Definition Sema.h:802
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
Definition Specifiers.h:411
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
Definition Attr.h:56
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:65
TPOC
The context in which partial ordering of function templates occurs.
Definition Template.h:310
TrivialABIHandling
Definition Sema.h:639
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
Definition Sema.h:644
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
Definition Sema.h:641
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:374
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
Definition Sema.h:424
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
Definition Sema.h:419
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
Definition Sema.h:422
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
Definition Sema.h:395
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
Definition Sema.h:381
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
Definition Sema.h:417
@ CUDATargetMismatch
CUDA Target attributes do not match.
Definition Sema.h:426
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
Definition Sema.h:414
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
Definition Sema.h:384
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
Definition Sema.h:398
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
Definition Sema.h:387
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
Definition Sema.h:401
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:390
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
Definition Sema.h:411
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:428
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
Definition Sema.h:405
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
Definition Sema.h:408
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:189
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:279
U cast(CodeGen::Address addr)
Definition Address.h:327
SmallVector< Token, 4 > CachedTokens
A set of tokens that has been cached for later parsing.
Definition DeclSpec.h:1256
@ None
The alignment was not explicit in code.
Definition ASTContext.h:176
CCEKind
Contexts in which a converted constant expression is required.
Definition Sema.h:832
@ CaseValue
Expression in a case label.
Definition Sema.h:833
@ StaticAssertMessageData
Call to data() in a static assert message.
Definition Sema.h:843
@ Enumerator
Enumerator value with fixed underlying type.
Definition Sema.h:834
@ StaticAssertMessageSize
Call to size() in a static assert message.
Definition Sema.h:841
@ Noexcept
Condition in a noexcept(bool) specifier.
Definition Sema.h:840
@ ArrayBound
Array bound in array declarator or new-expression.
Definition Sema.h:838
@ TempArgStrict
As above, but applies strict template checking rules.
Definition Sema.h:836
@ PackIndex
Index of a pack indexing expression or specifier.
Definition Sema.h:845
@ ExplicitBool
Condition in an explicit(bool) specifier.
Definition Sema.h:839
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
SourceLocIdentKind
Definition Expr.h:5057
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:6007
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6018
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6021
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Definition TypeBase.h:6025
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ Parens
New-expression has a C++98 paren-delimited initializer.
Definition ExprCXX.h:2249
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Dynamic
throw(T1, T2)
PredefinedIdentKind
Definition Expr.h:2033
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:432
@ Implicit
An implicit conversion.
Definition Sema.h:434
@ CStyleCast
A C-style cast.
Definition Sema.h:436
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
Definition Sema.h:442
@ OtherCast
A cast other than a C-style cast.
Definition Sema.h:440
@ FunctionalCast
A functional-style cast.
Definition Sema.h:438
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
Definition Specifiers.h:174
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
int const char * function
Definition c++config.h:31
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
Selector diagnostic state for all API notes readers used by one Sema.
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:247
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
Definition Sema.h:254
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
Definition Sema.h:250
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
Definition Sema.h:260
uint8_t PointerKind
Which kind of pointer declarator we saw.
Definition Sema.h:257
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Definition TypeBase.h:5146
Holds information about the various types of exception specification.
Definition TypeBase.h:5466
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5468
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5471
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition TypeBase.h:5474
Extra information about a function prototype.
Definition TypeBase.h:5494
Represents a complete lambda introducer.
Definition DeclSpec.h:2884
Contains a late templated function.
Definition Sema.h:15930
FPOptions FPO
Floating-point options in the point of definition.
Definition Sema.h:15935
Decl * D
The template function declaration to be late parsed.
Definition Sema.h:15933
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:934
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Definition Sema.h:2064
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
Definition Sema.h:10588
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
Definition Sema.h:10595
CheckNonDependentConversionsFlag(bool SuppressUserConversions, bool OnlyInitializeNonUserDefinedConversions)
Definition Sema.h:10597
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
Definition Sema.h:12122
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition Sema.h:12118
CheckTemplateArgumentInfo(const CheckTemplateArgumentInfo &)=delete
CheckTemplateArgumentInfo(bool PartialOrdering=false, bool MatchingTTP=false)
Definition Sema.h:12099
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition Sema.h:12111
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
Definition Sema.h:12108
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition Sema.h:12108
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:13233
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition Sema.h:13404
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
bool InParameterMappingSubstitution
Whether we're substituting into the parameter mapping of a constraint.
Definition Sema.h:13361
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition Sema.h:13377
ArrayRef< TemplateArgument > template_arguments() const
Definition Sema.h:13396
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition Sema.h:13372
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13364
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition Sema.h:13390
bool InConstraintSubstitution
Whether we're substituting into constraints.
Definition Sema.h:13358
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition Sema.h:13380
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition Sema.h:13387
SynthesisKind
The kind of template instantiation we are performing.
Definition Sema.h:13235
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13324
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition Sema.h:13245
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:13254
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition Sema.h:13273
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13321
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition Sema.h:13281
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition Sema.h:13288
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition Sema.h:13328
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition Sema.h:13299
@ Memoization
Added for Template instantiation observation.
Definition Sema.h:13334
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition Sema.h:13264
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition Sema.h:13340
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition Sema.h:13337
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition Sema.h:13343
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:13261
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition Sema.h:13269
@ SYCLKernelLaunchOverloadResolution
We are performing overload resolution for a call to a function template or variable template named 's...
Definition Sema.h:13351
@ ExpansionStmtInstantiation
We are instantiating an expansion statement.
Definition Sema.h:13354
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13277
@ TemplateInstantiation
We are instantiating a template declaration.
Definition Sema.h:13238
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition Sema.h:13291
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13295
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition Sema.h:13250
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13318
@ SYCLKernelLaunchLookup
We are performing name lookup for a function template or variable template named 'sycl_kernel_launch'...
Definition Sema.h:13347
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition Sema.h:13284
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13367
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition Sema.h:13393
bool isInstantiationRecord() const
Determines whether this template is an actual instantiation that should be counted toward the maximum...
InitializationContext(SourceLocation Loc, ValueDecl *Decl, DeclContext *Context)
Definition Sema.h:6906
Data structure used to record current or nested expression evaluation contexts.
Definition Sema.h:6807
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:6840
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition Sema.h:6842
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition Sema.h:6893
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition Sema.h:6827
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:6836
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition Sema.h:6847
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:6855
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition Sema.h:6851
bool IsCaseExpr
Whether evaluating an expression for a switch case label.
Definition Sema.h:6896
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6861
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:6822
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition Sema.h:6869
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6899
SmallVector< MisalignedMember, 4 > MisalignedMembers
Small set of gathered accesses to potentially misaligned members due to the packed attribute.
Definition Sema.h:6865
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition Sema.h:6812
VarDecl * DeclForInitializer
Declaration for initializer if one is currently being parsed.
Definition Sema.h:6832
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6916
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition Sema.h:6918
ExpressionEvaluationContext Context
The expression evaluation context.
Definition Sema.h:6809
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition Sema.h:6816
Holds the 'begin' and 'end' variables of a range-based for loop or expansion statement; begin-expr an...
Definition Sema.h:11184
FormatArgumentPassingKind ArgPassingKind
Definition Sema.h:2661
FunctionEffectDiffVector(const FunctionEffectsRef &Old, const FunctionEffectsRef &New)
Caller should short-circuit by checking for equality first.
std::optional< FunctionEffectWithCondition > Old
Definition Sema.h:15790
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:15794
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:15802
std::optional< FunctionEffectWithCondition > New
Definition Sema.h:15792
FunctionEffect::Kind EffectKind
Definition Sema.h:15787
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13580
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:14261
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition Sema.h:14264
bool isMoveEligible() const
Definition Sema.h:11238
bool isCopyElidable() const
Definition Sema.h:11239
const VarDecl * Candidate
Definition Sema.h:11233
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition Sema.h:3340
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition Sema.h:3349
SourceLocation IdentifierLoc
The location of the identifier.
Definition Sema.h:3343
SourceLocation CCLoc
The location of the '::'.
Definition Sema.h:3346
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition Sema.h:3337
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition Sema.h:3355
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition Sema.h:12744
Information from a C++ pragma export, for a symbol that we haven't seen the declaration for yet.
Definition Sema.h:2355
This an attribute introduced by #pragma clang attribute.
Definition Sema.h:2123
SmallVector< attr::SubjectMatchRule, 4 > MatchRules
Definition Sema.h:2126
A push'd group of PragmaAttributeEntries.
Definition Sema.h:2131
SourceLocation Loc
The location of the push attribute.
Definition Sema.h:2133
SmallVector< PragmaAttributeEntry, 2 > Entries
Definition Sema.h:2136
const IdentifierInfo * Namespace
The namespace of this push group.
Definition Sema.h:2135
SourceLocation PragmaLocation
Definition Sema.h:1842
PragmaMsStackAction Action
Definition Sema.h:1862
Slot(llvm::StringRef StackSlotLabel, ValueType Value, SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
Definition Sema.h:1975
llvm::StringRef StackSlotLabel
Definition Sema.h:1971
SourceLocation PragmaLocation
Definition Sema.h:1973
SourceLocation PragmaPushLocation
Definition Sema.h:1974
ValueType CurrentValue
Definition Sema.h:2045
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
Definition Sema.h:2031
bool hasValue() const
Definition Sema.h:2041
SmallVector< Slot, 2 > Stack
Definition Sema.h:2043
ValueType DefaultValue
Definition Sema.h:2044
SourceLocation CurrentPragmaLocation
Definition Sema.h:2046
PragmaStack(const ValueType &Default)
Definition Sema.h:2038
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)
Definition Sema.h:1982
ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val)
Definition Sema.h:5182
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition Sema.h:5176
RecursiveInstGuard(Sema &S, Decl *D, Kind Kind)
Definition Sema.h:13205
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:10485
SFINAEContextBase & operator=(const SFINAEContextBase &)=delete
SFINAEContextBase(Sema &S, SFINAETrap *Cur)
Definition Sema.h:12553
SFINAEContextBase(const SFINAEContextBase &)=delete
Abstract class used to diagnose incomplete types.
Definition Sema.h:8309
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull)
Definition Sema.h:2703
unsigned LayoutCompatible
If true, Type should be compared with other expression's types for layout-compatibility.
Definition Sema.h:2712
bool CheckSameAsPrevious
Definition Sema.h:360
NamedDecl * Previous
Definition Sema.h:361
SkipBodyInfo()=default
NamedDecl * New
Definition Sema.h:362
Information about a template-id annotation token.