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
2918 /// Returns true if the argument consists of one contiguous run of 1s with any
2919 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2920 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2921 /// since all 1s are not contiguous.
2922 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2923
2925 bool *ICContext = nullptr,
2926 bool IsListInit = false);
2927
2928 /// Check for overflow behavior type related implicit conversion diagnostics.
2929 /// Returns true if OBT-related diagnostic was issued, false otherwise.
2931 SourceLocation CC);
2932
2933 bool
2938 CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr =
2940
2941private:
2942 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2943 const ArraySubscriptExpr *ASE = nullptr,
2944 bool AllowOnePastEnd = true, bool IndexNegated = false);
2945 void CheckArrayAccess(const Expr *E);
2946
2947 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2948 const FunctionProtoType *Proto);
2949
2950 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2951 /// such as function pointers returned from functions.
2952 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2953
2954 /// CheckConstructorCall - Check a constructor call for correctness and safety
2955 /// properties not enforced by the C type system.
2956 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2958 const FunctionProtoType *Proto, SourceLocation Loc);
2959
2960 /// Warn if a pointer or reference argument passed to a function points to an
2961 /// object that is less aligned than the parameter. This can happen when
2962 /// creating a typedef with a lower alignment than the original type and then
2963 /// calling functions defined in terms of the original type.
2964 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2965 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2966
2967 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2968
2969 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2970 CallExpr *TheCall);
2971
2972 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2973 CallExpr *TheCall);
2974
2975 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2976
2977 /// Argument-value fortify checks for libc functions that are not builtins,
2978 /// dispatched by name (e.g. umask). Diagnostics belong to -Wfortify-source.
2979 void checkFortifiedLibcArgument(FunctionDecl *FD, CallExpr *TheCall);
2980
2981 /// Check the arguments to '__builtin_va_start', '__builtin_ms_va_start',
2982 /// or '__builtin_c23_va_start' for validity. Emit an error and return true
2983 /// on failure; return false on success.
2984 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2985 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2986
2987 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2988 /// friends. This is declared to take (...), so we have to check everything.
2989 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2990
2991 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2992 /// __builtin_isnan and friends. This is declared to take (...), so we have
2993 /// to check everything.
2994 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2995 unsigned BuiltinID);
2996
2997 /// Perform semantic analysis for a call to __builtin_complex.
2998 bool BuiltinComplex(CallExpr *TheCall);
2999 bool BuiltinOSLogFormat(CallExpr *TheCall);
3000
3001 /// BuiltinPrefetch - Handle __builtin_prefetch.
3002 /// This is declared to take (const void*, ...) and can take two
3003 /// optional constant int args.
3004 bool BuiltinPrefetch(CallExpr *TheCall);
3005
3006 /// Handle __builtin_alloca_with_align. This is declared
3007 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
3008 /// than 8.
3009 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
3010
3011 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
3012 bool BuiltinArithmeticFence(CallExpr *TheCall);
3013
3014 /// BuiltinAssume - Handle __assume (MS Extension).
3015 /// __assume does not evaluate its arguments, and should warn if its argument
3016 /// has side effects.
3017 bool BuiltinAssume(CallExpr *TheCall);
3018
3019 /// Handle __builtin_assume_aligned. This is declared
3020 /// as (const void*, size_t, ...) and can take one optional constant int arg.
3021 bool BuiltinAssumeAligned(CallExpr *TheCall);
3022
3023 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
3024 /// This checks that the target supports __builtin_longjmp and
3025 /// that val is a constant 1.
3026 bool BuiltinLongjmp(CallExpr *TheCall);
3027
3028 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
3029 /// This checks that the target supports __builtin_setjmp.
3030 bool BuiltinSetjmp(CallExpr *TheCall);
3031
3032 /// We have a call to a function like __sync_fetch_and_add, which is an
3033 /// overloaded function based on the pointer type of its first argument.
3034 /// The main BuildCallExpr routines have already promoted the types of
3035 /// arguments because all of these calls are prototyped as void(...).
3036 ///
3037 /// This function goes through and does final semantic checking for these
3038 /// builtins, as well as generating any warnings.
3039 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
3040
3041 /// BuiltinNontemporalOverloaded - We have a call to
3042 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
3043 /// overloaded function based on the pointer type of its last argument.
3044 ///
3045 /// This function goes through and does final semantic checking for these
3046 /// builtins.
3047 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
3048 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
3050
3051 /// \param FPOnly restricts the arguments to floating-point types.
3052 bool BuiltinElementwiseMath(CallExpr *TheCall,
3055 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
3056
3057 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
3058
3059 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
3061 bool BuiltinCountedByRef(CallExpr *TheCall);
3062
3063 // Matrix builtin handling.
3064 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
3065 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
3066 ExprResult CallResult);
3067 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
3068 ExprResult CallResult);
3069
3070 /// CheckFormatArguments - Check calls to printf and scanf (and similar
3071 /// functions) for correct use of format strings.
3072 /// Returns true if a format string has been fully checked.
3073 bool CheckFormatArguments(const FormatAttr *Format,
3074 ArrayRef<const Expr *> Args, bool IsCXXMember,
3075 VariadicCallType CallType, SourceLocation Loc,
3076 SourceRange Range,
3077 llvm::SmallBitVector &CheckedVarArgs);
3078 bool CheckFormatString(const FormatMatchesAttr *Format,
3079 ArrayRef<const Expr *> Args, bool IsCXXMember,
3080 VariadicCallType CallType, SourceLocation Loc,
3081 SourceRange Range,
3082 llvm::SmallBitVector &CheckedVarArgs);
3083 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
3084 FormatArgumentPassingKind FAPK,
3085 StringLiteral *ReferenceFormatString,
3086 unsigned format_idx, unsigned firstDataArg,
3088 SourceLocation Loc, SourceRange range,
3089 llvm::SmallBitVector &CheckedVarArgs);
3090
3091 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
3092
3093 /// Warn when using the wrong abs() function.
3094 void CheckAbsoluteValueFunction(const CallExpr *Call,
3095 const FunctionDecl *FDecl);
3096
3097 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
3098
3099 /// Check for dangerous or invalid arguments to memset().
3100 ///
3101 /// This issues warnings on known problematic, dangerous or unspecified
3102 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
3103 /// function calls.
3104 ///
3105 /// \param Call The call expression to diagnose.
3106 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
3107 IdentifierInfo *FnName);
3108
3109 bool CheckSizeofMemaccessArgument(const Expr *SizeOfArg, const Expr *Dest,
3110 IdentifierInfo *FnName);
3111 // Warn if the user has made the 'size' argument to strlcpy or strlcat
3112 // be the size of the source, instead of the destination.
3113 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
3114
3115 // Warn on anti-patterns as the 'size' argument to strncat.
3116 // The correct size argument should look like following:
3117 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
3118 void CheckStrncatArguments(const CallExpr *Call,
3119 const IdentifierInfo *FnName);
3120
3121 /// Alerts the user that they are attempting to free a non-malloc'd object.
3122 void CheckFreeArguments(const CallExpr *E);
3123
3124 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
3125 SourceLocation ReturnLoc, bool isObjCMethod = false,
3126 const AttrVec *Attrs = nullptr,
3127 const FunctionDecl *FD = nullptr);
3128
3129 /// Diagnoses "dangerous" implicit conversions within the given
3130 /// expression (which is a full expression). Implements -Wconversion
3131 /// and -Wsign-compare.
3132 ///
3133 /// \param CC the "context" location of the implicit conversion, i.e.
3134 /// the most location of the syntactic entity requiring the implicit
3135 /// conversion
3136 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
3137
3138 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
3139 /// Input argument E is a logical expression.
3141
3142 /// Diagnose when expression is an integer constant expression and its
3143 /// evaluation results in integer overflow
3144 void CheckForIntOverflow(const Expr *E);
3145 void CheckUnsequencedOperations(const Expr *E);
3146
3147 /// Perform semantic checks on a completed expression. This will either
3148 /// be a full-expression or a default argument expression.
3149 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
3150 bool IsConstexpr = false);
3151
3152 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
3153 Expr *Init);
3154
3155 /// A map from magic value to type information.
3156 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
3157 TypeTagForDatatypeMagicValues;
3158
3159 /// Peform checks on a call of a function with argument_with_type_tag
3160 /// or pointer_with_type_tag attributes.
3161 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
3162 const ArrayRef<const Expr *> ExprArgs,
3163 SourceLocation CallSiteLoc);
3164
3165 /// Check if we are taking the address of a packed field
3166 /// as this may be a problem if the pointer value is dereferenced.
3167 void CheckAddressOfPackedMember(Expr *rhs);
3168
3169 /// Helper class that collects misaligned member designations and
3170 /// their location info for delayed diagnostics.
3171 struct MisalignedMember {
3172 Expr *E;
3173 RecordDecl *RD;
3174 ValueDecl *MD;
3175 CharUnits Alignment;
3176
3177 MisalignedMember() : E(), RD(), MD() {}
3178 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
3179 CharUnits Alignment)
3180 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
3181 explicit MisalignedMember(Expr *E)
3182 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
3183
3184 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
3185 };
3186
3187 /// Adds an expression to the set of gathered misaligned members.
3188 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
3189 CharUnits Alignment);
3190 ///@}
3191
3192 //
3193 //
3194 // -------------------------------------------------------------------------
3195 //
3196 //
3197
3198 /// \name C++ Coroutines
3199 /// Implementations are in SemaCoroutine.cpp
3200 ///@{
3201
3202public:
3203 /// The C++ "std::coroutine_traits" template, which is defined in
3204 /// <coroutine_traits>
3206
3208 StringRef Keyword);
3212
3215 UnresolvedLookupExpr *Lookup);
3217 Expr *Awaiter, bool IsImplicit = false);
3219 UnresolvedLookupExpr *Lookup);
3222 bool IsImplicit = false);
3227
3228 // As a clang extension, enforces that a non-coroutine function must be marked
3229 // with [[clang::coro_wrapper]] if it returns a type marked with
3230 // [[clang::coro_return_type]].
3231 // Expects that FD is not a coroutine.
3233 /// Lookup 'coroutine_traits' in std namespace and std::experimental
3234 /// namespace. The namespace found is recorded in Namespace.
3236 SourceLocation FuncLoc);
3237 /// Check that the expression co_await promise.final_suspend() shall not be
3238 /// potentially-throwing.
3239 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
3240
3241 ///@}
3242
3243 //
3244 //
3245 // -------------------------------------------------------------------------
3246 //
3247 //
3248
3249 /// \name C++ Scope Specifiers
3250 /// Implementations are in SemaCXXScopeSpec.cpp
3251 ///@{
3252
3253public:
3254 // Marks SS invalid if it represents an incomplete type.
3256 // Complete an enum decl, maybe without a scope spec.
3258 CXXScopeSpec *SS = nullptr);
3259
3260 /// Compute the DeclContext that is associated with the given type.
3261 ///
3262 /// \param T the type for which we are attempting to find a DeclContext.
3263 ///
3264 /// \returns the declaration context represented by the type T,
3265 /// or NULL if the declaration context cannot be computed (e.g., because it is
3266 /// dependent and not the current instantiation).
3268
3269 /// Compute the DeclContext that is associated with the given
3270 /// scope specifier.
3271 ///
3272 /// \param SS the C++ scope specifier as it appears in the source
3273 ///
3274 /// \param EnteringContext when true, we will be entering the context of
3275 /// this scope specifier, so we can retrieve the declaration context of a
3276 /// class template or class template partial specialization even if it is
3277 /// not the current instantiation.
3278 ///
3279 /// \returns the declaration context represented by the scope specifier @p SS,
3280 /// or NULL if the declaration context cannot be computed (e.g., because it is
3281 /// dependent and not the current instantiation).
3283 bool EnteringContext = false);
3285
3286 /// If the given nested name specifier refers to the current
3287 /// instantiation, return the declaration that corresponds to that
3288 /// current instantiation (C++0x [temp.dep.type]p1).
3289 ///
3290 /// \param NNS a dependent nested name specifier.
3292
3293 /// The parser has parsed a global nested-name-specifier '::'.
3294 ///
3295 /// \param CCLoc The location of the '::'.
3296 ///
3297 /// \param SS The nested-name-specifier, which will be updated in-place
3298 /// to reflect the parsed nested-name-specifier.
3299 ///
3300 /// \returns true if an error occurred, false otherwise.
3302
3303 /// The parser has parsed a '__super' nested-name-specifier.
3304 ///
3305 /// \param SuperLoc The location of the '__super' keyword.
3306 ///
3307 /// \param ColonColonLoc The location of the '::'.
3308 ///
3309 /// \param SS The nested-name-specifier, which will be updated in-place
3310 /// to reflect the parsed nested-name-specifier.
3311 ///
3312 /// \returns true if an error occurred, false otherwise.
3314 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
3315
3316 /// Determines whether the given declaration is an valid acceptable
3317 /// result for name lookup of a nested-name-specifier.
3318 /// \param SD Declaration checked for nested-name-specifier.
3319 /// \param IsExtension If not null and the declaration is accepted as an
3320 /// extension, the pointed variable is assigned true.
3322 bool *CanCorrect = nullptr);
3323
3324 /// If the given nested-name-specifier begins with a bare identifier
3325 /// (e.g., Base::), perform name lookup for that identifier as a
3326 /// nested-name-specifier within the given scope, and return the result of
3327 /// that name lookup.
3329
3330 /// Keeps information about an identifier in a nested-name-spec.
3331 ///
3333 /// The type of the object, if we're parsing nested-name-specifier in
3334 /// a member access expression.
3336
3337 /// The identifier preceding the '::'.
3339
3340 /// The location of the identifier.
3342
3343 /// The location of the '::'.
3345
3346 /// Creates info object for the most typical case.
3348 SourceLocation ColonColonLoc,
3351 CCLoc(ColonColonLoc) {}
3352
3354 SourceLocation ColonColonLoc, QualType ObjectType)
3356 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
3357 };
3358
3359 /// Build a new nested-name-specifier for "identifier::", as described
3360 /// by ActOnCXXNestedNameSpecifier.
3361 ///
3362 /// \param S Scope in which the nested-name-specifier occurs.
3363 /// \param IdInfo Parser information about an identifier in the
3364 /// nested-name-spec.
3365 /// \param EnteringContext If true, enter the context specified by the
3366 /// nested-name-specifier.
3367 /// \param SS Optional nested name specifier preceding the identifier.
3368 /// \param ScopeLookupResult Provides the result of name lookup within the
3369 /// scope of the nested-name-specifier that was computed at template
3370 /// definition time.
3371 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
3372 /// error recovery and what kind of recovery is performed.
3373 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
3374 /// are allowed. The bool value pointed by this parameter is set to
3375 /// 'true' if the identifier is treated as if it was followed by ':',
3376 /// not '::'.
3377 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3378 ///
3379 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
3380 /// that it contains an extra parameter \p ScopeLookupResult, which provides
3381 /// the result of name lookup within the scope of the nested-name-specifier
3382 /// that was computed at template definition time.
3383 ///
3384 /// If ErrorRecoveryLookup is true, then this call is used to improve error
3385 /// recovery. This means that it should not emit diagnostics, it should
3386 /// just return true on failure. It also means it should only return a valid
3387 /// scope if it *knows* that the result is correct. It should not return in a
3388 /// dependent context, for example. Nor will it extend \p SS with the scope
3389 /// specifier.
3390 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3391 bool EnteringContext, CXXScopeSpec &SS,
3392 NamedDecl *ScopeLookupResult,
3393 bool ErrorRecoveryLookup,
3394 bool *IsCorrectedToColon = nullptr,
3395 bool OnlyNamespace = false);
3396
3397 /// The parser has parsed a nested-name-specifier 'identifier::'.
3398 ///
3399 /// \param S The scope in which this nested-name-specifier occurs.
3400 ///
3401 /// \param IdInfo Parser information about an identifier in the
3402 /// nested-name-spec.
3403 ///
3404 /// \param EnteringContext Whether we're entering the context nominated by
3405 /// this nested-name-specifier.
3406 ///
3407 /// \param SS The nested-name-specifier, which is both an input
3408 /// parameter (the nested-name-specifier before this type) and an
3409 /// output parameter (containing the full nested-name-specifier,
3410 /// including this new type).
3411 ///
3412 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
3413 /// are allowed. The bool value pointed by this parameter is set to 'true'
3414 /// if the identifier is treated as if it was followed by ':', not '::'.
3415 ///
3416 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3417 ///
3418 /// \returns true if an error occurred, false otherwise.
3419 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3420 bool EnteringContext, CXXScopeSpec &SS,
3421 bool *IsCorrectedToColon = nullptr,
3422 bool OnlyNamespace = false);
3423
3424 /// The parser has parsed a nested-name-specifier
3425 /// 'template[opt] template-name < template-args >::'.
3426 ///
3427 /// \param S The scope in which this nested-name-specifier occurs.
3428 ///
3429 /// \param SS The nested-name-specifier, which is both an input
3430 /// parameter (the nested-name-specifier before this type) and an
3431 /// output parameter (containing the full nested-name-specifier,
3432 /// including this new type).
3433 ///
3434 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
3435 /// \param TemplateName the template name.
3436 /// \param TemplateNameLoc The location of the template name.
3437 /// \param LAngleLoc The location of the opening angle bracket ('<').
3438 /// \param TemplateArgs The template arguments.
3439 /// \param RAngleLoc The location of the closing angle bracket ('>').
3440 /// \param CCLoc The location of the '::'.
3441 ///
3442 /// \param EnteringContext Whether we're entering the context of the
3443 /// nested-name-specifier.
3444 ///
3445 ///
3446 /// \returns true if an error occurred, false otherwise.
3448 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
3449 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
3450 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
3451 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
3452
3454 SourceLocation ColonColonLoc);
3455
3457 const DeclSpec &DS,
3458 SourceLocation ColonColonLoc,
3459 QualType Type);
3460
3461 /// IsInvalidUnlessNestedName - This method is used for error recovery
3462 /// purposes to determine whether the specified identifier is only valid as
3463 /// a nested name specifier, for example a namespace name. It is
3464 /// conservatively correct to always return false from this method.
3465 ///
3466 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
3468 NestedNameSpecInfo &IdInfo,
3469 bool EnteringContext);
3470
3471 /// Given a C++ nested-name-specifier, produce an annotation value
3472 /// that the parser can use later to reconstruct the given
3473 /// nested-name-specifier.
3474 ///
3475 /// \param SS A nested-name-specifier.
3476 ///
3477 /// \returns A pointer containing all of the information in the
3478 /// nested-name-specifier \p SS.
3480
3481 /// Given an annotation pointer for a nested-name-specifier, restore
3482 /// the nested-name-specifier structure.
3483 ///
3484 /// \param Annotation The annotation pointer, produced by
3485 /// \c SaveNestedNameSpecifierAnnotation().
3486 ///
3487 /// \param AnnotationRange The source range corresponding to the annotation.
3488 ///
3489 /// \param SS The nested-name-specifier that will be updated with the contents
3490 /// of the annotation pointer.
3491 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
3492 SourceRange AnnotationRange,
3493 CXXScopeSpec &SS);
3494
3495 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
3496
3497 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
3498 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
3499 /// After this method is called, according to [C++ 3.4.3p3], names should be
3500 /// looked up in the declarator-id's scope, until the declarator is parsed and
3501 /// ActOnCXXExitDeclaratorScope is called.
3502 /// The 'SS' should be a non-empty valid CXXScopeSpec.
3504
3505 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
3506 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
3507 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
3508 /// Used to indicate that names should revert to being looked up in the
3509 /// defining scope.
3511
3512 ///@}
3513
3514 //
3515 //
3516 // -------------------------------------------------------------------------
3517 //
3518 //
3519
3520 /// \name Declarations
3521 /// Implementations are in SemaDecl.cpp
3522 ///@{
3523
3524public:
3526
3527 /// The index of the first InventedParameterInfo that refers to the current
3528 /// context.
3530
3531 /// A RAII object to temporarily push a declaration context.
3533 private:
3534 Sema &S;
3535 DeclContext *SavedContext;
3536 ProcessingContextState SavedContextState;
3537 QualType SavedCXXThisTypeOverride;
3538 unsigned SavedFunctionScopesStart;
3539 unsigned SavedInventedParameterInfosStart;
3540
3541 public:
3542 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3543 : S(S), SavedContext(S.CurContext),
3544 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3545 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3546 SavedFunctionScopesStart(S.FunctionScopesStart),
3547 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3548 assert(ContextToPush && "pushing null context");
3549 S.CurContext = ContextToPush;
3550 if (NewThisContext)
3551 S.CXXThisTypeOverride = QualType();
3552 // Any saved FunctionScopes do not refer to this context.
3553 S.FunctionScopesStart = S.FunctionScopes.size();
3554 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3555 }
3556
3557 void pop() {
3558 if (!SavedContext)
3559 return;
3560 S.CurContext = SavedContext;
3561 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3562 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3563 S.FunctionScopesStart = SavedFunctionScopesStart;
3564 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3565 SavedContext = nullptr;
3566 }
3567
3569 ContextRAII(const ContextRAII &) = delete;
3571 };
3572
3573 void DiagnoseInvalidJumps(Stmt *Body);
3574
3575 /// The function definitions which were renamed as part of typo-correction
3576 /// to match their respective declarations. We want to keep track of them
3577 /// to ensure that we don't emit a "redefinition" error if we encounter a
3578 /// correctly named definition after the renamed definition.
3580
3581 /// A cache of the flags available in enumerations with the flag_enum
3582 /// attribute.
3583 llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3584
3585 /// A cache of enumerator values for enums checked by -Wassign-enum.
3586 llvm::DenseMap<const EnumDecl *, llvm::SmallVector<llvm::APSInt>>
3588
3589 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3590 /// declared. Rare. May alias another identifier, declared or undeclared.
3591 ///
3592 /// For aliases, the target identifier is used as a key for eventual
3593 /// processing when the target is declared. For the single-identifier form,
3594 /// the sole identifier is used as the key. Each entry is a `SetVector`
3595 /// (ordered by parse order) of aliases (identified by the alias name) in case
3596 /// of multiple aliases to the same undeclared identifier.
3597 llvm::MapVector<
3599 llvm::SetVector<
3601 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3603
3604 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3605 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3606 /// to define functions that occur in multiple standards to call the version
3607 /// in the currently selected standard.
3608 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>
3610
3611 /// Set containing all typedefs that are likely unused.
3614
3615 /// Store UnusedLocalTypedefNameCandidates in \p Sorted in a deterministic
3616 /// order.
3619
3620 typedef LazyVector<const DeclaratorDecl *,
3623
3624 /// The set of file scoped decls seen so far that have not been used
3625 /// and must warn if not used. Only contains the first declaration.
3627
3629 2, 2>
3631
3632 /// All the tentative definitions encountered in the TU.
3634
3635 /// All the external declarations encoutered and used in the TU.
3637
3638 /// Generally null except when we temporarily switch decl contexts,
3639 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3641
3642 /// Is the module scope we are in a C++ Header Unit?
3644 return ModuleScopes.empty() ? false
3645 : ModuleScopes.back().Module->isHeaderUnit();
3646 }
3647
3648 /// Get the module owning an entity.
3649 Module *getOwningModule(const Decl *Entity) {
3650 return Entity->getOwningModule();
3651 }
3652
3653 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3654
3656 /// Returns the TypeDeclType for the given type declaration,
3657 /// as ASTContext::getTypeDeclType would, but
3658 /// performs the required semantic checks for name lookup of said entity.
3659 void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD,
3660 SourceLocation NameLoc);
3661
3662 /// If the identifier refers to a type name within this scope,
3663 /// return the declaration of that type.
3664 ///
3665 /// This routine performs ordinary name lookup of the identifier II
3666 /// within the given scope, with optional C++ scope specifier SS, to
3667 /// determine whether the name refers to a type. If so, returns an
3668 /// opaque pointer (actually a QualType) corresponding to that
3669 /// type. Otherwise, returns NULL.
3671 Scope *S, CXXScopeSpec *SS = nullptr,
3672 bool isClassName = false, bool HasTrailingDot = false,
3673 ParsedType ObjectType = nullptr,
3674 bool IsCtorOrDtorName = false,
3675 bool WantNontrivialTypeSourceInfo = false,
3676 bool IsClassTemplateDeductionContext = true,
3677 ImplicitTypenameContext AllowImplicitTypename =
3679 IdentifierInfo **CorrectedII = nullptr);
3680
3681 /// isTagName() - This method is called *for error recovery purposes only*
3682 /// to determine if the specified name is a valid tag name ("struct foo"). If
3683 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3684 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3685 /// diagnose cases in C where the user forgot to specify the tag.
3687
3688 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3689 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3690 /// then downgrade the missing typename error to a warning.
3691 /// This is needed for MSVC compatibility; Example:
3692 /// @code
3693 /// template<class T> class A {
3694 /// public:
3695 /// typedef int TYPE;
3696 /// };
3697 /// template<class T> class B : public A<T> {
3698 /// public:
3699 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3700 /// };
3701 /// @endcode
3702 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3704 Scope *S, CXXScopeSpec *SS,
3705 ParsedType &SuggestedType,
3706 bool IsTemplateName = false);
3707
3708 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3709 /// type name has failed in a dependent context. In these situations, we
3710 /// automatically form a DependentTypeName that will retry lookup in a related
3711 /// scope during instantiation.
3713 SourceLocation NameLoc,
3714 bool IsTemplateTypeArg);
3715
3716 class NameClassification {
3718 union {
3723 };
3724
3725 explicit NameClassification(NameClassificationKind Kind) : Kind(Kind) {}
3726
3727 public:
3730
3733
3734 static NameClassification Error() {
3735 return NameClassification(NameClassificationKind::Error);
3736 }
3737
3738 static NameClassification Unknown() {
3739 return NameClassification(NameClassificationKind::Unknown);
3740 }
3741
3742 static NameClassification OverloadSet(ExprResult E) {
3743 NameClassification Result(NameClassificationKind::OverloadSet);
3744 Result.Expr = E;
3745 return Result;
3746 }
3747
3748 static NameClassification NonType(NamedDecl *D) {
3749 NameClassification Result(NameClassificationKind::NonType);
3750 Result.NonTypeDecl = D;
3751 return Result;
3752 }
3753
3754 static NameClassification UndeclaredNonType() {
3755 return NameClassification(NameClassificationKind::UndeclaredNonType);
3756 }
3757
3758 static NameClassification DependentNonType() {
3759 return NameClassification(NameClassificationKind::DependentNonType);
3760 }
3761
3762 static NameClassification TypeTemplate(TemplateName Name) {
3763 NameClassification Result(NameClassificationKind::TypeTemplate);
3764 Result.Template = Name;
3765 return Result;
3766 }
3767
3768 static NameClassification VarTemplate(TemplateName Name) {
3769 NameClassification Result(NameClassificationKind::VarTemplate);
3770 Result.Template = Name;
3771 return Result;
3772 }
3773
3774 static NameClassification FunctionTemplate(TemplateName Name) {
3776 Result.Template = Name;
3777 return Result;
3778 }
3779
3780 static NameClassification Concept(TemplateName Name) {
3781 NameClassification Result(NameClassificationKind::Concept);
3782 Result.Template = Name;
3783 return Result;
3784 }
3785
3786 static NameClassification UndeclaredTemplate(TemplateName Name) {
3788 Result.Template = Name;
3789 return Result;
3790 }
3791
3792 NameClassificationKind getKind() const { return Kind; }
3793
3796 return Expr;
3797 }
3798
3800 assert(Kind == NameClassificationKind::Type);
3801 return Type;
3802 }
3803
3805 assert(Kind == NameClassificationKind::NonType);
3806 return NonTypeDecl;
3807 }
3808
3817
3819 switch (Kind) {
3821 return TNK_Type_template;
3823 return TNK_Function_template;
3825 return TNK_Var_template;
3827 return TNK_Concept_template;
3830 default:
3831 llvm_unreachable("unsupported name classification.");
3832 }
3833 }
3834 };
3835
3836 /// Perform name lookup on the given name, classifying it based on
3837 /// the results of name lookup and the following token.
3838 ///
3839 /// This routine is used by the parser to resolve identifiers and help direct
3840 /// parsing. When the identifier cannot be found, this routine will attempt
3841 /// to correct the typo and classify based on the resulting name.
3842 ///
3843 /// \param S The scope in which we're performing name lookup.
3844 ///
3845 /// \param SS The nested-name-specifier that precedes the name.
3846 ///
3847 /// \param Name The identifier. If typo correction finds an alternative name,
3848 /// this pointer parameter will be updated accordingly.
3849 ///
3850 /// \param NameLoc The location of the identifier.
3851 ///
3852 /// \param NextToken The token following the identifier. Used to help
3853 /// disambiguate the name.
3854 ///
3855 /// \param CCC The correction callback, if typo correction is desired.
3856 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3857 IdentifierInfo *&Name, SourceLocation NameLoc,
3858 const Token &NextToken,
3859 CorrectionCandidateCallback *CCC = nullptr);
3860
3861 /// Act on the result of classifying a name as an undeclared (ADL-only)
3862 /// non-type declaration.
3864 SourceLocation NameLoc);
3865 /// Act on the result of classifying a name as an undeclared member of a
3866 /// dependent base class.
3868 IdentifierInfo *Name,
3869 SourceLocation NameLoc,
3870 bool IsAddressOfOperand);
3871 /// Act on the result of classifying a name as a specific non-type
3872 /// declaration.
3875 SourceLocation NameLoc,
3876 const Token &NextToken);
3877 /// Act on the result of classifying a name as an overload set.
3879
3880 /// Describes the detailed kind of a template name. Used in diagnostics.
3892
3893 /// Determine whether it's plausible that E was intended to be a
3894 /// template-name.
3896 if (!getLangOpts().CPlusPlus || E.isInvalid())
3897 return false;
3898 Dependent = false;
3899 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3900 return !DRE->hasExplicitTemplateArgs();
3901 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3902 return !ME->hasExplicitTemplateArgs();
3903 Dependent = true;
3904 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3905 return !DSDRE->hasExplicitTemplateArgs();
3906 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3907 return !DSME->hasExplicitTemplateArgs();
3908 // Any additional cases recognized here should also be handled by
3909 // diagnoseExprIntendedAsTemplateName.
3910 return false;
3911 }
3912
3913 void warnOnReservedIdentifier(const NamedDecl *D);
3915
3916 void ProcessPragmaExport(DeclaratorDecl *newDecl);
3917
3919
3921 MultiTemplateParamsArg TemplateParameterLists);
3922
3923 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3924 /// true if we were successful.
3926 SourceLocation Loc,
3927 unsigned FailedFoldDiagID);
3928
3929 /// Register the given locally-scoped extern "C" declaration so
3930 /// that it can be found later for redeclarations. We include any extern "C"
3931 /// declaration that is not visible in the translation unit here, not just
3932 /// function-scope declarations.
3934
3935 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3936 /// If T is the name of a class, then each of the following shall have a
3937 /// name different from T:
3938 /// - every static data member of class T;
3939 /// - every member function of class T
3940 /// - every member of class T that is itself a type;
3941 /// \returns true if the declaration name violates these rules.
3943
3944 /// Diagnose a declaration whose declarator-id has the given
3945 /// nested-name-specifier.
3946 ///
3947 /// \param SS The nested-name-specifier of the declarator-id.
3948 ///
3949 /// \param DC The declaration context to which the nested-name-specifier
3950 /// resolves.
3951 ///
3952 /// \param Name The name of the entity being declared.
3953 ///
3954 /// \param Loc The location of the name of the entity being declared.
3955 ///
3956 /// \param IsMemberSpecialization Whether we are declaring a member
3957 /// specialization.
3958 ///
3959 /// \param TemplateId The template-id, if any.
3960 ///
3961 /// \returns true if we cannot safely recover from this error, false
3962 /// otherwise.
3965 TemplateIdAnnotation *TemplateId,
3966 bool IsMemberSpecialization);
3967
3969
3970 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3971
3973 unsigned &IntVal);
3974
3975 /// Diagnose function specifiers on a declaration of an identifier that
3976 /// does not identify a function.
3977 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3978
3979 /// Return the declaration shadowed by the given typedef \p D, or null
3980 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3982 const LookupResult &R);
3983
3984 /// Return the declaration shadowed by the given variable \p D, or null
3985 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3987
3988 /// Return the declaration shadowed by the given variable \p D, or null
3989 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3991 const LookupResult &R);
3992 /// Diagnose variable or built-in function shadowing. Implements
3993 /// -Wshadow.
3994 ///
3995 /// This method is called whenever a VarDecl is added to a "useful"
3996 /// scope.
3997 ///
3998 /// \param ShadowedDecl the declaration that is shadowed by the given variable
3999 /// \param R the lookup of the name
4000 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
4001 const LookupResult &R);
4002
4003 /// Check -Wshadow without the advantage of a previous lookup.
4004 void CheckShadow(Scope *S, VarDecl *D);
4005
4006 /// Warn if 'E', which is an expression that is about to be modified, refers
4007 /// to a shadowing declaration.
4009
4010 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
4011 /// when these variables are captured by the lambda.
4013
4014 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
4015 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
4016 TypedefNameDecl *NewTD);
4019 TypeSourceInfo *TInfo,
4021
4022 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
4023 /// declares a typedef-name, either using the 'typedef' type specifier or via
4024 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
4028 TypeSourceInfo *TInfo,
4030 MultiTemplateParamsArg TemplateParamLists,
4031 bool &AddToScope,
4033
4034private:
4035 // Perform a check on an AsmLabel to verify its consistency and emit
4036 // diagnostics in case of an error.
4037 void CheckAsmLabel(Scope *S, Expr *AsmLabelExpr, StorageClass SC,
4038 TypeSourceInfo *TInfo, VarDecl *);
4039
4040public:
4041 /// Perform semantic checking on a newly-created variable
4042 /// declaration.
4043 ///
4044 /// This routine performs all of the type-checking required for a
4045 /// variable declaration once it has been built. It is used both to
4046 /// check variables after they have been parsed and their declarators
4047 /// have been translated into a declaration, and to check variables
4048 /// that have been instantiated from a template.
4049 ///
4050 /// Sets NewVD->isInvalidDecl() if an error was encountered.
4051 ///
4052 /// Returns true if the variable declaration is a redeclaration.
4053 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
4054 void CheckVariableDeclarationType(VarDecl *NewVD);
4055 void CheckCompleteVariableDeclaration(VarDecl *VD);
4056
4057 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
4058 TypeSourceInfo *TInfo,
4059 LookupResult &Previous,
4060 MultiTemplateParamsArg TemplateParamLists,
4061 bool &AddToScope);
4062
4063 /// Attach the ABI tag a standard calling convention variant requires, as an
4064 /// implicit abi_tag attribute. Call this once the function type is final.
4065 void addImplicitCallingConvAbiTag(FunctionDecl *FD);
4066
4067 /// AddOverriddenMethods - See if a method overrides any in the base classes,
4068 /// and if so, check that it's a valid override and remember it.
4069 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
4070
4071 /// Perform semantic checking of a new function declaration.
4072 ///
4073 /// Performs semantic analysis of the new function declaration
4074 /// NewFD. This routine performs all semantic checking that does not
4075 /// require the actual declarator involved in the declaration, and is
4076 /// used both for the declaration of functions as they are parsed
4077 /// (called via ActOnDeclarator) and for the declaration of functions
4078 /// that have been instantiated via C++ template instantiation (called
4079 /// via InstantiateDecl).
4080 ///
4081 /// \param IsMemberSpecialization whether this new function declaration is
4082 /// a member specialization (that replaces any definition provided by the
4083 /// previous declaration).
4084 ///
4085 /// This sets NewFD->isInvalidDecl() to true if there was an error.
4086 ///
4087 /// \returns true if the function declaration is a redeclaration.
4088 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
4089 LookupResult &Previous,
4090 bool IsMemberSpecialization, bool DeclIsDefn);
4091
4092 /// Checks if the new declaration declared in dependent context must be
4093 /// put in the same redeclaration chain as the specified declaration.
4094 ///
4095 /// \param D Declaration that is checked.
4096 /// \param PrevDecl Previous declaration found with proper lookup method for
4097 /// the same declaration name.
4098 /// \returns True if D must be added to the redeclaration chain which PrevDecl
4099 /// belongs to.
4100 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
4101
4102 /// Determines if we can perform a correct type check for \p D as a
4103 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
4104 /// best-effort check.
4105 ///
4106 /// \param NewD The new declaration.
4107 /// \param OldD The old declaration.
4108 /// \param NewT The portion of the type of the new declaration to check.
4109 /// \param OldT The portion of the type of the old declaration to check.
4110 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
4111 QualType NewT, QualType OldT);
4112 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
4113 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
4114
4115 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
4116 /// containing class. Otherwise it will return implicit SectionAttr if the
4117 /// function is a definition and there is an active value on CodeSegStack
4118 /// (from the current #pragma code-seg value).
4119 ///
4120 /// \param FD Function being declared.
4121 /// \param IsDefinition Whether it is a definition or just a declaration.
4122 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
4123 /// nullptr if no attribute should be added.
4124 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
4125 bool IsDefinition);
4126
4127 /// Common checks for a parameter-declaration that should apply to both
4128 /// function parameters and non-type template parameters.
4129 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
4130
4131 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
4132 /// to introduce parameters into function prototype scope.
4133 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
4134 SourceLocation ExplicitThisLoc = {});
4135
4136 /// Synthesizes a variable for a parameter arising from a
4137 /// typedef.
4138 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
4139 QualType T);
4140 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
4141 SourceLocation NameLoc,
4142 const IdentifierInfo *Name, QualType T,
4143 TypeSourceInfo *TSInfo, StorageClass SC);
4144
4145 /// Emit diagnostics if the initializer or any of its explicit or
4146 /// implicitly-generated subexpressions require copying or
4147 /// default-initializing a type that is or contains a C union type that is
4148 /// non-trivial to copy or default-initialize.
4149 void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
4150
4151 // These flags are passed to checkNonTrivialCUnion.
4157
4158 /// Emit diagnostics if a non-trivial C union type or a struct that contains
4159 /// a non-trivial C union is used in an invalid context.
4161 NonTrivialCUnionContext UseContext,
4162 unsigned NonTrivialKind);
4163
4164 /// Certain globally-unique variables might be accidentally duplicated if
4165 /// built into multiple shared libraries with hidden visibility. This can
4166 /// cause problems if the variable is mutable, its initialization is
4167 /// effectful, or its address is taken.
4170
4171 /// AddInitializerToDecl - Adds the initializer Init to the
4172 /// declaration dcl. If DirectInit is true, this is C++ direct
4173 /// initialization rather than copy initialization.
4174 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
4175 void ActOnUninitializedDecl(Decl *dcl);
4176
4177 /// ActOnInitializerError - Given that there was an error parsing an
4178 /// initializer for the given declaration, try to at least re-establish
4179 /// invariants such as whether a variable's type is either dependent or
4180 /// complete.
4181 void ActOnInitializerError(Decl *Dcl);
4182
4183 void ActOnCXXForRangeDecl(Decl *D, bool InExpansionStmt);
4185 IdentifierInfo *Ident,
4186 ParsedAttributes &Attrs);
4187
4188 /// Check if VD needs to be dllexport/dllimport due to being in a
4189 /// dllexport/import function.
4192
4193 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
4194 /// any semantic actions necessary after any initializer has been attached.
4195 void FinalizeDeclaration(Decl *D);
4197 ArrayRef<Decl *> Group);
4198
4199 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
4200 /// group, performing any necessary semantic checking.
4202
4203 /// Should be called on all declarations that might have attached
4204 /// documentation comments.
4205 void ActOnDocumentableDecl(Decl *D);
4207
4208 enum class FnBodyKind {
4209 /// C++26 [dcl.fct.def.general]p1
4210 /// function-body:
4211 /// ctor-initializer[opt] compound-statement
4212 /// function-try-block
4214 /// = default ;
4216 /// deleted-function-body
4217 ///
4218 /// deleted-function-body:
4219 /// = delete ;
4220 /// = delete ( unevaluated-string ) ;
4222 };
4223
4225 SourceLocation LocAfterDecls);
4227 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
4228 SkipBodyInfo *SkipBody = nullptr);
4230 MultiTemplateParamsArg TemplateParamLists,
4231 SkipBodyInfo *SkipBody = nullptr,
4232 FnBodyKind BodyKind = FnBodyKind::Other);
4234 SkipBodyInfo *SkipBody = nullptr,
4235 FnBodyKind BodyKind = FnBodyKind::Other);
4237
4238 /// Determine whether we can delay parsing the body of a function or
4239 /// function template until it is used, assuming we don't care about emitting
4240 /// code for that function.
4241 ///
4242 /// This will be \c false if we may need the body of the function in the
4243 /// middle of parsing an expression (where it's impractical to switch to
4244 /// parsing a different function), for instance, if it's constexpr in C++11
4245 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
4246 bool canDelayFunctionBody(const Declarator &D);
4247
4248 /// Determine whether we can skip parsing the body of a function
4249 /// definition, assuming we don't care about analyzing its body or emitting
4250 /// code for that function.
4251 ///
4252 /// This will be \c false only if we may need the body of the function in
4253 /// order to parse the rest of the program (for instance, if it is
4254 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
4255 bool canSkipFunctionBody(Decl *D);
4256
4257 /// Given the set of return statements within a function body,
4258 /// compute the variables that are subject to the named return value
4259 /// optimization.
4260 ///
4261 /// Each of the variables that is subject to the named return value
4262 /// optimization will be marked as NRVO variables in the AST, and any
4263 /// return statement that has a marked NRVO variable as its NRVO candidate can
4264 /// use the named return value optimization.
4265 ///
4266 /// This function applies a very simplistic algorithm for NRVO: if every
4267 /// return statement in the scope of a variable has the same NRVO candidate,
4268 /// that candidate is an NRVO variable.
4270
4271 /// Performs semantic analysis at the end of a function body.
4272 ///
4273 /// \param RetainFunctionScopeInfo If \c true, the client is responsible for
4274 /// releasing the associated \p FunctionScopeInfo. This is useful when
4275 /// building e.g. LambdaExprs.
4277 bool IsInstantiation = false,
4278 bool RetainFunctionScopeInfo = false);
4281
4282 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
4283 /// attribute for which parsing is delayed.
4285
4286 /// Diagnose any unused parameters in the given sequence of
4287 /// ParmVarDecl pointers.
4289
4290 /// Diagnose whether the size of parameters or return value of a
4291 /// function or obj-c method definition is pass-by-value and larger than a
4292 /// specified threshold.
4293 void
4295 QualType ReturnTy, NamedDecl *D);
4296
4298 SourceLocation RParenLoc);
4299
4302
4303 void ActOnPopScope(SourceLocation Loc, Scope *S);
4304
4305 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4306 /// no declarator (e.g. "struct foo;") is parsed.
4308 const ParsedAttributesView &DeclAttrs,
4309 RecordDecl *&AnonRecord);
4310
4311 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4312 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
4313 /// parameters to cope with template friend declarations.
4315 const ParsedAttributesView &DeclAttrs,
4316 MultiTemplateParamsArg TemplateParams,
4317 bool IsExplicitInstantiation,
4318 RecordDecl *&AnonRecord,
4319 SourceLocation EllipsisLoc = {});
4320
4321 /// BuildAnonymousStructOrUnion - Handle the declaration of an
4322 /// anonymous structure or union. Anonymous unions are a C++ feature
4323 /// (C++ [class.union]) and a C11 feature; anonymous structures
4324 /// are a C11 feature and GNU C++ extension.
4325 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
4326 RecordDecl *Record,
4327 const PrintingPolicy &Policy);
4328
4329 /// Called once it is known whether
4330 /// a tag declaration is an anonymous union or struct.
4332
4333 /// Emit diagnostic warnings for placeholder members.
4334 /// We can only do that after the class is fully constructed,
4335 /// as anonymous union/structs can insert placeholders
4336 /// in their parent scope (which might be a Record).
4338
4339 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
4340 /// Microsoft C anonymous structure.
4341 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
4342 /// Example:
4343 ///
4344 /// struct A { int a; };
4345 /// struct B { struct A; int b; };
4346 ///
4347 /// void foo() {
4348 /// B var;
4349 /// var.a = 3;
4350 /// }
4351 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
4352 RecordDecl *Record);
4353
4354 /// Given a non-tag type declaration, returns an enum useful for indicating
4355 /// what kind of non-tag type this is.
4356 NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK);
4357
4358 /// Determine whether a tag with a given kind is acceptable
4359 /// as a redeclaration of the given tag declaration.
4360 ///
4361 /// \returns true if the new tag kind is acceptable, false otherwise.
4363 bool isDefinition, SourceLocation NewTagLoc,
4364 const IdentifierInfo *Name);
4365
4366 /// This is invoked when we see 'struct foo' or 'struct {'. In the
4367 /// former case, Name will be non-null. In the later case, Name will be null.
4368 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
4369 /// a reference/declaration/definition of a tag.
4370 ///
4371 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
4372 /// trailing-type-specifier) other than one in an alias-declaration.
4373 ///
4374 /// \param SkipBody If non-null, will be set to indicate if the caller should
4375 /// skip the definition of this tag and treat it as if it were a declaration.
4376 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
4377 SourceLocation KWLoc, CXXScopeSpec &SS,
4378 IdentifierInfo *Name, SourceLocation NameLoc,
4379 const ParsedAttributesView &Attr, AccessSpecifier AS,
4380 SourceLocation ModulePrivateLoc,
4381 MultiTemplateParamsArg TemplateParameterLists,
4382 bool &OwnedDecl, bool &IsDependent,
4383 SourceLocation ScopedEnumKWLoc,
4384 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
4385 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
4386 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
4387
4388 /// ActOnField - Each field of a C struct/union is passed into this in order
4389 /// to create a FieldDecl object for it.
4390 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
4391 Declarator &D, Expr *BitfieldWidth);
4392
4393 /// HandleField - Analyze a field of a C struct or a C++ data member.
4394 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
4395 Declarator &D, Expr *BitfieldWidth,
4396 InClassInitStyle InitStyle, AccessSpecifier AS);
4397
4398 /// Build a new FieldDecl and check its well-formedness.
4399 ///
4400 /// This routine builds a new FieldDecl given the fields name, type,
4401 /// record, etc. \p PrevDecl should refer to any previous declaration
4402 /// with the same name and in the same scope as the field to be
4403 /// created.
4404 ///
4405 /// \returns a new FieldDecl.
4406 ///
4407 /// \todo The Declarator argument is a hack. It will be removed once
4408 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
4409 TypeSourceInfo *TInfo, RecordDecl *Record,
4410 SourceLocation Loc, bool Mutable,
4411 Expr *BitfieldWidth, InClassInitStyle InitStyle,
4412 SourceLocation TSSL, AccessSpecifier AS,
4413 NamedDecl *PrevDecl, Declarator *D = nullptr);
4414
4416
4417 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
4418 /// class and class extensions. For every class \@interface and class
4419 /// extension \@interface, if the last ivar is a bitfield of any type,
4420 /// then add an implicit `char :0` ivar to the end of that interface.
4421 void ActOnLastBitfield(SourceLocation DeclStart,
4422 SmallVectorImpl<Decl *> &AllIvarDecls);
4423
4424 // This is used for both record definitions and ObjC interface declarations.
4425 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
4426 ArrayRef<Decl *> Fields, SourceLocation LBrac,
4427 SourceLocation RBrac, const ParsedAttributesView &AttrList);
4428
4429 /// ActOnTagStartDefinition - Invoked when we have entered the
4430 /// scope of a tag's definition (e.g., for an enumeration, class,
4431 /// struct, or union).
4432 void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
4433
4434 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
4435 /// Differently from C++, actually parse the body and reject / error out
4436 /// in case of a structural mismatch.
4437 bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody);
4438
4440
4441 /// Invoked when we enter a tag definition that we're skipping.
4443
4444 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
4445 /// C++ record definition's base-specifiers clause and are starting its
4446 /// member declarations.
4448 SourceLocation FinalLoc,
4449 bool IsFinalSpelledSealed,
4450 bool IsAbstract,
4451 SourceLocation LBraceLoc);
4452
4453 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
4454 /// the definition of a tag (enumeration, class, struct, or union).
4456 SourceRange BraceRange);
4457
4460
4462
4463 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
4464 /// error parsing the definition of a tag.
4466
4468 EnumConstantDecl *LastEnumConst,
4469 SourceLocation IdLoc, IdentifierInfo *Id,
4470 Expr *val);
4471
4472 /// Check that this is a valid underlying type for an enum declaration.
4474
4475 /// Check whether this is a valid redeclaration of a previous enumeration.
4476 /// \return true if the redeclaration was invalid.
4477 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
4478 QualType EnumUnderlyingTy, bool IsFixed,
4479 const EnumDecl *Prev);
4480
4481 /// Determine whether the body of an anonymous enumeration should be skipped.
4482 /// \param II The name of the first enumerator.
4484 SourceLocation IILoc);
4485
4486 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
4487 SourceLocation IdLoc, IdentifierInfo *Id,
4488 const ParsedAttributesView &Attrs,
4489 SourceLocation EqualLoc, Expr *Val,
4490 SkipBodyInfo *SkipBody = nullptr);
4491 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
4492 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
4493 const ParsedAttributesView &Attr);
4494
4495 /// Set the current declaration context until it gets popped.
4496 void PushDeclContext(Scope *S, DeclContext *DC);
4497 void PopDeclContext();
4498
4499 /// EnterDeclaratorContext - Used when we must lookup names in the context
4500 /// of a declarator's nested name specifier.
4503
4504 /// Enter a template parameter scope, after it's been associated with a
4505 /// particular DeclContext. Causes lookup within the scope to chain through
4506 /// enclosing contexts in the correct order.
4508
4509 /// Push the parameters of D, which must be a function, into scope.
4512
4513 /// Add this decl to the scope shadowed decl chains.
4514 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4515
4516 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4517 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4518 /// true if 'D' belongs to the given declaration context.
4519 ///
4520 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4521 /// enclosing namespace set of the context, rather than contained
4522 /// directly within it.
4523 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4524 bool AllowInlineNamespace = false) const;
4525
4526 /// Determine whether a tag-like declaration found by lookup can be
4527 /// redeclared in the given scope. If lookup found a using-shadow, also
4528 /// consider the scope of the declaration named by the using-shadow.
4530 Scope *S = nullptr,
4531 bool AllowInlineNamespace = false) const;
4532
4533 /// Finds the scope corresponding to the given decl context, if it
4534 /// happens to be an enclosing scope. Otherwise return NULL.
4536
4537 /// Subroutines of ActOnDeclarator().
4539 TypeSourceInfo *TInfo);
4541
4542 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4544 NamedDecl *New, Decl *Old,
4546
4547 /// CheckAttributesOnDeducedType - Calls Sema functions for attributes that
4548 /// requires the type to be deduced.
4550
4551 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4552 /// same name and scope as a previous declaration 'Old'. Figure out
4553 /// how to resolve this situation, merging decls or emitting
4554 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4556 LookupResult &OldDecls);
4557
4558 /// CleanupMergedEnum - We have just merged the decl 'New' by making another
4559 /// definition visible.
4560 /// This method performs any necessary cleanup on the parser state to discard
4561 /// child nodes from newly parsed decl we are retiring.
4562 void CleanupMergedEnum(Scope *S, Decl *New);
4563
4564 /// MergeFunctionDecl - We just parsed a function 'New' from
4565 /// declarator D which has the same name and scope as a previous
4566 /// declaration 'Old'. Figure out how to resolve this situation,
4567 /// merging decls or emitting diagnostics as appropriate.
4568 ///
4569 /// In C++, New and Old must be declarations that are not
4570 /// overloaded. Use IsOverload to determine whether New and Old are
4571 /// overloaded, and to select the Old declaration that New should be
4572 /// merged with.
4573 ///
4574 /// Returns true if there was an error, false otherwise.
4576 bool MergeTypeWithOld, bool NewDeclIsDefn);
4577
4578 /// Completes the merge of two function declarations that are
4579 /// known to be compatible.
4580 ///
4581 /// This routine handles the merging of attributes and other
4582 /// properties of function declarations from the old declaration to
4583 /// the new declaration, once we know that New is in fact a
4584 /// redeclaration of Old.
4585 ///
4586 /// \returns false
4588 Scope *S, bool MergeTypeWithOld);
4590
4591 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4592 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4593 /// situation, merging decls or emitting diagnostics as appropriate.
4594 ///
4595 /// Tentative definition rules (C99 6.9.2p2) are checked by
4596 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4597 /// definitions here, since the initializer hasn't been attached.
4599
4600 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4601 /// scope as a previous declaration 'Old'. Figure out how to merge their
4602 /// types, emitting diagnostics as appropriate.
4603 ///
4604 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4605 /// back to here in AddInitializerToDecl. We can't check them before the
4606 /// initializer is attached.
4607 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4608
4609 /// We've just determined that \p Old and \p New both appear to be definitions
4610 /// of the same variable. Either diagnose or fix the problem.
4611 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4613
4614 /// Filters out lookup results that don't fall within the given scope
4615 /// as determined by isDeclInScope.
4617 bool ConsiderLinkage, bool AllowInlineNamespace);
4618
4619 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4620 /// have compatible owning modules.
4622
4623 /// [module.interface]p6:
4624 /// A redeclaration of an entity X is implicitly exported if X was introduced
4625 /// by an exported declaration; otherwise it shall not be exported.
4627
4628 /// A wrapper function for checking the semantic restrictions of
4629 /// a redeclaration within a module.
4631
4632 /// Check the redefinition in C++20 Modules.
4633 ///
4634 /// [basic.def.odr]p14:
4635 /// For any definable item D with definitions in multiple translation units,
4636 /// - if D is a non-inline non-templated function or variable, or
4637 /// - if the definitions in different translation units do not satisfy the
4638 /// following requirements,
4639 /// the program is ill-formed; a diagnostic is required only if the
4640 /// definable item is attached to a named module and a prior definition is
4641 /// reachable at the point where a later definition occurs.
4642 /// - Each such definition shall not be attached to a named module
4643 /// ([module.unit]).
4644 /// - Each such definition shall consist of the same sequence of tokens, ...
4645 /// ...
4646 ///
4647 /// Return true if the redefinition is not allowed. Return false otherwise.
4648 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4649
4651
4652 /// If it's a file scoped decl that must warn if not used, keep track
4653 /// of it.
4655
4656 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4658
4661 DiagReceiverTy DiagReceiver);
4662 void DiagnoseUnusedDecl(const NamedDecl *ND);
4663
4664 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4665 /// unless they are marked attr(unused).
4666 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4667
4668 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4669 /// variable.
4670 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4671
4672 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4673 /// from S, where a non-field would be declared. This routine copes
4674 /// with the difference between C and C++ scoping rules in structs and
4675 /// unions. For example, the following code is well-formed in C but
4676 /// ill-formed in C++:
4677 /// @code
4678 /// struct S6 {
4679 /// enum { BAR } e;
4680 /// };
4681 ///
4682 /// void test_S6() {
4683 /// struct S6 a;
4684 /// a.e = BAR;
4685 /// }
4686 /// @endcode
4687 /// For the declaration of BAR, this routine will return a different
4688 /// scope. The scope S will be the scope of the unnamed enumeration
4689 /// within S6. In C++, this routine will return the scope associated
4690 /// with S6, because the enumeration's scope is a transparent
4691 /// context but structures can contain non-field names. In C, this
4692 /// routine will return the translation unit scope, since the
4693 /// enumeration's scope is a transparent context and structures cannot
4694 /// contain non-field names.
4696
4698 SourceLocation Loc);
4699
4700 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4701 /// file scope. lazily create a decl for it. ForRedeclaration is true
4702 /// if we're creating this built-in in anticipation of redeclaring the
4703 /// built-in.
4704 NamedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S,
4705 bool ForRedeclaration, SourceLocation Loc);
4706
4707 /// Get the outermost AttributedType node that sets a calling convention.
4708 /// Valid types should not have multiple attributes with different CCs.
4709 const AttributedType *getCallingConvAttributedType(QualType T) const;
4710
4711 /// GetNameForDeclarator - Determine the full declaration name for the
4712 /// given Declarator.
4714
4715 /// Retrieves the declaration name from a parsed unqualified-id.
4717
4718 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4719 /// we are currently parsing the initializer.
4721
4722 /// Look for a locally scoped extern "C" declaration by the given name.
4724
4727
4728 /// Adjust the \c DeclContext for a function or variable that might be a
4729 /// function-local external declaration.
4731
4733
4734 /// Checks if the variant/multiversion functions are compatible.
4736 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4737 const PartialDiagnostic &NoProtoDiagID,
4738 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4739 const PartialDiagnosticAt &NoSupportDiagIDAt,
4740 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4741 bool ConstexprSupported, bool CLinkageMayDiffer);
4742
4743 /// type checking declaration initializers (C99 6.7.8)
4745 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4746
4749 SourceRange Range, bool DirectInit,
4750 Expr *Init);
4751
4753 Expr *Init);
4754
4756
4757 // Heuristically tells if the function is `get_return_object` member of a
4758 // coroutine promise_type by matching the function name.
4759 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4760 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4761
4762 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4763 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4765 Scope *S);
4766
4767 /// If this function is a C++ replaceable global allocation function
4768 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4769 /// adds any function attributes that we know a priori based on the standard.
4770 ///
4771 /// We need to check for duplicate attributes both here and where user-written
4772 /// attributes are applied to declarations.
4774 FunctionDecl *FD);
4775
4776 /// Adds any function attributes that we know a priori based on
4777 /// the declaration of this function.
4778 ///
4779 /// These attributes can apply both to implicitly-declared builtins
4780 /// (like __builtin___printf_chk) or to library-declared functions
4781 /// like NSLog or printf.
4782 ///
4783 /// We need to check for duplicate attributes both here and where user-written
4784 /// attributes are applied to declarations.
4786
4787 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4788 /// the correct width, and that the field type is valid.
4789 /// Returns false on success.
4791 const IdentifierInfo *FieldName, QualType FieldTy,
4792 bool IsMsStruct, Expr *BitWidth);
4793
4794 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4795 /// enum. If AllowMask is true, then we also allow the complement of a valid
4796 /// value, to be used as a mask.
4797 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4798 bool AllowMask) const;
4799
4800 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4801 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4802 SourceLocation WeakNameLoc);
4803
4804 /// ActOnPragmaRedefineExtname - Called on well formed
4805 /// \#pragma redefine_extname oldname newname.
4807 IdentifierInfo *AliasName,
4808 SourceLocation PragmaLoc,
4809 SourceLocation WeakNameLoc,
4810 SourceLocation AliasNameLoc);
4811
4812 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4813 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4814 SourceLocation PragmaLoc,
4815 SourceLocation WeakNameLoc,
4816 SourceLocation AliasNameLoc);
4817
4818 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4821 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4822 OMPDiscarded, // Discarded due to OpenMP hostness
4823 TemplateDiscarded, // Discarded due to uninstantiated templates
4825 };
4826 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4827 bool Final = false);
4828
4829 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4831
4832 /// Function or variable declarations to be checked for whether the deferred
4833 /// diagnostics should be emitted.
4835
4836private:
4837 /// Map of current shadowing declarations to shadowed declarations. Warn if
4838 /// it looks like the user is trying to modify the shadowing declaration.
4839 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4840
4841 // We need this to handle
4842 //
4843 // typedef struct {
4844 // void *foo() { return 0; }
4845 // } A;
4846 //
4847 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4848 // for example. If 'A', foo will have external linkage. If we have '*A',
4849 // foo will have no linkage. Since we can't know until we get to the end
4850 // of the typedef, this function finds out if D might have non-external
4851 // linkage. Callers should verify at the end of the TU if it D has external
4852 // linkage or not.
4853 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4854
4855#include "clang/Sema/AttrIsTypeDependent.inc"
4856
4857 ///@}
4858
4859 //
4860 //
4861 // -------------------------------------------------------------------------
4862 //
4863 //
4864
4865 /// \name Declaration Attribute Handling
4866 /// Implementations are in SemaDeclAttr.cpp
4867 ///@{
4868
4869public:
4870 /// Describes the kind of priority given to an availability attribute.
4871 ///
4872 /// The sum of priorities deteremines the final priority of the attribute.
4873 /// The final priority determines how the attribute will be merged.
4874 /// An attribute with a lower priority will always remove higher priority
4875 /// attributes for the specified platform when it is being applied. An
4876 /// attribute with a higher priority will not be applied if the declaration
4877 /// already has an availability attribute with a lower priority for the
4878 /// specified platform. The final prirority values are not expected to match
4879 /// the values in this enumeration, but instead should be treated as a plain
4880 /// integer value. This enumeration just names the priority weights that are
4881 /// used to calculate that final vaue.
4883 /// The availability attribute was specified explicitly next to the
4884 /// declaration.
4886
4887 /// The availability attribute was applied using '#pragma clang attribute'.
4889
4890 /// The availability attribute for a specific platform was inferred from
4891 /// an availability attribute for another platform.
4893
4894 /// The availability attribute was inferred from an 'anyAppleOS'
4895 /// availability attribute.
4897
4898 /// The availability attribute was inferred from an 'anyAppleOS'
4899 /// availability attribute that was applied using '#pragma clang attribute'.
4900 /// This has the lowest priority.
4902 };
4903
4904 /// Describes the reason a calling convention specification was ignored, used
4905 /// for diagnostics.
4912
4913 /// A helper function to provide Attribute Location for the Attr types
4914 /// AND the ParsedAttr.
4915 template <typename AttrInfo>
4916 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4917 getAttrLoc(const AttrInfo &AL) {
4918 return AL.getLocation();
4919 }
4921
4922 /// If Expr is a valid integer constant, get the value of the integer
4923 /// expression and return success or failure. May output an error.
4924 ///
4925 /// Negative argument is implicitly converted to unsigned, unless
4926 /// \p StrictlyUnsigned is true.
4927 template <typename AttrInfo>
4928 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4929 unsigned Idx = UINT_MAX,
4930 bool StrictlyUnsigned = false) {
4931 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4932 if (Expr->isTypeDependent() ||
4934 if (Idx != UINT_MAX)
4935 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4936 << &AI << Idx << AANT_ArgumentIntegerConstant
4937 << Expr->getSourceRange();
4938 else
4939 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4941 return false;
4942 }
4943
4944 if (!I->isIntN(32)) {
4945 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4946 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4947 return false;
4948 }
4949
4950 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4951 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4952 << &AI << /*non-negative*/ 1;
4953 return false;
4954 }
4955
4956 Val = (uint32_t)I->getZExtValue();
4957 return true;
4958 }
4959
4960 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4961 /// \#pragma weak during processing of other Decls.
4962 /// I couldn't figure out a clean way to generate these in-line, so
4963 /// we store them here and handle separately -- which is a hack.
4964 /// It would be best to refactor this.
4966
4967 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4969
4971 2, 2>
4973
4974 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4975 /// us to associate a raw vector type with one of the ext_vector type names.
4976 /// This is only necessary for issuing pretty diagnostics.
4978
4979 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4980 /// and return false, otherwise set \p Str to the value of the string literal
4981 /// and return true.
4983 const Expr *E, StringRef &Str,
4984 SourceLocation *ArgLocation = nullptr);
4985
4986 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4987 /// If not emit an error and return false. If the argument is an identifier it
4988 /// will emit an error with a fixit hint and treat it as if it was a string
4989 /// literal.
4990 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4991 StringRef &Str,
4992 SourceLocation *ArgLocation = nullptr);
4993
4994 /// Determine if type T is a valid subject for a nonnull and similar
4995 /// attributes. Dependent types are considered valid so they can be checked
4996 /// during instantiation time. By default, we look through references (the
4997 /// behavior used by nonnull), but if the second parameter is true, then we
4998 /// treat a reference type as valid.
4999 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
5000
5001 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
5002 /// declaration.
5003 void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
5004 Expr *OE);
5005
5006 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
5007 /// declaration.
5008 void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI,
5009 Expr *ParamExpr);
5010
5011 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
5012 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
5013
5014 AvailabilityAttr *
5016 const IdentifierInfo *Platform, bool Implicit,
5017 VersionTuple Introduced, VersionTuple Deprecated,
5018 VersionTuple Obsoleted, bool IsUnavailable,
5019 StringRef Message, bool IsStrict, StringRef Replacement,
5020 AvailabilityMergeKind AMK, int Priority,
5021 const IdentifierInfo *IIEnvironment,
5022 const IdentifierInfo *InferredPlatformII = nullptr);
5023
5024 AvailabilityAttr *mergeAndInferAvailabilityAttr(
5025 NamedDecl *D, const AttributeCommonInfo &CI,
5026 const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced,
5027 VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable,
5028 StringRef Message, bool IsStrict, StringRef Replacement,
5029 AvailabilityMergeKind AMK, int Priority,
5030 const IdentifierInfo *IIEnvironment,
5031 const IdentifierInfo *InferredPlatformII);
5032
5033 TypeVisibilityAttr *
5035 TypeVisibilityAttr::VisibilityType Vis);
5036 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
5037 VisibilityAttr::VisibilityType Vis);
5039 VisibilityAttr::VisibilityType Type);
5040 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
5041 StringRef Name);
5042
5043 /// Used to implement to perform semantic checking on
5044 /// attribute((section("foo"))) specifiers.
5045 ///
5046 /// In this case, "foo" is passed in to be checked. If the section
5047 /// specifier is invalid, return an Error that indicates the problem.
5048 ///
5049 /// This is a simple quality of implementation feature to catch errors
5050 /// and give good diagnostics in cases when the assembler or code generator
5051 /// would otherwise reject the section specifier.
5052 llvm::Error isValidSectionSpecifier(StringRef Str);
5053 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
5054 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
5055 StringRef Name);
5056
5057 // Check for things we'd like to warn about. Multiversioning issues are
5058 // handled later in the process, once we know how many exist.
5059 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
5060
5061 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
5062 StringRef NewUserDiagnostic);
5063 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
5064 const IdentifierInfo *Format, int FormatIdx,
5065 int FirstArg);
5066 FormatMatchesAttr *mergeFormatMatchesAttr(Decl *D,
5067 const AttributeCommonInfo &CI,
5068 const IdentifierInfo *Format,
5069 int FormatIdx,
5070 StringLiteral *FormatStr);
5071 ModularFormatAttr *mergeModularFormatAttr(Decl *D,
5072 const AttributeCommonInfo &CI,
5073 const IdentifierInfo *ModularImplFn,
5074 StringRef ImplName,
5076
5077 PersonalityAttr *mergePersonalityAttr(Decl *D, FunctionDecl *Routine,
5078 const AttributeCommonInfo &CI);
5079
5080 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
5081 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
5082 bool IsPackExpansion);
5084 bool IsPackExpansion);
5085
5086 /// AddAlignValueAttr - Adds an align_value attribute to a particular
5087 /// declaration.
5088 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
5089
5090 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
5091 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
5094
5096 bool BestCase,
5097 MSInheritanceModel SemanticSpelling);
5098
5100
5101 /// AddModeAttr - Adds a mode attribute to a particular declaration.
5102 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI,
5103 const IdentifierInfo *Name, bool InInstantiation = false);
5104 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
5105 const AttributeCommonInfo &CI,
5106 const IdentifierInfo *Ident);
5107 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
5108 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
5109 const AttributeCommonInfo &CI);
5110 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
5111 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
5112 const InternalLinkageAttr &AL);
5113
5114 /// Check validaty of calling convention attribute \p attr. If \p FD
5115 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
5116 /// target. Otherwise, it is specified by \p CFT.
5118 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
5120
5121 /// Checks a regparm attribute, returning true if it is ill-formed and
5122 /// otherwise setting numParams to the appropriate value.
5123 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
5124
5125 /// Create a CUDALaunchBoundsAttr attribute. By default, the function only
5126 /// supports nvptx target architectures and skips MaxBlocks if it is previous
5127 /// to sm_90. Use \p IgnoreArch to skip the architecture check.
5128 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
5129 Expr *MaxThreads,
5130 Expr *MinBlocks, Expr *MaxBlocks,
5131 bool IgnoreArch = false);
5132
5133 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
5134 /// declaration.
5135 void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI,
5136 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
5137
5138 /// Add a cluster_dims attribute to a particular declaration.
5139 CUDAClusterDimsAttr *createClusterDimsAttr(const AttributeCommonInfo &CI,
5140 Expr *X, Expr *Y, Expr *Z);
5141 void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X,
5142 Expr *Y, Expr *Z);
5143 /// Add a no_cluster attribute to a particular declaration.
5144 void addNoClusterAttr(Decl *D, const AttributeCommonInfo &CI);
5145
5146 enum class RetainOwnershipKind { NS, CF, OS };
5147
5148 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
5149 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
5150
5151 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
5152
5153 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
5154 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
5155 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
5156 const AttributeCommonInfo &CI,
5157 bool BestCase,
5158 MSInheritanceModel Model);
5159
5160 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
5161 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
5162 const EnforceTCBLeafAttr &AL);
5163
5164 /// Helper for delayed processing TransparentUnion or
5165 /// BPFPreserveAccessIndexAttr attribute.
5167 const ParsedAttributesView &AttrList);
5168
5169 // Options for ProcessDeclAttributeList().
5173
5176 Result.IncludeCXX11Attributes = Val;
5177 return Result;
5178 }
5179
5182 Result.IgnoreTypeAttributes = Val;
5183 return Result;
5184 }
5185
5186 // Should C++11 attributes be processed?
5188
5189 // Should any type attributes encountered be ignored?
5190 // If this option is false, a diagnostic will be emitted for any type
5191 // attributes of a kind that does not "slide" from the declaration to
5192 // the decl-specifier-seq.
5194 };
5195
5196 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
5197 /// attribute list to the specified decl, ignoring any type attributes.
5199 const ParsedAttributesView &AttrList,
5200 const ProcessDeclAttributeOptions &Options =
5202
5203 /// Annotation attributes are the only attributes allowed after an access
5204 /// specifier.
5206 const ParsedAttributesView &AttrList);
5207
5208 /// checkUnusedDeclAttributes - Given a declarator which is not being
5209 /// used to build a declaration, complain about any decl attributes
5210 /// which might be lying around on it.
5212
5213 void DiagnoseUnknownAttribute(const ParsedAttr &AL);
5214
5215 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
5216 /// \#pragma weak needs a non-definition decl and source may not have one.
5218 SourceLocation Loc);
5219
5220 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5221 /// applied to it, possibly with an alias.
5222 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
5223
5224 void ProcessPragmaWeak(Scope *S, Decl *D);
5225 // Decl attributes - this routine is the top level dispatcher.
5226 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
5227
5229
5230 /// Given a set of delayed diagnostics, re-emit them as if they had
5231 /// been delayed in the current context instead of in the given pool.
5232 /// Essentially, this just moves them to the current pool.
5234
5235 /// Check that the type is a plain record with one field being a pointer
5236 /// type and the other field being an integer. This matches the common
5237 /// implementation of std::span or sized_allocation_t in P0901R11.
5238 bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty);
5239
5240 /// Check if IdxExpr is a valid parameter index for a function or
5241 /// instance method D. May output an error.
5242 ///
5243 /// \returns true if IdxExpr is a valid index.
5244 template <typename AttrInfo>
5246 const Decl *D, const AttrInfo &AI, unsigned AttrArgNum,
5247 const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis = false,
5248 bool CanIndexVariadicArguments = false) {
5250
5251 // In C++ the implicit 'this' function parameter also counts.
5252 // Parameters are counted from one.
5253 bool HP = hasFunctionProto(D);
5254 bool HasImplicitThisParam = hasImplicitObjectParameter(D);
5255 bool IV = HP && isFunctionOrMethodVariadic(D);
5256 unsigned NumParams =
5257 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
5258
5259 std::optional<llvm::APSInt> IdxInt;
5260 if (IdxExpr->isTypeDependent() ||
5261 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
5262 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
5263 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
5264 << IdxExpr->getSourceRange();
5265 return false;
5266 }
5267
5268 constexpr unsigned Limit = 1 << ParamIdx::IdxBitWidth;
5269 unsigned IdxSource = IdxInt->getLimitedValue(Limit);
5270 if (IdxSource < 1 || IdxSource == Limit ||
5271 ((!IV || !CanIndexVariadicArguments) && IdxSource > NumParams)) {
5272 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
5273 << &AI << AttrArgNum << IdxExpr->getSourceRange();
5274 return false;
5275 }
5276 if (HasImplicitThisParam && !CanIndexImplicitThis) {
5277 if (IdxSource == 1) {
5278 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
5279 << &AI << IdxExpr->getSourceRange();
5280 return false;
5281 }
5282 }
5283
5284 Idx = ParamIdx(IdxSource, D);
5285 return true;
5286 }
5287
5288 ///@}
5289
5290 //
5291 //
5292 // -------------------------------------------------------------------------
5293 //
5294 //
5295
5296 /// \name C++ Declarations
5297 /// Implementations are in SemaDeclCXX.cpp
5298 ///@{
5299
5300public:
5302
5303 /// Called before parsing a function declarator belonging to a function
5304 /// declaration.
5306 unsigned TemplateParameterDepth);
5307
5308 /// Called after parsing a function declarator belonging to a function
5309 /// declaration.
5311
5312 // Act on C++ namespaces
5314 SourceLocation NamespaceLoc,
5315 SourceLocation IdentLoc, IdentifierInfo *Ident,
5316 SourceLocation LBrace,
5317 const ParsedAttributesView &AttrList,
5318 UsingDirectiveDecl *&UsingDecl, bool IsNested);
5319
5320 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
5321 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
5322 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
5323
5325
5326 /// Retrieve the special "std" namespace, which may require us to
5327 /// implicitly define the namespace.
5329
5331 EnumDecl *getStdAlignValT() const;
5332
5335 QualType AllocType, SourceLocation);
5336
5338 const IdentifierInfo *MemberOrBase);
5339
5341 /// The '<=>' operator was used in an expression and a builtin operator
5342 /// was selected.
5344 /// A defaulted 'operator<=>' needed the comparison category. This
5345 /// typically only applies to 'std::strong_ordering', due to the implicit
5346 /// fallback return value.
5348 /// A builtin needed 'std::strong_ordering' (eg. '__builtin_type_order').
5350 };
5351
5352 /// Lookup the specified comparison category types in the standard
5353 /// library, an check the VarDecls possibly returned by the operator<=>
5354 /// builtins for that type.
5355 ///
5356 /// \return The type of the comparison category type corresponding to the
5357 /// specified Kind, or a null type if an error occurs
5359 SourceLocation Loc,
5361
5362 /// Tests whether Ty is an instance of std::initializer_list and, if
5363 /// it is and Element is not NULL, assigns the element type to Element.
5364 bool isStdInitializerList(QualType Ty, QualType *Element);
5365
5366 /// Tests whether Ty is an instance of std::type_identity and, if
5367 /// it is and TypeArgument is not NULL, assigns the element type to Element.
5368 /// If MalformedDecl is not null, and type_identity was ruled out due to being
5369 /// incorrectly structured despite having the correct name, the faulty Decl
5370 /// will be assigned to MalformedDecl.
5371 bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument,
5372 const Decl **MalformedDecl = nullptr);
5373
5374 /// Looks for the std::initializer_list template and instantiates it
5375 /// with Element, or emits an error if it's not found.
5376 ///
5377 /// \returns The instantiated template, or null on error.
5379
5380 /// Looks for the std::type_identity template and instantiates it
5381 /// with Type, or returns a null type if type_identity has not been declared
5382 ///
5383 /// \returns The instantiated template, or null if std::type_identity is not
5384 /// declared
5386
5387 /// Determine whether Ctor is an initializer-list constructor, as
5388 /// defined in [dcl.init.list]p2.
5389 bool isInitListConstructor(const FunctionDecl *Ctor);
5390
5391 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
5392 SourceLocation NamespcLoc, CXXScopeSpec &SS,
5393 SourceLocation IdentLoc,
5394 IdentifierInfo *NamespcName,
5395 const ParsedAttributesView &AttrList);
5396
5398
5399 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
5400 SourceLocation AliasLoc, IdentifierInfo *Alias,
5401 CXXScopeSpec &SS, SourceLocation IdentLoc,
5402 IdentifierInfo *Ident);
5403
5404 /// Remove decls we can't actually see from a lookup being used to declare
5405 /// shadow using decls.
5406 ///
5407 /// \param S - The scope of the potential shadow decl
5408 /// \param Previous - The lookup of a potential shadow decl's name.
5409 void FilterUsingLookup(Scope *S, LookupResult &lookup);
5410
5411 /// Hides a using shadow declaration. This is required by the current
5412 /// using-decl implementation when a resolvable using declaration in a
5413 /// class is followed by a declaration which would hide or override
5414 /// one or more of the using decl's targets; for example:
5415 ///
5416 /// struct Base { void foo(int); };
5417 /// struct Derived : Base {
5418 /// using Base::foo;
5419 /// void foo(int);
5420 /// };
5421 ///
5422 /// The governing language is C++03 [namespace.udecl]p12:
5423 ///
5424 /// When a using-declaration brings names from a base class into a
5425 /// derived class scope, member functions in the derived class
5426 /// override and/or hide member functions with the same name and
5427 /// parameter types in a base class (rather than conflicting).
5428 ///
5429 /// There are two ways to implement this:
5430 /// (1) optimistically create shadow decls when they're not hidden
5431 /// by existing declarations, or
5432 /// (2) don't create any shadow decls (or at least don't make them
5433 /// visible) until we've fully parsed/instantiated the class.
5434 /// The problem with (1) is that we might have to retroactively remove
5435 /// a shadow decl, which requires several O(n) operations because the
5436 /// decl structures are (very reasonably) not designed for removal.
5437 /// (2) avoids this but is very fiddly and phase-dependent.
5438 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
5439
5440 /// Determines whether to create a using shadow decl for a particular
5441 /// decl, given the set of decls existing prior to this using lookup.
5443 const LookupResult &PreviousDecls,
5444 UsingShadowDecl *&PrevShadow);
5445
5446 /// Builds a shadow declaration corresponding to a 'using' declaration.
5449 UsingShadowDecl *PrevDecl);
5450
5451 /// Checks that the given using declaration is not an invalid
5452 /// redeclaration. Note that this is checking only for the using decl
5453 /// itself, not for any ill-formedness among the UsingShadowDecls.
5455 bool HasTypenameKeyword,
5456 const CXXScopeSpec &SS,
5457 SourceLocation NameLoc,
5458 const LookupResult &Previous);
5459
5460 /// Checks that the given nested-name qualifier used in a using decl
5461 /// in the current context is appropriately related to the current
5462 /// scope. If an error is found, diagnoses it and returns true.
5463 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
5464 /// the result of that lookup. UD is likewise nullptr, except when we have an
5465 /// already-populated UsingDecl whose shadow decls contain the same
5466 /// information (i.e. we're instantiating a UsingDecl with non-dependent
5467 /// scope).
5468 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
5469 const CXXScopeSpec &SS,
5470 const DeclarationNameInfo &NameInfo,
5471 SourceLocation NameLoc,
5472 const LookupResult *R = nullptr,
5473 const UsingDecl *UD = nullptr);
5474
5475 /// Builds a using declaration.
5476 ///
5477 /// \param IsInstantiation - Whether this call arises from an
5478 /// instantiation of an unresolved using declaration. We treat
5479 /// the lookup differently for these declarations.
5481 SourceLocation UsingLoc,
5482 bool HasTypenameKeyword,
5483 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5484 DeclarationNameInfo NameInfo,
5485 SourceLocation EllipsisLoc,
5486 const ParsedAttributesView &AttrList,
5487 bool IsInstantiation, bool IsUsingIfExists);
5489 SourceLocation UsingLoc,
5490 SourceLocation EnumLoc,
5491 SourceLocation NameLoc,
5492 TypeSourceInfo *EnumType, EnumDecl *ED);
5493 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
5494 ArrayRef<NamedDecl *> Expansions);
5495
5496 /// Additional checks for a using declaration referring to a constructor name.
5498
5499 /// Given a derived-class using shadow declaration for a constructor and the
5500 /// correspnding base class constructor, find or create the implicit
5501 /// synthesized derived class constructor to use for this initialization.
5504 ConstructorUsingShadowDecl *DerivedShadow);
5505
5507 SourceLocation UsingLoc,
5508 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5509 UnqualifiedId &Name, SourceLocation EllipsisLoc,
5510 const ParsedAttributesView &AttrList);
5512 SourceLocation UsingLoc,
5513 SourceLocation EnumLoc, SourceRange TyLoc,
5514 const IdentifierInfo &II, ParsedType Ty,
5515 const CXXScopeSpec &SS);
5517 MultiTemplateParamsArg TemplateParams,
5518 SourceLocation UsingLoc, UnqualifiedId &Name,
5519 const ParsedAttributesView &AttrList,
5520 TypeResult Type, Decl *DeclFromDeclSpec);
5521
5522 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
5523 /// including handling of its default argument expressions.
5524 ///
5525 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
5527 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5529 bool HadMultipleCandidates, bool IsListInitialization,
5530 bool IsStdInitListInitialization, bool RequiresZeroInit,
5531 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5532
5533 /// Build a CXXConstructExpr whose constructor has already been resolved if
5534 /// it denotes an inherited constructor.
5536 SourceLocation ConstructLoc, QualType DeclInitType,
5537 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5538 bool HadMultipleCandidates, bool IsListInitialization,
5539 bool IsStdInitListInitialization, bool RequiresZeroInit,
5540 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5541
5542 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
5543 // the constructor can be elidable?
5545 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5546 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5547 bool HadMultipleCandidates, bool IsListInitialization,
5548 bool IsStdInitListInitialization, bool RequiresZeroInit,
5549 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5550
5552 SourceLocation InitLoc);
5553
5554 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
5555 /// constructed variable.
5556 void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit);
5557
5558 /// Helper class that collects exception specifications for
5559 /// implicitly-declared special member functions.
5561 // Pointer to allow copying
5562 Sema *Self;
5563 // We order exception specifications thus:
5564 // noexcept is the most restrictive, but is only used in C++11.
5565 // throw() comes next.
5566 // Then a throw(collected exceptions)
5567 // Finally no specification, which is expressed as noexcept(false).
5568 // throw(...) is used instead if any called function uses it.
5569 ExceptionSpecificationType ComputedEST;
5570 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5571 SmallVector<QualType, 4> Exceptions;
5572
5573 void ClearExceptions() {
5574 ExceptionsSeen.clear();
5575 Exceptions.clear();
5576 }
5577
5578 public:
5580 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5581 if (!Self.getLangOpts().CPlusPlus11)
5582 ComputedEST = EST_DynamicNone;
5583 }
5584
5585 /// Get the computed exception specification type.
5587 assert(!isComputedNoexcept(ComputedEST) &&
5588 "noexcept(expr) should not be a possible result");
5589 return ComputedEST;
5590 }
5591
5592 /// The number of exceptions in the exception specification.
5593 unsigned size() const { return Exceptions.size(); }
5594
5595 /// The set of exceptions in the exception specification.
5596 const QualType *data() const { return Exceptions.data(); }
5597
5598 /// Integrate another called method into the collected data.
5599 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5600
5601 /// Integrate an invoked expression into the collected data.
5602 void CalledExpr(Expr *E) { CalledStmt(E); }
5603
5604 /// Integrate an invoked statement into the collected data.
5605 void CalledStmt(Stmt *S);
5606
5607 /// Overwrite an EPI's exception specification with this
5608 /// computed exception specification.
5611 ESI.Type = getExceptionSpecType();
5612 if (ESI.Type == EST_Dynamic) {
5613 ESI.Exceptions = Exceptions;
5614 } else if (ESI.Type == EST_None) {
5615 /// C++11 [except.spec]p14:
5616 /// The exception-specification is noexcept(false) if the set of
5617 /// potential exceptions of the special member function contains "any"
5618 ESI.Type = EST_NoexceptFalse;
5619 ESI.NoexceptExpr =
5620 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5621 }
5622 return ESI;
5623 }
5624 };
5625
5626 /// Evaluate the implicit exception specification for a defaulted
5627 /// special member function.
5629
5630 /// Check the given exception-specification and update the
5631 /// exception specification information with the results.
5632 void checkExceptionSpecification(bool IsTopLevel,
5634 ArrayRef<ParsedType> DynamicExceptions,
5635 ArrayRef<SourceRange> DynamicExceptionRanges,
5636 Expr *NoexceptExpr,
5637 SmallVectorImpl<QualType> &Exceptions,
5639
5640 /// Add an exception-specification to the given member or friend function
5641 /// (or function template). The exception-specification was parsed
5642 /// after the function itself was declared.
5644 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5645 ArrayRef<ParsedType> DynamicExceptions,
5646 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5647
5648 class InheritedConstructorInfo;
5649
5650 /// Determine if a special member function should have a deleted
5651 /// definition when it is defaulted.
5653 InheritedConstructorInfo *ICI = nullptr,
5654 bool Diagnose = false);
5655
5656 /// Produce notes explaining why a defaulted function was defined as deleted.
5658
5659 /// Declare the implicit default constructor for the given class.
5660 ///
5661 /// \param ClassDecl The class declaration into which the implicit
5662 /// default constructor will be added.
5663 ///
5664 /// \returns The implicitly-declared default constructor.
5667
5668 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5669 /// defining this constructor as the default constructor.
5672
5673 /// Declare the implicit destructor for the given class.
5674 ///
5675 /// \param ClassDecl The class declaration into which the implicit
5676 /// destructor will be added.
5677 ///
5678 /// \returns The implicitly-declared destructor.
5680
5681 /// DefineImplicitDestructor - Checks for feasibility of
5682 /// defining this destructor as the default destructor.
5683 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5685
5686 /// Build an exception spec for destructors that don't have one.
5687 ///
5688 /// C++11 says that user-defined destructors with no exception spec get one
5689 /// that looks as if the destructor was implicitly declared.
5691
5692 /// Define the specified inheriting constructor.
5695
5696 /// Declare the implicit copy constructor for the given class.
5697 ///
5698 /// \param ClassDecl The class declaration into which the implicit
5699 /// copy constructor will be added.
5700 ///
5701 /// \returns The implicitly-declared copy constructor.
5703
5704 /// DefineImplicitCopyConstructor - Checks for feasibility of
5705 /// defining this constructor as the copy constructor.
5706 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5708
5709 /// Declare the implicit move constructor for the given class.
5710 ///
5711 /// \param ClassDecl The Class declaration into which the implicit
5712 /// move constructor will be added.
5713 ///
5714 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5715 /// declared.
5717
5718 /// DefineImplicitMoveConstructor - Checks for feasibility of
5719 /// defining this constructor as the move constructor.
5720 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5722
5723 /// Declare the implicit copy assignment operator for the given class.
5724 ///
5725 /// \param ClassDecl The class declaration into which the implicit
5726 /// copy assignment operator will be added.
5727 ///
5728 /// \returns The implicitly-declared copy assignment operator.
5730
5731 /// Defines an implicitly-declared copy assignment operator.
5732 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5733 CXXMethodDecl *MethodDecl);
5734
5735 /// Declare the implicit move assignment operator for the given class.
5736 ///
5737 /// \param ClassDecl The Class declaration into which the implicit
5738 /// move assignment operator will be added.
5739 ///
5740 /// \returns The implicitly-declared move assignment operator, or NULL if it
5741 /// wasn't declared.
5743
5744 /// Defines an implicitly-declared move assignment operator.
5745 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5746 CXXMethodDecl *MethodDecl);
5747
5748 /// Check a completed declaration of an implicit special member.
5750
5751 /// Determine whether the given function is an implicitly-deleted
5752 /// special member function.
5754
5755 /// Check whether 'this' shows up in the type of a static member
5756 /// function after the (naturally empty) cv-qualifier-seq would be.
5757 ///
5758 /// \returns true if an error occurred.
5760
5761 /// Whether this' shows up in the exception specification of a static
5762 /// member function.
5764
5765 /// Check whether 'this' shows up in the attributes of the given
5766 /// static member function.
5767 ///
5768 /// \returns true if an error occurred.
5770
5772 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5773
5775
5776 /// Given a constructor and the set of arguments provided for the
5777 /// constructor, convert the arguments and add any required default arguments
5778 /// to form a proper call to this constructor.
5779 ///
5780 /// \returns true if an error occurred, false otherwise.
5782 QualType DeclInitType, MultiExprArg ArgsPtr,
5783 SourceLocation Loc,
5784 SmallVectorImpl<Expr *> &ConvertedArgs,
5785 bool AllowExplicit = false,
5786 bool IsListInitialization = false);
5787
5788 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5789 /// initializer for the declaration 'Dcl'.
5790 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5791 /// static data member of class X, names should be looked up in the scope of
5792 /// class X.
5794
5795 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5796 /// initializer for the declaration 'Dcl'.
5797 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5798
5799 /// Define the "body" of the conversion from a lambda object to a
5800 /// function pointer.
5801 ///
5802 /// This routine doesn't actually define a sensible body; rather, it fills
5803 /// in the initialization expression needed to copy the lambda object into
5804 /// the block, and IR generation actually generates the real body of the
5805 /// block pointer conversion.
5806 void
5808 CXXConversionDecl *Conv);
5809
5810 /// Define the "body" of the conversion from a lambda object to a
5811 /// block pointer.
5812 ///
5813 /// This routine doesn't actually define a sensible body; rather, it fills
5814 /// in the initialization expression needed to copy the lambda object into
5815 /// the block, and IR generation actually generates the real body of the
5816 /// block pointer conversion.
5818 CXXConversionDecl *Conv);
5819
5820 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5821 /// linkage specification, including the language and (if present)
5822 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5823 /// language string literal. LBraceLoc, if valid, provides the location of
5824 /// the '{' brace. Otherwise, this linkage specification does not
5825 /// have any braces.
5827 Expr *LangStr, SourceLocation LBraceLoc);
5828
5829 /// ActOnFinishLinkageSpecification - Complete the definition of
5830 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5831 /// valid, it's the position of the closing '}' brace in a linkage
5832 /// specification that uses braces.
5834 SourceLocation RBraceLoc);
5835
5836 //===--------------------------------------------------------------------===//
5837 // C++ Classes
5838 //
5839
5840 /// Get the class that is directly named by the current context. This is the
5841 /// class for which an unqualified-id in this scope could name a constructor
5842 /// or destructor.
5843 ///
5844 /// If the scope specifier denotes a class, this will be that class.
5845 /// If the scope specifier is empty, this will be the class whose
5846 /// member-specification we are currently within. Otherwise, there
5847 /// is no such class.
5849
5850 /// isCurrentClassName - Determine whether the identifier II is the
5851 /// name of the class type currently being defined. In the case of
5852 /// nested classes, this will only return true if II is the name of
5853 /// the innermost class.
5854 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5855 const CXXScopeSpec *SS = nullptr);
5856
5857 /// Determine whether the identifier II is a typo for the name of
5858 /// the class type currently being defined. If so, update it to the identifier
5859 /// that should have been used.
5861
5862 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5864 SourceLocation ColonLoc,
5865 const ParsedAttributesView &Attrs);
5866
5867 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5868 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5869 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5870 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5871 /// present (but parsing it has been deferred).
5872 NamedDecl *
5874 MultiTemplateParamsArg TemplateParameterLists,
5875 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5876 InClassInitStyle InitStyle);
5877
5878 /// Enter a new C++ default initializer scope. After calling this, the
5879 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5880 /// parsing or instantiating the initializer failed.
5882
5883 /// This is invoked after parsing an in-class initializer for a
5884 /// non-static C++ class member, and after instantiating an in-class
5885 /// initializer in a class template. Such actions are deferred until the class
5886 /// is complete.
5888 SourceLocation EqualLoc,
5890
5891 /// Handle a C++ member initializer using parentheses syntax.
5893 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5894 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5895 const DeclSpec &DS, SourceLocation IdLoc,
5896 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5897 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5898
5899 /// Handle a C++ member initializer using braced-init-list syntax.
5900 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5901 CXXScopeSpec &SS,
5902 IdentifierInfo *MemberOrBase,
5903 ParsedType TemplateTypeTy,
5904 const DeclSpec &DS, SourceLocation IdLoc,
5905 Expr *InitList, SourceLocation EllipsisLoc);
5906
5907 /// Handle a C++ member initializer.
5908 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5909 CXXScopeSpec &SS,
5910 IdentifierInfo *MemberOrBase,
5911 ParsedType TemplateTypeTy,
5912 const DeclSpec &DS, SourceLocation IdLoc,
5913 Expr *Init, SourceLocation EllipsisLoc);
5914
5916 SourceLocation IdLoc);
5917
5919 TypeSourceInfo *BaseTInfo, Expr *Init,
5920 CXXRecordDecl *ClassDecl,
5921 SourceLocation EllipsisLoc);
5922
5924 CXXRecordDecl *ClassDecl);
5925
5928
5930 ArrayRef<CXXCtorInitializer *> Initializers = {});
5931
5932 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5933 /// mark all the non-trivial destructors of its members and bases as
5934 /// referenced.
5935 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5936 CXXRecordDecl *Record);
5937
5938 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5939 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5940 /// class. In the Microsoft C++ ABI, this is done any time a class's
5941 /// destructor is referenced.
5943 SourceLocation Location, CXXRecordDecl *ClassDecl,
5944 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5945 nullptr);
5946
5947 /// Do semantic checks to allow the complete destructor variant to be emitted
5948 /// when the destructor is defined in another translation unit. In the Itanium
5949 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5950 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5951 /// of the checks performed when emitting a regular destructor.
5952 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5953 CXXDestructorDecl *Dtor);
5954
5955 /// The list of classes whose vtables have been used within
5956 /// this translation unit, and the source locations at which the
5957 /// first use occurred.
5958 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5959
5960 /// The list of vtables that are required but have not yet been
5961 /// materialized.
5963
5964 /// The set of classes whose vtables have been used within
5965 /// this translation unit, and a bit that will be true if the vtable is
5966 /// required to be emitted (otherwise, it should be emitted only if needed
5967 /// by code generation).
5968 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5969
5970 /// Load any externally-stored vtable uses.
5972
5973 /// Note that the vtable for the given class was used at the
5974 /// given location.
5976 bool DefinitionRequired = false);
5977
5978 /// Mark the exception specifications of all virtual member functions
5979 /// in the given class as needed.
5981 const CXXRecordDecl *RD);
5982
5983 /// MarkVirtualMembersReferenced - Will mark all members of the given
5984 /// CXXRecordDecl referenced.
5986 bool ConstexprOnly = false);
5987
5988 /// Define all of the vtables that have been used in this
5989 /// translation unit and reference any virtual members used by those
5990 /// vtables.
5991 ///
5992 /// \returns true if any work was done, false otherwise.
5993 bool DefineUsedVTables();
5994
5995 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
5996 /// special functions, such as the default constructor, copy
5997 /// constructor, or destructor, to the given C++ class (C++
5998 /// [special]p1). This routine can only be executed just before the
5999 /// definition of the class is complete.
6001
6002 /// ActOnMemInitializers - Handle the member initializers for a constructor.
6003 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
6005 bool AnyErrors);
6006
6007 /// Check class-level dllimport/dllexport attribute. The caller must
6008 /// ensure that referenceDLLExportedClassMethods is called some point later
6009 /// when all outer classes of Class are complete.
6012
6014
6015 /// Perform propagation of DLL attributes from a derived class to a
6016 /// templated base class for MS compatibility.
6018 CXXRecordDecl *Class, Attr *ClassAttr,
6019 ClassTemplateSpecializationDecl *BaseTemplateSpec,
6020 SourceLocation BaseLoc);
6021
6022 /// Perform semantic checks on a class definition that has been
6023 /// completing, introducing implicitly-declared members, checking for
6024 /// abstract types, etc.
6025 ///
6026 /// \param S The scope in which the class was parsed. Null if we didn't just
6027 /// parse a class definition.
6028 /// \param Record The completed class.
6030
6031 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
6032 /// conditions that are needed for the attribute to have an effect.
6034
6035 /// Check that VTable Pointer authentication is only being set on the first
6036 /// first instantiation of the vtable
6038
6040 Decl *TagDecl, SourceLocation LBrac,
6041 SourceLocation RBrac,
6042 const ParsedAttributesView &AttrList);
6043
6044 /// Perform any semantic analysis which needs to be delayed until all
6045 /// pending class member declarations have been parsed.
6048
6049 /// This is used to implement the constant expression evaluation part of the
6050 /// attribute enable_if extension. There is nothing in standard C++ which
6051 /// would require reentering parameters.
6054 llvm::function_ref<Scope *()> EnterScope);
6056
6057 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
6058 /// parsing a top-level (non-nested) C++ class, and we are now
6059 /// parsing those parts of the given Method declaration that could
6060 /// not be parsed earlier (C++ [class.mem]p2), such as default
6061 /// arguments. This action should enter the scope of the given
6062 /// Method declaration as if we had just parsed the qualified method
6063 /// name. However, it should not bring the parameters into scope;
6064 /// that will be performed by ActOnDelayedCXXMethodParameter.
6066 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
6068
6069 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
6070 /// processing the delayed method declaration for Method. The method
6071 /// declaration is now considered finished. There may be a separate
6072 /// ActOnStartOfFunctionDef action later (not necessarily
6073 /// immediately!) for this method, if it was also defined inside the
6074 /// class body.
6077
6079
6080 bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
6081 StringEvaluationContext EvalContext,
6082 bool ErrorOnInvalidMessage);
6083 bool EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
6084 StringEvaluationContext EvalContext,
6085 bool ErrorOnInvalidMessage);
6086
6088 Expr *AssertExpr, Expr *AssertMessageExpr,
6089 SourceLocation RParenLoc);
6091 Expr *AssertExpr, Expr *AssertMessageExpr,
6092 SourceLocation RParenLoc, bool Failed);
6093
6094 /// Try to print more useful information about a failed static_assert
6095 /// with expression \E
6096 void DiagnoseStaticAssertDetails(const Expr *E);
6097
6098 /// If E represents a built-in type trait, or a known standard type trait,
6099 /// try to print more information about why the type type-trait failed.
6100 /// This assumes we already evaluated the expression to a false boolean value.
6101 void DiagnoseTypeTraitDetails(const Expr *E);
6102
6103 /// Handle a friend type declaration. This works in tandem with
6104 /// ActOnTag.
6105 ///
6106 /// Notes on friend class templates:
6107 ///
6108 /// We generally treat friend class declarations as if they were
6109 /// declaring a class. So, for example, the elaborated type specifier
6110 /// in a friend declaration is required to obey the restrictions of a
6111 /// class-head (i.e. no typedefs in the scope chain), template
6112 /// parameters are required to match up with simple template-ids, &c.
6113 /// However, unlike when declaring a template specialization, it's
6114 /// okay to refer to a template specialization without an empty
6115 /// template parameter declaration, e.g.
6116 /// friend class A<T>::B<unsigned>;
6117 /// We permit this as a special case; if there are any template
6118 /// parameters present at all, require proper matching, i.e.
6119 /// template <> template <class T> friend class A<int>::B;
6120 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
6121 MultiTemplateParamsArg TemplateParams,
6122 SourceLocation EllipsisLoc);
6124 MultiTemplateParamsArg TemplateParams);
6125
6126 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
6127 /// the well-formedness of the constructor declarator @p D with type @p
6128 /// R. If there are any errors in the declarator, this routine will
6129 /// emit diagnostics and set the invalid bit to true. In any case, the type
6130 /// will be updated to reflect a well-formed type for the constructor and
6131 /// returned.
6133 StorageClass &SC);
6134
6135 /// CheckConstructor - Checks a fully-formed constructor for
6136 /// well-formedness, issuing any diagnostics required. Returns true if
6137 /// the constructor declarator is invalid.
6139
6140 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
6141 /// the well-formednes of the destructor declarator @p D with type @p
6142 /// R. If there are any errors in the declarator, this routine will
6143 /// emit diagnostics and set the declarator to invalid. Even if this happens,
6144 /// will be updated to reflect a well-formed type for the destructor and
6145 /// returned.
6147 StorageClass &SC);
6148
6149 /// CheckDestructor - Checks a fully-formed destructor definition for
6150 /// well-formedness, issuing any diagnostics required. Returns true
6151 /// on error.
6153
6154 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
6155 /// well-formednes of the conversion function declarator @p D with
6156 /// type @p R. If there are any errors in the declarator, this routine
6157 /// will emit diagnostics and return true. Otherwise, it will return
6158 /// false. Either way, the type @p R will be updated to reflect a
6159 /// well-formed type for the conversion operator.
6161
6162 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
6163 /// the declaration of the given C++ conversion function. This routine
6164 /// is responsible for recording the conversion function in the C++
6165 /// class, if possible.
6167
6168 /// Check the validity of a declarator that we parsed for a deduction-guide.
6169 /// These aren't actually declarators in the grammar, so we need to check that
6170 /// the user didn't specify any pieces that are not part of the
6171 /// deduction-guide grammar. Return true on invalid deduction-guide.
6173 StorageClass &SC);
6174
6176
6179 SourceLocation DefaultLoc);
6181
6185 FunctionDecl *Spaceship);
6188
6190 QualType R, bool IsLambda,
6191 DeclContext *DC = nullptr);
6193 DeclarationName Name, QualType R);
6195
6196 //===--------------------------------------------------------------------===//
6197 // C++ Derived Classes
6198 //
6199
6200 /// Check the validity of a C++ base class specifier.
6201 ///
6202 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
6203 /// and returns NULL otherwise.
6205 SourceRange SpecifierRange, bool Virtual,
6206 AccessSpecifier Access,
6207 TypeSourceInfo *TInfo,
6208 SourceLocation EllipsisLoc);
6209
6210 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
6211 /// one entry in the base class list of a class specifier, for
6212 /// example:
6213 /// class foo : public bar, virtual private baz {
6214 /// 'public bar' and 'virtual private baz' are each base-specifiers.
6215 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
6216 const ParsedAttributesView &Attrs, bool Virtual,
6217 AccessSpecifier Access, ParsedType basetype,
6218 SourceLocation BaseLoc,
6219 SourceLocation EllipsisLoc);
6220
6221 /// Performs the actual work of attaching the given base class
6222 /// specifiers to a C++ class.
6225
6226 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
6227 /// class, after checking whether there are any duplicate base
6228 /// classes.
6229 void ActOnBaseSpecifiers(Decl *ClassDecl,
6231
6232 /// Determine whether the type \p Derived is a C++ class that is
6233 /// derived from the type \p Base.
6234 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6236 bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived,
6240 CXXBasePaths &Paths);
6241
6242 // FIXME: I don't like this name.
6243 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
6244
6246 SourceLocation Loc, SourceRange Range,
6247 CXXCastPath *BasePath = nullptr,
6248 bool IgnoreAccess = false);
6249
6250 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
6251 /// conversion (where Derived and Base are class types) is
6252 /// well-formed, meaning that the conversion is unambiguous (and
6253 /// that all of the base classes are accessible). Returns true
6254 /// and emits a diagnostic if the code is ill-formed, returns false
6255 /// otherwise. Loc is the location where this routine should point to
6256 /// if there is an error, and Range is the source range to highlight
6257 /// if there is an error.
6258 ///
6259 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
6260 /// diagnostic for the respective type of error will be suppressed, but the
6261 /// check for ill-formed code will still be performed.
6263 unsigned InaccessibleBaseID,
6264 unsigned AmbiguousBaseConvID,
6265 SourceLocation Loc, SourceRange Range,
6266 DeclarationName Name, CXXCastPath *BasePath,
6267 bool IgnoreAccess = false);
6268
6269 /// Builds a string representing ambiguous paths from a
6270 /// specific derived class to different subobjects of the same base
6271 /// class.
6272 ///
6273 /// This function builds a string that can be used in error messages
6274 /// to show the different paths that one can take through the
6275 /// inheritance hierarchy to go from the derived class to different
6276 /// subobjects of a base class. The result looks something like this:
6277 /// @code
6278 /// struct D -> struct B -> struct A
6279 /// struct D -> struct C -> struct A
6280 /// @endcode
6281 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
6282
6284 const CXXMethodDecl *Old);
6285
6286 /// CheckOverridingFunctionReturnType - Checks whether the return types are
6287 /// covariant, according to C++ [class.virtual]p5.
6289 const CXXMethodDecl *Old);
6290
6291 // Check that the overriding method has no explicit object parameter.
6293 const CXXMethodDecl *Old);
6294
6295 /// Mark the given method pure.
6296 ///
6297 /// \param Method the method to be marked pure.
6298 ///
6299 /// \param InitRange the source range that covers the "0" initializer.
6301
6302 /// CheckOverrideControl - Check C++11 override control semantics.
6304
6305 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
6306 /// not used in the declaration of an overriding method.
6308
6309 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
6310 /// function overrides a virtual member function marked 'final', according to
6311 /// C++11 [class.virtual]p4.
6313 const CXXMethodDecl *Old);
6314
6325
6326 struct TypeDiagnoser;
6327
6330 TypeDiagnoser &Diagnoser);
6331 template <typename... Ts>
6333 const Ts &...Args) {
6334 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
6335 return RequireNonAbstractType(Loc, T, Diagnoser);
6336 }
6337
6338 void DiagnoseAbstractType(const CXXRecordDecl *RD);
6339
6340 //===--------------------------------------------------------------------===//
6341 // C++ Overloaded Operators [C++ 13.5]
6342 //
6343
6344 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
6345 /// of this overloaded operator is well-formed. If so, returns false;
6346 /// otherwise, emits appropriate diagnostics and returns true.
6348
6349 /// CheckLiteralOperatorDeclaration - Check whether the declaration
6350 /// of this literal operator function is well-formed. If so, returns
6351 /// false; otherwise, emits appropriate diagnostics and returns true.
6353
6354 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
6355 /// found in an explicit(bool) specifier.
6357
6358 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
6359 /// Returns true if the explicit specifier is now resolved.
6361
6362 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
6363 /// C++ if/switch/while/for statement.
6364 /// e.g: "if (int x = f()) {...}"
6366
6367 // Emitting members of dllexported classes is delayed until the class
6368 // (including field initializers) is fully parsed.
6371
6372 /// Merge the exception specifications of two variable declarations.
6373 ///
6374 /// This is called when there's a redeclaration of a VarDecl. The function
6375 /// checks if the redeclaration might have an exception specification and
6376 /// validates compatibility and merges the specs if necessary.
6378
6379 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
6380 /// function, once we already know that they have the same
6381 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
6382 /// error, false otherwise.
6384
6385 /// Helpers for dealing with blocks and functions.
6387
6388 /// CheckExtraCXXDefaultArguments - Check for any extra default
6389 /// arguments in the declarator, which is not a function declaration
6390 /// or definition and therefore is not permitted to have default
6391 /// arguments. This routine should be invoked for every declarator
6392 /// that is not a function declaration or definition.
6394
6395 /// Perform semantic analysis for the variable declaration that
6396 /// occurs within a C++ catch clause, returning the newly-created
6397 /// variable.
6399 SourceLocation StartLoc,
6400 SourceLocation IdLoc,
6401 const IdentifierInfo *Id);
6402
6403 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
6404 /// handler.
6406
6408
6409 /// Handle a friend tag declaration where the scope specifier was
6410 /// templated.
6412 unsigned TagSpec, SourceLocation TagLoc,
6413 CXXScopeSpec &SS, IdentifierInfo *Name,
6414 SourceLocation NameLoc,
6415 SourceLocation EllipsisLoc,
6417 MultiTemplateParamsArg TempParamLists,
6418 TemplateIdAnnotation *TemplateId);
6419
6422 bool IsInstantiation);
6423
6425 NestedNameSpecifierLoc NNSLoc);
6426
6428 SourceLocation DeclStart, Declarator &D,
6429 Expr *BitfieldWidth,
6430 InClassInitStyle InitStyle,
6431 AccessSpecifier AS,
6432 const ParsedAttr &MSPropertyAttr);
6433
6434 /// Diagnose why the specified class does not have a trivial special member of
6435 /// the given kind.
6438
6439 /// Determine whether a defaulted or deleted special member function is
6440 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
6441 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
6445 bool Diagnose = false);
6446
6447 /// Handle a C++11 empty-declaration and attribute-declaration.
6449 SourceLocation SemiLoc);
6450
6452 /// Diagnose issues that are non-constant or that are extensions.
6454 /// Identify whether this function satisfies the formal rules for constexpr
6455 /// functions in the current lanugage mode (with no extensions).
6457 };
6458
6459 // Check whether a function declaration satisfies the requirements of a
6460 // constexpr function definition or a constexpr constructor definition. If so,
6461 // return true. If not, produce appropriate diagnostics (unless asked not to
6462 // by Kind) and return false.
6463 //
6464 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
6466 CheckConstexprKind Kind);
6467
6468 /// Diagnose methods which overload virtual methods in a base class
6469 /// without overriding any.
6471
6472 /// Check if a method overloads virtual methods in a base class without
6473 /// overriding any.
6474 void
6476 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6477 void
6479 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6480
6481 /// ActOnParamDefaultArgument - Check whether the default argument
6482 /// provided for a function parameter is well-formed. If so, attach it
6483 /// to the parameter declaration.
6484 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
6485 Expr *defarg);
6486
6487 /// ActOnParamUnparsedDefaultArgument - We've seen a default
6488 /// argument for a function parameter, but we can't parse it yet
6489 /// because we're inside a class definition. Note that this default
6490 /// argument will be parsed later.
6492 SourceLocation ArgLoc);
6493
6494 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
6495 /// the default argument for the parameter param failed.
6497 Expr *DefaultArg);
6499 SourceLocation EqualLoc);
6500 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6501 SourceLocation EqualLoc);
6502
6503 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6504 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6505 StringLiteral *Message = nullptr);
6506 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6507
6508 void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind,
6509 StringLiteral *DeletedMessage = nullptr);
6513
6514 NamedDecl *
6516 MultiTemplateParamsArg TemplateParamLists);
6519 RecordDecl *ClassDecl,
6520 const IdentifierInfo *Name);
6521
6523 SourceLocation Loc);
6525
6526 /// Stack containing information needed when in C++2a an 'auto' is encountered
6527 /// in a function declaration parameter type specifier in order to invent a
6528 /// corresponding template parameter in the enclosing abbreviated function
6529 /// template. This information is also present in LambdaScopeInfo, stored in
6530 /// the FunctionScopes stack.
6532
6533 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6534 std::unique_ptr<CXXFieldCollector> FieldCollector;
6535
6537 /// Set containing all declared private fields that are not used.
6539
6541
6542 /// PureVirtualClassDiagSet - a set of class declarations which we have
6543 /// emitted a list of pure virtual functions. Used to prevent emitting the
6544 /// same list more than once.
6545 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6546
6550
6551 /// All the delegating constructors seen so far in the file, used for
6552 /// cycle detection at the end of the TU.
6554
6555 /// The C++ "std" namespace, where the standard library resides.
6557
6558 /// The C++ "std::initializer_list" template, which is defined in
6559 /// <initializer_list>.
6561
6562 /// The C++ "std::type_identity" template, which is defined in
6563 /// <type_traits>.
6565
6566 // Contains the locations of the beginning of unparsed default
6567 // argument locations.
6568 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6569
6570 /// UndefinedInternals - all the used, undefined objects which require a
6571 /// definition in this translation unit.
6572 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6573
6574 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6576
6577 /// The C++ special members which we are currently in the process of
6578 /// declaring. If this process recursively triggers the declaration of the
6579 /// same special member, we should act as if it is not yet declared.
6581
6583
6584 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6585
6588 ParsingClassDepth++;
6590 }
6592 ParsingClassDepth--;
6594 }
6595
6597 CXXScopeSpec &SS,
6598 ParsedType TemplateTypeTy,
6599 IdentifierInfo *MemberOrBase);
6600
6601private:
6602 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6603 QualType ResultTy,
6604 ArrayRef<QualType> Args);
6605 // Helper for ActOnFields to check for all function pointer members.
6606 bool EntirelyFunctionPointers(const RecordDecl *Record);
6607
6608 // A cache representing if we've fully checked the various comparison category
6609 // types stored in ASTContext. The bit-index corresponds to the integer value
6610 // of a ComparisonCategoryType enumerator.
6611 llvm::SmallBitVector FullyCheckedComparisonCategories;
6612
6613 /// Check if there is a field shadowing.
6614 void CheckShadowInheritedFields(const SourceLocation &Loc,
6615 DeclarationName FieldName,
6616 const CXXRecordDecl *RD,
6617 bool DeclIsField = true);
6618
6619 ///@}
6620
6621 //
6622 //
6623 // -------------------------------------------------------------------------
6624 //
6625 //
6626
6627 /// \name C++ Exception Specifications
6628 /// Implementations are in SemaExceptionSpec.cpp
6629 ///@{
6630
6631public:
6632 /// All the overriding functions seen during a class definition
6633 /// that had their exception spec checks delayed, plus the overridden
6634 /// function.
6637
6638 /// All the function redeclarations seen during a class definition that had
6639 /// their exception spec checks delayed, plus the prior declaration they
6640 /// should be checked against. Except during error recovery, the new decl
6641 /// should always be a friend declaration, as that's the only valid way to
6642 /// redeclare a special member before its class is complete.
6645
6646 /// Determine if we're in a case where we need to (incorrectly) eagerly
6647 /// parse an exception specification to work around a libstdc++ bug.
6649
6650 /// Check the given noexcept-specifier, convert its expression, and compute
6651 /// the appropriate ExceptionSpecificationType.
6652 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6654
6655 CanThrowResult canThrow(const Stmt *E);
6656 /// Determine whether the callee of a particular function call can throw.
6657 /// E, D and Loc are all optional.
6658 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6661 const FunctionProtoType *FPT);
6664
6665 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6666 /// exception specification. Incomplete types, or pointers to incomplete types
6667 /// other than void are not allowed.
6668 ///
6669 /// \param[in,out] T The exception type. This will be decayed to a pointer
6670 /// type
6671 /// when the input is an array or a function type.
6673
6674 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6675 /// pointer to member to a function with an exception specification. This
6676 /// means that it is invalid to add another level of indirection.
6679
6680 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6681 /// exception specifications. Exception specifications are equivalent if
6682 /// they allow exactly the same set of exception types. It does not matter how
6683 /// that is achieved. See C++ [except.spec]p2.
6685 SourceLocation OldLoc,
6686 const FunctionProtoType *New,
6687 SourceLocation NewLoc);
6689 const PartialDiagnostic &NoteID,
6690 const FunctionProtoType *Old,
6691 SourceLocation OldLoc,
6692 const FunctionProtoType *New,
6693 SourceLocation NewLoc);
6694 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6695
6696 /// CheckExceptionSpecSubset - Check whether the second function type's
6697 /// exception specification is a subset (or equivalent) of the first function
6698 /// type. This is used by override and pointer assignment checks.
6700 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6701 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6702 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6703 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6704 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6705
6706 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6707 /// two functions have equivalent exception specs. This is part of the
6708 /// assignment and override compatibility check. We do not check the
6709 /// parameters of parameter function pointers recursively, as no sane
6710 /// programmer would even be able to write such a function type.
6712 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6713 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6714 SourceLocation TargetLoc, const FunctionProtoType *Source,
6715 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6716
6717 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6718
6719 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6720 /// spec is a subset of base spec.
6722 const CXXMethodDecl *Old);
6723
6724 ///@}
6725
6726 //
6727 //
6728 // -------------------------------------------------------------------------
6729 //
6730 //
6731
6732 /// \name Expressions
6733 /// Implementations are in SemaExpr.cpp
6734 ///@{
6735
6736public:
6737 /// Describes how the expressions currently being parsed are
6738 /// evaluated at run-time, if at all.
6740 /// The current expression and its subexpressions occur within an
6741 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6742 /// \c sizeof, where the type of the expression may be significant but
6743 /// no code will be generated to evaluate the value of the expression at
6744 /// run time.
6746
6747 /// The current expression occurs within a braced-init-list within
6748 /// an unevaluated operand. This is mostly like a regular unevaluated
6749 /// context, except that we still instantiate constexpr functions that are
6750 /// referenced here so that we can perform narrowing checks correctly.
6752
6753 /// The current expression occurs within a discarded statement.
6754 /// This behaves largely similarly to an unevaluated operand in preventing
6755 /// definitions from being required, but not in other ways.
6757
6758 /// The current expression occurs within an unevaluated
6759 /// operand that unconditionally permits abstract references to
6760 /// fields, such as a SIZE operator in MS-style inline assembly.
6762
6763 /// The current context is "potentially evaluated" in C++11 terms,
6764 /// but the expression is evaluated at compile-time (like the values of
6765 /// cases in a switch statement).
6767
6768 /// In addition of being constant evaluated, the current expression
6769 /// occurs in an immediate function context - either a consteval function
6770 /// or a consteval if statement.
6772
6773 /// The current expression is potentially evaluated at run time,
6774 /// which means that code may be generated to evaluate the value of the
6775 /// expression at run time.
6777
6778 /// The current expression is potentially evaluated, but any
6779 /// declarations referenced inside that expression are only used if
6780 /// in fact the current expression is used.
6781 ///
6782 /// This value is used when parsing default function arguments, for which
6783 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6784 /// through varargs) but do not want to mark declarations as "referenced"
6785 /// until the default argument is used.
6787 };
6788
6789 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6790 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6791 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6792 /// have been applied to all subexpressions of the enclosing full expression.
6793 /// This is cleared at the end of each full expression.
6796
6797 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6798
6799 /// Data structure used to record current or nested
6800 /// expression evaluation contexts.
6802 /// The expression evaluation context.
6804
6805 /// Whether the enclosing context needed a cleanup.
6807
6808 /// The number of active cleanup objects when we entered
6809 /// this expression evaluation context.
6811
6813
6814 /// The lambdas that are present within this context, if it
6815 /// is indeed an unevaluated context.
6817
6818 /// The declaration that provides context for lambda expressions
6819 /// and block literals if the normal declaration context does not
6820 /// suffice, e.g., in a default function argument.
6822
6823 /// Declaration for initializer if one is currently being
6824 /// parsed. Used when an expression has a possibly unreachable
6825 /// diagnostic to reference the declaration as a whole.
6827
6828 /// If we are processing a decltype type, a set of call expressions
6829 /// for which we have deferred checking the completeness of the return type.
6831
6832 /// If we are processing a decltype type, a set of temporary binding
6833 /// expressions for which we have deferred checking the destructor.
6835
6837
6838 /// Expressions appearing as the LHS of a volatile assignment in this
6839 /// context. We produce a warning for these when popping the context if
6840 /// they are not discarded-value expressions nor unevaluated operands.
6842
6843 /// Set of candidates for starting an immediate invocation.
6846
6847 /// Set of DeclRefExprs referencing a consteval function when used in a
6848 /// context not already known to be immediately invoked.
6850
6851 /// P2718R0 - Lifetime extension in range-based for loops.
6852 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6853 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6854 /// InLifetimeExtendingContext is true.
6856
6857 /// Small set of gathered accesses to potentially misaligned members
6858 /// due to the packed attribute.
6860
6861 /// \brief Describes whether we are in an expression constext which we have
6862 /// to handle differently.
6870
6871 // A context can be nested in both a discarded statement context and
6872 // an immediate function context, so they need to be tracked independently.
6876
6878
6879 // We are in a constant context, but we also allow
6880 // non constant expressions, for example for array bounds (which may be
6881 // VLAs).
6883
6884 /// Whether we are currently in a context in which all temporaries must be
6885 /// lifetime-extended, even if they're not bound to a reference (for
6886 /// example, in a for-range initializer).
6888
6889 /// Whether evaluating an expression for a switch case label.
6890 bool IsCaseExpr = false;
6891
6892 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6894
6895 // When evaluating immediate functions in the initializer of a default
6896 // argument or default member initializer, this is the declaration whose
6897 // default initializer is being evaluated and the location of the call
6898 // or constructor definition.
6902 : Loc(Loc), Decl(Decl), Context(Context) {
6903 assert(Decl && Context && "invalid initialization context");
6904 }
6905
6907 ValueDecl *Decl = nullptr;
6909 };
6910 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6911
6922
6928
6935
6940
6945 // C++23 [expr.const]p14:
6946 // An expression or conversion is in an immediate function
6947 // context if it is potentially evaluated and either:
6948 // * its innermost enclosing non-block scope is a function
6949 // parameter scope of an immediate function, or
6950 // * its enclosing statement is enclosed by the compound-
6951 // statement of a consteval if statement.
6954 }
6955
6963 };
6964
6966 assert(!ExprEvalContexts.empty() &&
6967 "Must be in an expression evaluation context");
6968 return ExprEvalContexts.back();
6969 }
6970
6972 assert(!ExprEvalContexts.empty() &&
6973 "Must be in an expression evaluation context");
6974 return ExprEvalContexts.back();
6975 }
6976
6978 assert(ExprEvalContexts.size() >= 2 &&
6979 "Must be in an expression evaluation context");
6980 return ExprEvalContexts[ExprEvalContexts.size() - 2];
6981 }
6982
6984 return const_cast<Sema *>(this)->parentEvaluationContext();
6985 }
6986
6991
6992 /// Increment when we find a reference; decrement when we find an ignored
6993 /// assignment. Ultimately the value is 0 if every reference is an ignored
6994 /// assignment.
6995 ///
6996 /// Uses canonical VarDecl as key so in-class decls and out-of-class defs of
6997 /// static data members get tracked as a single entry.
6998 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
6999
7000 /// Used to control the generation of ExprWithCleanups.
7002
7003 /// ExprCleanupObjects - This is the stack of objects requiring
7004 /// cleanup that are created by the current full expression.
7006
7007 /// Determine whether the use of this declaration is valid, without
7008 /// emitting diagnostics.
7009 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
7010 // A version of DiagnoseUseOfDecl that should be used if overload resolution
7011 // has been used to find this declaration, which means we don't have to bother
7012 // checking the trailing requires clause.
7014 return DiagnoseUseOfDecl(
7015 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
7016 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
7017 /*SkipTrailingRequiresClause=*/true);
7018 }
7019
7020 /// Determine whether the use of this declaration is valid, and
7021 /// emit any corresponding diagnostics.
7022 ///
7023 /// This routine diagnoses various problems with referencing
7024 /// declarations that can occur when using a declaration. For example,
7025 /// it might warn if a deprecated or unavailable declaration is being
7026 /// used, or produce an error (and return true) if a C++0x deleted
7027 /// function is being used.
7028 ///
7029 /// \returns true if there was an error (this declaration cannot be
7030 /// referenced), false otherwise.
7032 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
7033 bool ObjCPropertyAccess = false,
7034 bool AvoidPartialAvailabilityChecks = false,
7035 ObjCInterfaceDecl *ClassReceiver = nullptr,
7036 bool SkipTrailingRequiresClause = false);
7037
7038 /// Emit a note explaining that this function is deleted.
7040
7041 /// DiagnoseSentinelCalls - This routine checks whether a call or
7042 /// message-send is to a declaration with the sentinel attribute, and
7043 /// if so, it checks that the requirements of the sentinel are
7044 /// satisfied.
7046 ArrayRef<Expr *> Args);
7047
7049 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
7052
7054 ExpressionEvaluationContext NewContext, FunctionDecl *FD);
7055
7058 ExpressionEvaluationContext NewContext, ReuseLambdaContextDecl_t,
7062
7064
7068
7069 /// Check whether E, which is either a discarded-value expression or an
7070 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
7071 /// lvalue, and if so, remove it from the list of volatile-qualified
7072 /// assignments that we are going to warn are deprecated.
7074
7076
7077 // Functions for marking a declaration referenced. These functions also
7078 // contain the relevant logic for marking if a reference to a function or
7079 // variable is an odr-use (in the C++11 sense). There are separate variants
7080 // for expressions referring to a decl; these exist because odr-use marking
7081 // needs to be delayed for some constant variables when we build one of the
7082 // named expressions.
7083 //
7084 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
7085 // should usually be true. This only needs to be set to false if the lack of
7086 // odr-use cannot be determined from the current context (for instance,
7087 // because the name denotes a virtual function and was written without an
7088 // explicit nested-name-specifier).
7089 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
7090
7091 /// Mark a function referenced, and check whether it is odr-used
7092 /// (C++ [basic.def.odr]p2, C99 6.9p3)
7094 bool MightBeOdrUse = true);
7095
7096 /// Mark a variable referenced, and check whether it is odr-used
7097 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
7098 /// used directly for normal expressions referring to VarDecl.
7100
7101 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
7102 ///
7103 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
7104 /// be handled with care if the DeclRefExpr is not newly-created.
7105 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
7106
7107 /// Perform reference-marking and odr-use handling for a MemberExpr.
7109
7110 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
7113 unsigned CapturingScopeIndex);
7114
7116 void CleanupVarDeclMarking();
7117
7118 /// Try to capture the given variable.
7119 ///
7120 /// \param Var The variable to capture.
7121 ///
7122 /// \param Loc The location at which the capture occurs.
7123 ///
7124 /// \param Kind The kind of capture, which may be implicit (for either a
7125 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
7126 ///
7127 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
7128 /// an explicit lambda capture.
7129 ///
7130 /// \param BuildAndDiagnose Whether we are actually supposed to add the
7131 /// captures or diagnose errors. If false, this routine merely check whether
7132 /// the capture can occur without performing the capture itself or complaining
7133 /// if the variable cannot be captured.
7134 ///
7135 /// \param CaptureType Will be set to the type of the field used to capture
7136 /// this variable in the innermost block or lambda. Only valid when the
7137 /// variable can be captured.
7138 ///
7139 /// \param DeclRefType Will be set to the type of a reference to the capture
7140 /// from within the current scope. Only valid when the variable can be
7141 /// captured.
7142 ///
7143 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
7144 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
7145 /// This is useful when enclosing lambdas must speculatively capture
7146 /// variables that may or may not be used in certain specializations of
7147 /// a nested generic lambda.
7148 ///
7149 /// \returns true if an error occurred (i.e., the variable cannot be
7150 /// captured) and false if the capture succeeded.
7152 TryCaptureKind Kind, SourceLocation EllipsisLoc,
7153 bool BuildAndDiagnose, QualType &CaptureType,
7154 QualType &DeclRefType,
7155 const unsigned *const FunctionScopeIndexToStopAt);
7156
7157 /// Try to capture the given variable.
7160 SourceLocation EllipsisLoc = SourceLocation());
7161
7162 /// Checks if the variable must be captured.
7164
7165 /// Given a variable, determine the type that a reference to that
7166 /// variable will have in the given scope.
7168
7169 /// Mark all of the declarations referenced within a particular AST node as
7170 /// referenced. Used when template instantiation instantiates a non-dependent
7171 /// type -- entities referenced by the type are now referenced.
7173
7174 /// Mark any declarations that appear within this expression or any
7175 /// potentially-evaluated subexpressions as "referenced".
7176 ///
7177 /// \param SkipLocalVariables If true, don't mark local variables as
7178 /// 'referenced'.
7179 /// \param StopAt Subexpressions that we shouldn't recurse into.
7181 bool SkipLocalVariables = false,
7182 ArrayRef<const Expr *> StopAt = {});
7183
7184 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
7185 /// conversion.
7186 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
7187
7188 /// Conditionally issue a diagnostic based on the statements's reachability
7189 /// analysis.
7190 ///
7191 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
7192 /// the function body is parsed, and then do a basic reachability analysis to
7193 /// determine if the statement is reachable. If it is unreachable, the
7194 /// diagnostic will not be emitted.
7195 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7196 const PartialDiagnostic &PD);
7197
7198 /// Conditionally issue a diagnostic based on the current
7199 /// evaluation context.
7200 ///
7201 /// \param Statement If Statement is non-null, delay reporting the
7202 /// diagnostic until the function body is parsed, and then do a basic
7203 /// reachability analysis to determine if the statement is reachable.
7204 /// If it is unreachable, the diagnostic will not be emitted.
7205 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
7206 const PartialDiagnostic &PD);
7207 /// Similar, but diagnostic is only produced if all the specified statements
7208 /// are reachable.
7209 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7210 const PartialDiagnostic &PD);
7211
7212 // Primary Expressions.
7213 SourceRange getExprRange(Expr *E) const;
7214
7215 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
7216 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
7217 bool HasTrailingLParen, bool IsAddressOfOperand,
7218 CorrectionCandidateCallback *CCC = nullptr,
7219 bool IsInlineAsmIdentifier = false);
7220
7221 /// Decomposes the given name into a DeclarationNameInfo, its location, and
7222 /// possibly a list of template arguments.
7223 ///
7224 /// If this produces template arguments, it is permitted to call
7225 /// DecomposeTemplateName.
7226 ///
7227 /// This actually loses a lot of source location information for
7228 /// non-standard name kinds; we should consider preserving that in
7229 /// some way.
7230 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
7231 TemplateArgumentListInfo &Buffer,
7232 DeclarationNameInfo &NameInfo,
7233 const TemplateArgumentListInfo *&TemplateArgs);
7234
7235 /// Diagnose a lookup that found results in an enclosing class during error
7236 /// recovery. This usually indicates that the results were found in a
7237 /// dependent base class that could not be searched as part of a template
7238 /// definition. Always issues a diagnostic (though this may be only a warning
7239 /// in MS compatibility mode).
7240 ///
7241 /// Return \c true if the error is unrecoverable, or \c false if the caller
7242 /// should attempt to recover using these lookup results.
7243 bool DiagnoseDependentMemberLookup(const LookupResult &R);
7244
7245 /// Diagnose an empty lookup.
7246 ///
7247 /// \return false if new lookup candidates were found
7248 bool
7249 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
7250 CorrectionCandidateCallback &CCC,
7251 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
7252 ArrayRef<Expr *> Args = {},
7253 DeclContext *LookupCtx = nullptr);
7254
7255 /// If \p D cannot be odr-used in the current expression evaluation context,
7256 /// return a reason explaining why. Otherwise, return NOUR_None.
7258
7259 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7260 SourceLocation Loc,
7261 const CXXScopeSpec *SS = nullptr);
7262 DeclRefExpr *
7263 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7264 const DeclarationNameInfo &NameInfo,
7265 const CXXScopeSpec *SS = nullptr,
7266 NamedDecl *FoundD = nullptr,
7267 SourceLocation TemplateKWLoc = SourceLocation(),
7268 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7269
7270 /// BuildDeclRefExpr - Build an expression that references a
7271 /// declaration that does not require a closure capture.
7272 DeclRefExpr *
7273 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7274 const DeclarationNameInfo &NameInfo,
7275 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
7276 SourceLocation TemplateKWLoc = SourceLocation(),
7277 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7278
7279 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
7280 bool HasTrailingLParen);
7281
7282 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
7283 /// declaration name, generally during template instantiation.
7284 /// There's a large number of things which don't need to be done along
7285 /// this path.
7287 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
7288 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
7289
7290 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
7291 bool NeedsADL,
7292 bool AcceptInvalidDecl = false);
7293
7294 /// Complete semantic analysis for a reference to the given declaration.
7296 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
7297 NamedDecl *FoundD = nullptr,
7298 const TemplateArgumentListInfo *TemplateArgs = nullptr,
7299 bool AcceptInvalidDecl = false);
7300
7301 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
7302 // where Tokens representing function local predefined macros (such as
7303 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
7304 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
7305
7306 ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK);
7307 ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind);
7308 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
7309
7310 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
7311
7312 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
7314 Scope *UDLScope = nullptr);
7315 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
7316 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
7317 MultiExprArg Val);
7318 ExprResult ActOnCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
7319 unsigned NumUserSpecifiedExprs,
7320 SourceLocation InitLoc,
7321 SourceLocation LParenLoc,
7322 SourceLocation RParenLoc);
7323
7324 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
7325 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
7326 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
7327 /// from multiple tokens. However, the common case is that StringToks points
7328 /// to one string.
7329 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
7330 Scope *UDLScope = nullptr);
7331
7332 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
7333
7334 /// ControllingExprOrType is either an opaque pointer coming out of a
7335 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
7336 /// into two so we don't take a void *, but that's awkward because one of
7337 /// the operands is either a ParsedType or an Expr *, which doesn't lend
7338 /// itself to generic code very well.
7339 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
7340 SourceLocation DefaultLoc,
7341 SourceLocation RParenLoc,
7342 bool PredicateIsExpr,
7343 void *ControllingExprOrType,
7344 ArrayRef<ParsedType> ArgTypes,
7345 ArrayRef<Expr *> ArgExprs);
7346 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
7347 /// it'd be better to split this interface into two so we don't take a
7348 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
7349 /// isn't a trivial change.
7350 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
7351 SourceLocation DefaultLoc,
7352 SourceLocation RParenLoc,
7353 bool PredicateIsExpr,
7354 void *ControllingExprOrType,
7355 ArrayRef<TypeSourceInfo *> Types,
7356 ArrayRef<Expr *> Exprs);
7357
7358 // Binary/Unary Operators. 'Tok' is the token for the operator.
7359 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
7360 Expr *InputExpr, bool IsAfterAmp = false);
7361 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
7362 Expr *Input, bool IsAfterAmp = false);
7363
7364 /// Unary Operators. 'Tok' is the token for the operator.
7365 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
7366 Expr *Input, bool IsAfterAmp = false);
7367
7368 /// Determine whether the given expression is a qualified member
7369 /// access expression, of a form that could be turned into a pointer to member
7370 /// with the address-of operator.
7371 bool isQualifiedMemberAccess(Expr *E);
7372 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
7373 const Expr *Op,
7374 const CXXMethodDecl *MD);
7375
7376 /// CheckAddressOfOperand - The operand of & must be either a function
7377 /// designator or an lvalue designating an object. If it is an lvalue, the
7378 /// object cannot be declared with storage class register or be a bit field.
7379 /// Note: The usual conversions are *not* applied to the operand of the &
7380 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
7381 /// In C++, the operand might be an overloaded function name, in which case
7382 /// we allow the '&' but retain the overloaded-function type.
7383 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
7384
7385 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
7386 /// _Alignas(type-name) .
7387 /// [dcl.align] An alignment-specifier of the form
7388 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
7389 ///
7390 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
7391 /// _Alignas(_Alignof(type-name)).
7392 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
7393 SourceLocation OpLoc, SourceRange R);
7394 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
7395 SourceLocation OpLoc, SourceRange R);
7396
7397 /// Build a sizeof or alignof expression given a type operand.
7398 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
7399 SourceLocation OpLoc,
7400 UnaryExprOrTypeTrait ExprKind,
7401 SourceRange R);
7402
7403 /// Build a sizeof or alignof expression given an expression
7404 /// operand.
7405 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
7406 UnaryExprOrTypeTrait ExprKind);
7407
7408 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
7409 /// expr and the same for @c alignof and @c __alignof
7410 /// Note that the ArgRange is invalid if isType is false.
7411 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
7412 UnaryExprOrTypeTrait ExprKind,
7413 bool IsType, void *TyOrEx,
7414 SourceRange ArgRange);
7415
7416 /// Check for operands with placeholder types and complain if found.
7417 /// Returns ExprError() if there was an error and no recovery was possible.
7419 bool CheckVecStepExpr(Expr *E);
7420
7421 /// Check the constraints on expression operands to unary type expression
7422 /// and type traits.
7423 ///
7424 /// Completes any types necessary and validates the constraints on the operand
7425 /// expression. The logic mostly mirrors the type-based overload, but may
7426 /// modify the expression as it completes the type for that expression through
7427 /// template instantiation, etc.
7428 bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind);
7429
7430 /// Check the constraints on operands to unary expression and type
7431 /// traits.
7432 ///
7433 /// This will complete any types necessary, and validate the various
7434 /// constraints on those operands.
7435 ///
7436 /// The UsualUnaryConversions() function is *not* called by this routine.
7437 /// C99 6.3.2.1p[2-4] all state:
7438 /// Except when it is the operand of the sizeof operator ...
7439 ///
7440 /// C++ [expr.sizeof]p4
7441 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
7442 /// standard conversions are not applied to the operand of sizeof.
7443 ///
7444 /// This policy is followed for all of the unary trait expressions.
7445 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
7446 SourceRange ExprRange,
7447 UnaryExprOrTypeTrait ExprKind,
7448 StringRef KWName);
7449
7450 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
7451 tok::TokenKind Kind, Expr *Input);
7452
7453 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
7454 MultiExprArg ArgExprs,
7455 SourceLocation RLoc);
7456 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
7457 Expr *Idx, SourceLocation RLoc);
7458
7459 ExprResult CreateBuiltinMatrixSingleSubscriptExpr(Expr *Base, Expr *RowIdx,
7460 SourceLocation RBLoc);
7461
7462 ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
7463 Expr *ColumnIdx,
7464 SourceLocation RBLoc);
7465
7466 /// ConvertArgumentsForCall - Converts the arguments specified in
7467 /// Args/NumArgs to the parameter types of the function FDecl with
7468 /// function prototype Proto. Call is the call expression itself, and
7469 /// Fn is the function expression. For a C++ member function, this
7470 /// routine does not attempt to convert the object argument. Returns
7471 /// true if the call is ill-formed.
7472 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
7473 const FunctionProtoType *Proto,
7474 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
7475 bool ExecConfig = false);
7476
7477 /// CheckStaticArrayArgument - If the given argument corresponds to a static
7478 /// array parameter, check that it is non-null, and that if it is formed by
7479 /// array-to-pointer decay, the underlying array is sufficiently large.
7480 ///
7481 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
7482 /// the array type derivation, then for each call to the function, the value
7483 /// of the corresponding actual argument shall provide access to the first
7484 /// element of an array with at least as many elements as specified by the
7485 /// size expression.
7486 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
7487 const Expr *ArgExpr);
7488
7489 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
7490 /// This provides the location of the left/right parens and a list of comma
7491 /// locations.
7492 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7493 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7494 Expr *ExecConfig = nullptr);
7495
7496 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
7497 /// This provides the location of the left/right parens and a list of comma
7498 /// locations.
7499 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7500 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7501 Expr *ExecConfig = nullptr,
7502 bool IsExecConfig = false,
7503 bool AllowRecovery = false);
7504
7505 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
7506 // with the specified CallArgs
7507 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
7508 MultiExprArg CallArgs);
7509
7511
7512 /// BuildResolvedCallExpr - Build a call to a resolved expression,
7513 /// i.e. an expression not of \p OverloadTy. The expression should
7514 /// unary-convert to an expression of function-pointer or
7515 /// block-pointer type.
7516 ///
7517 /// \param NDecl the declaration being called, if available
7519 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
7520 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
7521 Expr *Config = nullptr, bool IsExecConfig = false,
7522 ADLCallKind UsesADL = ADLCallKind::NotADL);
7523
7525 ParsedType &Ty, SourceLocation RParenLoc,
7526 Expr *CastExpr);
7527
7528 /// Prepares for a scalar cast, performing all the necessary stages
7529 /// except the final cast and returning the kind required.
7531
7532 /// Build an altivec or OpenCL literal.
7534 SourceLocation RParenLoc, Expr *E,
7535 TypeSourceInfo *TInfo);
7536
7537 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7538 /// the ParenListExpr into a sequence of comma binary operators.
7540
7542 SourceLocation RParenLoc, Expr *InitExpr);
7543
7545 TypeSourceInfo *TInfo,
7546 SourceLocation RParenLoc,
7547 Expr *LiteralExpr);
7548
7549 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7550 SourceLocation RBraceLoc);
7551
7552 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7553 SourceLocation RBraceLoc, bool IsExplicit);
7554
7555 /// Binary Operators. 'Tok' is the token for the operator.
7557 Expr *LHSExpr, Expr *RHSExpr);
7559 Expr *LHSExpr, Expr *RHSExpr,
7560 bool ForFoldExpression = false);
7561
7562 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7563 /// operator @p Opc at location @c TokLoc. This routine only supports
7564 /// built-in operations; ActOnBinOp handles overloaded operators.
7566 Expr *LHSExpr, Expr *RHSExpr,
7567 bool ForFoldExpression = false);
7569 UnresolvedSetImpl &Functions);
7570
7571 /// Look for instances where it is likely the comma operator is confused with
7572 /// another operator. There is an explicit list of acceptable expressions for
7573 /// the left hand side of the comma operator, otherwise emit a warning.
7574 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7575
7576 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7577 /// in the case of a the GNU conditional expr extension.
7579 SourceLocation ColonLoc, Expr *CondExpr,
7580 Expr *LHSExpr, Expr *RHSExpr);
7581
7582 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7584 LabelDecl *TheDecl);
7585
7586 void ActOnStartStmtExpr();
7587 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7588 SourceLocation RPLoc);
7590 SourceLocation RPLoc, unsigned TemplateDepth);
7591 // Handle the final expression in a statement expression.
7593 void ActOnStmtExprError();
7594
7595 /// __builtin_offsetof(type, a.b[123][456].c)
7597 TypeSourceInfo *TInfo,
7598 const Designation &Desig,
7599 SourceLocation RParenLoc);
7602 ParsedType ParsedArgTy,
7603 const Designation &Desig,
7604 SourceLocation RParenLoc);
7605
7606 // __builtin_choose_expr(constExpr, expr1, expr2)
7607 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7608 Expr *LHSExpr, Expr *RHSExpr,
7609 SourceLocation RPLoc);
7610
7611 // __builtin_va_arg(expr, type)
7613 SourceLocation RPLoc);
7615 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7616
7617 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7618 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7620 SourceLocation BuiltinLoc,
7621 SourceLocation RPLoc);
7622
7623 // #embed
7625 StringLiteral *BinaryData, StringRef FileName);
7626
7627 // Build a potentially resolved SourceLocExpr.
7629 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7630 DeclContext *ParentContext);
7631
7632 // __null
7634
7635 bool CheckCaseExpression(Expr *E);
7636
7637 //===------------------------- "Block" Extension ------------------------===//
7638
7639 /// ActOnBlockStart - This callback is invoked when a block literal is
7640 /// started.
7641 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7642
7643 /// ActOnBlockArguments - This callback allows processing of block arguments.
7644 /// If there are no arguments, this is still invoked.
7645 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7646 Scope *CurScope);
7647
7648 /// ActOnBlockError - If there is an error parsing a block, this callback
7649 /// is invoked to pop the information about the block from the action impl.
7650 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7651
7652 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7653 /// literal was successfully completed. ^(int x){...}
7655 Scope *CurScope);
7656
7657 //===---------------------------- Clang Extensions ----------------------===//
7658
7659 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7660 /// provided arguments.
7661 ///
7662 /// __builtin_convertvector( value, dst type )
7663 ///
7665 SourceLocation BuiltinLoc,
7666 SourceLocation RParenLoc);
7667
7668 //===---------------------------- OpenCL Features -----------------------===//
7669
7670 /// Parse a __builtin_astype expression.
7671 ///
7672 /// __builtin_astype( value, dst type )
7673 ///
7674 ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy,
7675 SourceLocation BuiltinLoc,
7676 SourceLocation RParenLoc);
7677
7678 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7680 SourceLocation BuiltinLoc,
7681 SourceLocation RParenLoc);
7682
7683 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7685 ArrayRef<Expr *> SubExprs,
7686 QualType T = QualType());
7687
7688 /// Cast a base object to a member's actual type.
7689 ///
7690 /// There are two relevant checks:
7691 ///
7692 /// C++ [class.access.base]p7:
7693 ///
7694 /// If a class member access operator [...] is used to access a non-static
7695 /// data member or non-static member function, the reference is ill-formed
7696 /// if the left operand [...] cannot be implicitly converted to a pointer to
7697 /// the naming class of the right operand.
7698 ///
7699 /// C++ [expr.ref]p7:
7700 ///
7701 /// If E2 is a non-static data member or a non-static member function, the
7702 /// program is ill-formed if the class of which E2 is directly a member is
7703 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7704 ///
7705 /// Note that the latter check does not consider access; the access of the
7706 /// "real" base class is checked as appropriate when checking the access of
7707 /// the member name.
7709 NestedNameSpecifier Qualifier,
7710 NamedDecl *FoundDecl,
7711 NamedDecl *Member);
7712
7713 /// CheckCallReturnType - Checks that a call expression's return type is
7714 /// complete. Returns true on failure. The location passed in is the location
7715 /// that best represents the call.
7716 bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc,
7717 CallExpr *CE, FunctionDecl *FD);
7718
7719 /// Emit a warning for all pending noderef expressions that we recorded.
7721
7723
7724 /// Instantiate or parse a C++ default argument expression as necessary.
7725 /// Return true on error.
7727 ParmVarDecl *Param, Expr *Init = nullptr,
7728 bool SkipImmediateInvocations = true);
7729
7730 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7731 /// the default expr if needed.
7733 ParmVarDecl *Param, Expr *Init = nullptr);
7734
7735 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7736 /// invocation.
7738
7740
7741 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7742 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7743
7744 /// Abstract base class used for diagnosing integer constant
7745 /// expression violations.
7747 public:
7749
7751
7752 virtual SemaDiagnosticBuilder
7753 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7755 SourceLocation Loc) = 0;
7758 };
7759
7760 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7761 /// and reports the appropriate diagnostics. Returns false on success.
7762 /// Can optionally return the value of the expression.
7765 VerifyICEDiagnoser &Diagnoser,
7769 unsigned DiagID,
7772 VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result = nullptr,
7776 AllowFoldKind CanFold = AllowFoldKind::No) {
7777 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7778 }
7779
7780 /// DiagnoseAssignmentAsCondition - Given that an expression is
7781 /// being used as a boolean condition, warn if it's an assignment.
7783
7784 /// Redundant parentheses over an equality comparison can indicate
7785 /// that the user intended an assignment used as condition.
7787
7789 public:
7791 FullExprArg(Sema &actions) : E(nullptr) {}
7792
7793 ExprResult release() { return E; }
7794
7795 Expr *get() const { return E; }
7796
7797 Expr *operator->() { return E; }
7798
7799 private:
7800 // FIXME: No need to make the entire Sema class a friend when it's just
7801 // Sema::MakeFullExpr that needs access to the constructor below.
7802 friend class Sema;
7803
7804 explicit FullExprArg(Expr *expr) : E(expr) {}
7805
7806 Expr *E;
7807 };
7808
7810 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7811 }
7813 return FullExprArg(
7814 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7815 }
7817 ExprResult FE =
7818 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7819 /*DiscardedValue*/ true);
7820 return FullExprArg(FE.get());
7821 }
7822
7823 class ConditionResult {
7824 Decl *ConditionVar;
7825 ExprResult Condition;
7826 bool Invalid;
7827 std::optional<bool> KnownValue;
7828
7829 friend class Sema;
7830 ConditionResult(Sema &S, Decl *ConditionVar, ExprResult Condition,
7831 bool IsConstexpr)
7832 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7833 if (IsConstexpr && Condition.get()) {
7834 if (std::optional<llvm::APSInt> Val =
7835 Condition.get()->getIntegerConstantExpr(S.Context)) {
7836 KnownValue = !!(*Val);
7837 }
7838 }
7839 }
7840 explicit ConditionResult(bool Invalid)
7841 : ConditionVar(nullptr), Condition(Invalid), Invalid(Invalid),
7842 KnownValue(std::nullopt) {}
7843
7844 public:
7845 ConditionResult() : ConditionResult(false) {}
7846 bool isInvalid() const { return Invalid; }
7847 std::pair<VarDecl *, Expr *> get() const {
7848 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7849 Condition.get());
7850 }
7851 std::optional<bool> getKnownValue() const { return KnownValue; }
7852 };
7854
7855 /// CheckBooleanCondition - Diagnose problems involving the use of
7856 /// the given expression as a boolean condition (e.g. in an if
7857 /// statement). Also performs the standard function and array
7858 /// decays, possibly changing the input variable.
7859 ///
7860 /// \param Loc - A location associated with the condition, e.g. the
7861 /// 'if' keyword.
7862 /// \return true iff there were any errors
7864 bool IsConstexpr = false);
7865
7866 enum class ConditionKind {
7867 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7868 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7869 Switch ///< An integral condition for a 'switch' statement.
7870 };
7871
7872 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7873 ConditionKind CK, bool MissingOK = false);
7874
7875 QualType CheckConditionalOperands( // C99 6.5.15
7876 ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK,
7877 ExprObjectKind &OK, SourceLocation QuestionLoc);
7878
7879 /// Emit a specialized diagnostic when one expression is a null pointer
7880 /// constant and the other is not a pointer. Returns true if a diagnostic is
7881 /// emitted.
7882 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7883 SourceLocation QuestionLoc);
7884
7885 /// type checking for vector binary operators.
7887 SourceLocation Loc, bool IsCompAssign,
7888 bool AllowBothBool, bool AllowBoolConversion,
7889 bool AllowBoolOperation, bool ReportInvalid);
7890
7891 /// Return a signed ext_vector_type that is of identical size and number of
7892 /// elements. For floating point vectors, return an integer type of identical
7893 /// size and number of elements. In the non ext_vector_type case, search from
7894 /// the largest type to the smallest type to avoid cases where long long ==
7895 /// long, where long gets picked over long long.
7898
7899 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7900 /// operates on extended vector types. Instead of producing an IntTy result,
7901 /// like a scalar comparison, a vector comparison produces a vector of integer
7902 /// types.
7904 SourceLocation Loc,
7905 BinaryOperatorKind Opc);
7907 SourceLocation Loc,
7908 BinaryOperatorKind Opc);
7910 SourceLocation Loc,
7911 BinaryOperatorKind Opc);
7913 SourceLocation Loc,
7914 BinaryOperatorKind Opc);
7916 SourceLocation Loc,
7917 BinaryOperatorKind Opc);
7918 // type checking for sizeless vector binary operators.
7920 SourceLocation Loc, bool IsCompAssign,
7921 ArithConvKind OperationKind);
7922
7923 /// Type checking for matrix binary operators.
7925 SourceLocation Loc,
7926 bool IsCompAssign);
7928 SourceLocation Loc, bool IsCompAssign);
7929
7930 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7931 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7932 /// VLST) allowed?
7933 ///
7934 /// This will also return false if the two given types do not make sense from
7935 /// the perspective of SVE bitcasts.
7936 bool isValidSveBitcast(QualType srcType, QualType destType);
7937
7938 /// Are the two types matrix types and do they have the same dimensions i.e.
7939 /// do they have the same number of rows and the same number of columns?
7941
7942 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7943
7944 /// Are the two types lax-compatible vector types? That is, given
7945 /// that one of them is a vector, do they have equal storage sizes,
7946 /// where the storage size is the number of elements times the element
7947 /// size?
7948 ///
7949 /// This will also return false if either of the types is neither a
7950 /// vector nor a real type.
7951 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
7952
7953 /// Is this a legal conversion between two types, one of which is
7954 /// known to be a vector type?
7955 bool isLaxVectorConversion(QualType srcType, QualType destType);
7956
7957 // This returns true if at least one of the types is an altivec vector.
7958 bool anyAltivecTypes(QualType srcType, QualType destType);
7959
7960 // type checking C++ declaration initializers (C++ [dcl.init]).
7961
7962 /// Check a cast of an unknown-any type. We intentionally only
7963 /// trigger this for C-style casts.
7966 ExprValueKind &VK, CXXCastPath &Path);
7967
7968 /// Force an expression with unknown-type to an expression of the
7969 /// given type.
7971
7972 /// Type-check an expression that's being passed to an
7973 /// __unknown_anytype parameter.
7975 QualType &paramType);
7976
7977 // CheckMatrixCast - Check type constraints for matrix casts.
7978 // We allow casting between matrixes of the same dimensions i.e. when they
7979 // have the same number of rows and column. Returns true if the cast is
7980 // invalid.
7981 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
7982 CastKind &Kind);
7983
7984 // CheckVectorCast - check type constraints for vectors.
7985 // Since vectors are an extension, there are no C standard reference for this.
7986 // We allow casting between vectors and integer datatypes of the same size.
7987 // returns true if the cast is invalid
7988 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
7989 CastKind &Kind);
7990
7991 /// Prepare `SplattedExpr` for a vector splat operation, adding
7992 /// implicit casts if necessary.
7993 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
7994
7995 /// Prepare `SplattedExpr` for a matrix splat operation, adding
7996 /// implicit casts if necessary.
7997 ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr);
7998
7999 // CheckExtVectorCast - check type constraints for extended vectors.
8000 // Since vectors are an extension, there are no C standard reference for this.
8001 // We allow casting between vectors and integer datatypes of the same size,
8002 // or vectors and the element type of that vector.
8003 // returns the cast expr
8005 CastKind &Kind);
8006
8008 return K == ConditionKind::Switch ? Context.IntTy : Context.BoolTy;
8009 }
8010
8011 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2), converts
8012 // functions and arrays to their respective pointers (C99 6.3.2.1), and
8013 // promotes floating-piont types according to the language semantics.
8015
8016 // UsualUnaryFPConversions - promotes floating-point types according to the
8017 // current language semantics.
8019
8020 /// CallExprUnaryConversions - a special case of an unary conversion
8021 /// performed on a function designator of a call expression.
8023
8024 // DefaultFunctionArrayConversion - converts functions and arrays
8025 // to their respective pointers (C99 6.3.2.1).
8027
8028 // DefaultFunctionArrayLvalueConversion - converts functions and
8029 // arrays to their respective pointers and performs the
8030 // lvalue-to-rvalue conversion.
8032 bool Diagnose = true);
8033
8034 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
8035 // the operand. This function is a no-op if the operand has a function type
8036 // or an array type.
8038
8039 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
8040 // do not have a prototype. Integer promotions are performed on each
8041 // argument, and arguments that have type float are promoted to double.
8043
8045 const FunctionProtoType *Proto,
8046 Expr *Fn);
8047
8048 /// Determine the degree of POD-ness for an expression.
8049 /// Incomplete types are considered POD, since this check can be performed
8050 /// when we're in an unevaluated context.
8052
8053 /// Check to see if the given expression is a valid argument to a variadic
8054 /// function, issuing a diagnostic if not.
8055 void checkVariadicArgument(const Expr *E, VariadicCallType CT);
8056
8057 /// GatherArgumentsForCall - Collector argument expressions for various
8058 /// form of call prototypes.
8060 SourceLocation CallLoc, FunctionDecl *FDecl,
8061 const FunctionProtoType *Proto, unsigned FirstParam,
8064 bool AllowExplicit = false, bool IsListInitialization = false);
8065
8066 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
8067 // will create a runtime trap if the resulting type is not a POD type.
8069 FunctionDecl *FDecl);
8070
8071 // Check that the usual arithmetic conversions can be performed on this pair
8072 // of expressions that might be of enumeration type.
8074 ArithConvKind ACK);
8075
8076 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
8077 // operands and then handles various conversions that are common to binary
8078 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
8079 // routine returns the first non-arithmetic type found. The client is
8080 // responsible for emitting appropriate error diagnostics.
8082 SourceLocation Loc, ArithConvKind ACK);
8083
8085 switch (ConvTy) {
8086 default:
8087 return false;
8091 return true;
8092 }
8093 llvm_unreachable("impossible");
8094 }
8095
8096 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
8097 /// assignment conversion type specified by ConvTy. This returns true if the
8098 /// conversion was invalid or false if the conversion was accepted.
8100 QualType DstType, QualType SrcType,
8101 Expr *SrcExpr, AssignmentAction Action,
8102 bool *Complained = nullptr);
8103
8104 /// CheckAssignmentConstraints - Perform type checking for assignment,
8105 /// argument passing, variable initialization, and function return values.
8106 /// C99 6.5.16.
8108 QualType LHSType,
8109 QualType RHSType);
8110
8111 /// Check assignment constraints and optionally prepare for a conversion of
8112 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
8113 /// is true.
8115 ExprResult &RHS, CastKind &Kind,
8116 bool ConvertRHS = true);
8117
8118 /// Check assignment constraints for an assignment of RHS to LHSType.
8119 ///
8120 /// \param LHSType The destination type for the assignment.
8121 /// \param RHS The source expression for the assignment.
8122 /// \param Diagnose If \c true, diagnostics may be produced when checking
8123 /// for assignability. If a diagnostic is produced, \p RHS will be
8124 /// set to ExprError(). Note that this function may still return
8125 /// without producing a diagnostic, even for an invalid assignment.
8126 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
8127 /// in an audited Core Foundation API and does not need to be checked
8128 /// for ARC retain issues.
8129 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
8130 /// conversions necessary to perform the assignment. If \c false,
8131 /// \p Diagnose must also be \c false.
8133 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
8134 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
8135
8136 // If the lhs type is a transparent union, check whether we
8137 // can initialize the transparent union with the given expression.
8139 ExprResult &RHS);
8140
8141 /// the following "Check" methods will return a valid/converted QualType
8142 /// or a null QualType (indicating an error diagnostic was issued).
8143
8144 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
8146 ExprResult &RHS);
8147
8148 /// Diagnose cases where a scalar was implicitly converted to a vector and
8149 /// diagnose the underlying types. Otherwise, diagnose the error
8150 /// as invalid vector logical operands for non-C++ cases.
8152 ExprResult &RHS);
8153
8155 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8156 BinaryOperatorKind Opc);
8157 QualType CheckRemainderOperands( // C99 6.5.5
8158 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8159 bool IsCompAssign = false);
8160 QualType CheckAdditionOperands( // C99 6.5.6
8161 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8162 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8164 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8165 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8166 QualType CheckShiftOperands( // C99 6.5.7
8167 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8168 BinaryOperatorKind Opc, bool IsCompAssign = false);
8170 QualType CheckCompareOperands( // C99 6.5.8/9
8171 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8172 BinaryOperatorKind Opc);
8173 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
8174 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8175 BinaryOperatorKind Opc);
8176 QualType CheckLogicalOperands( // C99 6.5.[13,14]
8177 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc,
8178 BinaryOperatorKind Opc);
8179 // CheckAssignmentOperands is used for both simple and compound assignment.
8180 // For simple assignment, pass both expressions and a null converted type.
8181 // For compound assignment, pass both expressions and the converted type.
8182 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
8183 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
8184 BinaryOperatorKind Opc);
8185
8186 /// To be used for checking whether the arguments being passed to
8187 /// function exceeds the number of parameters expected for it.
8188 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
8189 bool PartialOverloading = false) {
8190 // We check whether we're just after a comma in code-completion.
8191 if (NumArgs > 0 && PartialOverloading)
8192 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
8193 return NumArgs > NumParams;
8194 }
8195
8196 /// Whether the AST is currently being rebuilt to correct immediate
8197 /// invocations. Immediate invocation candidates and references to consteval
8198 /// functions aren't tracked when this is set.
8200
8206
8207 /// Determines whether we are currently in a context that
8208 /// is not evaluated as per C++ [expr] p5.
8211 }
8212
8216
8220
8224
8231
8232 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8234 assert(!ExprEvalContexts.empty() &&
8235 "Must be in an expression evaluation context");
8236 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8238 Ctx.DelayedDefaultInitializationContext)
8239 return Ctx.DelayedDefaultInitializationContext;
8240 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8241 Ctx.isUnevaluated())
8242 break;
8243 }
8244 return std::nullopt;
8245 }
8246
8247 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8249 assert(!ExprEvalContexts.empty() &&
8250 "Must be in an expression evaluation context");
8251 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
8252 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8254 !Ctx.DelayedDefaultInitializationContext && Res)
8255 break;
8256 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8257 Ctx.isUnevaluated())
8258 break;
8259 Res = Ctx.DelayedDefaultInitializationContext;
8260 }
8261 return Res;
8262 }
8263
8264 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
8265 /// SelfAssigned when inside a CXXMethodDecl.
8266 const FieldDecl *
8268
8270
8271 template <typename... Ts>
8273 const Ts &...Args) {
8274 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8275 return RequireCompleteType(Loc, T, CompleteTypeKind::Normal, Diagnoser);
8276 }
8277
8278 template <typename... Ts>
8279 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
8280 const Ts &...Args) {
8281 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8283 }
8284
8285 /// Abstract class used to diagnose incomplete types.
8288
8289 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
8290 virtual ~TypeDiagnoser() {}
8291 };
8292
8293 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
8294 protected:
8295 unsigned DiagID;
8296 std::tuple<const Ts &...> Args;
8297
8298 template <std::size_t... Is>
8300 std::index_sequence<Is...>) const {
8301 // Apply all tuple elements to the builder in order.
8302 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
8303 (void)Dummy;
8304 }
8305
8306 public:
8307 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8308 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
8309 assert(DiagID != 0 && "no diagnostic for type diagnoser");
8310 }
8311
8312 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8313 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
8314 emit(DB, std::index_sequence_for<Ts...>());
8315 DB << T;
8316 }
8317 };
8318
8319 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
8320 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
8321 /// For example, a diagnostic with no other parameters would generally have
8322 /// the form "...%select{incomplete|sizeless}0 type %1...".
8323 template <typename... Ts>
8325 public:
8326 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8327 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
8328
8329 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8330 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
8331 this->emit(DB, std::index_sequence_for<Ts...>());
8332 DB << T->isSizelessType() << T;
8333 }
8334 };
8335
8336 /// Check an argument list for placeholders that we won't try to
8337 /// handle later.
8339
8340 /// The C++ "std::source_location::__impl" struct, defined in
8341 /// <source_location>.
8343
8344 /// A stack of expression evaluation contexts.
8346
8347 // Set of failed immediate invocations to avoid double diagnosing.
8349
8350 /// List of SourceLocations where 'self' is implicitly retained inside a
8351 /// block.
8354
8355 /// Do an explicit extend of the given block pointer if we're in ARC.
8357
8358 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
8361
8362private:
8363 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
8364
8365 /// Methods for marking which expressions involve dereferencing a pointer
8366 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
8367 /// they are parsed, meaning that a noderef pointer may not be accessed. For
8368 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
8369 /// `*p`, but need to check that `address of` is called on it. This requires
8370 /// keeping a container of all pending expressions and checking if the address
8371 /// of them are eventually taken.
8372 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
8373 void CheckAddressOfNoDeref(const Expr *E);
8374
8375 ///@}
8376
8377 //
8378 //
8379 // -------------------------------------------------------------------------
8380 //
8381 //
8382
8383 /// \name C++ Expressions
8384 /// Implementations are in SemaExprCXX.cpp
8385 ///@{
8386
8387public:
8388 /// The C++ "std::bad_alloc" class, which is defined by the C++
8389 /// standard library.
8391
8392 /// The C++ "std::align_val_t" enum class, which is defined by the C++
8393 /// standard library.
8395
8396 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
8398
8399 /// A flag to remember whether the implicit forms of operator new and delete
8400 /// have been declared.
8402
8403 /// Delete-expressions to be analyzed at the end of translation unit
8404 ///
8405 /// This list contains class members, and locations of delete-expressions
8406 /// that could not be proven as to whether they mismatch with new-expression
8407 /// used in initializer of the field.
8408 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
8409
8410 /// Handle the result of the special case name lookup for inheriting
8411 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
8412 /// constructor names in member using declarations, even if 'X' is not the
8413 /// name of the corresponding type.
8415 SourceLocation NameLoc,
8416 const IdentifierInfo &Name);
8417
8419 SourceLocation NameLoc, Scope *S,
8420 CXXScopeSpec &SS, bool EnteringContext);
8422 Scope *S, CXXScopeSpec &SS,
8423 ParsedType ObjectType, bool EnteringContext);
8424
8426 ParsedType ObjectType);
8427
8428 /// Build a C++ typeid expression with a type operand.
8429 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8430 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8431
8432 /// Build a C++ typeid expression with an expression operand.
8433 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8434 Expr *Operand, SourceLocation RParenLoc);
8435
8436 /// ActOnCXXTypeid - Parse typeid( something ).
8438 bool isType, void *TyOrExpr,
8439 SourceLocation RParenLoc);
8440
8441 /// Build a Microsoft __uuidof expression with a type operand.
8442 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8443 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8444
8445 /// Build a Microsoft __uuidof expression with an expression operand.
8446 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8447 Expr *Operand, SourceLocation RParenLoc);
8448
8449 /// ActOnCXXUuidof - Parse __uuidof( something ).
8451 bool isType, void *TyOrExpr,
8452 SourceLocation RParenLoc);
8453
8454 //// ActOnCXXThis - Parse 'this' pointer.
8456
8457 /// Check whether the type of 'this' is valid in the current context.
8459
8460 /// Build a CXXThisExpr and mark it referenced in the current context.
8461 Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
8463
8464 /// Try to retrieve the type of the 'this' pointer.
8465 ///
8466 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8468
8469 /// When non-NULL, the C++ 'this' expression is allowed despite the
8470 /// current context not being a non-static member function. In such cases,
8471 /// this provides the type used for 'this'.
8473
8474 /// RAII object used to temporarily allow the C++ 'this' expression
8475 /// to be used, with the given qualifiers on the current class type.
8477 Sema &S;
8478 QualType OldCXXThisTypeOverride;
8479 bool Enabled;
8480
8481 public:
8482 /// Introduce a new scope where 'this' may be allowed (when enabled),
8483 /// using the given declaration (which is either a class template or a
8484 /// class) along with the given qualifiers.
8485 /// along with the qualifiers placed on '*this'.
8486 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8487 bool Enabled = true);
8488
8492 };
8493
8494 /// Make sure the value of 'this' is actually available in the current
8495 /// context, if it is a potentially evaluated context.
8496 ///
8497 /// \param Loc The location at which the capture of 'this' occurs.
8498 ///
8499 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8500 /// capture list.
8501 ///
8502 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8503 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8504 /// This is useful when enclosing lambdas must speculatively capture
8505 /// 'this' that may or may not be used in certain specializations of
8506 /// a nested generic lambda (depending on whether the name resolves to
8507 /// a non-static member function or a static function).
8508 /// \return returns 'true' if failed, 'false' if success.
8510 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8511 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8512 bool ByCopy = false);
8513
8514 /// Determine whether the given type is the type of *this that is used
8515 /// outside of the body of a member function for a type that is currently
8516 /// being defined.
8518
8519 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8521
8522 /// Build a boolean-typed literal expression.
8524
8525 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8527
8528 //// ActOnCXXThrow - Parse throw expressions.
8531 bool IsThrownVarInScope);
8532
8533 /// CheckCXXThrowOperand - Validate the operand of a throw.
8534 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8535
8536 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8537 /// Can be interpreted either as function-style casting ("int(x)")
8538 /// or class type construction ("ClassType(x,y,z)")
8539 /// or creation of a value-initialized type ("int()").
8541 SourceLocation LParenOrBraceLoc,
8542 MultiExprArg Exprs,
8543 SourceLocation RParenOrBraceLoc,
8544 bool ListInitialization);
8545
8547 SourceLocation LParenLoc,
8548 MultiExprArg Exprs,
8549 SourceLocation RParenLoc,
8550 bool ListInitialization);
8551
8552 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8553 ///
8554 /// E.g.:
8555 /// @code new (memory) int[size][4] @endcode
8556 /// or
8557 /// @code ::new Foo(23, "hello") @endcode
8558 ///
8559 /// \param StartLoc The first location of the expression.
8560 /// \param UseGlobal True if 'new' was prefixed with '::'.
8561 /// \param PlacementLParen Opening paren of the placement arguments.
8562 /// \param PlacementArgs Placement new arguments.
8563 /// \param PlacementRParen Closing paren of the placement arguments.
8564 /// \param TypeIdParens If the type is in parens, the source range.
8565 /// \param D The type to be allocated, as well as array dimensions.
8566 /// \param Initializer The initializing expression or initializer-list, or
8567 /// null if there is none.
8568 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8569 SourceLocation PlacementLParen,
8570 MultiExprArg PlacementArgs,
8571 SourceLocation PlacementRParen,
8572 SourceRange TypeIdParens, Declarator &D,
8573 Expr *Initializer);
8575 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8576 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8577 SourceRange TypeIdParens, QualType AllocType,
8578 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8579 SourceRange DirectInitRange, Expr *Initializer);
8580
8581 /// Determine whether \p FD is an aligned allocation or deallocation
8582 /// function that is unavailable.
8584
8585 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8586 /// function that is unavailable.
8588 SourceLocation Loc);
8589
8590 /// Checks that a type is suitable as the allocated type
8591 /// in a new-expression.
8592 bool CheckAllocatedType(QualType AllocType, SourceLocation Loc,
8593 SourceRange R);
8594
8595 /// Finds the overloads of operator new and delete that are appropriate
8596 /// for the allocation.
8597 std::optional<ResolvedAllocation> FindAllocationFunctions(
8598 SourceLocation StartLoc, SourceRange Range,
8600 QualType AllocType, bool IsArray, const ImplicitAllocationParameters &IAP,
8601 MultiExprArg PlaceArgs, bool Diagnose = true);
8602
8603 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8604 /// delete. These are:
8605 /// @code
8606 /// // C++03:
8607 /// void* operator new(std::size_t) throw(std::bad_alloc);
8608 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8609 /// void operator delete(void *) throw();
8610 /// void operator delete[](void *) throw();
8611 /// // C++11:
8612 /// void* operator new(std::size_t);
8613 /// void* operator new[](std::size_t);
8614 /// void operator delete(void *) noexcept;
8615 /// void operator delete[](void *) noexcept;
8616 /// // C++1y:
8617 /// void* operator new(std::size_t);
8618 /// void* operator new[](std::size_t);
8619 /// void operator delete(void *) noexcept;
8620 /// void operator delete[](void *) noexcept;
8621 /// void operator delete(void *, std::size_t) noexcept;
8622 /// void operator delete[](void *, std::size_t) noexcept;
8623 /// @endcode
8624 /// Note that the placement and nothrow forms of new are *not* implicitly
8625 /// declared. Their use requires including <new>.
8628 ArrayRef<QualType> Params);
8629
8631 DeclarationName Name, FunctionDecl *&Operator,
8633 bool Diagnose = true);
8636 DeclarationName Name,
8637 bool Diagnose = true);
8639 CXXRecordDecl *RD,
8640 bool Diagnose,
8641 bool LookForGlobal,
8642 DeclarationName Name);
8643
8644 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8645 /// @code ::delete ptr; @endcode
8646 /// or
8647 /// @code delete [] ptr; @endcode
8648 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8649 bool ArrayForm, Expr *Operand);
8651 bool IsDelete, bool CallCanBeVirtual,
8652 bool WarnOnNonAbstractTypes,
8653 SourceLocation DtorLoc);
8654
8656 Expr *Operand, SourceLocation RParen);
8658 SourceLocation RParen);
8659
8661 SourceLocation OpLoc,
8662 tok::TokenKind OpKind,
8663 ParsedType &ObjectType,
8664 bool &MayBePseudoDestructor);
8665
8667 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8668 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8669 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8670
8672 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8673 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8674 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8675
8677 SourceLocation OpLoc,
8678 tok::TokenKind OpKind,
8679 SourceLocation TildeLoc,
8680 const DeclSpec &DS);
8681
8682 /// MaybeCreateExprWithCleanups - If the current full-expression
8683 /// requires any cleanups, surround it with a ExprWithCleanups node.
8684 /// Otherwise, just returns the passed-in expression.
8688
8689 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8690 return ActOnFinishFullExpr(
8691 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8692 }
8694 bool DiscardedValue, bool IsConstexpr = false,
8695 bool IsTemplateArgument = false);
8697
8698 /// Process the expression contained within a decltype. For such expressions,
8699 /// certain semantic checks on temporaries are delayed until this point, and
8700 /// are omitted for the 'topmost' call in the decltype expression. If the
8701 /// topmost call bound a temporary, strip that temporary off the expression.
8703
8704 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8705 bool IsUDSuffix);
8706
8708
8709 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8710 SourceLocation StmtLoc,
8711 ConditionKind CK);
8712
8713 /// Check the use of the given variable as a C++ condition in an if,
8714 /// while, do-while, or switch statement.
8716 SourceLocation StmtLoc, ConditionKind CK);
8717
8718 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8719 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8720
8721 /// Helper function to determine whether this is the (deprecated) C++
8722 /// conversion from a string literal to a pointer to non-const char or
8723 /// non-const wchar_t (for narrow and wide string literals,
8724 /// respectively).
8726
8727 /// PerformImplicitConversion - Perform an implicit conversion of the
8728 /// expression From to the type ToType using the pre-computed implicit
8729 /// conversion sequence ICS. Returns the converted
8730 /// expression. Action is the kind of conversion we're performing,
8731 /// used in the error message.
8733 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8734 AssignmentAction Action,
8736
8737 /// PerformImplicitConversion - Perform an implicit conversion of the
8738 /// expression From to the type ToType by following the standard
8739 /// conversion sequence SCS. Returns the converted
8740 /// expression. Flavor is the context in which we're performing this
8741 /// conversion, for use in error messages.
8743 const StandardConversionSequence &SCS,
8744 AssignmentAction Action,
8746
8747 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8748
8749 /// Parsed one of the type trait support pseudo-functions.
8750 ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
8752 SourceLocation RParenLoc);
8753 ExprResult BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
8755 SourceLocation RParenLoc);
8756
8757 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8758 /// pseudo-functions.
8759 ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc,
8760 ParsedType LhsTy, Expr *DimExpr,
8761 SourceLocation RParen);
8762
8763 ExprResult BuildArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc,
8764 TypeSourceInfo *TSInfo, Expr *DimExpr,
8765 SourceLocation RParen);
8766
8767 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8768 /// pseudo-functions.
8769 ExprResult ActOnExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc,
8770 Expr *Queried, SourceLocation RParen);
8771
8772 ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc,
8773 Expr *Queried, SourceLocation RParen);
8774
8777 bool isIndirect);
8779 ExprResult &RHS,
8780 SourceLocation QuestionLoc);
8781
8782 //// Determines if a type is trivially relocatable
8783 /// according to the C++26 rules.
8784 // FIXME: This is in Sema because it requires
8785 // overload resolution, can we move to ASTContext?
8788
8789 /// Check the operands of ?: under C++ semantics.
8790 ///
8791 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8792 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8793 ///
8794 /// This function also implements GCC's vector extension and the
8795 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8796 /// permit the use of a?b:c where the type of a is that of a integer vector
8797 /// with the same number of elements and size as the vectors of b and c. If
8798 /// one of either b or c is a scalar it is implicitly converted to match the
8799 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8800 /// c are scalars, then b and c are checked and converted to the type of a if
8801 /// possible.
8802 ///
8803 /// The expressions are evaluated differently for GCC's and OpenCL's
8804 /// extensions. For the GCC extension, the ?: operator is evaluated as
8805 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8806 /// For the OpenCL extensions, the ?: operator is evaluated as
8807 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8808 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8810 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8811 ExprObjectKind &OK, SourceLocation questionLoc);
8812
8813 /// Find a merged pointer type and convert the two expressions to it.
8814 ///
8815 /// This finds the composite pointer type for \p E1 and \p E2 according to
8816 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8817 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8818 /// ConvertArgs is \c true).
8819 ///
8820 /// \param Loc The location of the operator requiring these two expressions to
8821 /// be converted to the composite pointer type.
8822 ///
8823 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8824 /// type.
8826 bool ConvertArgs = true);
8828 ExprResult &E2, bool ConvertArgs = true) {
8829 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8830 QualType Composite =
8831 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8832 E1 = E1Tmp;
8833 E2 = E2Tmp;
8834 return Composite;
8835 }
8836
8837 /// MaybeBindToTemporary - If the passed in expression has a record type with
8838 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8839 /// it simply returns the passed in expression.
8841
8842 /// IgnoredValueConversions - Given that an expression's result is
8843 /// syntactically ignored, perform any conversions that are
8844 /// required.
8846
8848
8851 const DeclarationNameInfo &TargetNameInfo);
8852
8854 SourceLocation KeywordLoc,
8855 bool IsIfExists, CXXScopeSpec &SS,
8856 UnqualifiedId &Name);
8857
8860 ArrayRef<ParmVarDecl *> LocalParameters,
8861 Scope *BodyScope);
8865 CXXScopeSpec &SS,
8866 SourceLocation NameLoc,
8867 const IdentifierInfo *TypeName,
8868 TemplateIdAnnotation *TemplateId);
8870 SourceLocation NoexceptLoc);
8872 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8873 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8876 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8880 bool IsSatisfied, SourceLocation NoexceptLoc,
8887 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8888 const ASTConstraintSatisfaction &Satisfaction);
8891 SourceLocation LParenLoc,
8892 ArrayRef<ParmVarDecl *> LocalParameters,
8893 SourceLocation RParenLoc,
8895 SourceLocation ClosingBraceLoc);
8896
8897private:
8898 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8899 bool IsDelete);
8900
8901 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8902 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8903 bool DeleteWasArrayForm);
8904
8905 std::optional<AllocationArgumentSet>
8906 resolveAllocationArguments(LookupResult &R,
8908 ArrayRef<Expr *> PlacementArguments);
8909
8910 // Attempts to construct the type identity argument for the call to a
8911 // type aware operator new. Returns null on failure.
8912 Expr *tryGetTypeIdentityArgument(QualType Type, SourceLocation);
8913
8914 Expr *AllocationSizeExpr = nullptr;
8915 Expr *AllocationAlignmentExpr = nullptr;
8916 llvm::DenseMap<QualType, Expr *> AllocationTypeIdentityArguments;
8917
8918 ///@}
8919
8920 //
8921 //
8922 // -------------------------------------------------------------------------
8923 //
8924 //
8925
8926 /// \name Member Access Expressions
8927 /// Implementations are in SemaExprMember.cpp
8928 ///@{
8929
8930public:
8931 /// Check whether an expression might be an implicit class member access.
8933 bool IsAddressOfOperand);
8934
8935 /// Builds an expression which might be an implicit member expression.
8937 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8938 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8939
8940 /// Builds an implicit member access expression. The current context
8941 /// is known to be an instance method, and the given unqualified lookup
8942 /// set is known to contain only instance members, at least one of which
8943 /// is from an appropriate type.
8945 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8946 LookupResult &R,
8947 const TemplateArgumentListInfo *TemplateArgs,
8948 bool IsDefiniteInstance, const Scope *S);
8949
8951 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8952 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8953 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8954 const TemplateArgumentListInfo *TemplateArgs);
8955
8956 /// The main callback when the parser finds something like
8957 /// expression . [nested-name-specifier] identifier
8958 /// expression -> [nested-name-specifier] identifier
8959 /// where 'identifier' encompasses a fairly broad spectrum of
8960 /// possibilities, including destructor and operator references.
8961 ///
8962 /// \param OpKind either tok::arrow or tok::period
8963 /// \param ObjCImpDecl the current Objective-C \@implementation
8964 /// decl; this is an ugly hack around the fact that Objective-C
8965 /// \@implementations aren't properly put in the context chain
8967 tok::TokenKind OpKind, CXXScopeSpec &SS,
8968 SourceLocation TemplateKWLoc,
8969 UnqualifiedId &Member, Decl *ObjCImpDecl);
8970
8971 MemberExpr *
8972 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
8973 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
8974 ValueDecl *Member, DeclAccessPair FoundDecl,
8975 bool HadMultipleCandidates,
8976 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
8978 const TemplateArgumentListInfo *TemplateArgs = nullptr);
8979
8980 // Check whether the declarations we found through a nested-name
8981 // specifier in a member expression are actually members of the base
8982 // type. The restriction here is:
8983 //
8984 // C++ [expr.ref]p2:
8985 // ... In these cases, the id-expression shall name a
8986 // member of the class or of one of its base classes.
8987 //
8988 // So it's perfectly legitimate for the nested-name specifier to name
8989 // an unrelated class, and for us to find an overload set including
8990 // decls from classes which are not superclasses, as long as the decl
8991 // we actually pick through overload resolution is from a superclass.
8992 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
8993 const CXXScopeSpec &SS,
8994 const LookupResult &R);
8995
8996 // This struct is for use by ActOnMemberAccess to allow
8997 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
8998 // changing the access operator from a '.' to a '->' (to see if that is the
8999 // change needed to fix an error about an unknown member, e.g. when the class
9000 // defines a custom operator->).
9006
9008 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
9009 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
9010 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
9011 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
9012 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9013
9016 bool IsArrow, const CXXScopeSpec &SS,
9017 SourceLocation TemplateKWLoc,
9018 NamedDecl *FirstQualifierInScope, LookupResult &R,
9019 const TemplateArgumentListInfo *TemplateArgs,
9020 const Scope *S, bool SuppressQualifierCheck = false,
9021 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
9022
9023 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
9024 SourceLocation OpLoc,
9025 const CXXScopeSpec &SS, FieldDecl *Field,
9026 DeclAccessPair FoundDecl,
9027 const DeclarationNameInfo &MemberNameInfo);
9028
9029 /// Perform conversions on the LHS of a member access expression.
9031
9033 const CXXScopeSpec &SS, SourceLocation nameLoc,
9034 IndirectFieldDecl *indirectField,
9035 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
9036 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
9037
9038private:
9039 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
9040
9041 ///@}
9042
9043 //
9044 //
9045 // -------------------------------------------------------------------------
9046 //
9047 //
9048
9049 /// \name Initializers
9050 /// Implementations are in SemaInit.cpp
9051 ///@{
9052
9053public:
9054 /// Stack of types that correspond to the parameter entities that are
9055 /// currently being copy-initialized. Can be empty.
9057
9058 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
9060
9061 bool IsStringInit(Expr *Init, const ArrayType *AT);
9062
9063 /// Determine whether we can perform aggregate initialization for the purposes
9064 /// of overload resolution.
9066 const InitializedEntity &Entity, InitListExpr *From);
9067
9069 SourceLocation EqualOrColonLoc,
9070 bool GNUSyntax, ExprResult Init);
9071
9072 /// Check that the lifetime of the initializer (and its subobjects) is
9073 /// sufficient for initializing the entity, and perform lifetime extension
9074 /// (when permitted) if not.
9076
9079 bool BoundToLvalueReference);
9080
9081 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
9082 /// it as an xvalue. In C++98, the result will still be a prvalue, because
9083 /// we don't have xvalues there.
9085
9089
9093 SourceLocation EqualLoc, ExprResult Init,
9094 bool TopLevelOfInitList = false,
9095 bool AllowExplicit = false);
9096
9098 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9099 const InitializationKind &Kind, MultiExprArg Init);
9100
9101 ///@}
9102
9103 //
9104 //
9105 // -------------------------------------------------------------------------
9106 //
9107 //
9108
9109 /// \name C++ Lambda Expressions
9110 /// Implementations are in SemaLambda.cpp
9111 ///@{
9112
9113public:
9114 /// Create a new lambda closure type.
9116 TypeSourceInfo *Info,
9117 unsigned LambdaDependencyKind,
9118 LambdaCaptureDefault CaptureDefault);
9119
9120 /// Number lambda for linkage purposes if necessary.
9122 std::optional<CXXRecordDecl::LambdaNumbering>
9123 NumberingOverride = std::nullopt);
9124
9125 /// Endow the lambda scope info with the relevant properties.
9126 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
9127 SourceRange IntroducerRange,
9128 LambdaCaptureDefault CaptureDefault,
9129 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
9130 bool Mutable);
9131
9134
9136 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
9137 TemplateParameterList *TemplateParams);
9138
9139 void
9141 SourceLocation CallOperatorLoc,
9142 const AssociatedConstraint &TrailingRequiresClause,
9143 TypeSourceInfo *MethodTyInfo,
9144 ConstexprSpecKind ConstexprKind, StorageClass SC,
9146 bool HasExplicitResultType);
9147
9148 /// Returns true if the explicit object parameter was invalid.
9150 SourceLocation CallLoc);
9151
9152 /// Perform initialization analysis of the init-capture and perform
9153 /// any implicit conversions such as an lvalue-to-rvalue conversion if
9154 /// not being used to initialize a reference.
9156 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
9157 IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init) {
9159 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
9161 }
9163 SourceLocation EllipsisLoc,
9164 UnsignedOrNone NumExpansions,
9165 IdentifierInfo *Id,
9166 bool DirectInit, Expr *&Init);
9167
9168 /// Create a dummy variable within the declcontext of the lambda's
9169 /// call operator, for name lookup purposes for a lambda init capture.
9170 ///
9171 /// CodeGen handles emission of lambda captures, ignoring these dummy
9172 /// variables appropriately.
9174 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
9175 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
9176
9177 /// Add an init-capture to a lambda scope.
9178 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
9179
9180 /// Note that we have finished the explicit captures for the
9181 /// given lambda.
9183
9184 /// Deduce a block or lambda's return type based on the return
9185 /// statements present in the body.
9187
9188 /// Once the Lambdas capture are known, we can start to create the closure,
9189 /// call operator method, and keep track of the captures.
9190 /// We do the capture lookup here, but they are not actually captured until
9191 /// after we know what the qualifiers of the call operator are.
9193 Scope *CurContext);
9194
9195 /// This is called after parsing the explicit template parameter list
9196 /// on a lambda (if it exists) in C++2a.
9198 SourceLocation LAngleLoc,
9199 ArrayRef<NamedDecl *> TParams,
9200 SourceLocation RAngleLoc,
9201 ExprResult RequiresClause);
9202
9204 SourceLocation MutableLoc);
9205
9207 Scope *LambdaScope,
9209
9210 /// ActOnStartOfLambdaDefinition - This is called just before we start
9211 /// parsing the body of a lambda; it analyzes the explicit captures and
9212 /// arguments, and sets up various data-structures for the body of the
9213 /// lambda.
9215 Declarator &ParamInfo, const DeclSpec &DS);
9216
9217 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
9218 /// is invoked to pop the information about the lambda.
9219 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
9220 bool IsInstantiation = false);
9221
9222 /// ActOnLambdaExpr - This is called when the body of a lambda expression
9223 /// was successfully completed.
9225
9226 /// Does copying/destroying the captured variable have side effects?
9227 bool CaptureHasSideEffects(const sema::Capture &From);
9228
9229 /// Diagnose if an explicit lambda capture is unused. Returns true if a
9230 /// diagnostic is emitted.
9231 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
9232 SourceRange FixItRange,
9233 const sema::Capture &From);
9234
9235 /// Build a FieldDecl suitable to hold the given capture.
9237
9238 /// Initialize the given capture with a suitable expression.
9240 SourceLocation ImplicitCaptureLoc,
9241 bool IsOpenMPMapping = false);
9242
9243 /// Complete a lambda-expression having processed and attached the
9244 /// lambda body.
9246
9247 /// Get the return type to use for a lambda's conversion function(s) to
9248 /// function pointer type, given the type of the call operator.
9249 QualType
9251 CallingConv CC);
9252
9254 SourceLocation ConvLocation,
9255 CXXConversionDecl *Conv, Expr *Src);
9256
9258 : private FunctionScopeRAII {
9259 public:
9261 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
9263 bool ShouldAddDeclsFromParentScope = true);
9264 };
9265
9266 /// Compute the mangling number context for a lambda expression or
9267 /// block literal. Also return the extra mangling decl if any.
9268 ///
9269 /// \param DC - The DeclContext containing the lambda expression or
9270 /// block literal.
9271 std::tuple<MangleNumberingContext *, Decl *>
9273
9274 ///@}
9275
9276 //
9277 //
9278 // -------------------------------------------------------------------------
9279 //
9280 //
9281
9282 /// \name Name Lookup
9283 ///
9284 /// These routines provide name lookup that is used during semantic
9285 /// analysis to resolve the various kinds of names (identifiers,
9286 /// overloaded operator names, constructor names, etc.) into zero or
9287 /// more declarations within a particular scope. The major entry
9288 /// points are LookupName, which performs unqualified name lookup,
9289 /// and LookupQualifiedName, which performs qualified name lookup.
9290 ///
9291 /// All name lookup is performed based on some specific criteria,
9292 /// which specify what names will be visible to name lookup and how
9293 /// far name lookup should work. These criteria are important both
9294 /// for capturing language semantics (certain lookups will ignore
9295 /// certain names, for example) and for performance, since name
9296 /// lookup is often a bottleneck in the compilation of C++. Name
9297 /// lookup criteria is specified via the LookupCriteria enumeration.
9298 ///
9299 /// The results of name lookup can vary based on the kind of name
9300 /// lookup performed, the current language, and the translation
9301 /// unit. In C, for example, name lookup will either return nothing
9302 /// (no entity found) or a single declaration. In C++, name lookup
9303 /// can additionally refer to a set of overloaded functions or
9304 /// result in an ambiguity. All of the possible results of name
9305 /// lookup are captured by the LookupResult class, which provides
9306 /// the ability to distinguish among them.
9307 ///
9308 /// Implementations are in SemaLookup.cpp
9309 ///@{
9310
9311public:
9312 /// Tracks whether we are in a context where typo correction is
9313 /// disabled.
9315
9316 /// The number of typos corrected by CorrectTypo.
9318
9319 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
9320 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
9321
9322 /// A cache containing identifiers for which typo correction failed and
9323 /// their locations, so that repeated attempts to correct an identifier in a
9324 /// given location are ignored if typo correction already failed for it.
9326
9327 /// SpecialMemberOverloadResult - The overloading result for a special member
9328 /// function.
9329 ///
9330 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
9331 /// integer are used to determine whether overload resolution succeeded.
9333 public:
9335
9336 private:
9337 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
9338
9339 public:
9342 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
9343
9344 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
9345 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
9346
9347 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
9348 void setKind(Kind K) { Pair.setInt(K); }
9349 };
9350
9351 using SpecialMemberCacheKey = std::pair<const CXXRecordDecl *, unsigned>;
9352
9353 /// A cache of special member function overload resolution results
9354 /// for C++ records.
9355 llvm::DenseMap<SpecialMemberCacheKey, SpecialMemberOverloadResult>
9357
9359
9360 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
9361 // TODO: make this is a typesafe union.
9364
9365 /// Describes the kind of name lookup to perform.
9367 /// Ordinary name lookup, which finds ordinary names (functions,
9368 /// variables, typedefs, etc.) in C and most kinds of names
9369 /// (functions, variables, members, types, etc.) in C++.
9371 /// Tag name lookup, which finds the names of enums, classes,
9372 /// structs, and unions.
9374 /// Label name lookup.
9376 /// Member name lookup, which finds the names of
9377 /// class/struct/union members.
9379 /// Look up of an operator name (e.g., operator+) for use with
9380 /// operator overloading. This lookup is similar to ordinary name
9381 /// lookup, but will ignore any declarations that are class members.
9383 /// Look up a name following ~ in a destructor name. This is an ordinary
9384 /// lookup, but prefers tags to typedefs.
9386 /// Look up of a name that precedes the '::' scope resolution
9387 /// operator in C++. This lookup completely ignores operator, object,
9388 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9390 /// Look up a namespace name within a C++ using directive or
9391 /// namespace alias definition, ignoring non-namespace names (C++
9392 /// [basic.lookup.udir]p1).
9394 /// Look up all declarations in a scope with the given name,
9395 /// including resolved using declarations. This is appropriate
9396 /// for checking redeclarations for a using declaration.
9398 /// Look up an ordinary name that is going to be redeclared as a
9399 /// name with linkage. This lookup ignores any declarations that
9400 /// are outside of the current scope unless they have linkage. See
9401 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9403 /// Look up a friend of a local class. This lookup does not look
9404 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9406 /// Look up the name of an Objective-C protocol.
9408 /// Look up implicit 'self' parameter of an objective-c method.
9410 /// Look up the name of an OpenMP user-defined reduction operation.
9412 /// Look up the name of an OpenMP user-defined mapper.
9414 /// Look up any declaration with any name.
9416 };
9417
9418 /// The possible outcomes of name lookup for a literal operator.
9420 /// The lookup resulted in an error.
9422 /// The lookup found no match but no diagnostic was issued.
9424 /// The lookup found a single 'cooked' literal operator, which
9425 /// expects a normal literal to be built and passed to it.
9427 /// The lookup found a single 'raw' literal operator, which expects
9428 /// a string literal containing the spelling of the literal token.
9430 /// The lookup found an overload set of literal operator templates,
9431 /// which expect the characters of the spelling of the literal token to be
9432 /// passed as a non-type template argument pack.
9434 /// The lookup found an overload set of literal operator templates,
9435 /// which expect the character type and characters of the spelling of the
9436 /// string literal token to be passed as template arguments.
9438 };
9439
9440 SpecialMemberOverloadResult
9442 bool VolatileArg, bool RValueThis, bool ConstThis,
9443 bool VolatileThis);
9444
9446
9447 /// Look up a name, looking for a single declaration. Return
9448 /// null if the results were absent, ambiguous, or overloaded.
9449 ///
9450 /// It is preferable to use the elaborated form and explicitly handle
9451 /// ambiguity and overloaded.
9453 Scope *S, DeclarationName Name, SourceLocation Loc,
9454 LookupNameKind NameKind,
9456
9457 /// Lookup a builtin function, when name lookup would otherwise
9458 /// fail.
9459 bool LookupBuiltin(LookupResult &R);
9460 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9461
9462 /// Perform unqualified name lookup starting from a given
9463 /// scope.
9464 ///
9465 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9466 /// used to find names within the current scope. For example, 'x' in
9467 /// @code
9468 /// int x;
9469 /// int f() {
9470 /// return x; // unqualified name look finds 'x' in the global scope
9471 /// }
9472 /// @endcode
9473 ///
9474 /// Different lookup criteria can find different names. For example, a
9475 /// particular scope can have both a struct and a function of the same
9476 /// name, and each can be found by certain lookup criteria. For more
9477 /// information about lookup criteria, see the documentation for the
9478 /// class LookupCriteria.
9479 ///
9480 /// @param S The scope from which unqualified name lookup will
9481 /// begin. If the lookup criteria permits, name lookup may also search
9482 /// in the parent scopes.
9483 ///
9484 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9485 /// look up and the lookup kind), and is updated with the results of lookup
9486 /// including zero or more declarations and possibly additional information
9487 /// used to diagnose ambiguities.
9488 ///
9489 /// @returns \c true if lookup succeeded and false otherwise.
9490 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9491 bool ForceNoCPlusPlus = false);
9492
9493 /// Perform qualified name lookup into a given context.
9494 ///
9495 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9496 /// names when the context of those names is explicit specified, e.g.,
9497 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9498 ///
9499 /// Different lookup criteria can find different names. For example, a
9500 /// particular scope can have both a struct and a function of the same
9501 /// name, and each can be found by certain lookup criteria. For more
9502 /// information about lookup criteria, see the documentation for the
9503 /// class LookupCriteria.
9504 ///
9505 /// \param R captures both the lookup criteria and any lookup results found.
9506 ///
9507 /// \param LookupCtx The context in which qualified name lookup will
9508 /// search. If the lookup criteria permits, name lookup may also search
9509 /// in the parent contexts or (for C++ classes) base classes.
9510 ///
9511 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9512 /// occurs as part of unqualified name lookup.
9513 ///
9514 /// \returns true if lookup succeeded, false if it failed.
9515 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9516 bool InUnqualifiedLookup = false);
9517
9518 /// Performs qualified name lookup or special type of lookup for
9519 /// "__super::" scope specifier.
9520 ///
9521 /// This routine is a convenience overload meant to be called from contexts
9522 /// that need to perform a qualified name lookup with an optional C++ scope
9523 /// specifier that might require special kind of lookup.
9524 ///
9525 /// \param R captures both the lookup criteria and any lookup results found.
9526 ///
9527 /// \param LookupCtx The context in which qualified name lookup will
9528 /// search.
9529 ///
9530 /// \param SS An optional C++ scope-specifier.
9531 ///
9532 /// \returns true if lookup succeeded, false if it failed.
9533 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9534 CXXScopeSpec &SS);
9535
9536 /// Performs name lookup for a name that was parsed in the
9537 /// source code, and may contain a C++ scope specifier.
9538 ///
9539 /// This routine is a convenience routine meant to be called from
9540 /// contexts that receive a name and an optional C++ scope specifier
9541 /// (e.g., "N::M::x"). It will then perform either qualified or
9542 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9543 /// respectively) on the given name and return those results. It will
9544 /// perform a special type of lookup for "__super::" scope specifier.
9545 ///
9546 /// @param S The scope from which unqualified name lookup will
9547 /// begin.
9548 ///
9549 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9550 ///
9551 /// @param EnteringContext Indicates whether we are going to enter the
9552 /// context of the scope-specifier SS (if present).
9553 ///
9554 /// @returns True if any decls were found (but possibly ambiguous)
9556 QualType ObjectType, bool AllowBuiltinCreation = false,
9557 bool EnteringContext = false);
9558
9559 /// Perform qualified name lookup into all base classes of the given
9560 /// class.
9561 ///
9562 /// \param R captures both the lookup criteria and any lookup results found.
9563 ///
9564 /// \param Class The context in which qualified name lookup will
9565 /// search. Name lookup will search in all base classes merging the results.
9566 ///
9567 /// @returns True if any decls were found (but possibly ambiguous)
9569
9571 UnresolvedSetImpl &Functions);
9572
9573 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9574 /// If GnuLabelLoc is a valid source location, then this is a definition
9575 /// of an __label__ label name, otherwise it is a normal label definition
9576 /// or use. If IsLabelStmt is true, then this is the label of a
9577 /// labeled-statement.
9579 SourceLocation GnuLabelLoc = SourceLocation(),
9580 bool IsLabelStmt = false);
9581
9582 /// Perform a name lookup for a label with the specified name; this does not
9583 /// create a new label if the lookup fails.
9585
9586 /// Look up the constructors for the given class.
9588
9589 /// Look up the default constructor for the given class.
9591
9592 /// Look up the copying constructor for the given class.
9594 unsigned Quals);
9595
9596 /// Look up the copying assignment operator for the given class.
9598 bool RValueThis, unsigned ThisQuals);
9599
9600 /// Look up the moving constructor for the given class.
9602 unsigned Quals);
9603
9604 /// Look up the moving assignment operator for the given class.
9606 bool RValueThis, unsigned ThisQuals);
9607
9608 /// Look for the destructor of the given class.
9609 ///
9610 /// During semantic analysis, this routine should be used in lieu of
9611 /// CXXRecordDecl::getDestructor().
9612 ///
9613 /// \returns The destructor for this class.
9615
9616 /// Force the declaration of any implicitly-declared members of this
9617 /// class.
9619
9620 /// Make a merged definition of an existing hidden definition \p ND
9621 /// visible at the specified location.
9623
9624 /// Check ODR hashes for C/ObjC when merging types from modules.
9625 /// Differently from C++, actually parse the body and reject in case
9626 /// of a mismatch.
9627 template <typename T,
9628 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9630 if (Duplicate->getODRHash() != Previous->getODRHash())
9631 return false;
9632
9633 // Make the previous decl visible.
9635 return true;
9636 }
9637
9638 /// Get the set of additional modules that should be checked during
9639 /// name lookup. A module and its imports become visible when instanting a
9640 /// template defined within it.
9641 llvm::DenseSet<Module *> &getLookupModules();
9642
9643 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9645
9646 /// Determine if the template parameter \p D has a visible default argument.
9647 bool
9649 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9650 /// Determine if the template parameter \p D has a reachable default argument.
9652 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9653 /// Determine if the template parameter \p D has a reachable default argument.
9657
9658 /// Determine if there is a visible declaration of \p D that is an explicit
9659 /// specialization declaration for a specialization of a template. (For a
9660 /// member specialization, use hasVisibleMemberSpecialization.)
9662 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9663 /// Determine if there is a reachable declaration of \p D that is an explicit
9664 /// specialization declaration for a specialization of a template. (For a
9665 /// member specialization, use hasReachableMemberSpecialization.)
9667 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9668
9669 /// Determine if there is a visible declaration of \p D that is a member
9670 /// specialization declaration (as opposed to an instantiated declaration).
9672 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9673 /// Determine if there is a reachable declaration of \p D that is a member
9674 /// specialization declaration (as opposed to an instantiated declaration).
9676 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9677
9678 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9679
9680 /// Determine whether any declaration of an entity is visible.
9681 bool
9683 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9684 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9685 }
9686
9689 /// Determine whether any declaration of an entity is reachable.
9690 bool
9692 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9693 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9694 }
9696 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9697
9698 void diagnoseTypo(const TypoCorrection &Correction,
9699 const PartialDiagnostic &TypoDiag,
9700 bool ErrorRecovery = true);
9701
9702 /// Diagnose a successfully-corrected typo. Separated from the correction
9703 /// itself to allow external validation of the result, etc.
9704 ///
9705 /// \param Correction The result of performing typo correction.
9706 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9707 /// string added to it (and usually also a fixit).
9708 /// \param PrevNote A note to use when indicating the location of the entity
9709 /// to which we are correcting. Will have the correction string added
9710 /// to it.
9711 /// \param ErrorRecovery If \c true (the default), the caller is going to
9712 /// recover from the typo as if the corrected string had been typed.
9713 /// In this case, \c PDiag must be an error, and we will attach a fixit
9714 /// to it.
9715 void diagnoseTypo(const TypoCorrection &Correction,
9716 const PartialDiagnostic &TypoDiag,
9717 const PartialDiagnostic &PrevNote,
9718 bool ErrorRecovery = true);
9719
9720 /// Find the associated classes and namespaces for
9721 /// argument-dependent lookup for a call with the given set of
9722 /// arguments.
9723 ///
9724 /// This routine computes the sets of associated classes and associated
9725 /// namespaces searched by argument-dependent lookup
9726 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9728 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9729 AssociatedNamespaceSet &AssociatedNamespaces,
9730 AssociatedClassSet &AssociatedClasses);
9731
9732 /// Produce a diagnostic describing the ambiguity that resulted
9733 /// from name lookup.
9734 ///
9735 /// \param Result The result of the ambiguous lookup to be diagnosed.
9737
9738 /// LookupLiteralOperator - Determine which literal operator should be used
9739 /// for a user-defined literal, per C++11 [lex.ext].
9740 ///
9741 /// Normal overload resolution is not used to select which literal operator to
9742 /// call for a user-defined literal. Look up the provided literal operator
9743 /// name, and filter the results to the appropriate set for the given argument
9744 /// types.
9747 bool AllowRaw, bool AllowTemplate,
9748 bool AllowStringTemplate, bool DiagnoseMissing,
9749 StringLiteral *StringLit = nullptr);
9750
9752 ArrayRef<Expr *> Args, ADLResult &Functions);
9753
9754 void LookupVisibleDecls(Scope *S, LookupNameKind Kind,
9756 bool IncludeGlobalScope = true,
9757 bool LoadExternal = true);
9758 void LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,
9760 bool IncludeGlobalScope = true,
9761 bool IncludeDependentBases = false,
9762 bool LoadExternal = true);
9763
9764 /// Try to "correct" a typo in the source code by finding
9765 /// visible declarations whose names are similar to the name that was
9766 /// present in the source code.
9767 ///
9768 /// \param TypoName the \c DeclarationNameInfo structure that contains
9769 /// the name that was present in the source code along with its location.
9770 ///
9771 /// \param LookupKind the name-lookup criteria used to search for the name.
9772 ///
9773 /// \param S the scope in which name lookup occurs.
9774 ///
9775 /// \param SS the nested-name-specifier that precedes the name we're
9776 /// looking for, if present.
9777 ///
9778 /// \param CCC A CorrectionCandidateCallback object that provides further
9779 /// validation of typo correction candidates. It also provides flags for
9780 /// determining the set of keywords permitted.
9781 ///
9782 /// \param MemberContext if non-NULL, the context in which to look for
9783 /// a member access expression.
9784 ///
9785 /// \param EnteringContext whether we're entering the context described by
9786 /// the nested-name-specifier SS.
9787 ///
9788 /// \param OPT when non-NULL, the search for visible declarations will
9789 /// also walk the protocols in the qualified interfaces of \p OPT.
9790 ///
9791 /// \returns a \c TypoCorrection containing the corrected name if the typo
9792 /// along with information such as the \c NamedDecl where the corrected name
9793 /// was declared, and any additional \c NestedNameSpecifier needed to access
9794 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9796 Sema::LookupNameKind LookupKind, Scope *S,
9798 CorrectTypoKind Mode,
9799 DeclContext *MemberContext = nullptr,
9800 bool EnteringContext = false,
9801 const ObjCObjectPointerType *OPT = nullptr,
9802 bool RecordFailure = true);
9803
9804 /// Kinds of missing import. Note, the values of these enumerators correspond
9805 /// to %select values in diagnostics.
9813
9814 /// Diagnose that the specified declaration needs to be visible but
9815 /// isn't, and suggest a module import that would resolve the problem.
9817 MissingImportKind MIK, bool Recover = true);
9819 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9820 MissingImportKind MIK, bool Recover);
9821
9822 /// Called on #pragma clang __debug dump II
9824
9825 /// Called on #pragma clang __debug dump E
9826 void ActOnPragmaDump(Expr *E);
9827
9828private:
9829 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9830 //
9831 // The boolean value will be true to indicate that the namespace was loaded
9832 // from an AST/PCH file, or false otherwise.
9833 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9834
9835 /// Whether we have already loaded known namespaces from an extenal
9836 /// source.
9837 bool LoadedExternalKnownNamespaces;
9838
9839 bool CppLookupName(LookupResult &R, Scope *S);
9840
9841 /// Determine if we could use all the declarations in the module.
9842 bool isUsableModule(const Module *M);
9843
9844 /// Helper for CorrectTypo used to create and populate a new
9845 /// TypoCorrectionConsumer. Returns nullptr if typo correction should be
9846 /// skipped entirely.
9847 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9848 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9850 DeclContext *MemberContext, bool EnteringContext,
9851 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9852
9853 /// Cache for module units which is usable for current module.
9854 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9855
9856 /// Record the typo correction failure and return an empty correction.
9857 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9858 bool RecordFailure = true) {
9859 if (RecordFailure)
9860 TypoCorrectionFailures[Typo].insert(TypoLoc);
9861 return TypoCorrection();
9862 }
9863
9864 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9865
9866 /// Determine whether two declarations should be linked together, given that
9867 /// the old declaration might not be visible and the new declaration might
9868 /// not have external linkage.
9869 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9870 const NamedDecl *New) {
9871 if (isVisible(Old))
9872 return true;
9873 // See comment in below overload for why it's safe to compute the linkage
9874 // of the new declaration here.
9875 if (New->isExternallyDeclarable()) {
9876 assert(Old->isExternallyDeclarable() &&
9877 "should not have found a non-externally-declarable previous decl");
9878 return true;
9879 }
9880 return false;
9881 }
9882 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9883
9884 ///@}
9885
9886 //
9887 //
9888 // -------------------------------------------------------------------------
9889 //
9890 //
9891
9892 /// \name Modules
9893 /// Implementations are in SemaModule.cpp
9894 ///@{
9895
9896public:
9897 /// Get the module unit whose scope we are currently within.
9899 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9900 }
9901
9902 /// Is the module scope we are an implementation unit?
9904 if (ModuleScopes.empty())
9905 return false;
9906 const Module *M = ModuleScopes.back().Module;
9908 }
9909
9910 // When loading a non-modular PCH files, this is used to restore module
9911 // visibility.
9913 VisibleModules.setVisible(Mod, ImportLoc);
9914 }
9915
9916 enum class ModuleDeclKind {
9917 Interface, ///< 'export module X;'
9918 Implementation, ///< 'module X;'
9919 PartitionInterface, ///< 'export module X:Y;'
9920 PartitionImplementation, ///< 'module X:Y;'
9921 };
9922
9923 /// An enumeration to represent the transition of states in parsing module
9924 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9925 /// an error in state transition, the state is set to NotACXX20Module.
9927 FirstDecl, ///< Parsing the first decl in a TU.
9928 GlobalFragment, ///< after 'module;' but before 'module X;'
9929 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9930 ImportFinished, ///< after any non-import decl.
9931 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9932 ///< non-import decl.
9933 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9934 ///< non-import decl has already been seen.
9935 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9936 };
9937
9938 /// The parser has processed a module-declaration that begins the definition
9939 /// of a module interface or implementation.
9941 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9942 ModuleIdPath Path, ModuleIdPath Partition,
9943 ModuleImportState &ImportState,
9944 bool SeenNoTrivialPPDirective);
9945
9946 /// The parser has processed a global-module-fragment declaration that begins
9947 /// the definition of the global module fragment of the current module unit.
9948 /// \param ModuleLoc The location of the 'module' keyword.
9950
9951 /// The parser has processed a private-module-fragment declaration that begins
9952 /// the definition of the private module fragment of the current module unit.
9953 /// \param ModuleLoc The location of the 'module' keyword.
9954 /// \param PrivateLoc The location of the 'private' keyword.
9956 SourceLocation PrivateLoc);
9957
9958 /// The parser has processed a module import declaration.
9959 ///
9960 /// \param StartLoc The location of the first token in the declaration. This
9961 /// could be the location of an '@', 'export', or 'import'.
9962 /// \param ExportLoc The location of the 'export' keyword, if any.
9963 /// \param ImportLoc The location of the 'import' keyword.
9964 /// \param Path The module toplevel name as an access path.
9965 /// \param IsPartition If the name is for a partition.
9967 SourceLocation ExportLoc,
9968 SourceLocation ImportLoc, ModuleIdPath Path,
9969 bool IsPartition = false);
9971 SourceLocation ExportLoc,
9972 SourceLocation ImportLoc, Module *M,
9973 ModuleIdPath Path = {});
9974
9975 /// The parser has processed a module import translated from a
9976 /// #include or similar preprocessing directive.
9977 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9978 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9979
9980 /// The parsed has entered a submodule.
9981 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
9982 /// The parser has left a submodule.
9983 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
9984
9985 /// Create an implicit import of the given module at the given
9986 /// source location, for error recovery, if possible.
9987 ///
9988 /// This routine is typically used when an entity found by name lookup
9989 /// is actually hidden within a module that we know about but the user
9990 /// has forgotten to import.
9991 void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
9992 Module *Mod);
9993
9994 /// We have parsed the start of an export declaration, including the '{'
9995 /// (if present).
9996 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
9997 SourceLocation LBraceLoc);
9998
9999 /// Complete the definition of an export declaration.
10000 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
10001 SourceLocation RBraceLoc);
10002
10003private:
10004 /// The parser has begun a translation unit to be compiled as a C++20
10005 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
10006 void HandleStartOfHeaderUnit();
10007
10008 struct ModuleScope {
10009 SourceLocation BeginLoc;
10010 clang::Module *Module = nullptr;
10011 VisibleModuleSet OuterVisibleModules;
10012 };
10013 /// The modules we're currently parsing.
10014 llvm::SmallVector<ModuleScope, 16> ModuleScopes;
10015
10016 /// For an interface unit, this is the implicitly imported interface unit.
10017 clang::Module *ThePrimaryInterface = nullptr;
10018
10019 /// The explicit global module fragment of the current translation unit.
10020 /// The explicit Global Module Fragment, as specified in C++
10021 /// [module.global.frag].
10022 clang::Module *TheGlobalModuleFragment = nullptr;
10023
10024 /// The implicit global module fragments of the current translation unit.
10025 ///
10026 /// The contents in the implicit global module fragment can't be discarded.
10027 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
10028
10029 /// Namespace definitions that we will export when they finish.
10030 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
10031
10032 /// In a C++ standard module, inline declarations require a definition to be
10033 /// present at the end of a definition domain. This set holds the decls to
10034 /// be checked at the end of the TU.
10035 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
10036
10037 /// Helper function to judge if we are in module purview.
10038 /// Return false if we are not in a module.
10039 bool isCurrentModulePurview() const;
10040
10041 /// Enter the scope of the explicit global module fragment.
10042 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
10043 /// Leave the scope of the explicit global module fragment.
10044 void PopGlobalModuleFragment();
10045
10046 /// Enter the scope of an implicit global module fragment.
10047 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
10048 /// Leave the scope of an implicit global module fragment.
10049 void PopImplicitGlobalModuleFragment();
10050
10051 VisibleModuleSet VisibleModules;
10052
10053 /// Whether we had imported any named modules.
10054 bool HadImportedNamedModules = false;
10055 /// The set of instantiations we need to check if they references TU-local
10056 /// entity from TUs. This only makes sense if we imported any named modules.
10057 llvm::SmallVector<std::pair<FunctionDecl *, SourceLocation>>
10058 PendingCheckReferenceForTULocal;
10059 /// Implement [basic.link]p18, which requires that we can't use TU-local
10060 /// entities from other TUs (ignoring header units).
10061 void checkReferenceToTULocalFromOtherTU(FunctionDecl *FD,
10062 SourceLocation PointOfInstantiation);
10063 /// Implement [basic.link]p17, which diagnose for non TU local exposure in
10064 /// module interface or module partition.
10065 void checkExposure(const TranslationUnitDecl *TU);
10066
10067 ///@}
10068
10069 //
10070 //
10071 // -------------------------------------------------------------------------
10072 //
10073 //
10074
10075 /// \name C++ Overloading
10076 /// Implementations are in SemaOverload.cpp
10077 ///@{
10078
10079public:
10080 /// Whether deferrable diagnostics should be deferred.
10081 bool DeferDiags = false;
10082
10083 /// RAII class to control scope of DeferDiags.
10085 Sema &S;
10086 bool SavedDeferDiags = false;
10087
10088 public:
10090 : S(S), SavedDeferDiags(S.DeferDiags) {
10091 S.DeferDiags = SavedDeferDiags || DeferDiags;
10092 }
10093 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
10096 };
10097
10098 /// Flag indicating if Sema is building a recovery call expression.
10099 ///
10100 /// This flag is used to avoid building recovery call expressions
10101 /// if Sema is already doing so, which would cause infinite recursions.
10103
10104 /// Determine whether the given New declaration is an overload of the
10105 /// declarations in Old. This routine returns OverloadKind::Match or
10106 /// OverloadKind::NonFunction if New and Old cannot be overloaded, e.g., if
10107 /// New has the same signature as some function in Old (C++ 1.3.10) or if the
10108 /// Old declarations aren't functions (or function templates) at all. When it
10109 /// does return OverloadKind::Match or OverloadKind::NonFunction, MatchedDecl
10110 /// will point to the decl that New cannot be overloaded with. This decl may
10111 /// be a UsingShadowDecl on top of the underlying declaration.
10112 ///
10113 /// Example: Given the following input:
10114 ///
10115 /// void f(int, float); // #1
10116 /// void f(int, int); // #2
10117 /// int f(int, int); // #3
10118 ///
10119 /// When we process #1, there is no previous declaration of "f", so IsOverload
10120 /// will not be used.
10121 ///
10122 /// When we process #2, Old contains only the FunctionDecl for #1. By
10123 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
10124 /// they have different signatures), so this routine returns
10125 /// OverloadKind::Overload; MatchedDecl is unchanged.
10126 ///
10127 /// When we process #3, Old is an overload set containing #1 and #2. We
10128 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
10129 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
10130 /// types of functions are not part of the signature), IsOverload returns
10131 /// OverloadKind::Match and MatchedDecl will be set to point to the
10132 /// FunctionDecl for #2.
10133 ///
10134 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
10135 /// class by a using declaration. The rules for whether to hide shadow
10136 /// declarations ignore some properties which otherwise figure into a function
10137 /// template's signature.
10139 const LookupResult &OldDecls, NamedDecl *&OldDecl,
10140 bool UseMemberUsingDeclRules);
10142 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10143
10144 // Checks whether MD constitutes an override the base class method BaseMD.
10145 // When checking for overrides, the object object members are ignored.
10146 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
10147 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10148
10149 enum class AllowedExplicit {
10150 /// Allow no explicit functions to be used.
10152 /// Allow explicit conversion functions but not explicit constructors.
10154 /// Allow both explicit conversion functions and explicit constructors.
10156 };
10157
10159 Expr *From, QualType ToType, bool SuppressUserConversions,
10160 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
10161 bool AllowObjCWritebackConversion);
10162
10163 /// PerformImplicitConversion - Perform an implicit conversion of the
10164 /// expression From to the type ToType. Returns the
10165 /// converted expression. Flavor is the kind of conversion we're
10166 /// performing, used in the error message. If @p AllowExplicit,
10167 /// explicit user-defined conversions are permitted.
10169 AssignmentAction Action,
10170 bool AllowExplicit = false);
10171
10172 /// IsIntegralPromotion - Determines whether the conversion from the
10173 /// expression From (whose potentially-adjusted type is FromType) to
10174 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
10175 /// sets PromotedType to the promoted type.
10176 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
10177
10178 /// IsFloatingPointPromotion - Determines whether the conversion from
10179 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
10180 /// returns true and sets PromotedType to the promoted type.
10181 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
10182
10183 /// Determine if a conversion is a complex promotion.
10184 ///
10185 /// A complex promotion is defined as a complex -> complex conversion
10186 /// where the conversion between the underlying real types is a
10187 /// floating-point or integral promotion.
10188 bool IsComplexPromotion(QualType FromType, QualType ToType);
10189
10190 /// IsOverflowBehaviorTypePromotion - Determines whether the conversion from
10191 /// FromType to ToType involves an OverflowBehaviorType FromType being
10192 /// promoted to an OverflowBehaviorType ToType which has a larger bitwidth.
10193 /// If so, returns true and sets FromType to ToType.
10194 bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType);
10195
10196 /// IsOverflowBehaviorTypeConversion - Determines whether the conversion from
10197 /// FromType to ToType necessarily involves both an OverflowBehaviorType and
10198 /// a non-OverflowBehaviorType. If so, returns true and sets FromType to
10199 /// ToType.
10200 bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType);
10201
10202 /// IsPointerConversion - Determines whether the conversion of the
10203 /// expression From, which has the (possibly adjusted) type FromType,
10204 /// can be converted to the type ToType via a pointer conversion (C++
10205 /// 4.10). If so, returns true and places the converted type (that
10206 /// might differ from ToType in its cv-qualifiers at some level) into
10207 /// ConvertedType.
10208 ///
10209 /// This routine also supports conversions to and from block pointers
10210 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
10211 /// pointers to interfaces. FIXME: Once we've determined the
10212 /// appropriate overloading rules for Objective-C, we may want to
10213 /// split the Objective-C checks into a different routine; however,
10214 /// GCC seems to consider all of these conversions to be pointer
10215 /// conversions, so for now they live here. IncompatibleObjC will be
10216 /// set if the conversion is an allowed Objective-C conversion that
10217 /// should result in a warning.
10218 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
10219 bool InOverloadResolution, QualType &ConvertedType,
10220 bool &IncompatibleObjC);
10221
10222 /// isObjCPointerConversion - Determines whether this is an
10223 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
10224 /// with the same arguments and return values.
10225 bool isObjCPointerConversion(QualType FromType, QualType ToType,
10226 QualType &ConvertedType, bool &IncompatibleObjC);
10227 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
10228 QualType &ConvertedType);
10229
10230 /// FunctionParamTypesAreEqual - This routine checks two function proto types
10231 /// for equality of their parameter types. Caller has already checked that
10232 /// they have same number of parameters. If the parameters are different,
10233 /// ArgPos will have the parameter index of the first different parameter.
10234 /// If `Reversed` is true, the parameters of `NewType` will be compared in
10235 /// reverse order. That's useful if one of the functions is being used as a
10236 /// C++20 synthesized operator overload with a reversed parameter order.
10239 unsigned *ArgPos = nullptr,
10240 bool Reversed = false);
10241
10243 const FunctionProtoType *NewType,
10244 unsigned *ArgPos = nullptr,
10245 bool Reversed = false);
10246
10247 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
10248 const FunctionDecl *NewFunction,
10249 unsigned *ArgPos = nullptr,
10250 bool Reversed = false);
10251
10252 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
10253 /// function types. Catches different number of parameter, mismatch in
10254 /// parameter types, and different return types.
10256 QualType ToType);
10257
10258 /// CheckPointerConversion - Check the pointer conversion from the
10259 /// expression From to the type ToType. This routine checks for
10260 /// ambiguous or inaccessible derived-to-base pointer
10261 /// conversions for which IsPointerConversion has already returned
10262 /// true. It returns true and produces a diagnostic if there was an
10263 /// error, or returns false otherwise.
10264 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
10265 CXXCastPath &BasePath, bool IgnoreBaseAccess,
10266 bool Diagnose = true);
10267
10268 /// IsMemberPointerConversion - Determines whether the conversion of the
10269 /// expression From, which has the (possibly adjusted) type FromType, can be
10270 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
10271 /// If so, returns true and places the converted type (that might differ from
10272 /// ToType in its cv-qualifiers at some level) into ConvertedType.
10273 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
10274 bool InOverloadResolution,
10275 QualType &ConvertedType);
10276
10286 /// CheckMemberPointerConversion - Check the member pointer conversion from
10287 /// the expression From to the type ToType. This routine checks for ambiguous
10288 /// or virtual or inaccessible base-to-derived member pointer conversions for
10289 /// which IsMemberPointerConversion has already returned true. It produces a
10290 // diagnostic if there was an error.
10292 QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
10293 CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
10294 bool IgnoreBaseAccess, MemberPointerConversionDirection Direction);
10295
10296 /// IsQualificationConversion - Determines whether the conversion from
10297 /// an rvalue of type FromType to ToType is a qualification conversion
10298 /// (C++ 4.4).
10299 ///
10300 /// \param ObjCLifetimeConversion Output parameter that will be set to
10301 /// indicate when the qualification conversion involves a change in the
10302 /// Objective-C object lifetime.
10303 bool IsQualificationConversion(QualType FromType, QualType ToType,
10304 bool CStyle, bool &ObjCLifetimeConversion);
10305
10306 /// Determine whether the conversion from FromType to ToType is a valid
10307 /// conversion of ExtInfo/ExtProtoInfo on the nested function type.
10308 /// More precisely, this method checks whether FromType can be transformed
10309 /// into an exact match for ToType, by transforming its extended function
10310 /// type information in legal manner (e.g. by strictly stripping "noreturn"
10311 /// or "noexcept", or by stripping "noescape" for arguments).
10312 bool IsFunctionConversion(QualType FromType, QualType ToType) const;
10313
10314 /// Same as `IsFunctionConversion`, but if this would return true, it sets
10315 /// `ResultTy` to `ToType`.
10316 bool TryFunctionConversion(QualType FromType, QualType ToType,
10317 QualType &ResultTy) const;
10318
10321 DeclarationName Name,
10322 OverloadCandidateSet &CandidateSet,
10323 FunctionDecl *Fn, MultiExprArg Args,
10324 bool IsMember = false);
10325
10327 FunctionDecl *Fun);
10329 Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl,
10331
10332 /// PerformContextuallyConvertToBool - Perform a contextual conversion
10333 /// of the expression From to bool (C++0x [conv]p3).
10335
10336 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
10337 /// conversion of the expression From to an Objective-C pointer type.
10338 /// Returns a valid but null ExprResult if no conversion sequence exists.
10340
10342 CCEKind CCE,
10343 NamedDecl *Dest = nullptr);
10344
10346 llvm::APSInt &Value, CCEKind CCE);
10348 APValue &Value, CCEKind CCE,
10349 NamedDecl *Dest = nullptr);
10350
10351 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10352 /// That is a converted constant expression
10353 /// (which was built with BuildConvertedConstantExpression)
10356 CCEKind CCE, bool RequireInt,
10357 const APValue &PreNarrowingValue);
10358
10359 /// Abstract base class used to perform a contextual implicit
10360 /// conversion from an expression to any type passing a filter.
10362 public:
10365
10369
10370 /// Determine whether the specified type is a valid destination type
10371 /// for this conversion.
10372 virtual bool match(QualType T) = 0;
10373
10374 /// Emits a diagnostic complaining that the expression does not have
10375 /// integral or enumeration type.
10377 QualType T) = 0;
10378
10379 /// Emits a diagnostic when the expression has incomplete class type.
10380 virtual SemaDiagnosticBuilder
10382
10383 /// Emits a diagnostic when the only matching conversion function
10384 /// is explicit.
10386 SourceLocation Loc,
10387 QualType T,
10388 QualType ConvTy) = 0;
10389
10390 /// Emits a note for the explicit conversion function.
10391 virtual SemaDiagnosticBuilder
10393
10394 /// Emits a diagnostic when there are multiple possible conversion
10395 /// functions.
10397 QualType T) = 0;
10398
10399 /// Emits a note for one of the candidate conversions.
10400 virtual SemaDiagnosticBuilder
10402
10403 /// Emits a diagnostic when we picked a conversion function
10404 /// (for cases when we are not allowed to pick a conversion function).
10406 SourceLocation Loc,
10407 QualType T,
10408 QualType ConvTy) = 0;
10409
10411 };
10412
10414 bool AllowScopedEnumerations;
10415
10416 public:
10417 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10418 bool SuppressConversion)
10420 AllowScopedEnumerations(AllowScopedEnumerations) {}
10421
10422 /// Match an integral or (possibly scoped) enumeration type.
10423 bool match(QualType T) override;
10424
10426 QualType T) override {
10427 return diagnoseNotInt(S, Loc, T);
10428 }
10429
10430 /// Emits a diagnostic complaining that the expression does not have
10431 /// integral or enumeration type.
10433 QualType T) = 0;
10434 };
10435
10436 /// Perform a contextual implicit conversion.
10439 ContextualImplicitConverter &Converter);
10440
10441 /// ReferenceCompareResult - Expresses the result of comparing two
10442 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10443 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10445 /// Ref_Incompatible - The two types are incompatible, so direct
10446 /// reference binding is not possible.
10448 /// Ref_Related - The two types are reference-related, which means
10449 /// that their unqualified forms (T1 and T2) are either the same
10450 /// or T1 is a base class of T2.
10452 /// Ref_Compatible - The two types are reference-compatible.
10454 };
10455
10456 // Fake up a scoped enumeration that still contextually converts to bool.
10458 /// The conversions that would be performed on an lvalue of type T2 when
10459 /// binding a reference of type T1 to it, as determined when evaluating
10460 /// whether T1 is reference-compatible with T2.
10471 };
10473
10474 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10475 /// determine whether they are reference-compatible,
10476 /// reference-related, or incompatible, for use in C++ initialization by
10477 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10478 /// type, and the first type (T1) is the pointee type of the reference
10479 /// type being initialized.
10482 ReferenceConversions *Conv = nullptr);
10483
10484 /// AddOverloadCandidate - Adds the given function to the set of
10485 /// candidate functions, using the given function call arguments. If
10486 /// @p SuppressUserConversions, then don't allow user-defined
10487 /// conversions via constructors or conversion operators.
10488 ///
10489 /// \param PartialOverloading true if we are performing "partial" overloading
10490 /// based on an incomplete set of function arguments. This feature is used by
10491 /// code completion.
10494 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10495 bool PartialOverloading = false, bool AllowExplicit = true,
10496 bool AllowExplicitConversion = false,
10497 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10498 ConversionSequenceList EarlyConversions = {},
10500 bool AggregateCandidateDeduction = false, bool StrictPackMatch = false);
10501
10502 /// Add all of the function declarations in the given function set to
10503 /// the overload candidate set.
10505 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10506 OverloadCandidateSet &CandidateSet,
10507 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10508 bool SuppressUserConversions = false, bool PartialOverloading = false,
10509 bool FirstArgumentIsBase = false);
10510
10511 /// AddMethodCandidate - Adds a named decl (which is some kind of
10512 /// method) as a method candidate to the given overload set.
10513 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10514 Expr::Classification ObjectClassification,
10515 ArrayRef<Expr *> Args,
10516 OverloadCandidateSet &CandidateSet,
10517 bool SuppressUserConversion = false,
10518 OverloadCandidateParamOrder PO = {});
10519
10520 /// AddMethodCandidate - Adds the given C++ member function to the set
10521 /// of candidate functions, using the given function call arguments
10522 /// and the object argument (@c Object). For example, in a call
10523 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10524 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10525 /// allow user-defined conversions via constructors or conversion
10526 /// operators.
10527 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10528 CXXRecordDecl *ActingContext, QualType ObjectType,
10529 Expr::Classification ObjectClassification,
10530 ArrayRef<Expr *> Args,
10531 OverloadCandidateSet &CandidateSet,
10532 bool SuppressUserConversions = false,
10533 bool PartialOverloading = false,
10534 ConversionSequenceList EarlyConversions = {},
10536 bool StrictPackMatch = false);
10537
10538 /// Add a C++ member function template as a candidate to the candidate
10539 /// set, using template argument deduction to produce an appropriate member
10540 /// function template specialization.
10542 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10543 CXXRecordDecl *ActingContext,
10544 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10545 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10546 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10547 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10548
10549 /// Add a C++ function template specialization as a candidate
10550 /// in the candidate set, using template argument deduction to produce
10551 /// an appropriate function template specialization.
10553 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10554 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10555 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10556 bool PartialOverloading = false, bool AllowExplicit = true,
10557 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10559 bool AggregateCandidateDeduction = false);
10560
10562 /// Do not consider any user-defined conversions when constructing the
10563 /// initializing sequence.
10565
10566 /// Before constructing the initializing sequence, we check whether the
10567 /// parameter type and argument type contain any user defined conversions.
10568 /// If so, do not initialize them. This effectively bypasses some undesired
10569 /// instantiation before checking constaints, which might otherwise result
10570 /// in non-SFINAE errors e.g. recursive constraints.
10572
10579 };
10580
10581 /// Check that implicit conversion sequences can be formed for each argument
10582 /// whose corresponding parameter has a non-dependent type, per DR1391's
10583 /// [temp.deduct.call]p10.
10586 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10588 CheckNonDependentConversionsFlag UserConversionFlag,
10589 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10590 Expr::Classification ObjectClassification = {},
10591 OverloadCandidateParamOrder PO = {});
10592
10593 /// AddConversionCandidate - Add a C++ conversion function as a
10594 /// candidate in the candidate set (C++ [over.match.conv],
10595 /// C++ [over.match.copy]). From is the expression we're converting from,
10596 /// and ToType is the type that we're eventually trying to convert to
10597 /// (which may or may not be the same type as the type that the
10598 /// conversion function produces).
10600 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10601 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10602 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10603 bool AllowExplicit, bool AllowResultConversion = true,
10604 bool StrictPackMatch = false);
10605
10606 /// Adds a conversion function template specialization
10607 /// candidate to the overload set, using template argument deduction
10608 /// to deduce the template arguments of the conversion function
10609 /// template from the type that we are converting to (C++
10610 /// [temp.deduct.conv]).
10612 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10613 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10614 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10615 bool AllowExplicit, bool AllowResultConversion = true);
10616
10617 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10618 /// converts the given @c Object to a function pointer via the
10619 /// conversion function @c Conversion, and then attempts to call it
10620 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10621 /// the type of function that we'll eventually be calling.
10622 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10623 DeclAccessPair FoundDecl,
10624 CXXRecordDecl *ActingContext,
10625 const FunctionProtoType *Proto, Expr *Object,
10626 ArrayRef<Expr *> Args,
10627 OverloadCandidateSet &CandidateSet);
10628
10629 /// Add all of the non-member operator function declarations in the given
10630 /// function set to the overload candidate set.
10632 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10633 OverloadCandidateSet &CandidateSet,
10634 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10635
10636 /// Add overload candidates for overloaded operators that are
10637 /// member functions.
10638 ///
10639 /// Add the overloaded operator candidates that are member functions
10640 /// for the operator Op that was used in an operator expression such
10641 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10642 /// CandidateSet will store the added overload candidates. (C++
10643 /// [over.match.oper]).
10645 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10646 OverloadCandidateSet &CandidateSet,
10648
10649 /// AddBuiltinCandidate - Add a candidate for a built-in
10650 /// operator. ResultTy and ParamTys are the result and parameter types
10651 /// of the built-in candidate, respectively. Args and NumArgs are the
10652 /// arguments being passed to the candidate. IsAssignmentOperator
10653 /// should be true when this built-in candidate is an assignment
10654 /// operator. NumContextualBoolArguments is the number of arguments
10655 /// (at the beginning of the argument list) that will be contextually
10656 /// converted to bool.
10657 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10658 OverloadCandidateSet &CandidateSet,
10659 bool IsAssignmentOperator = false,
10660 unsigned NumContextualBoolArguments = 0);
10661
10662 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10663 /// operator overloads to the candidate set (C++ [over.built]), based
10664 /// on the operator @p Op and the arguments given. For example, if the
10665 /// operator is a binary '+', this routine might add "int
10666 /// operator+(int, int)" to cover integer addition.
10668 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10669 OverloadCandidateSet &CandidateSet);
10670
10671 /// Add function candidates found via argument-dependent lookup
10672 /// to the set of overloading candidates.
10673 ///
10674 /// This routine performs argument-dependent name lookup based on the
10675 /// given function name (which may also be an operator name) and adds
10676 /// all of the overload candidates found by ADL to the overload
10677 /// candidate set (C++ [basic.lookup.argdep]).
10679 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10680 TemplateArgumentListInfo *ExplicitTemplateArgs,
10681 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10682
10683 /// Check the enable_if expressions on the given function. Returns the first
10684 /// failing attribute, or NULL if they were all successful.
10685 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10686 ArrayRef<Expr *> Args,
10687 bool MissingImplicitThis = false);
10688
10689 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10690 /// non-ArgDependent DiagnoseIfAttrs.
10691 ///
10692 /// Argument-dependent diagnose_if attributes should be checked each time a
10693 /// function is used as a direct callee of a function call.
10694 ///
10695 /// Returns true if any errors were emitted.
10696 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10697 const Expr *ThisArg,
10698 ArrayRef<const Expr *> Args,
10699 SourceLocation Loc);
10700
10701 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10702 /// ArgDependent DiagnoseIfAttrs.
10703 ///
10704 /// Argument-independent diagnose_if attributes should be checked on every use
10705 /// of a function.
10706 ///
10707 /// Returns true if any errors were emitted.
10708 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10709 SourceLocation Loc);
10710
10711 /// Determine if \p A and \p B are equivalent internal linkage declarations
10712 /// from different modules, and thus an ambiguity error can be downgraded to
10713 /// an extension warning.
10714 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10715 const NamedDecl *B);
10717 SourceLocation Loc, const NamedDecl *D,
10718 ArrayRef<const NamedDecl *> Equiv);
10719
10720 // Emit as a 'note' the specific overload candidate
10722 const NamedDecl *Found, const FunctionDecl *Fn,
10724 QualType DestType = QualType(), bool TakingAddress = false);
10725
10726 // Emit as a series of 'note's all template and non-templates identified by
10727 // the expression Expr
10728 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10729 bool TakingAddress = false);
10730
10731 /// Returns whether the given function's address can be taken or not,
10732 /// optionally emitting a diagnostic if the address can't be taken.
10733 ///
10734 /// Returns false if taking the address of the function is illegal.
10735 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10736 bool Complain = false,
10737 SourceLocation Loc = SourceLocation());
10738
10739 // [PossiblyAFunctionType] --> [Return]
10740 // NonFunctionType --> NonFunctionType
10741 // R (A) --> R(A)
10742 // R (*)(A) --> R (A)
10743 // R (&)(A) --> R (A)
10744 // R (S::*)(A) --> R (A)
10745 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10746
10747 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10748 /// an overloaded function (C++ [over.over]), where @p From is an
10749 /// expression with overloaded function type and @p ToType is the type
10750 /// we're trying to resolve to. For example:
10751 ///
10752 /// @code
10753 /// int f(double);
10754 /// int f(int);
10755 ///
10756 /// int (*pfd)(double) = f; // selects f(double)
10757 /// @endcode
10758 ///
10759 /// This routine returns the resulting FunctionDecl if it could be
10760 /// resolved, and NULL otherwise. When @p Complain is true, this
10761 /// routine will emit diagnostics if there is an error.
10762 FunctionDecl *
10763 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10764 bool Complain, DeclAccessPair &Found,
10765 bool *pHadMultipleCandidates = nullptr);
10766
10767 /// Given an expression that refers to an overloaded function, try to
10768 /// resolve that function to a single function that can have its address
10769 /// taken. This will modify `Pair` iff it returns non-null.
10770 ///
10771 /// This routine can only succeed if from all of the candidates in the
10772 /// overload set for SrcExpr that can have their addresses taken, there is one
10773 /// candidate that is more constrained than the rest.
10774 FunctionDecl *
10775 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10776
10777 /// Given an overloaded function, tries to turn it into a non-overloaded
10778 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10779 /// will perform access checks, diagnose the use of the resultant decl, and,
10780 /// if requested, potentially perform a function-to-pointer decay.
10781 ///
10782 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10783 /// Otherwise, returns true. This may emit diagnostics and return true.
10785 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10786
10787 /// Given an expression that refers to an overloaded function, try to
10788 /// resolve that overloaded function expression down to a single function.
10789 ///
10790 /// This routine can only resolve template-ids that refer to a single function
10791 /// template, where that template-id refers to a single template whose
10792 /// template arguments are either provided by the template-id or have
10793 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10794 ///
10795 /// If no template-ids are found, no diagnostics are emitted and NULL is
10796 /// returned.
10798 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10799 TemplateSpecCandidateSet *FailedTSC = nullptr,
10800 bool ForTypeDeduction = false);
10801
10802 // Resolve and fix an overloaded expression that can be resolved
10803 // because it identifies a single function template specialization.
10804 //
10805 // Last three arguments should only be supplied if Complain = true
10806 //
10807 // Return true if it was logically possible to so resolve the
10808 // expression, regardless of whether or not it succeeded. Always
10809 // returns true if 'complain' is set.
10811 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10812 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10813 QualType DestTypeForComplaining = QualType(),
10814 unsigned DiagIDForComplaining = 0);
10815
10816 /// Add the overload candidates named by callee and/or found by argument
10817 /// dependent lookup to the given overload set.
10818 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10819 ArrayRef<Expr *> Args,
10820 OverloadCandidateSet &CandidateSet,
10821 bool PartialOverloading = false);
10822
10823 /// Add the call candidates from the given set of lookup results to the given
10824 /// overload set. Non-function lookup results are ignored.
10826 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10827 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10828
10829 // An enum used to represent the different possible results of building a
10830 // range-based for loop.
10836
10837 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10838 /// given LookupResult is non-empty, it is assumed to describe a member which
10839 /// will be invoked. Otherwise, the function will be found via argument
10840 /// dependent lookup.
10841 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10842 /// otherwise CallExpr is set to ExprError() and some non-success value
10843 /// is returned.
10845 SourceLocation RangeLoc,
10846 const DeclarationNameInfo &NameInfo,
10847 LookupResult &MemberLookup,
10848 OverloadCandidateSet *CandidateSet,
10849 Expr *Range, ExprResult *CallExpr);
10850
10851 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10852 /// (which eventually refers to the declaration Func) and the call
10853 /// arguments Args/NumArgs, attempt to resolve the function call down
10854 /// to a specific function. If overload resolution succeeds, returns
10855 /// the call expression produced by overload resolution.
10856 /// Otherwise, emits diagnostics and returns ExprError.
10858 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10859 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10860 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10861
10862 /// Constructs and populates an OverloadedCandidateSet from
10863 /// the given function.
10864 /// \returns true when an the ExprResult output parameter has been set.
10866 MultiExprArg Args, SourceLocation RParenLoc,
10867 OverloadCandidateSet *CandidateSet,
10869
10873 const UnresolvedSetImpl &Fns,
10874 bool PerformADL = true);
10875
10876 /// Perform lookup for an overloaded unary operator.
10879 const UnresolvedSetImpl &Fns,
10880 ArrayRef<Expr *> Args, bool RequiresADL = true);
10881
10882 /// Create a unary operation that may resolve to an overloaded
10883 /// operator.
10884 ///
10885 /// \param OpLoc The location of the operator itself (e.g., '*').
10886 ///
10887 /// \param Opc The UnaryOperatorKind that describes this operator.
10888 ///
10889 /// \param Fns The set of non-member functions that will be
10890 /// considered by overload resolution. The caller needs to build this
10891 /// set based on the context using, e.g.,
10892 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10893 /// set should not contain any member functions; those will be added
10894 /// by CreateOverloadedUnaryOp().
10895 ///
10896 /// \param Input The input argument.
10899 const UnresolvedSetImpl &Fns, Expr *input,
10900 bool RequiresADL = true);
10901
10902 /// Perform lookup for an overloaded binary operator.
10905 const UnresolvedSetImpl &Fns,
10906 ArrayRef<Expr *> Args, bool RequiresADL = true);
10907
10908 /// Create a binary operation that may resolve to an overloaded
10909 /// operator.
10910 ///
10911 /// \param OpLoc The location of the operator itself (e.g., '+').
10912 ///
10913 /// \param Opc The BinaryOperatorKind that describes this operator.
10914 ///
10915 /// \param Fns The set of non-member functions that will be
10916 /// considered by overload resolution. The caller needs to build this
10917 /// set based on the context using, e.g.,
10918 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10919 /// set should not contain any member functions; those will be added
10920 /// by CreateOverloadedBinOp().
10921 ///
10922 /// \param LHS Left-hand argument.
10923 /// \param RHS Right-hand argument.
10924 /// \param PerformADL Whether to consider operator candidates found by ADL.
10925 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10926 /// C++20 operator rewrites.
10927 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10928 /// the function in question. Such a function is never a candidate in
10929 /// our overload resolution. This also enables synthesizing a three-way
10930 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10932 const UnresolvedSetImpl &Fns, Expr *LHS,
10933 Expr *RHS, bool RequiresADL = true,
10934 bool AllowRewrittenCandidates = true,
10935 FunctionDecl *DefaultedFn = nullptr);
10937 const UnresolvedSetImpl &Fns,
10938 Expr *LHS, Expr *RHS,
10939 FunctionDecl *DefaultedFn);
10940
10942 SourceLocation RLoc, Expr *Base,
10943 MultiExprArg Args);
10944
10945 /// BuildCallToMemberFunction - Build a call to a member
10946 /// function. MemExpr is the expression that refers to the member
10947 /// function (and includes the object parameter), Args/NumArgs are the
10948 /// arguments to the function call (not including the object
10949 /// parameter). The caller needs to validate that the member
10950 /// expression refers to a non-static member function or an overloaded
10951 /// member function.
10953 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10954 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10955 bool IsExecConfig = false, bool AllowRecovery = false);
10956
10957 /// BuildCallToObjectOfClassType - Build a call to an object of class
10958 /// type (C++ [over.call.object]), which can end up invoking an
10959 /// overloaded function call operator (@c operator()) or performing a
10960 /// user-defined conversion on the object argument.
10962 SourceLocation LParenLoc,
10963 MultiExprArg Args,
10964 SourceLocation RParenLoc);
10965
10966 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
10967 /// (if one exists), where @c Base is an expression of class type and
10968 /// @c Member is the name of the member we're trying to find.
10970 SourceLocation OpLoc,
10971 bool *NoArrowOperatorFound = nullptr);
10972
10975 bool HadMultipleCandidates);
10976
10977 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
10978 /// to a literal operator described by the provided lookup results.
10981 SourceLocation LitEndLoc,
10982 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10983
10984 /// FixOverloadedFunctionReference - E is an expression that refers to
10985 /// a C++ overloaded function (possibly with some parentheses and
10986 /// perhaps a '&' around it). We have resolved the overloaded function
10987 /// to the function declaration Fn, so patch up the expression E to
10988 /// refer (possibly indirectly) to Fn. Returns the new expr.
10990 FunctionDecl *Fn);
10992 DeclAccessPair FoundDecl,
10993 FunctionDecl *Fn);
10994
10995 /// - Returns a selector which best matches given argument list or
10996 /// nullptr if none could be found
10998 bool IsInstance,
11000
11001 ///@}
11002
11003 //
11004 //
11005 // -------------------------------------------------------------------------
11006 //
11007 //
11008
11009 /// \name Statements
11010 /// Implementations are in SemaStmt.cpp
11011 ///@{
11012
11013public:
11014 /// Stack of active SEH __finally scopes. Can be empty.
11016
11017 /// Stack of '_Defer' statements that are currently being parsed, as well
11018 /// as the locations of their '_Defer' keywords. Can be empty.
11020
11021 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
11023
11025 bool HasLeadingEmptyMacro = false);
11026
11028 SourceLocation EndLoc);
11030
11031 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
11032 /// whose result is unused, warn.
11033 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
11034
11035 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
11039 ArrayRef<Stmt *> Elts, bool isStmtExpr);
11040
11042
11045 SourceLocation DotDotDotLoc, ExprResult RHS,
11046 SourceLocation ColonLoc);
11047
11048 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
11049 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
11050
11052 SourceLocation ColonLoc, Stmt *SubStmt,
11053 Scope *CurScope);
11055 SourceLocation ColonLoc, Stmt *SubStmt);
11056
11058 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
11060 Stmt *SubStmt);
11061
11062 /// Check whether the given statement can have musttail applied to it,
11063 /// issuing a diagnostic and returning false if not. In the success case,
11064 /// the statement is rewritten to remove implicit nodes from the return
11065 /// value.
11066 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
11067
11069 SourceLocation LParenLoc, Stmt *InitStmt,
11070 ConditionResult Cond, SourceLocation RParenLoc,
11071 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11073 SourceLocation LParenLoc, Stmt *InitStmt,
11074 ConditionResult Cond, SourceLocation RParenLoc,
11075 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
11076
11078
11080 SourceLocation LParenLoc, Stmt *InitStmt,
11081 ConditionResult Cond,
11082 SourceLocation RParenLoc);
11084 Stmt *Body);
11085
11086 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
11087 /// integer not in the range of enum values.
11088 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
11089 Expr *SrcExpr);
11090
11092 ConditionResult Cond, SourceLocation RParenLoc,
11093 Stmt *Body);
11095 SourceLocation WhileLoc, SourceLocation CondLParen,
11096 Expr *Cond, SourceLocation CondRParen);
11097
11099 Stmt *First, ConditionResult Second,
11100 FullExprArg Third, SourceLocation RParenLoc,
11101 Stmt *Body);
11102
11103 /// In an Objective C collection iteration statement:
11104 /// for (x in y)
11105 /// x can be an arbitrary l-value expression. Bind it up as a
11106 /// full-expression.
11108
11110 /// Initial building of a for-range statement.
11112 /// Instantiation or recovery rebuild of a for-range statement. Don't
11113 /// attempt any typo-correction.
11115 /// Determining whether a for-range statement could be built. Avoid any
11116 /// unnecessary or irreversible actions.
11118 };
11119
11120 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
11121 ///
11122 /// C++11 [stmt.ranged]:
11123 /// A range-based for statement is equivalent to
11124 ///
11125 /// {
11126 /// auto && __range = range-init;
11127 /// for ( auto __begin = begin-expr,
11128 /// __end = end-expr;
11129 /// __begin != __end;
11130 /// ++__begin ) {
11131 /// for-range-declaration = *__begin;
11132 /// statement
11133 /// }
11134 /// }
11135 ///
11136 /// The body of the loop is not available yet, since it cannot be analysed
11137 /// until we have determined the type of the for-range-declaration.
11139 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
11140 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
11141 SourceLocation RParenLoc, BuildForRangeKind Kind,
11142 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11143
11144 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
11145 StmtResult BuildCXXForRangeStmt(
11146 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
11147 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
11148 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
11149 BuildForRangeKind Kind,
11150 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11151
11152 /// Set the type of a for-range declaration whose for-range or expansion
11153 /// initialiser is dependent.
11154 void ActOnDependentForRangeInitializer(VarDecl *LoopVar,
11155 BuildForRangeKind BFRK);
11156
11157 /// Holds the 'begin' and 'end' variables of a range-based for loop or
11158 /// expansion statement; begin-expr and end-expr are also provided; the
11159 /// latter are used in some diagnostics.
11161 VarDecl *BeginVar = nullptr;
11162 VarDecl *EndVar = nullptr;
11163 Expr *BeginExpr = nullptr;
11164 Expr *EndExpr = nullptr;
11165 bool isValid() const { return BeginVar != nullptr && EndVar != nullptr; }
11166 };
11167
11168 /// Determine begin-expr and end-expr and build variable declarations for
11169 /// them as per [stmt.ranged].
11170 ForRangeBeginEndInfo BuildCXXForRangeBeginEndVars(
11171 Scope *S, VarDecl *RangeVar, SourceLocation ColonLoc,
11172 SourceLocation CoawaitLoc,
11173 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps,
11174 BuildForRangeKind Kind, bool IsConstexpr,
11175 StmtResult *RebuildResult = nullptr,
11176 llvm::function_ref<StmtResult()> RebuildWithDereference = {},
11177 IdentifierInfo *BeginName = nullptr, IdentifierInfo *EndName = nullptr);
11178
11179 /// Helper used by the expansion statements and for-range code to build
11180 /// a variable declaration for e.g. 'begin' and 'end'.
11181 VarDecl *BuildForRangeVarDecl(SourceLocation Loc, QualType Type,
11182 IdentifierInfo *Name, bool IsConstexpr);
11183
11184 /// Build the range variable of a range-based for loop or iterating
11185 /// expansion statement and return its DeclStmt.
11186 StmtResult BuildCXXForRangeRangeVar(Scope *S, Expr *Range, QualType Type,
11187 bool IsConstexpr = false);
11188
11189 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
11190 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
11191 /// body cannot be performed until after the type of the range variable is
11192 /// determined.
11193 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
11194
11195 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
11196 LabelDecl *TheDecl);
11197 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
11198 SourceLocation StarLoc, Expr *DestExp);
11199 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope,
11200 LabelDecl *Label, SourceLocation LabelLoc);
11201 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope,
11202 LabelDecl *Label, SourceLocation LabelLoc);
11203
11204 void ActOnStartOfDeferStmt(SourceLocation DeferLoc, Scope *CurScope);
11205 void ActOnDeferStmtError(Scope *CurScope);
11206 StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope);
11207
11210
11213
11214 bool isMoveEligible() const { return S != None; };
11216 };
11218
11219 /// Determine whether the given expression might be move-eligible or
11220 /// copy-elidable in either a (co_)return statement or throw expression,
11221 /// without considering function return type, if applicable.
11222 ///
11223 /// \param E The expression being returned from the function or block,
11224 /// being thrown, or being co_returned from a coroutine. This expression
11225 /// might be modified by the implementation.
11226 ///
11227 /// \param Mode Overrides detection of current language mode
11228 /// and uses the rules for C++23.
11229 ///
11230 /// \returns An aggregate which contains the Candidate and isMoveEligible
11231 /// and isCopyElidable methods. If Candidate is non-null, it means
11232 /// isMoveEligible() would be true under the most permissive language
11233 /// standard.
11234 NamedReturnInfo getNamedReturnInfo(
11236
11237 /// Determine whether the given NRVO candidate variable is move-eligible or
11238 /// copy-elidable, without considering function return type.
11239 ///
11240 /// \param VD The NRVO candidate variable.
11241 ///
11242 /// \returns An aggregate which contains the Candidate and isMoveEligible
11243 /// and isCopyElidable methods. If Candidate is non-null, it means
11244 /// isMoveEligible() would be true under the most permissive language
11245 /// standard.
11246 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
11247
11248 /// Updates given NamedReturnInfo's move-eligible and
11249 /// copy-elidable statuses, considering the function
11250 /// return type criteria as applicable to return statements.
11251 ///
11252 /// \param Info The NamedReturnInfo object to update.
11253 ///
11254 /// \param ReturnType This is the return type of the function.
11255 /// \returns The copy elision candidate, in case the initial return expression
11256 /// was copy elidable, or nullptr otherwise.
11257 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
11258 QualType ReturnType);
11259
11260 /// Perform the initialization of a potentially-movable value, which
11261 /// is the result of return value.
11262 ///
11263 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
11264 /// treat returned lvalues as rvalues in certain cases (to prefer move
11265 /// construction), then falls back to treating them as lvalues if that failed.
11268 const NamedReturnInfo &NRInfo, Expr *Value,
11269 bool SupressSimplerImplicitMoves = false);
11270
11272
11273 /// Deduce the return type for a function from a returned expression, per
11274 /// C++1y [dcl.spec.auto]p6.
11276 SourceLocation ReturnLoc, Expr *RetExpr,
11277 const AutoType *AT);
11278
11279 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11280 Scope *CurScope);
11281 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11282 bool AllowRecovery = false);
11283
11284 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
11285 /// for capturing scopes.
11287 NamedReturnInfo &NRInfo,
11288 bool SupressSimplerImplicitMoves);
11289
11290 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
11291 /// and creates a proper catch handler from them.
11293 Stmt *HandlerBlock);
11294
11295 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
11296 /// handlers and creates a try statement from them.
11298 ArrayRef<Stmt *> Handlers);
11299
11300 void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry);
11301
11302 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
11303 SourceLocation TryLoc, Stmt *TryBlock,
11304 Stmt *Handler);
11306 Stmt *Block);
11311
11313 bool IsIfExists,
11314 NestedNameSpecifierLoc QualifierLoc,
11315 DeclarationNameInfo NameInfo,
11316 Stmt *Nested);
11318 bool IsIfExists, CXXScopeSpec &SS,
11319 UnqualifiedId &Name, Stmt *Nested);
11320
11321 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11322 CapturedRegionKind Kind, unsigned NumParams);
11323 typedef std::pair<StringRef, QualType> CapturedParamNameType;
11324 void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope,
11325 CapturedRegionKind Kind,
11327 unsigned OpenMPCaptureLevel = 0);
11331 SourceLocation Loc,
11332 unsigned NumParams);
11333
11335 VarDecl *RangeVar, ArrayRef<MaterializeTemporaryExpr *> Temporaries);
11336
11337private:
11338 /// Check whether the given statement can have musttail applied to it,
11339 /// issuing a diagnostic and returning false if not.
11340 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
11341
11342 ///@}
11343
11344 //
11345 //
11346 // -------------------------------------------------------------------------
11347 //
11348 //
11349
11350 /// \name `inline asm` Statement
11351 /// Implementations are in SemaStmtAsm.cpp
11352 ///@{
11353
11354public:
11355 ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel);
11356 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
11357 bool IsVolatile, unsigned NumOutputs,
11358 unsigned NumInputs, IdentifierInfo **Names,
11359 MultiExprArg Constraints, MultiExprArg Exprs,
11360 Expr *AsmString, MultiExprArg Clobbers,
11361 unsigned NumLabels, SourceLocation RParenLoc);
11362
11364 llvm::InlineAsmIdentifierInfo &Info);
11366 SourceLocation TemplateKWLoc,
11367 UnqualifiedId &Id,
11368 bool IsUnevaluatedContext);
11369 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
11370 SourceLocation AsmLoc);
11372 SourceLocation AsmLoc);
11374 ArrayRef<Token> AsmToks, StringRef AsmString,
11375 unsigned NumOutputs, unsigned NumInputs,
11376 ArrayRef<StringRef> Constraints,
11377 ArrayRef<StringRef> Clobbers,
11378 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
11379 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
11380 SourceLocation Location, bool AlwaysCreate);
11381
11382 ///@}
11383
11384 //
11385 //
11386 // -------------------------------------------------------------------------
11387 //
11388 //
11389
11390 /// \name Statement Attribute Handling
11391 /// Implementations are in SemaStmtAttr.cpp
11392 ///@{
11393
11394public:
11395 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11396 const AttributeCommonInfo &A);
11397 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11398 const AttributeCommonInfo &A);
11399
11400 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11402
11403 /// Process the attributes before creating an attributed statement. Returns
11404 /// the semantic attributes that have been processed.
11405 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11407
11409 SourceRange Range);
11411 const IdentifierInfo *AttrName,
11412 SourceRange Range);
11413
11414 ///@}
11415
11416 //
11417 //
11418 // -------------------------------------------------------------------------
11419 //
11420 //
11421
11422 /// \name C++ Templates
11423 /// Implementations are in SemaTemplate.cpp
11424 ///@{
11425
11426public:
11427 // Saves the current floating-point pragma stack and clear it in this Sema.
11429 public:
11431 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11432 S.FpPragmaStack.Stack.clear();
11433 }
11434 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11437
11438 private:
11439 Sema &S;
11441 };
11442
11444 CurFPFeatures = FPO;
11445 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11446 }
11447
11453
11458
11459 typedef llvm::MapVector<const FunctionDecl *,
11460 std::unique_ptr<LateParsedTemplate>>
11463
11464 /// Determine the number of levels of enclosing template parameters. This is
11465 /// only usable while parsing. Note that this does not include dependent
11466 /// contexts in which no template parameters have yet been declared, such as
11467 /// in a terse function template or generic lambda before the first 'auto' is
11468 /// encountered.
11469 unsigned getTemplateDepth(Scope *S) const;
11470
11472 bool AllowFunctionTemplates = true,
11473 bool AllowDependent = true);
11475 bool AllowFunctionTemplates = true,
11476 bool AllowDependent = true,
11477 bool AllowNonTemplateFunctions = false);
11478 /// Try to interpret the lookup result D as a template-name.
11479 ///
11480 /// \param D A declaration found by name lookup.
11481 /// \param AllowFunctionTemplates Whether function templates should be
11482 /// considered valid results.
11483 /// \param AllowDependent Whether unresolved using declarations (that might
11484 /// name templates) should be considered valid results.
11486 bool AllowFunctionTemplates = true,
11487 bool AllowDependent = true);
11488
11490 /// Whether and why a template name is required in this lookup.
11492 public:
11493 /// Template name is required if TemplateKWLoc is valid.
11495 : TemplateKW(TemplateKWLoc) {}
11496 /// Template name is unconditionally required.
11498
11500 return TemplateKW.value_or(SourceLocation());
11501 }
11502 bool hasTemplateKeyword() const {
11503 return getTemplateKeywordLoc().isValid();
11504 }
11505 bool isRequired() const { return TemplateKW != SourceLocation(); }
11506 explicit operator bool() const { return isRequired(); }
11507
11508 private:
11509 std::optional<SourceLocation> TemplateKW;
11510 };
11511
11513 /// This is not assumed to be a template name.
11515 /// This is assumed to be a template name because lookup found nothing.
11517 /// This is assumed to be a template name because lookup found one or more
11518 /// functions (but no function templates).
11520 };
11521
11522 bool
11524 QualType ObjectType, bool EnteringContext,
11525 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11526 AssumedTemplateKind *ATK = nullptr,
11527 bool AllowTypoCorrection = true);
11528
11530 bool hasTemplateKeyword,
11531 const UnqualifiedId &Name,
11532 ParsedType ObjectType, bool EnteringContext,
11534 bool &MemberOfUnknownSpecialization,
11535 bool AllowTypoCorrection = true);
11536
11537 /// Try to resolve an undeclared template name as a type template.
11538 ///
11539 /// Sets II to the identifier corresponding to the template name, and updates
11540 /// Name to a corresponding (typo-corrected) type template name and TNK to
11541 /// the corresponding kind, if possible.
11543 TemplateNameKind &TNK,
11544 SourceLocation NameLoc,
11545 IdentifierInfo *&II);
11546
11547 /// Determine whether a particular identifier might be the name in a C++1z
11548 /// deduction-guide declaration.
11549 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11550 SourceLocation NameLoc, CXXScopeSpec &SS,
11551 ParsedTemplateTy *Template = nullptr);
11552
11554 SourceLocation IILoc, Scope *S,
11555 const CXXScopeSpec *SS,
11556 TemplateTy &SuggestedTemplate,
11557 TemplateNameKind &SuggestedKind);
11558
11559 /// Determine whether we would be unable to instantiate this template (because
11560 /// it either has no definition, or is in the process of being instantiated).
11562 SourceLocation PointOfInstantiation, NamedDecl *Instantiation,
11563 bool InstantiatedFromMember, const NamedDecl *Pattern,
11564 const NamedDecl *PatternDef, TemplateSpecializationKind TSK,
11565 bool Complain = true, bool *Unreachable = nullptr);
11566
11567 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11568 /// that the template parameter 'PrevDecl' is being shadowed by a new
11569 /// declaration at location Loc. Returns true to indicate that this is
11570 /// an error, and false otherwise.
11571 ///
11572 /// \param Loc The location of the declaration that shadows a template
11573 /// parameter.
11574 ///
11575 /// \param PrevDecl The template parameter that the declaration shadows.
11576 ///
11577 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11578 /// a warning for compatibility with older versions of clang.
11579 /// Ignored when MSVC compatibility is enabled.
11581 bool SupportedForCompatibility = false);
11582
11583 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11584 /// the parameter D to reference the templated declaration and return a
11585 /// pointer to the template declaration. Otherwise, do nothing to D and return
11586 /// null.
11588
11589 /// ActOnTypeParameter - Called when a C++ template type parameter
11590 /// (e.g., "typename T") has been parsed. Typename specifies whether
11591 /// the keyword "typename" was used to declare the type parameter
11592 /// (otherwise, "class" was used), and KeyLoc is the location of the
11593 /// "class" or "typename" keyword. ParamName is the name of the
11594 /// parameter (NULL indicates an unnamed template parameter) and
11595 /// ParamNameLoc is the location of the parameter name (if any).
11596 /// If the type parameter has a default argument, it will be added
11597 /// later via ActOnTypeParameterDefault.
11599 SourceLocation EllipsisLoc,
11600 SourceLocation KeyLoc,
11601 IdentifierInfo *ParamName,
11602 SourceLocation ParamNameLoc, unsigned Depth,
11603 unsigned Position, SourceLocation EqualLoc,
11604 ParsedType DefaultArg, bool HasTypeConstraint);
11605
11607
11608 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11610 TemplateTypeParmDecl *ConstrainedParameter,
11611 SourceLocation EllipsisLoc);
11612 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11614 TemplateTypeParmDecl *ConstrainedParameter,
11615 SourceLocation EllipsisLoc,
11616 bool AllowUnexpandedPack);
11617
11618 /// Attach a type-constraint to a template parameter.
11619 /// \returns true if an error occurred. This can happen if the
11620 /// immediately-declared constraint could not be formed (e.g. incorrect number
11621 /// of arguments for the named concept).
11623 DeclarationNameInfo NameInfo,
11624 TemplateName NamedConcept, NamedDecl *FoundDecl,
11625 const TemplateArgumentListInfo *TemplateArgs,
11626 TemplateTypeParmDecl *ConstrainedParameter,
11627 SourceLocation EllipsisLoc);
11628
11630 NonTypeTemplateParmDecl *NewConstrainedParm,
11631 NonTypeTemplateParmDecl *OrigConstrainedParm,
11632 SourceLocation EllipsisLoc);
11633
11634 /// Require the given type to be a structural type, and diagnose if it is not.
11635 ///
11636 /// \return \c true if an error was produced.
11638
11639 /// Check that the type of a non-type template parameter is
11640 /// well-formed.
11641 ///
11642 /// \returns the (possibly-promoted) parameter type if valid;
11643 /// otherwise, produces a diagnostic and returns a NULL type.
11645 SourceLocation Loc);
11647
11649 unsigned Depth, unsigned Position,
11650 SourceLocation EqualLoc,
11651 Expr *DefaultArg);
11652
11653 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11654 /// parameter (e.g. T in template <template <typename> class T> class array)
11655 /// has been parsed. S is the current scope.
11657 Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind,
11658 bool TypenameKeyword, TemplateParameterList *Params,
11659 SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11660 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11661 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11662
11663 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11664 /// constrained by RequiresClause, that contains the template parameters in
11665 /// Params.
11667 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11668 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11669 SourceLocation RAngleLoc, Expr *RequiresClause);
11670
11671 /// The context in which we are checking a template parameter list.
11673 // For this context, Class, Variable, TypeAlias, and non-pack Template
11674 // Template Parameters are treated uniformly.
11676
11683 };
11684
11685 /// Checks the validity of a template parameter list, possibly
11686 /// considering the template parameter list from a previous
11687 /// declaration.
11688 ///
11689 /// If an "old" template parameter list is provided, it must be
11690 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11691 /// template parameter list.
11692 ///
11693 /// \param NewParams Template parameter list for a new template
11694 /// declaration. This template parameter list will be updated with any
11695 /// default arguments that are carried through from the previous
11696 /// template parameter list.
11697 ///
11698 /// \param OldParams If provided, template parameter list from a
11699 /// previous declaration of the same template. Default template
11700 /// arguments will be merged from the old template parameter list to
11701 /// the new template parameter list.
11702 ///
11703 /// \param TPC Describes the context in which we are checking the given
11704 /// template parameter list.
11705 ///
11706 /// \param SkipBody If we might have already made a prior merged definition
11707 /// of this template visible, the corresponding body-skipping information.
11708 /// Default argument redefinition is not an error when skipping such a body,
11709 /// because (under the ODR) we can assume the default arguments are the same
11710 /// as the prior merged definition.
11711 ///
11712 /// \returns true if an error occurred, false otherwise.
11714 TemplateParameterList *OldParams,
11716 SkipBodyInfo *SkipBody = nullptr);
11717
11718 /// Match the given template parameter lists to the given scope
11719 /// specifier, returning the template parameter list that applies to the
11720 /// name.
11721 ///
11722 /// \param DeclStartLoc the start of the declaration that has a scope
11723 /// specifier or a template parameter list.
11724 ///
11725 /// \param DeclLoc The location of the declaration itself.
11726 ///
11727 /// \param SS the scope specifier that will be matched to the given template
11728 /// parameter lists. This scope specifier precedes a qualified name that is
11729 /// being declared.
11730 ///
11731 /// \param TemplateId The template-id following the scope specifier, if there
11732 /// is one. Used to check for a missing 'template<>'.
11733 ///
11734 /// \param ParamLists the template parameter lists, from the outermost to the
11735 /// innermost template parameter lists.
11736 ///
11737 /// \param IsFriend Whether to apply the slightly different rules for
11738 /// matching template parameters to scope specifiers in friend
11739 /// declarations.
11740 ///
11741 /// \param IsMemberSpecialization will be set true if the scope specifier
11742 /// denotes a fully-specialized type, and therefore this is a declaration of
11743 /// a member specialization.
11744 ///
11745 /// \returns the template parameter list, if any, that corresponds to the
11746 /// name that is preceded by the scope specifier @p SS. This template
11747 /// parameter list may have template parameters (if we're declaring a
11748 /// template) or may have no template parameters (if we're declaring a
11749 /// template specialization), or may be NULL (if what we're declaring isn't
11750 /// itself a template).
11752 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11753 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11754 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11755 bool &IsMemberSpecialization, bool &Invalid,
11756 bool SuppressDiagnostic = false);
11757
11758 /// Returns the template parameter list with all default template argument
11759 /// information.
11761
11763 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11764 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11765 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11766 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11767 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11768 TemplateParameterList **OuterTemplateParamLists,
11769 bool IsMemberSpecialization, SkipBodyInfo *SkipBody = nullptr);
11770
11771 /// Translates template arguments as provided by the parser
11772 /// into template arguments used by semantic analysis.
11775
11776 /// Convert a parsed type into a parsed template argument. This is mostly
11777 /// trivial, except that we may have parsed a C++17 deduced class template
11778 /// specialization type, in which case we should form a template template
11779 /// argument instead of a type template argument.
11781
11783
11786 SourceLocation TemplateLoc,
11787 TemplateArgumentListInfo &TemplateArgs,
11788 Scope *Scope, bool ForNestedNameSpecifier);
11789
11791 ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword,
11792 SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS,
11793 SourceLocation TemplateKWLoc, TemplateTy Template,
11794 const IdentifierInfo *TemplateII,
11795 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11796 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11797 bool IsCtorOrDtorName = false, bool IsClassName = false,
11798 ImplicitTypenameContext AllowImplicitTypename =
11800
11801 /// Parsed an elaborated-type-specifier that refers to a template-id,
11802 /// such as \c class T::template apply<U>.
11804 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11805 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11806 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11807 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11808
11811 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11813
11814 /// Get the specialization of the given variable template corresponding to
11815 /// the specified argument list, or a null-but-valid result if the arguments
11816 /// are dependent.
11818 SourceLocation TemplateLoc,
11819 SourceLocation TemplateNameLoc,
11820 const TemplateArgumentListInfo &TemplateArgs,
11821 bool SetWrittenArgs);
11822
11823 /// Form a reference to the specialization of the given variable template
11824 /// corresponding to the specified argument list, or a null-but-valid result
11825 /// if the arguments are dependent.
11827 const DeclarationNameInfo &NameInfo,
11829 SourceLocation TemplateLoc,
11830 const TemplateArgumentListInfo *TemplateArgs);
11831
11833 const DeclarationNameInfo &NameInfo, TemplateName Template,
11834 const TemplateArgumentListInfo *TemplateArgs);
11835
11837 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11838 const DeclarationNameInfo &ConceptNameInfo,
11839 NamedDecl *FoundDecl, TemplateDecl *NamedConcept,
11840 const TemplateArgumentListInfo *TemplateArgs,
11841 bool DoCheckConstraintSatisfaction = true);
11842
11845 bool TemplateKeyword, TemplateDecl *TD,
11846 SourceLocation Loc);
11847
11849 SourceLocation TemplateKWLoc, LookupResult &R,
11850 bool RequiresADL,
11851 const TemplateArgumentListInfo *TemplateArgs);
11852
11853 // We actually only call this from template instantiation.
11856 const DeclarationNameInfo &NameInfo,
11857 const TemplateArgumentListInfo *TemplateArgs,
11858 bool IsAddressOfOperand);
11859
11861 return Pack.pack_size() - 1 - *ArgPackSubstIndex;
11862 }
11863
11866 Arg = Arg.pack_elements()[*ArgPackSubstIndex];
11867 if (Arg.isPackExpansion())
11868 Arg = Arg.getPackExpansionPattern();
11869 return Arg;
11870 }
11871
11873 BuildSubstNonTypeTemplateParmExpr(Decl *AssociatedDecl, unsigned Index,
11874 QualType ParamType, SourceLocation loc,
11875 TemplateArgument Replacement,
11876 UnsignedOrNone PackIndex, bool Final);
11877
11878 /// Form a template name from a name that is syntactically required to name a
11879 /// template, either due to use of the 'template' keyword or because a name in
11880 /// this syntactic context is assumed to name a template (C++
11881 /// [temp.names]p2-4).
11882 ///
11883 /// This action forms a template name given the name of the template and its
11884 /// optional scope specifier. This is used when the 'template' keyword is used
11885 /// or when the parsing context unambiguously treats a following '<' as
11886 /// introducing a template argument list. Note that this may produce a
11887 /// non-dependent template name if we can perform the lookup now and identify
11888 /// the named template.
11889 ///
11890 /// For example, given "x.MetaFun::template apply", the scope specifier
11891 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11892 /// of the "template" keyword, and "apply" is the \p Name.
11894 SourceLocation TemplateKWLoc,
11895 const UnqualifiedId &Name,
11896 ParsedType ObjectType,
11897 bool EnteringContext, TemplateTy &Template,
11898 bool AllowInjectedClassName = false);
11899
11901 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11902 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11904 MultiTemplateParamsArg TemplateParameterLists,
11905 SkipBodyInfo *SkipBody = nullptr);
11906
11907 /// Check the non-type template arguments of a class template
11908 /// partial specialization according to C++ [temp.class.spec]p9.
11909 ///
11910 /// \param TemplateNameLoc the location of the template name.
11911 /// \param PrimaryTemplate the template parameters of the primary class
11912 /// template.
11913 /// \param NumExplicit the number of explicitly-specified template arguments.
11914 /// \param TemplateArgs the template arguments of the class template
11915 /// partial specialization.
11916 ///
11917 /// \returns \c true if there was an error, \c false otherwise.
11919 TemplateDecl *PrimaryTemplate,
11920 unsigned NumExplicitArgs,
11926
11928 MultiTemplateParamsArg TemplateParameterLists,
11929 Declarator &D);
11930
11931 /// Diagnose cases where we have an explicit template specialization
11932 /// before/after an explicit template instantiation, producing diagnostics
11933 /// for those cases where they are required and determining whether the
11934 /// new specialization/instantiation will have any effect.
11935 ///
11936 /// \param NewLoc the location of the new explicit specialization or
11937 /// instantiation.
11938 ///
11939 /// \param NewTSK the kind of the new explicit specialization or
11940 /// instantiation.
11941 ///
11942 /// \param PrevDecl the previous declaration of the entity.
11943 ///
11944 /// \param PrevTSK the kind of the old explicit specialization or
11945 /// instantiatin.
11946 ///
11947 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11948 /// declaration was instantiated (either implicitly or explicitly).
11949 ///
11950 /// \param HasNoEffect will be set to true to indicate that the new
11951 /// specialization or instantiation has no effect and should be ignored.
11952 ///
11953 /// \returns true if there was an error that should prevent the introduction
11954 /// of the new declaration into the AST, false otherwise.
11956 SourceLocation NewLoc,
11957 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11958 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11959 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11960
11961 /// Perform semantic analysis for the given dependent function
11962 /// template specialization.
11963 ///
11964 /// The only possible way to get a dependent function template specialization
11965 /// is with a friend declaration, like so:
11966 ///
11967 /// \code
11968 /// template <class T> void foo(T);
11969 /// template <class T> class A {
11970 /// friend void foo<>(T);
11971 /// };
11972 /// \endcode
11973 ///
11974 /// There really isn't any useful analysis we can do here, so we
11975 /// just store the information.
11977 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
11979
11980 /// Perform semantic analysis for the given function template
11981 /// specialization.
11982 ///
11983 /// This routine performs all of the semantic analysis required for an
11984 /// explicit function template specialization. On successful completion,
11985 /// the function declaration \p FD will become a function template
11986 /// specialization.
11987 ///
11988 /// \param FD the function declaration, which will be updated to become a
11989 /// function template specialization.
11990 ///
11991 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
11992 /// if any. Note that this may be valid info even when 0 arguments are
11993 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
11994 /// as it anyway contains info on the angle brackets locations.
11995 ///
11996 /// \param Previous the set of declarations that may be specialized by
11997 /// this function specialization.
11998 ///
11999 /// \param QualifiedFriend whether this is a lookup for a qualified friend
12000 /// declaration with no explicit template argument list that might be
12001 /// befriending a function template specialization.
12003 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
12004 LookupResult &Previous, bool QualifiedFriend = false);
12005
12006 /// Perform semantic analysis for the given non-template member
12007 /// specialization.
12008 ///
12009 /// This routine performs all of the semantic analysis required for an
12010 /// explicit member function specialization. On successful completion,
12011 /// the function declaration \p FD will become a member function
12012 /// specialization.
12013 ///
12014 /// \param Member the member declaration, which will be updated to become a
12015 /// specialization.
12016 ///
12017 /// \param Previous the set of declarations, one of which may be specialized
12018 /// by this function specialization; the set will be modified to contain the
12019 /// redeclared member.
12022
12023 // Explicit instantiation of a class template specialization
12025 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
12026 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
12027 TemplateTy Template, SourceLocation TemplateNameLoc,
12028 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
12029 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
12030
12031 // Explicit instantiation of a member class of a class template.
12033 SourceLocation TemplateLoc,
12034 unsigned TagSpec, SourceLocation KWLoc,
12035 CXXScopeSpec &SS, IdentifierInfo *Name,
12036 SourceLocation NameLoc,
12037 const ParsedAttributesView &Attr);
12038
12040 SourceLocation TemplateLoc,
12041 Declarator &D);
12042
12043 /// If the given template parameter has a default template
12044 /// argument, substitute into that default template argument and
12045 /// return the corresponding template argument.
12047 TemplateDecl *Template, SourceLocation TemplateKWLoc,
12048 SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param,
12049 ArrayRef<TemplateArgument> SugaredConverted,
12050 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
12051
12052 /// Returns the top most location responsible for the definition of \p N.
12053 /// If \p N is a a template specialization, this is the location
12054 /// of the top of the instantiation stack.
12055 /// Otherwise, the location of \p N is returned.
12057
12058 /// Specifies the context in which a particular template
12059 /// argument is being checked.
12061 /// The template argument was specified in the code or was
12062 /// instantiated with some deduced template arguments.
12064
12065 /// The template argument was deduced via template argument
12066 /// deduction.
12068
12069 /// The template argument was deduced from an array bound
12070 /// via template argument deduction.
12072 };
12073
12081
12082 /// The checked, converted argument will be added to the
12083 /// end of these vectors.
12085
12086 /// The check is being performed in the context of partial ordering.
12088
12089 /// If true, assume these template arguments are
12090 /// the injected template arguments for a template template parameter.
12091 /// This will relax the requirement that all its possible uses are valid:
12092 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
12093 /// during instantiation.
12095
12096 /// Is set to true when, in the context of TTP matching, a pack parameter
12097 /// matches non-pack arguments.
12098 bool StrictPackMatch = false;
12099 };
12100
12101 /// Check that the given template argument corresponds to the given
12102 /// template parameter.
12103 ///
12104 /// \param Param The template parameter against which the argument will be
12105 /// checked.
12106 ///
12107 /// \param Arg The template argument, which may be updated due to conversions.
12108 ///
12109 /// \param Template The template in which the template argument resides.
12110 ///
12111 /// \param TemplateLoc The location of the template name for the template
12112 /// whose argument list we're matching.
12113 ///
12114 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
12115 /// the template argument list.
12116 ///
12117 /// \param ArgumentPackIndex The index into the argument pack where this
12118 /// argument will be placed. Only valid if the parameter is a parameter pack.
12119 ///
12120 /// \param CTAK Describes how we arrived at this particular template argument:
12121 /// explicitly written, deduced, etc.
12122 ///
12123 /// \returns true on error, false otherwise.
12125 NamedDecl *Template, SourceLocation TemplateLoc,
12126 SourceLocation RAngleLoc,
12127 unsigned ArgumentPackIndex,
12130
12131 /// Check that the given template arguments can be provided to
12132 /// the given template, converting the arguments along the way.
12133 ///
12134 /// \param Template The template to which the template arguments are being
12135 /// provided.
12136 ///
12137 /// \param TemplateLoc The location of the template name in the source.
12138 ///
12139 /// \param TemplateArgs The list of template arguments. If the template is
12140 /// a template template parameter, this function may extend the set of
12141 /// template arguments to also include substituted, defaulted template
12142 /// arguments.
12143 ///
12144 /// \param PartialTemplateArgs True if the list of template arguments is
12145 /// intentionally partial, e.g., because we're checking just the initial
12146 /// set of template arguments.
12147 ///
12148 /// \param Converted Will receive the converted, canonicalized template
12149 /// arguments.
12150 ///
12151 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
12152 /// contain the converted forms of the template arguments as written.
12153 /// Otherwise, \p TemplateArgs will not be modified.
12154 ///
12155 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
12156 /// receive true if the cause for the error is the associated constraints of
12157 /// the template not being satisfied by the template arguments.
12158 ///
12159 /// \param DefaultArgs any default arguments from template specialization
12160 /// deduction.
12161 ///
12162 /// \returns true if an error occurred, false otherwise.
12164 SourceLocation TemplateLoc,
12165 TemplateArgumentListInfo &TemplateArgs,
12166 const DefaultArguments &DefaultArgs,
12167 bool PartialTemplateArgs,
12169 bool UpdateArgsWithConversions = true,
12170 bool *ConstraintsNotSatisfied = nullptr);
12171
12174 SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
12175 const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
12176 CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions = true,
12177 bool *ConstraintsNotSatisfied = nullptr);
12178
12181 SmallVectorImpl<TemplateArgument> &SugaredConverted,
12182 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
12183
12184 /// Check a template argument against its corresponding
12185 /// template type parameter.
12186 ///
12187 /// This routine implements the semantics of C++ [temp.arg.type]. It
12188 /// returns true if an error occurred, and false otherwise.
12190
12191 /// Check a template argument against its corresponding
12192 /// non-type template parameter.
12193 ///
12194 /// This routine implements the semantics of C++ [temp.arg.nontype].
12195 /// If an error occurred, it returns ExprError(); otherwise, it
12196 /// returns the converted template argument. \p ParamType is the
12197 /// type of the non-type template parameter after it has been instantiated.
12199 QualType InstantiatedParamType, Expr *Arg,
12200 TemplateArgument &SugaredConverted,
12201 TemplateArgument &CanonicalConverted,
12202 bool StrictCheck,
12204
12205 /// Check a template argument against its corresponding
12206 /// template template parameter.
12207 ///
12208 /// This routine implements the semantics of C++ [temp.arg.template].
12209 /// It returns true if an error occurred, and false otherwise.
12211 TemplateParameterList *Params,
12213 bool PartialOrdering,
12214 bool *StrictPackMatch);
12215
12218 const TemplateArgumentLoc &Arg);
12219
12221 std::optional<SourceRange> ParamRange = {});
12223
12224 /// Given a non-type template argument that refers to a
12225 /// declaration and the type of its corresponding non-type template
12226 /// parameter, produce an expression that properly refers to that
12227 /// declaration.
12228 /// FIXME: This is used in some contexts where the resulting expression
12229 /// doesn't need to live too long. It would be useful if this function
12230 /// could return a temporary expression.
12232 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc);
12235 SourceLocation Loc);
12236
12237 /// Enumeration describing how template parameter lists are compared
12238 /// for equality.
12240 /// We are matching the template parameter lists of two templates
12241 /// that might be redeclarations.
12242 ///
12243 /// \code
12244 /// template<typename T> struct X;
12245 /// template<typename T> struct X;
12246 /// \endcode
12248
12249 /// We are matching the template parameter lists of two template
12250 /// template parameters as part of matching the template parameter lists
12251 /// of two templates that might be redeclarations.
12252 ///
12253 /// \code
12254 /// template<template<int I> class TT> struct X;
12255 /// template<template<int Value> class Other> struct X;
12256 /// \endcode
12258
12259 /// We are determining whether the template-parameters are equivalent
12260 /// according to C++ [temp.over.link]/6. This comparison does not consider
12261 /// constraints.
12262 ///
12263 /// \code
12264 /// template<C1 T> void f(T);
12265 /// template<C2 T> void f(T);
12266 /// \endcode
12268 };
12269
12270 // A struct to represent the 'new' declaration, which is either itself just
12271 // the named decl, or the important information we need about it in order to
12272 // do constraint comparisons.
12274 const NamedDecl *ND = nullptr;
12275 const DeclContext *DC = nullptr;
12276 const DeclContext *LexicalDC = nullptr;
12277 SourceLocation Loc;
12278
12279 public:
12282 const DeclContext *LexicalDeclCtx,
12283 SourceLocation Loc)
12284
12285 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
12286 assert(DC && LexicalDC &&
12287 "Constructor only for cases where we have the information to put "
12288 "in here");
12289 }
12290
12291 // If this was constructed with no information, we cannot do substitution
12292 // for constraint comparison, so make sure we can check that.
12293 bool isInvalid() const { return !ND && !DC; }
12294
12295 const NamedDecl *getDecl() const { return ND; }
12296
12297 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
12298
12300 return ND ? ND->getLexicalDeclContext() : LexicalDC;
12301 }
12302
12304 return ND ? ND->getDeclContext() : DC;
12305 }
12306
12307 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
12308 };
12309
12310 /// Determine whether the given template parameter lists are
12311 /// equivalent.
12312 ///
12313 /// \param New The new template parameter list, typically written in the
12314 /// source code as part of a new template declaration.
12315 ///
12316 /// \param Old The old template parameter list, typically found via
12317 /// name lookup of the template declared with this template parameter
12318 /// list.
12319 ///
12320 /// \param Complain If true, this routine will produce a diagnostic if
12321 /// the template parameter lists are not equivalent.
12322 ///
12323 /// \param Kind describes how we are to match the template parameter lists.
12324 ///
12325 /// \param TemplateArgLoc If this source location is valid, then we
12326 /// are actually checking the template parameter list of a template
12327 /// argument (New) against the template parameter list of its
12328 /// corresponding template template parameter (Old). We produce
12329 /// slightly different diagnostics in this scenario.
12330 ///
12331 /// \returns True if the template parameter lists are equal, false
12332 /// otherwise.
12334 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
12335 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
12337 SourceLocation TemplateArgLoc = SourceLocation());
12338
12340 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
12342 SourceLocation TemplateArgLoc = SourceLocation()) {
12343 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
12344 Kind, TemplateArgLoc);
12345 }
12346
12347 /// Check whether a template can be declared within this scope.
12348 ///
12349 /// If the template declaration is valid in this scope, returns
12350 /// false. Otherwise, issues a diagnostic and returns true.
12351 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
12352
12353 /// Called when the parser has parsed a C++ typename
12354 /// specifier, e.g., "typename T::type".
12355 ///
12356 /// \param S The scope in which this typename type occurs.
12357 /// \param TypenameLoc the location of the 'typename' keyword
12358 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12359 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
12360 /// \param IdLoc the location of the identifier.
12361 /// \param IsImplicitTypename context where T::type refers to a type.
12363 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
12364 const IdentifierInfo &II, SourceLocation IdLoc,
12366
12367 /// Called when the parser has parsed a C++ typename
12368 /// specifier that ends in a template-id, e.g.,
12369 /// "typename MetaFun::template apply<T1, T2>".
12370 ///
12371 /// \param S The scope in which this typename type occurs.
12372 /// \param TypenameLoc the location of the 'typename' keyword
12373 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12374 /// \param TemplateLoc the location of the 'template' keyword, if any.
12375 /// \param TemplateName The template name.
12376 /// \param TemplateII The identifier used to name the template.
12377 /// \param TemplateIILoc The location of the template name.
12378 /// \param LAngleLoc The location of the opening angle bracket ('<').
12379 /// \param TemplateArgs The template arguments.
12380 /// \param RAngleLoc The location of the closing angle bracket ('>').
12382 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
12383 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
12384 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
12385 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
12386 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
12387
12389 SourceLocation KeywordLoc,
12390 NestedNameSpecifierLoc QualifierLoc,
12391 const IdentifierInfo &II, SourceLocation IILoc,
12392 TypeSourceInfo **TSI, bool DeducedTSTContext);
12393
12395 SourceLocation KeywordLoc,
12396 NestedNameSpecifierLoc QualifierLoc,
12397 const IdentifierInfo &II, SourceLocation IILoc,
12398 bool DeducedTSTContext = true);
12399
12400 /// Rebuilds a type within the context of the current instantiation.
12401 ///
12402 /// The type \p T is part of the type of an out-of-line member definition of
12403 /// a class template (or class template partial specialization) that was
12404 /// parsed and constructed before we entered the scope of the class template
12405 /// (or partial specialization thereof). This routine will rebuild that type
12406 /// now that we have entered the declarator's scope, which may produce
12407 /// different canonical types, e.g.,
12408 ///
12409 /// \code
12410 /// template<typename T>
12411 /// struct X {
12412 /// typedef T* pointer;
12413 /// pointer data();
12414 /// };
12415 ///
12416 /// template<typename T>
12417 /// typename X<T>::pointer X<T>::data() { ... }
12418 /// \endcode
12419 ///
12420 /// Here, the type "typename X<T>::pointer" will be created as a
12421 /// DependentNameType, since we do not know that we can look into X<T> when we
12422 /// parsed the type. This function will rebuild the type, performing the
12423 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
12424 /// canonical type is the same as the canonical type of T*, allowing the
12425 /// return types of the out-of-line definition and the declaration to match.
12427 SourceLocation Loc,
12428 DeclarationName Name);
12430
12432
12433 /// Rebuild the template parameters now that we know we're in a current
12434 /// instantiation.
12435 bool
12437
12438 /// Produces a formatted string that describes the binding of
12439 /// template parameters to template arguments.
12440 std::string
12442 const TemplateArgumentList &Args);
12443
12444 std::string
12446 const TemplateArgument *Args,
12447 unsigned NumArgs);
12448
12452
12453 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12454 /// was just parsed. This is only possible with an explicit scope
12455 /// specifier naming a dependent type.
12457 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12458 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12459 const TemplateArgumentListInfo *TemplateArgs);
12460
12463 SourceLocation TemplateKWLoc,
12464 const DeclarationNameInfo &NameInfo,
12465 const TemplateArgumentListInfo *TemplateArgs);
12466
12467 // Calculates whether the expression Constraint depends on an enclosing
12468 // template, for the purposes of [temp.friend] p9.
12469 // TemplateDepth is the 'depth' of the friend function, which is used to
12470 // compare whether a declaration reference is referring to a containing
12471 // template, or just the current friend function. A 'lower' TemplateDepth in
12472 // the AST refers to a 'containing' template. As the constraint is
12473 // uninstantiated, this is relative to the 'top' of the TU.
12474 bool
12476 unsigned TemplateDepth,
12477 const Expr *Constraint);
12478
12479 /// Find the failed Boolean condition within a given Boolean
12480 /// constant expression, and describe it with a string.
12481 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12482
12484
12486 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12487 const IdentifierInfo *Name, SourceLocation NameLoc);
12488
12490 Expr *ConstraintExpr,
12491 const ParsedAttributesView &Attrs);
12492
12494 bool &AddToScope);
12496
12497 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12498 const CXXScopeSpec &SS,
12499 const IdentifierInfo *Name,
12500 SourceLocation TagLoc, SourceLocation NameLoc);
12501
12503 CachedTokens &Toks);
12506
12507 /// We've found a use of a templated declaration that would trigger an
12508 /// implicit instantiation. Check that any relevant explicit specializations
12509 /// and partial specializations are visible/reachable, and diagnose if not.
12512
12513 ///@}
12514
12515 //
12516 //
12517 // -------------------------------------------------------------------------
12518 //
12519 //
12520
12521 /// \name C++ Template Argument Deduction
12522 /// Implementations are in SemaTemplateDeduction.cpp
12523 ///@{
12524
12525public:
12526 class SFINAETrap;
12527
12530 : S(S), Prev(std::exchange(S.CurrentSFINAEContext, Cur)) {}
12531
12532 protected:
12534 ~SFINAEContextBase() { S.CurrentSFINAEContext = Prev; }
12537
12538 private:
12539 SFINAETrap *Prev;
12540 };
12541
12545
12546 /// RAII class used to determine whether SFINAE has
12547 /// trapped any errors that occur during template argument
12548 /// deduction.
12549 class SFINAETrap : SFINAEContextBase {
12550 bool HasErrorOcurred = false;
12551 bool WithAccessChecking = false;
12552 bool PrevLastDiagnosticIgnored =
12553 S.getDiagnostics().isLastDiagnosticIgnored();
12554 sema::TemplateDeductionInfo *DeductionInfo = nullptr;
12555
12556 SFINAETrap(Sema &S, sema::TemplateDeductionInfo *Info,
12557 bool WithAccessChecking)
12558 : SFINAEContextBase(S, this), WithAccessChecking(WithAccessChecking),
12559 DeductionInfo(Info) {}
12560
12561 public:
12562 /// \param WithAccessChecking If true, discard all diagnostics (from the
12563 /// immediate context) instead of adding them to the currently active
12564 /// \ref TemplateDeductionInfo.
12565 explicit SFINAETrap(Sema &S, bool WithAccessChecking = false)
12566 : SFINAETrap(S, /*Info=*/nullptr, WithAccessChecking) {}
12567
12569 : SFINAETrap(S, &Info, /*WithAccessChecking=*/false) {}
12570
12572 S.getDiagnostics().setLastDiagnosticIgnored(PrevLastDiagnosticIgnored);
12573 }
12574
12575 SFINAETrap(const SFINAETrap &) = delete;
12576 SFINAETrap &operator=(const SFINAETrap &) = delete;
12577
12579 return DeductionInfo;
12580 }
12581
12582 /// Determine whether any SFINAE errors have been trapped.
12583 bool hasErrorOccurred() const { return HasErrorOcurred; }
12584 void setErrorOccurred() { HasErrorOcurred = true; }
12585
12586 bool withAccessChecking() const { return WithAccessChecking; }
12587 };
12588
12589 /// RAII class used to indicate that we are performing provisional
12590 /// semantic analysis to determine the validity of a construct, so
12591 /// typo-correction and diagnostics in the immediate context (not within
12592 /// implicitly-instantiated templates) should be suppressed.
12594 Sema &SemaRef;
12595 // FIXME: Using a SFINAETrap for this is a hack.
12596 SFINAETrap Trap;
12597 bool PrevDisableTypoCorrection;
12598
12599 public:
12600 explicit TentativeAnalysisScope(Sema &SemaRef)
12601 : SemaRef(SemaRef), Trap(SemaRef, /*ForValidityCheck=*/true),
12602 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12603 SemaRef.DisableTypoCorrection = true;
12604 }
12606 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12607 }
12608
12611 };
12612
12613 /// For each declaration that involved template argument deduction, the
12614 /// set of diagnostics that were suppressed during that template argument
12615 /// deduction.
12616 ///
12617 /// FIXME: Serialize this structure to the AST file.
12618 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12621
12622 /// Compare types for equality with respect to possibly compatible
12623 /// function types (noreturn adjustment, implicit calling conventions). If any
12624 /// of parameter and argument is not a function, just perform type comparison.
12625 ///
12626 /// \param P the template parameter type.
12627 ///
12628 /// \param A the argument type.
12630
12631 /// Allocate a TemplateArgumentLoc where all locations have
12632 /// been initialized to the given location.
12633 ///
12634 /// \param Arg The template argument we are producing template argument
12635 /// location information for.
12636 ///
12637 /// \param NTTPType For a declaration template argument, the type of
12638 /// the non-type template parameter that corresponds to this template
12639 /// argument. Can be null if no type sugar is available to add to the
12640 /// type from the template argument.
12641 ///
12642 /// \param Loc The source location to use for the resulting template
12643 /// argument.
12645 QualType NTTPType,
12646 SourceLocation Loc);
12647
12648 /// Get a template argument mapping the given template parameter to itself,
12649 /// e.g. for X in \c template<int X>, this would return an expression template
12650 /// argument referencing X.
12652 SourceLocation Location);
12653
12654 /// Adjust the type \p ArgFunctionType to match the calling convention,
12655 /// noreturn, and optionally the exception specification of \p FunctionType.
12656 /// Deduction often wants to ignore these properties when matching function
12657 /// types.
12659 bool AdjustExceptionSpec = false);
12660
12663 ArrayRef<TemplateArgument> TemplateArgs,
12665
12668 ArrayRef<TemplateArgument> TemplateArgs,
12670
12671 /// Deduce the template arguments of the given template from \p FromType.
12672 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12673 /// [over.match.class.deduct]p4.
12674 ///
12675 /// It only supports class or type alias templates.
12679
12684 bool NumberOfArgumentsMustMatch);
12685
12686 /// Substitute the explicitly-provided template arguments into the
12687 /// given function template according to C++ [temp.arg.explicit].
12688 ///
12689 /// \param FunctionTemplate the function template into which the explicit
12690 /// template arguments will be substituted.
12691 ///
12692 /// \param ExplicitTemplateArgs the explicitly-specified template
12693 /// arguments.
12694 ///
12695 /// \param Deduced the deduced template arguments, which will be populated
12696 /// with the converted and checked explicit template arguments.
12697 ///
12698 /// \param ParamTypes will be populated with the instantiated function
12699 /// parameters.
12700 ///
12701 /// \param FunctionType if non-NULL, the result type of the function template
12702 /// will also be instantiated and the pointed-to value will be updated with
12703 /// the instantiated function type.
12704 ///
12705 /// \param Info if substitution fails for any reason, this object will be
12706 /// populated with more information about the failure.
12707 ///
12708 /// \returns TemplateDeductionResult::Success if substitution was successful,
12709 /// or some failure condition.
12712 TemplateArgumentListInfo &ExplicitTemplateArgs,
12716
12717 /// brief A function argument from which we performed template argument
12718 // deduction for a call.
12731
12732 /// Finish template argument deduction for a function template,
12733 /// checking the deduced template arguments for completeness and forming
12734 /// the function template specialization.
12735 ///
12736 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12737 /// which the deduced argument types should be compared.
12738 /// \param CheckNonDependent Callback before substituting into the declaration
12739 /// with the deduced template arguments.
12740 /// \param OnlyInitializeNonUserDefinedConversions is used as a workaround for
12741 /// some breakages introduced by CWG2369, where non-user-defined conversions
12742 /// are checked first before the constraints.
12746 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12748 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
12749 bool PartialOverloading, bool PartialOrdering,
12750 bool ForOverloadSetAddressResolution,
12751 llvm::function_ref<bool(bool)> CheckNonDependent =
12752 [](bool /*OnlyInitializeNonUserDefinedConversions*/) {
12753 return false;
12754 });
12755
12756 /// Perform [temp.friend] p5 template argument deduction for a dependent
12757 /// friend declaration and a candidate class template specialization.
12759 ClassTemplateDecl *PatternCTD,
12760 ClassTemplateDecl *CandidateCTD,
12762 ArrayRef<TemplateArgument> PatternArgs,
12763 ArrayRef<TemplateArgument> CandidateArgs,
12764 SourceLocation Loc,
12765 TemplateSpecCandidateSet *FailedTSC,
12766 MultiLevelTemplateArgumentList &DeducedArgs);
12767
12768 /// Perform template argument deduction from a function call
12769 /// (C++ [temp.deduct.call]).
12770 ///
12771 /// \param FunctionTemplate the function template for which we are performing
12772 /// template argument deduction.
12773 ///
12774 /// \param ExplicitTemplateArgs the explicit template arguments provided
12775 /// for this call.
12776 ///
12777 /// \param Args the function call arguments
12778 ///
12779 /// \param Specialization if template argument deduction was successful,
12780 /// this will be set to the function template specialization produced by
12781 /// template argument deduction.
12782 ///
12783 /// \param Info the argument will be updated to provide additional information
12784 /// about template argument deduction.
12785 ///
12786 /// \param CheckNonDependent A callback to invoke to check conversions for
12787 /// non-dependent parameters, between deduction and substitution, per DR1391.
12788 /// If this returns true, substitution will be skipped and we return
12789 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12790 /// passed the parameter types (after substituting explicit template
12791 /// arguments).
12792 ///
12793 /// \returns the result of template argument deduction.
12796 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12798 bool PartialOverloading, bool AggregateDeductionCandidate,
12799 bool PartialOrdering, QualType ObjectType,
12800 Expr::Classification ObjectClassification,
12801 bool ForOverloadSetAddressResolution,
12802 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent);
12803
12804 /// Deduce template arguments when taking the address of a function
12805 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12806 /// a template.
12807 ///
12808 /// \param FunctionTemplate the function template for which we are performing
12809 /// template argument deduction.
12810 ///
12811 /// \param ExplicitTemplateArgs the explicitly-specified template
12812 /// arguments.
12813 ///
12814 /// \param ArgFunctionType the function type that will be used as the
12815 /// "argument" type (A) when performing template argument deduction from the
12816 /// function template's function type. This type may be NULL, if there is no
12817 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12818 ///
12819 /// \param Specialization if template argument deduction was successful,
12820 /// this will be set to the function template specialization produced by
12821 /// template argument deduction.
12822 ///
12823 /// \param Info the argument will be updated to provide additional information
12824 /// about template argument deduction.
12825 ///
12826 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12827 /// the address of a function template per [temp.deduct.funcaddr] and
12828 /// [over.over]. If \c false, we are looking up a function template
12829 /// specialization based on its signature, per [temp.deduct.decl].
12830 ///
12831 /// \returns the result of template argument deduction.
12834 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12836 bool IsAddressOfFunction = false);
12837
12838 /// Deduce template arguments for a templated conversion
12839 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12840 /// conversion function template specialization.
12843 Expr::Classification ObjectClassification, QualType ToType,
12845
12846 /// Deduce template arguments for a function template when there is
12847 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12848 ///
12849 /// \param FunctionTemplate the function template for which we are performing
12850 /// template argument deduction.
12851 ///
12852 /// \param ExplicitTemplateArgs the explicitly-specified template
12853 /// arguments.
12854 ///
12855 /// \param Specialization if template argument deduction was successful,
12856 /// this will be set to the function template specialization produced by
12857 /// template argument deduction.
12858 ///
12859 /// \param Info the argument will be updated to provide additional information
12860 /// about template argument deduction.
12861 ///
12862 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12863 /// the address of a function template in a context where we do not have a
12864 /// target type, per [over.over]. If \c false, we are looking up a function
12865 /// template specialization based on its signature, which only happens when
12866 /// deducing a function parameter type from an argument that is a template-id
12867 /// naming a function template specialization.
12868 ///
12869 /// \returns the result of template argument deduction.
12872 TemplateArgumentListInfo *ExplicitTemplateArgs,
12875 bool IsAddressOfFunction = false);
12876
12877 /// Substitute Replacement for \p auto in \p TypeWithAuto
12878 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12879 /// Substitute Replacement for auto in TypeWithAuto
12881 QualType Replacement);
12882
12883 // Substitute auto in TypeWithAuto for a Dependent auto type
12885
12886 // Substitute auto in TypeWithAuto for a Dependent auto type
12889
12890 /// Completely replace the \c auto in \p TypeWithAuto by
12891 /// \p Replacement. This does not retain any \c auto type sugar.
12892 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12894 QualType Replacement);
12895
12896 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12897 ///
12898 /// Note that this is done even if the initializer is dependent. (This is
12899 /// necessary to support partial ordering of templates using 'auto'.)
12900 /// A dependent type will be produced when deducing from a dependent type.
12901 ///
12902 /// \param Type the type pattern using the auto type-specifier.
12903 /// \param Init the initializer for the variable whose type is to be deduced.
12904 /// \param Result if type deduction was successful, this will be set to the
12905 /// deduced type.
12906 /// \param Info the argument will be updated to provide additional information
12907 /// about template argument deduction.
12908 /// \param DependentDeduction Set if we should permit deduction in
12909 /// dependent cases. This is necessary for template partial ordering
12910 /// with 'auto' template parameters. The template parameter depth to be
12911 /// used should be specified in the 'Info' parameter.
12912 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12913 /// does not satisfy the type-constraint in the auto
12914 /// type.
12918 bool DependentDeduction = false,
12919 bool IgnoreConstraints = false,
12920 TemplateSpecCandidateSet *FailedTSC = nullptr);
12921 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12923 bool Diagnose = true);
12924
12926 SourceLocation Loc);
12927
12928 /// Returns the more specialized class template partial specialization
12929 /// according to the rules of partial ordering of class template partial
12930 /// specializations (C++ [temp.class.order]).
12931 ///
12932 /// \param PS1 the first class template partial specialization
12933 ///
12934 /// \param PS2 the second class template partial specialization
12935 ///
12936 /// \returns the more specialized class template partial specialization. If
12937 /// neither partial specialization is more specialized, returns NULL.
12942
12945
12949
12952
12954 TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg,
12955 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
12956 bool PartialOrdering, bool *StrictPackMatch);
12957
12958 /// Mark which template parameters are used in a given expression.
12959 ///
12960 /// \param E the expression from which template parameters will be deduced.
12961 ///
12962 /// \param Used a bit vector whose elements will be set to \c true
12963 /// to indicate when the corresponding template parameter will be
12964 /// deduced.
12965 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12966 unsigned Depth, llvm::SmallBitVector &Used);
12967
12968 /// Mark which template parameters are named in a given expression.
12969 ///
12970 /// Unlike MarkUsedTemplateParameters, this excludes parameter that
12971 /// are used but not directly named by an expression - i.e. it excludes
12972 /// any template parameter that denotes the type of a referenced NTTP.
12973 ///
12974 /// \param Used a bit vector whose elements will be set to \c true
12975 /// to indicate when the corresponding template parameter will be
12976 /// deduced.
12978 const Expr *E, unsigned Depth, llvm::SmallBitVector &Used);
12979
12980 /// Mark which template parameters can be deduced from a given
12981 /// template argument list.
12982 ///
12983 /// \param TemplateArgs the template argument list from which template
12984 /// 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 TemplateArgumentList &TemplateArgs,
12990 bool OnlyDeduced, unsigned Depth,
12991 llvm::SmallBitVector &Used);
12992
12994 bool OnlyDeduced, unsigned Depth,
12995 llvm::SmallBitVector &Used);
12996
12998 unsigned Depth, llvm::SmallBitVector &Used);
12999
13000 void
13005
13006 /// Marks all of the template parameters that will be deduced by a
13007 /// call to the given function template.
13008 static void
13011 llvm::SmallBitVector &Deduced);
13012
13013 /// Returns the more specialized function template according
13014 /// to the rules of function template partial ordering (C++
13015 /// [temp.func.order]).
13016 ///
13017 /// \param FT1 the first function template
13018 ///
13019 /// \param FT2 the second function template
13020 ///
13021 /// \param TPOC the context in which we are performing partial ordering of
13022 /// function templates.
13023 ///
13024 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
13025 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
13026 /// when calling a member function.
13027 ///
13028 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
13029 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
13030 /// template from a member function
13031 ///
13032 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
13033 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
13034 /// template from a member function
13035 ///
13036 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
13037 /// candidate with a reversed parameter order. In this case, the corresponding
13038 /// P/A pairs between FT1 and FT2 are reversed.
13039 ///
13040 /// \returns the more specialized function template. If neither
13041 /// template is more specialized, returns NULL.
13044 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
13045 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false,
13046 bool PartialOverloading = false);
13047
13048 /// Retrieve the most specialized of the given function template
13049 /// specializations.
13050 ///
13051 /// \param SpecBegin the start iterator of the function template
13052 /// specializations that we will be comparing.
13053 ///
13054 /// \param SpecEnd the end iterator of the function template
13055 /// specializations, paired with \p SpecBegin.
13056 ///
13057 /// \param Loc the location where the ambiguity or no-specializations
13058 /// diagnostic should occur.
13059 ///
13060 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
13061 /// no matching candidates.
13062 ///
13063 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
13064 /// occurs.
13065 ///
13066 /// \param CandidateDiag partial diagnostic used for each function template
13067 /// specialization that is a candidate in the ambiguous ordering. One
13068 /// parameter in this diagnostic should be unbound, which will correspond to
13069 /// the string describing the template arguments for the function template
13070 /// specialization.
13071 ///
13072 /// \returns the most specialized function template specialization, if
13073 /// found. Otherwise, returns SpecEnd.
13074 UnresolvedSetIterator
13075 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
13076 TemplateSpecCandidateSet &FailedCandidates,
13077 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
13078 const PartialDiagnostic &AmbigDiag,
13079 const PartialDiagnostic &CandidateDiag,
13080 bool Complain = true, QualType TargetType = QualType());
13081
13082 /// Returns the more constrained function according to the rules of
13083 /// partial ordering by constraints (C++ [temp.constr.order]).
13084 ///
13085 /// \param FD1 the first function
13086 ///
13087 /// \param FD2 the second function
13088 ///
13089 /// \returns the more constrained function. If neither function is
13090 /// more constrained, returns NULL.
13091 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
13092 FunctionDecl *FD2);
13093
13094 ///@}
13095
13096 //
13097 //
13098 // -------------------------------------------------------------------------
13099 //
13100 //
13101
13102 /// \name C++ Template Deduction Guide
13103 /// Implementations are in SemaTemplateDeductionGuide.cpp
13104 ///@{
13105
13106 /// Declare implicit deduction guides for a class template if we've
13107 /// not already done so.
13108 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
13109 SourceLocation Loc);
13110
13111 CXXDeductionGuideDecl *DeclareAggregateDeductionGuideFromInitList(
13112 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
13113 SourceLocation Loc);
13114
13115 ///@}
13116
13117 //
13118 //
13119 // -------------------------------------------------------------------------
13120 //
13121 //
13122
13123 /// \name C++ Template Instantiation
13124 /// Implementations are in SemaTemplateInstantiate.cpp
13125 ///@{
13126
13127public:
13128 /// A helper class for building up ExtParameterInfos.
13131 bool HasInteresting = false;
13132
13133 public:
13134 /// Set the ExtParameterInfo for the parameter at the given index,
13135 ///
13137 assert(Infos.size() <= index);
13138 Infos.resize(index);
13139 Infos.push_back(info);
13140
13141 if (!HasInteresting)
13142 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
13143 }
13144
13145 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
13146 /// ExtParameterInfo array we've built up.
13148 getPointerOrNull(unsigned numParams) {
13149 if (!HasInteresting)
13150 return nullptr;
13151 Infos.resize(numParams);
13152 return Infos.data();
13153 }
13154 };
13155
13156 /// The current instantiation scope used to store local
13157 /// variables.
13159
13160 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
13162
13163 /// A mapping from parameters with unparsed default arguments to the
13164 /// set of instantiations of each parameter.
13165 ///
13166 /// This mapping is a temporary data structure used when parsing
13167 /// nested class templates or nested classes of class templates,
13168 /// where we might end up instantiating an inner class before the
13169 /// default arguments of its methods have been parsed.
13171
13172 using InstantiatingSpecializationsKey = llvm::PointerIntPair<Decl *, 2>;
13173
13180
13182 : S(S), Key(D->getCanonicalDecl(), unsigned(Kind)) {
13183 auto [_, Created] = S.InstantiatingSpecializations.insert(Key);
13184 if (!Created)
13185 Key = {};
13186 }
13187
13189 if (Key.getOpaqueValue()) {
13190 [[maybe_unused]] bool Erased =
13191 S.InstantiatingSpecializations.erase(Key);
13192 assert(Erased);
13193 }
13194 }
13195
13198
13199 operator bool() const { return Key.getOpaqueValue() == nullptr; }
13200
13201 private:
13202 Sema &S;
13204 };
13205
13206 /// A context in which code is being synthesized (where a source location
13207 /// alone is not sufficient to identify the context). This covers template
13208 /// instantiation and various forms of implicitly-generated functions.
13210 /// The kind of template instantiation we are performing
13212 /// We are instantiating a template declaration. The entity is
13213 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
13215
13216 /// We are instantiating a default argument for a template
13217 /// parameter. The Entity is the template parameter whose argument is
13218 /// being instantiated, the Template is the template, and the
13219 /// TemplateArgs/NumTemplateArguments provide the template arguments as
13220 /// specified.
13222
13223 /// We are instantiating a default argument for a function.
13224 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
13225 /// provides the template arguments as specified.
13227
13228 /// We are substituting explicit template arguments provided for
13229 /// a function template. The entity is a FunctionTemplateDecl.
13231
13232 /// We are substituting template argument determined as part of
13233 /// template argument deduction for either a class template
13234 /// partial specialization or a function template. The
13235 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
13236 /// a TemplateDecl.
13238
13239 /// We are substituting into a lambda expression.
13241
13242 /// We are substituting prior template arguments into a new
13243 /// template parameter. The template parameter itself is either a
13244 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
13246
13247 /// We are checking the validity of a default template argument that
13248 /// has been used when naming a template-id.
13250
13251 /// We are computing the exception specification for a defaulted special
13252 /// member function.
13254
13255 /// We are instantiating the exception specification for a function
13256 /// template which was deferred until it was needed.
13258
13259 /// We are instantiating a requirement of a requires expression.
13261
13262 /// We are checking the satisfaction of a nested requirement of a requires
13263 /// expression.
13265
13266 /// We are declaring an implicit special member function.
13268
13269 /// We are declaring an implicit 'operator==' for a defaulted
13270 /// 'operator<=>'.
13272
13273 /// We are defining a synthesized function (such as a defaulted special
13274 /// member).
13276
13277 // We are checking the constraints associated with a constrained entity or
13278 // the constraint expression of a concept. This includes the checks that
13279 // atomic constraints have the type 'bool' and that they can be constant
13280 // evaluated.
13282
13283 // We are substituting template arguments into a constraint expression.
13285
13286 // Instantiating a Requires Expression parameter clause.
13288
13289 // We are substituting into the parameter mapping of an atomic constraint
13290 // during normalization.
13292
13293 /// We are rewriting a comparison operator in terms of an operator<=>.
13295
13296 /// We are initializing a structured binding.
13298
13299 /// We are marking a class as __dllexport.
13301
13302 /// We are building an implied call from __builtin_dump_struct. The
13303 /// arguments are in CallArgs.
13305
13306 /// Added for Template instantiation observation.
13307 /// Memoization means we are _not_ instantiating a template because
13308 /// it is already instantiated (but we entered a context where we
13309 /// would have had to if it was not already instantiated).
13311
13312 /// We are building deduction guides for a class.
13314
13315 /// We are instantiating a type alias template declaration.
13317
13318 /// We are performing partial ordering for template template parameters.
13320
13321 /// We are performing name lookup for a function template or variable
13322 /// template named 'sycl_kernel_launch'.
13324
13325 /// We are performing overload resolution for a call to a function
13326 /// template or variable template named 'sycl_kernel_launch'.
13328
13329 /// We are instantiating an expansion statement.
13331 } Kind;
13332
13333 /// Whether we're substituting into constraints.
13335
13336 /// Whether we're substituting into the parameter mapping of a constraint.
13338
13339 /// The point of instantiation or synthesis within the source code.
13341
13342 /// The entity that is being synthesized.
13344
13345 /// The template (or partial specialization) in which we are
13346 /// performing the instantiation, for substitutions of prior template
13347 /// arguments.
13349
13350 union {
13351 /// The list of template arguments we are substituting, if they
13352 /// are not part of the entity.
13354
13355 /// The list of argument expressions in a synthesized call.
13356 const Expr *const *CallArgs;
13357 };
13358
13359 // FIXME: Wrap this union around more members, or perhaps store the
13360 // kind-specific members in the RAII object owning the context.
13361 union {
13362 /// The number of template arguments in TemplateArgs.
13364
13365 /// The number of expressions in CallArgs.
13366 unsigned NumCallArgs;
13367
13368 /// The special member being declared or defined.
13370 };
13371
13376
13377 /// The source range that covers the construct that cause
13378 /// the instantiation, e.g., the template-id that causes a class
13379 /// template instantiation.
13381
13386
13387 /// Determines whether this template is an actual instantiation
13388 /// that should be counted toward the maximum instantiation depth.
13389 bool isInstantiationRecord() const;
13390 };
13391
13392 /// A stack object to be created when performing template
13393 /// instantiation.
13394 ///
13395 /// Construction of an object of type \c InstantiatingTemplate
13396 /// pushes the current instantiation onto the stack of active
13397 /// instantiations. If the size of this stack exceeds the maximum
13398 /// number of recursive template instantiations, construction
13399 /// produces an error and evaluates true.
13400 ///
13401 /// Destruction of this object will pop the named instantiation off
13402 /// the stack.
13404 /// Note that we are instantiating a class template,
13405 /// function template, variable template, alias template,
13406 /// or a member thereof.
13407 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13408 Decl *Entity,
13409 SourceRange InstantiationRange = SourceRange());
13410
13412 /// Note that we are instantiating an exception specification
13413 /// of a function template.
13414 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13416 SourceRange InstantiationRange = SourceRange());
13417
13418 /// Note that we are instantiating a type alias template declaration.
13419 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13420 TypeAliasTemplateDecl *Entity,
13421 ArrayRef<TemplateArgument> TemplateArgs,
13422 SourceRange InstantiationRange = SourceRange());
13423
13424 /// Note that we are instantiating a default argument in a
13425 /// template-id.
13426 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13428 ArrayRef<TemplateArgument> TemplateArgs,
13429 SourceRange InstantiationRange = SourceRange());
13430
13431 /// Note that we are substituting either explicitly-specified or
13432 /// deduced template arguments during function template argument deduction.
13433 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13435 ArrayRef<TemplateArgument> TemplateArgs,
13437 SourceRange InstantiationRange = SourceRange());
13438
13439 /// Note that we are instantiating as part of template
13440 /// argument deduction for a class template declaration.
13441 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13443 ArrayRef<TemplateArgument> TemplateArgs,
13444 SourceRange InstantiationRange = SourceRange());
13445
13446 /// Note that we are instantiating as part of template
13447 /// argument deduction for a class template partial
13448 /// specialization.
13449 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13451 ArrayRef<TemplateArgument> TemplateArgs,
13452 SourceRange InstantiationRange = SourceRange());
13453
13454 /// Note that we are instantiating as part of template
13455 /// argument deduction for a variable template partial
13456 /// specialization.
13457 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13459 ArrayRef<TemplateArgument> TemplateArgs,
13460 SourceRange InstantiationRange = SourceRange());
13461
13462 /// Note that we are instantiating a default argument for a function
13463 /// parameter.
13464 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13465 ParmVarDecl *Param,
13466 ArrayRef<TemplateArgument> TemplateArgs,
13467 SourceRange InstantiationRange = SourceRange());
13468
13469 /// Note that we are substituting prior template arguments into a
13470 /// non-type parameter.
13471 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13473 ArrayRef<TemplateArgument> TemplateArgs,
13474 SourceRange InstantiationRange);
13475
13476 /// Note that we are substituting prior template arguments into a
13477 /// template template parameter.
13478 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13480 ArrayRef<TemplateArgument> TemplateArgs,
13481 SourceRange InstantiationRange);
13482
13483 /// Note that we are checking the default template argument
13484 /// against the template parameter for a given template-id.
13485 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13487 ArrayRef<TemplateArgument> TemplateArgs,
13488 SourceRange InstantiationRange);
13489
13491 /// \brief Note that we are checking the constraints associated with some
13492 /// constrained entity (a concept declaration or a template with associated
13493 /// constraints).
13494 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13496 ArrayRef<TemplateArgument> TemplateArgs,
13497 SourceRange InstantiationRange);
13498
13500 /// \brief Note that we are checking a constraint expression associated
13501 /// with a template declaration or as part of the satisfaction check of a
13502 /// concept.
13503 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13505 SourceRange InstantiationRange);
13506
13508 /// \brief Note that we are subtituting into the parameter mapping of an
13509 /// atomic constraint during constraint normalization.
13510 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13512 SourceRange InstantiationRange);
13513
13514 /// \brief Note that we are substituting template arguments into a part of
13515 /// a requirement of a requires expression.
13516 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13518 SourceRange InstantiationRange = SourceRange());
13519
13520 /// \brief Note that we are substituting the body of an expansion statement.
13521 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13522 CXXExpansionStmtPattern *ExpansionStmt,
13524 SourceRange InstantiationRange);
13525
13526 /// \brief Note that we are checking the satisfaction of the constraint
13527 /// expression inside of a nested requirement.
13528 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13530 SourceRange InstantiationRange = SourceRange());
13531
13532 /// \brief Note that we are checking a requires clause.
13533 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13534 const RequiresExpr *E,
13535 SourceRange InstantiationRange);
13536
13538 /// \brief Note that we are building deduction guides.
13539 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13541 SourceRange InstantiationRange = SourceRange());
13542
13544 /// \brief Note that we are partial ordering template template parameters.
13545 InstantiatingTemplate(Sema &SemaRef, SourceLocation ArgLoc,
13547 SourceRange InstantiationRange = SourceRange());
13548
13549 /// Note that we have finished instantiating this template.
13550 void Clear();
13551
13553
13554 /// Determines whether we have exceeded the maximum
13555 /// recursive template instantiations.
13556 bool isInvalid() const { return Invalid; }
13557
13558 private:
13559 Sema &SemaRef;
13560 bool Invalid;
13561
13564 SourceLocation PointOfInstantiation,
13565 SourceRange InstantiationRange, Decl *Entity,
13566 NamedDecl *Template = nullptr,
13567 ArrayRef<TemplateArgument> TemplateArgs = {});
13568
13570
13571 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13572 };
13573
13574 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13575 const MultiLevelTemplateArgumentList &TemplateArgs,
13576 TemplateArgumentLoc &Output,
13577 SourceLocation Loc = {},
13578 const DeclarationName &Entity = {});
13579 bool
13580 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13581 const MultiLevelTemplateArgumentList &TemplateArgs,
13582 TemplateArgumentListInfo &Outputs);
13583
13584 /// Substitute concept template arguments in the constraint expression
13585 /// of a concept-id. This is used to implement [temp.constr.normal].
13587 SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE,
13588 const Expr *ConstraintExpr,
13589 const MultiLevelTemplateArgumentList &MLTAL);
13590
13592 ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
13593 const MultiLevelTemplateArgumentList &TemplateArgs,
13594 TemplateArgumentListInfo &Out);
13595
13596 /// Retrieve the template argument list(s) that should be used to
13597 /// instantiate the definition of the given declaration.
13598 ///
13599 /// \param ND the declaration for which we are computing template
13600 /// instantiation arguments.
13601 ///
13602 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13603 /// the decl context where it will be created. In this case, the `Innermost`
13604 /// should likely be provided. If ND is non-null, this is ignored.
13605 ///
13606 /// \param Innermost if non-NULL, specifies a template argument list for the
13607 /// template declaration passed as ND.
13608 ///
13609 /// \param RelativeToPrimary true if we should get the template
13610 /// arguments relative to the primary template, even when we're
13611 /// dealing with a specialization. This is only relevant for function
13612 /// template specializations.
13613 ///
13614 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13615 /// instantiating the definition of the given declaration, \p ND. This is
13616 /// used to determine the proper set of template instantiation arguments for
13617 /// friend function template specializations.
13618 ///
13619 /// \param ForConstraintInstantiation when collecting arguments,
13620 /// ForConstraintInstantiation indicates we should continue looking when
13621 /// encountering a lambda generic call operator, and continue looking for
13622 /// arguments on an enclosing class template.
13623 ///
13624 /// \param SkipForSpecialization when specified, any template specializations
13625 /// in a traversal would be ignored.
13626 ///
13627 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13628 /// when encountering a specialized member function template, rather than
13629 /// returning immediately.
13630 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13631 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13632 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13633 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13634 bool ForConstraintInstantiation = false,
13635 bool SkipForSpecialization = false,
13636 bool ForDefaultArgumentSubstitution = false);
13637
13638 /// RAII object to handle the state changes required to synthesize
13639 /// a function body.
13641 Sema &S;
13642 Sema::ContextRAII SavedContext;
13643 bool PushedCodeSynthesisContext = false;
13644
13645 public:
13647 : S(S), SavedContext(S, DC) {
13648 auto *FD = dyn_cast<FunctionDecl>(DC);
13649 S.PushFunctionScope();
13650 S.PushExpressionEvaluationContextForFunction(
13652 if (FD)
13653 FD->setWillHaveBody(true);
13654 else
13655 assert(isa<ObjCMethodDecl>(DC));
13656 }
13657
13659 assert(!PushedCodeSynthesisContext);
13660
13663 Ctx.PointOfInstantiation = UseLoc;
13664 Ctx.Entity = cast<Decl>(S.CurContext);
13665 S.pushCodeSynthesisContext(Ctx);
13666
13667 PushedCodeSynthesisContext = true;
13668 }
13669
13671 if (PushedCodeSynthesisContext)
13672 S.popCodeSynthesisContext();
13673 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13674 FD->setWillHaveBody(false);
13675 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13676 }
13677 S.PopExpressionEvaluationContext();
13678 S.PopFunctionScopeInfo();
13679 }
13680
13684 };
13685
13686 /// RAII object to ensure that a code synthesis context is popped on scope
13687 /// exit.
13689 Sema &S;
13690
13691 public:
13693 : S(S) {
13694 S.pushCodeSynthesisContext(Ctx);
13695 }
13696
13697 ~ScopedCodeSynthesisContext() { S.popCodeSynthesisContext(); }
13701 };
13702
13703 /// List of active code synthesis contexts.
13704 ///
13705 /// This vector is treated as a stack. As synthesis of one entity requires
13706 /// synthesis of another, additional contexts are pushed onto the stack.
13708
13709 /// Specializations whose definitions are currently being instantiated.
13710 llvm::DenseSet<InstantiatingSpecializationsKey> InstantiatingSpecializations;
13711
13712 /// Non-dependent types used in templates that have already been instantiated
13713 /// by some template instantiation.
13714 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13715
13716 /// Extra modules inspected when performing a lookup during a template
13717 /// instantiation. Computed lazily.
13719
13720 /// Cache of additional modules that should be used for name lookup
13721 /// within the current template instantiation. Computed lazily; use
13722 /// getLookupModules() to get a complete set.
13723 llvm::DenseSet<Module *> LookupModulesCache;
13724
13725 /// Map from the most recent declaration of a namespace to the most
13726 /// recent visible declaration of that namespace.
13727 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13728
13730
13731 /// The number of \p CodeSynthesisContexts that are not template
13732 /// instantiations and, therefore, should not be counted as part of the
13733 /// instantiation depth.
13734 ///
13735 /// When the instantiation depth reaches the user-configurable limit
13736 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13737 // FIXME: Should we have a similar limit for other forms of synthesis?
13739
13740 /// The depth of the context stack at the point when the most recent
13741 /// error or warning was produced.
13742 ///
13743 /// This value is used to suppress printing of redundant context stacks
13744 /// when there are multiple errors or warnings in the same instantiation.
13745 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13747
13748 /// The current index into pack expansion arguments that will be
13749 /// used for substitution of parameter packs.
13750 ///
13751 /// The pack expansion index will be none to indicate that parameter packs
13752 /// should be instantiated as themselves. Otherwise, the index specifies
13753 /// which argument within the parameter pack will be used for substitution.
13755
13756 /// RAII object used to change the argument pack substitution index
13757 /// within a \c Sema object.
13758 ///
13759 /// See \c ArgPackSubstIndex for more information.
13761 Sema &Self;
13762 UnsignedOrNone OldSubstIndex;
13763
13764 public:
13766 : Self(Self),
13767 OldSubstIndex(std::exchange(Self.ArgPackSubstIndex, NewSubstIndex)) {}
13768
13769 ~ArgPackSubstIndexRAII() { Self.ArgPackSubstIndex = OldSubstIndex; }
13772 };
13773
13776
13787 /// Prints the current instantiation stack through a series of
13788 /// notes.
13793
13794 /// Returns a pointer to the current SFINAE context, if any.
13795 [[nodiscard]] SFINAETrap *getSFINAEContext() const {
13796 return CurrentSFINAEContext;
13797 }
13798 [[nodiscard]] bool isSFINAEContext() const {
13799 return CurrentSFINAEContext != nullptr;
13800 }
13801
13802 /// Perform substitution on the type T with a given set of template
13803 /// arguments.
13804 ///
13805 /// This routine substitutes the given template arguments into the
13806 /// type T and produces the instantiated type.
13807 ///
13808 /// \param T the type into which the template arguments will be
13809 /// substituted. If this type is not dependent, it will be returned
13810 /// immediately.
13811 ///
13812 /// \param Args the template arguments that will be
13813 /// substituted for the top-level template parameters within T.
13814 ///
13815 /// \param Loc the location in the source code where this substitution
13816 /// is being performed. It will typically be the location of the
13817 /// declarator (if we're instantiating the type of some declaration)
13818 /// or the location of the type in the source code (if, e.g., we're
13819 /// instantiating the type of a cast expression).
13820 ///
13821 /// \param Entity the name of the entity associated with a declaration
13822 /// being instantiated (if any). May be empty to indicate that there
13823 /// is no such entity (if, e.g., this is a type that occurs as part of
13824 /// a cast expression) or that the entity has no name (e.g., an
13825 /// unnamed function parameter).
13826 ///
13827 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13828 /// acceptable as the top level type of the result.
13829 ///
13830 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13831 /// whenever substitution would perform a replacement with a null or
13832 /// non-existent template argument.
13833 ///
13834 /// \returns If the instantiation succeeds, the instantiated
13835 /// type. Otherwise, produces diagnostics and returns a NULL type.
13837 const MultiLevelTemplateArgumentList &TemplateArgs,
13838 SourceLocation Loc, DeclarationName Entity,
13839 bool AllowDeducedTST = false);
13840
13842 const MultiLevelTemplateArgumentList &TemplateArgs,
13843 SourceLocation Loc, DeclarationName Entity,
13844 bool *IsIncompleteSubstitution = nullptr);
13845
13847 const MultiLevelTemplateArgumentList &TemplateArgs,
13848 SourceLocation Loc, DeclarationName Entity);
13849
13852 const MultiLevelTemplateArgumentList &TemplateArgs,
13853 SourceLocation Loc, DeclarationName Entity);
13854
13855 /// A form of SubstType intended specifically for instantiating the
13856 /// type of a FunctionDecl. Its purpose is solely to force the
13857 /// instantiation of default-argument expressions and to avoid
13858 /// instantiating an exception-specification.
13860 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13861 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13862 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13864 const MultiLevelTemplateArgumentList &Args);
13867 SmallVectorImpl<QualType> &ExceptionStorage,
13868 const MultiLevelTemplateArgumentList &Args);
13869 ParmVarDecl *
13871 const MultiLevelTemplateArgumentList &TemplateArgs,
13872 int indexAdjustment, UnsignedOrNone NumExpansions,
13873 bool ExpectParameterPack, bool EvaluateConstraints = true);
13874
13875 /// Substitute the given template arguments into the given set of
13876 /// parameters, producing the set of parameter types that would be generated
13877 /// from such a substitution.
13879 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13880 const MultiLevelTemplateArgumentList &TemplateArgs,
13881 SmallVectorImpl<QualType> &ParamTypes,
13883 ExtParameterInfoBuilder &ParamInfos);
13884
13885 /// Substitute the given template arguments into the default argument.
13887 const MultiLevelTemplateArgumentList &TemplateArgs,
13888 bool ForCallExpr = false);
13890 const MultiLevelTemplateArgumentList &TemplateArgs);
13891 /// Substitute an expression as if it is a address-of-operand, which makes it
13892 /// act like a CXXIdExpression rather than an attempt to call.
13894 const MultiLevelTemplateArgumentList &TemplateArgs);
13895
13896 // Must be used instead of SubstExpr at 'constraint checking' time.
13899 const MultiLevelTemplateArgumentList &TemplateArgs);
13900 // Unlike the above, this does not evaluate constraints.
13902 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13903
13904 /// Substitute the given template arguments into a list of
13905 /// expressions, expanding pack expansions if required.
13906 ///
13907 /// \param Exprs The list of expressions to substitute into.
13908 ///
13909 /// \param IsCall Whether this is some form of call, in which case
13910 /// default arguments will be dropped.
13911 ///
13912 /// \param TemplateArgs The set of template arguments to substitute.
13913 ///
13914 /// \param Outputs Will receive all of the substituted arguments.
13915 ///
13916 /// \returns true if an error occurred, false otherwise.
13917 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13918 const MultiLevelTemplateArgumentList &TemplateArgs,
13919 SmallVectorImpl<Expr *> &Outputs);
13920
13922 const MultiLevelTemplateArgumentList &TemplateArgs);
13923
13926 bool CXXDirectInit);
13927
13928 /// Perform substitution on the base class specifiers of the
13929 /// given class template specialization.
13930 ///
13931 /// Produces a diagnostic and returns true on error, returns false and
13932 /// attaches the instantiated base classes to the class template
13933 /// specialization if successful.
13934 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13935 const MultiLevelTemplateArgumentList &TemplateArgs);
13936
13937 /// Instantiate the definition of a class from a given pattern.
13938 ///
13939 /// \param PointOfInstantiation The point of instantiation within the
13940 /// source code.
13941 ///
13942 /// \param Instantiation is the declaration whose definition is being
13943 /// instantiated. This will be either a class template specialization
13944 /// or a member class of a class template specialization.
13945 ///
13946 /// \param Pattern is the pattern from which the instantiation
13947 /// occurs. This will be either the declaration of a class template or
13948 /// the declaration of a member class of a class template.
13949 ///
13950 /// \param TemplateArgs The template arguments to be substituted into
13951 /// the pattern.
13952 ///
13953 /// \param TSK the kind of implicit or explicit instantiation to perform.
13954 ///
13955 /// \param Complain whether to complain if the class cannot be instantiated
13956 /// due to the lack of a definition.
13957 ///
13958 /// \returns true if an error occurred, false otherwise.
13959 bool InstantiateClass(SourceLocation PointOfInstantiation,
13960 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13961 const MultiLevelTemplateArgumentList &TemplateArgs,
13962 TemplateSpecializationKind TSK, bool Complain = true);
13963
13964private:
13965 bool InstantiateClassImpl(SourceLocation PointOfInstantiation,
13966 CXXRecordDecl *Instantiation,
13967 CXXRecordDecl *Pattern,
13968 const MultiLevelTemplateArgumentList &TemplateArgs,
13969 TemplateSpecializationKind TSK, bool Complain);
13970
13971public:
13972 /// Instantiate the definition of an enum from a given pattern.
13973 ///
13974 /// \param PointOfInstantiation The point of instantiation within the
13975 /// source code.
13976 /// \param Instantiation is the declaration whose definition is being
13977 /// instantiated. This will be a member enumeration of a class
13978 /// temploid specialization, or a local enumeration within a
13979 /// function temploid specialization.
13980 /// \param Pattern The templated declaration from which the instantiation
13981 /// occurs.
13982 /// \param TemplateArgs The template arguments to be substituted into
13983 /// the pattern.
13984 /// \param TSK The kind of implicit or explicit instantiation to perform.
13985 ///
13986 /// \return \c true if an error occurred, \c false otherwise.
13987 bool InstantiateEnum(SourceLocation PointOfInstantiation,
13988 EnumDecl *Instantiation, EnumDecl *Pattern,
13989 const MultiLevelTemplateArgumentList &TemplateArgs,
13991
13992 /// Instantiate the definition of a field from the given pattern.
13993 ///
13994 /// \param PointOfInstantiation The point of instantiation within the
13995 /// source code.
13996 /// \param Instantiation is the declaration whose definition is being
13997 /// instantiated. This will be a class of a class temploid
13998 /// specialization, or a local enumeration within a function temploid
13999 /// specialization.
14000 /// \param Pattern The templated declaration from which the instantiation
14001 /// occurs.
14002 /// \param TemplateArgs The template arguments to be substituted into
14003 /// the pattern.
14004 ///
14005 /// \return \c true if an error occurred, \c false otherwise.
14007 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
14008 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
14009
14011 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec);
14012
14014 SourceLocation PointOfInstantiation,
14015 ClassTemplateSpecializationDecl *ClassTemplateSpec,
14016 TemplateSpecializationKind TSK, bool Complain,
14017 bool PrimaryStrictPackMatch);
14018
14019 /// Instantiates the definitions of all of the member
14020 /// of the given class, which is an instantiation of a class template
14021 /// or a member class of a template.
14022 void
14023 InstantiateClassMembers(SourceLocation PointOfInstantiation,
14024 CXXRecordDecl *Instantiation,
14025 const MultiLevelTemplateArgumentList &TemplateArgs,
14027
14028 /// Instantiate the definitions of all of the members of the
14029 /// given class template specialization, which was named as part of an
14030 /// explicit instantiation.
14032 SourceLocation PointOfInstantiation,
14033 ClassTemplateSpecializationDecl *ClassTemplateSpec,
14035
14038 const MultiLevelTemplateArgumentList &TemplateArgs);
14039
14040 /// Do template substitution on declaration name info.
14043 const MultiLevelTemplateArgumentList &TemplateArgs);
14045 SubstTemplateName(SourceLocation TemplateKWLoc,
14046 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
14047 SourceLocation NameLoc,
14048 const MultiLevelTemplateArgumentList &TemplateArgs);
14049
14051 const MultiLevelTemplateArgumentList &TemplateArgs,
14052 bool EvaluateConstraint);
14053
14054 /// Determine whether we are currently performing template instantiation.
14057 }
14058
14059 /// Determine whether we are currently performing constraint substitution.
14061 return !CodeSynthesisContexts.empty() &&
14062 CodeSynthesisContexts.back().InConstraintSubstitution;
14063 }
14064
14066 return !CodeSynthesisContexts.empty() &&
14067 CodeSynthesisContexts.back().InParameterMappingSubstitution &&
14069 }
14070
14071 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
14072
14073 /// \brief create a Requirement::SubstitutionDiagnostic with only a
14074 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
14077
14078 ///@}
14079
14080 //
14081 //
14082 // -------------------------------------------------------------------------
14083 //
14084 //
14085
14086 /// \name C++ Template Declaration Instantiation
14087 /// Implementations are in SemaTemplateInstantiateDecl.cpp
14088 ///@{
14089
14090public:
14091 /// An entity for which implicit template instantiation is required.
14092 ///
14093 /// The source location associated with the declaration is the first place in
14094 /// the source code where the declaration was "used". It is not necessarily
14095 /// the point of instantiation (which will be either before or after the
14096 /// namespace-scope declaration that triggered this implicit instantiation),
14097 /// However, it is the location that diagnostics should generally refer to,
14098 /// because users will need to know what code triggered the instantiation.
14099 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
14100
14101 /// The queue of implicit template instantiations that are required
14102 /// but have not yet been performed.
14103 std::deque<PendingImplicitInstantiation> PendingInstantiations;
14104
14105 /// Queue of implicit template instantiations that cannot be performed
14106 /// eagerly.
14108
14112
14113 /// The queue of implicit template instantiations that are required
14114 /// and must be performed within the current local scope.
14115 ///
14116 /// This queue is only used for member functions of local classes in
14117 /// templates, which must be instantiated in the same scope as their
14118 /// enclosing function, so that they can reference function-local
14119 /// types, static variables, enumerators, etc.
14120 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
14121
14123 public:
14125 : S(S), AtEndOfTU(AtEndOfTU) {
14126 SavedPendingLocalImplicitInstantiations.swap(
14127 S.PendingLocalImplicitInstantiations);
14128 }
14129
14130 void perform() {
14131 S.PerformPendingInstantiations(/*LocalOnly=*/true,
14132 /*AtEndOfTU=*/AtEndOfTU);
14133 }
14134
14136 assert(S.PendingLocalImplicitInstantiations.empty() &&
14137 "there shouldn't be any pending local implicit instantiations");
14138 SavedPendingLocalImplicitInstantiations.swap(
14139 S.PendingLocalImplicitInstantiations);
14140 }
14141
14145
14146 private:
14147 Sema &S;
14148 bool AtEndOfTU;
14149 std::deque<PendingImplicitInstantiation>
14150 SavedPendingLocalImplicitInstantiations;
14151 };
14152
14153 /// Records and restores the CurFPFeatures state on entry/exit of compound
14154 /// statements.
14156 public:
14161 FPOptionsOverride getOverrides() { return OldOverrides; }
14162
14163 private:
14164 Sema &S;
14165 FPOptions OldFPFeaturesState;
14166 FPOptionsOverride OldOverrides;
14167 LangOptions::FPEvalMethodKind OldEvalMethod;
14168 SourceLocation OldFPPragmaLocation;
14169 };
14170
14172 public:
14173 GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
14174 : S(S), Enabled(Enabled), AtEndOfTU(AtEndOfTU) {
14175 if (!Enabled)
14176 return;
14177
14178 S.SavedPendingInstantiations.emplace_back();
14179 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
14180
14181 S.SavedVTableUses.emplace_back();
14182 S.SavedVTableUses.back().swap(S.VTableUses);
14183 }
14184
14185 void perform() {
14186 if (Enabled) {
14187 S.DefineUsedVTables();
14188 S.PerformPendingInstantiations(/*LocalOnly=*/false,
14189 /*AtEndOfTU=*/AtEndOfTU);
14190 }
14191 }
14192
14194 if (!Enabled)
14195 return;
14196
14197 // Restore the set of pending vtables.
14198 assert(S.VTableUses.empty() &&
14199 "VTableUses should be empty before it is discarded.");
14200 S.VTableUses.swap(S.SavedVTableUses.back());
14201 S.SavedVTableUses.pop_back();
14202
14203 // Restore the set of pending implicit instantiations.
14204 if ((S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) &&
14205 AtEndOfTU) {
14206 assert(S.PendingInstantiations.empty() &&
14207 "PendingInstantiations should be empty before it is discarded.");
14208 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14209 S.SavedPendingInstantiations.pop_back();
14210 } else {
14211 // Template instantiations in the PCH may be delayed until the TU.
14212 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
14213 S.PendingInstantiations.insert(
14214 S.PendingInstantiations.end(),
14215 S.SavedPendingInstantiations.back().begin(),
14216 S.SavedPendingInstantiations.back().end());
14217 S.SavedPendingInstantiations.pop_back();
14218 }
14219 }
14220
14222 delete;
14225
14226 private:
14227 Sema &S;
14228 bool Enabled;
14229 bool AtEndOfTU;
14230 };
14231
14233 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
14234
14245
14246 /// Recheck instantiated thread-safety attributes that could not be validated
14247 /// on the dependent pattern declaration.
14248 bool checkInstantiatedThreadSafetyAttrs(const Decl *D, const Attr *A);
14249
14250 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
14251 const Decl *Pattern, Decl *Inst,
14252 LateInstantiatedAttrVec *LateAttrs = nullptr,
14253 LocalInstantiationScope *OuterMostScope = nullptr);
14254
14255 /// Update instantiation attributes after template was late parsed.
14256 ///
14257 /// Some attributes are evaluated based on the body of template. If it is
14258 /// late parsed, such attributes cannot be evaluated when declaration is
14259 /// instantiated. This function is used to update instantiation attributes
14260 /// when template definition is ready.
14261 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
14262
14263 void
14265 const Decl *Pattern, Decl *Inst,
14266 LateInstantiatedAttrVec *LateAttrs = nullptr,
14267 LocalInstantiationScope *OuterMostScope = nullptr);
14268
14270 bool IsCopy = false);
14271
14273 ParmVarDecl *Param);
14274 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
14276
14277 /// Instantiate (or find existing instantiation of) a function template with a
14278 /// given set of template arguments.
14279 ///
14280 /// Usually this should not be used, and template argument deduction should be
14281 /// used in its place.
14284 SourceLocation Loc,
14287
14288 /// Instantiate the definition of the given function from its
14289 /// template.
14290 ///
14291 /// \param PointOfInstantiation the point at which the instantiation was
14292 /// required. Note that this is not precisely a "point of instantiation"
14293 /// for the function, but it's close.
14294 ///
14295 /// \param Function the already-instantiated declaration of a
14296 /// function template specialization or member function of a class template
14297 /// specialization.
14298 ///
14299 /// \param Recursive if true, recursively instantiates any functions that
14300 /// are required by this instantiation.
14301 ///
14302 /// \param DefinitionRequired if true, then we are performing an explicit
14303 /// instantiation where the body of the function is required. Complain if
14304 /// there is no such body.
14305 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
14307 bool Recursive = false,
14308 bool DefinitionRequired = false,
14309 bool AtEndOfTU = false);
14312 const TemplateArgumentList *PartialSpecArgs,
14314 SourceLocation PointOfInstantiation,
14315 LateInstantiatedAttrVec *LateAttrs = nullptr,
14316 LocalInstantiationScope *StartingScope = nullptr);
14317
14318 /// Instantiates a variable template specialization by completing it
14319 /// with appropriate type information and initializer.
14321 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
14322 const MultiLevelTemplateArgumentList &TemplateArgs);
14323
14324 /// BuildVariableInstantiation - Used after a new variable has been created.
14325 /// Sets basic variable data and decides whether to postpone the
14326 /// variable instantiation.
14327 void
14329 const MultiLevelTemplateArgumentList &TemplateArgs,
14330 LateInstantiatedAttrVec *LateAttrs,
14331 DeclContext *Owner,
14332 LocalInstantiationScope *StartingScope,
14333 bool InstantiatingVarTemplate = false,
14334 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
14335
14336 /// Instantiate the initializer of a variable.
14338 VarDecl *Var, VarDecl *OldVar,
14339 const MultiLevelTemplateArgumentList &TemplateArgs);
14340
14341 /// Instantiate the definition of the given variable from its
14342 /// template.
14343 ///
14344 /// \param PointOfInstantiation the point at which the instantiation was
14345 /// required. Note that this is not precisely a "point of instantiation"
14346 /// for the variable, but it's close.
14347 ///
14348 /// \param Var the already-instantiated declaration of a templated variable.
14349 ///
14350 /// \param Recursive if true, recursively instantiates any functions that
14351 /// are required by this instantiation.
14352 ///
14353 /// \param DefinitionRequired if true, then we are performing an explicit
14354 /// instantiation where a definition of the variable is required. Complain
14355 /// if there is no such definition.
14356 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
14357 VarDecl *Var, bool Recursive = false,
14358 bool DefinitionRequired = false,
14359 bool AtEndOfTU = false);
14360
14363 const MultiLevelTemplateArgumentList &TemplateArgs);
14364
14365 /// Find the instantiation of the given declaration within the
14366 /// current instantiation.
14367 ///
14368 /// This routine is intended to be used when \p D is a declaration
14369 /// referenced from within a template, that needs to mapped into the
14370 /// corresponding declaration within an instantiation. For example,
14371 /// given:
14372 ///
14373 /// \code
14374 /// template<typename T>
14375 /// struct X {
14376 /// enum Kind {
14377 /// KnownValue = sizeof(T)
14378 /// };
14379 ///
14380 /// bool getKind() const { return KnownValue; }
14381 /// };
14382 ///
14383 /// template struct X<int>;
14384 /// \endcode
14385 ///
14386 /// In the instantiation of X<int>::getKind(), we need to map the \p
14387 /// EnumConstantDecl for \p KnownValue (which refers to
14388 /// X<T>::<Kind>::KnownValue) to its instantiation
14389 /// (X<int>::<Kind>::KnownValue).
14390 /// \p FindInstantiatedDecl performs this mapping from within the
14391 /// instantiation of X<int>.
14392 NamedDecl *
14394 const MultiLevelTemplateArgumentList &TemplateArgs,
14395 bool FindingInstantiatedContext = false);
14396
14397 /// Finds the instantiation of the given declaration context
14398 /// within the current instantiation.
14399 ///
14400 /// \returns NULL if there was an error
14401 DeclContext *
14403 const MultiLevelTemplateArgumentList &TemplateArgs);
14404
14405 Decl *SubstDecl(Decl *D, DeclContext *Owner,
14406 const MultiLevelTemplateArgumentList &TemplateArgs);
14407
14408 /// Substitute the name and return type of a defaulted 'operator<=>' to form
14409 /// an implicit 'operator=='.
14411 FunctionDecl *Spaceship);
14412
14413 /// Performs template instantiation for all implicit template
14414 /// instantiations we have seen until this point.
14415 void PerformPendingInstantiations(bool LocalOnly = false,
14416 bool AtEndOfTU = true);
14417
14420 const MultiLevelTemplateArgumentList &TemplateArgs,
14421 bool EvaluateConstraints = true);
14422
14424 const DeclContext *Pattern,
14425 const MultiLevelTemplateArgumentList &TemplateArgs);
14426
14427private:
14428 /// Introduce the instantiated local variables into the local
14429 /// instantiation scope.
14430 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
14431 const FunctionDecl *PatternDecl,
14433 /// Introduce the instantiated function parameters into the local
14434 /// instantiation scope, and set the parameter names to those used
14435 /// in the template.
14436 bool addInstantiatedParametersToScope(
14437 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14439 const MultiLevelTemplateArgumentList &TemplateArgs);
14440
14441 /// Introduce the instantiated captures of the lambda into the local
14442 /// instantiation scope.
14443 bool addInstantiatedCapturesToScope(
14444 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14446 const MultiLevelTemplateArgumentList &TemplateArgs);
14447
14448 int ParsingClassDepth = 0;
14449
14450 class SavePendingParsedClassStateRAII {
14451 public:
14452 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14453
14454 ~SavePendingParsedClassStateRAII() {
14455 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14456 "there shouldn't be any pending delayed exception spec checks");
14457 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14458 "there shouldn't be any pending delayed exception spec checks");
14459 swapSavedState();
14460 }
14461
14462 SavePendingParsedClassStateRAII(const SavePendingParsedClassStateRAII &) =
14463 delete;
14464 SavePendingParsedClassStateRAII &
14465 operator=(const SavePendingParsedClassStateRAII &) = delete;
14466
14467 private:
14468 Sema &S;
14470 SavedOverridingExceptionSpecChecks;
14472 SavedEquivalentExceptionSpecChecks;
14473
14474 void swapSavedState() {
14475 SavedOverridingExceptionSpecChecks.swap(
14476 S.DelayedOverridingExceptionSpecChecks);
14477 SavedEquivalentExceptionSpecChecks.swap(
14478 S.DelayedEquivalentExceptionSpecChecks);
14479 }
14480 };
14481
14482 ///@}
14483
14484 //
14485 //
14486 // -------------------------------------------------------------------------
14487 //
14488 //
14489
14490 /// \name C++ Variadic Templates
14491 /// Implementations are in SemaTemplateVariadic.cpp
14492 ///@{
14493
14494public:
14495 /// Determine whether an unexpanded parameter pack might be permitted in this
14496 /// location. Useful for error recovery.
14498
14499 /// The context in which an unexpanded parameter pack is
14500 /// being diagnosed.
14501 ///
14502 /// Note that the values of this enumeration line up with the first
14503 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
14505 /// An arbitrary expression.
14507
14508 /// The base type of a class type.
14510
14511 /// The type of an arbitrary declaration.
14513
14514 /// The type of a data member.
14516
14517 /// The size of a bit-field.
14519
14520 /// The expression in a static assertion.
14522
14523 /// The fixed underlying type of an enumeration.
14525
14526 /// The enumerator value.
14528
14529 /// A using declaration.
14531
14532 /// A friend declaration.
14534
14535 /// A declaration qualifier.
14537
14538 /// An initializer.
14540
14541 /// A default argument.
14543
14544 /// The type of a non-type template parameter.
14546
14547 /// The type of an exception.
14549
14550 /// Explicit specialization.
14552
14553 /// Partial specialization.
14555
14556 /// Microsoft __if_exists.
14558
14559 /// Microsoft __if_not_exists.
14561
14562 /// Lambda expression.
14564
14565 /// Block expression.
14567
14568 /// A type constraint.
14570
14571 // A requirement in a requires-expression.
14573
14574 // A requires-clause.
14576 };
14577
14578 /// Diagnose unexpanded parameter packs.
14579 ///
14580 /// \param Loc The location at which we should emit the diagnostic.
14581 ///
14582 /// \param UPPC The context in which we are diagnosing unexpanded
14583 /// parameter packs.
14584 ///
14585 /// \param Unexpanded the set of unexpanded parameter packs.
14586 ///
14587 /// \returns true if an error occurred, false otherwise.
14591
14592 /// If the given type contains an unexpanded parameter pack,
14593 /// diagnose the error.
14594 ///
14595 /// \param Loc The source location where a diagnostc should be emitted.
14596 ///
14597 /// \param T The type that is being checked for unexpanded parameter
14598 /// packs.
14599 ///
14600 /// \returns true if an error occurred, false otherwise.
14603
14604 /// If the given expression contains an unexpanded parameter
14605 /// pack, diagnose the error.
14606 ///
14607 /// \param E The expression that is being checked for unexpanded
14608 /// parameter packs.
14609 ///
14610 /// \returns true if an error occurred, false otherwise.
14613
14614 /// If the given requirees-expression contains an unexpanded reference to one
14615 /// of its own parameter packs, diagnose the error.
14616 ///
14617 /// \param RE The requiress-expression that is being checked for unexpanded
14618 /// parameter packs.
14619 ///
14620 /// \returns true if an error occurred, false otherwise.
14622
14623 /// If the given nested-name-specifier contains an unexpanded
14624 /// parameter pack, diagnose the error.
14625 ///
14626 /// \param SS The nested-name-specifier that is being checked for
14627 /// unexpanded parameter packs.
14628 ///
14629 /// \returns true if an error occurred, false otherwise.
14632
14633 /// If the given name contains an unexpanded parameter pack,
14634 /// diagnose the error.
14635 ///
14636 /// \param NameInfo The name (with source location information) that
14637 /// is being checked for unexpanded parameter packs.
14638 ///
14639 /// \returns true if an error occurred, false otherwise.
14642
14643 /// If the given template name contains an unexpanded parameter pack,
14644 /// diagnose the error.
14645 ///
14646 /// \param Loc The location of the template name.
14647 ///
14648 /// \param Template The template name that is being checked for unexpanded
14649 /// parameter packs.
14650 ///
14651 /// \returns true if an error occurred, false otherwise.
14655
14656 /// If the given template argument contains an unexpanded parameter
14657 /// pack, diagnose the error.
14658 ///
14659 /// \param Arg The template argument that is being checked for unexpanded
14660 /// parameter packs.
14661 ///
14662 /// \returns true if an error occurred, false otherwise.
14665
14666 /// Collect the set of unexpanded parameter packs within the given
14667 /// template argument.
14668 ///
14669 /// \param Arg The template argument that will be traversed to find
14670 /// unexpanded parameter packs.
14672 TemplateArgument Arg,
14674
14675 /// Collect the set of unexpanded parameter packs within the given
14676 /// template argument.
14677 ///
14678 /// \param Arg The template argument that will be traversed to find
14679 /// unexpanded parameter packs.
14683
14684 /// Collect the set of unexpanded parameter packs within the given
14685 /// type.
14686 ///
14687 /// \param T The type that will be traversed to find
14688 /// unexpanded parameter packs.
14691
14692 /// Collect the set of unexpanded parameter packs within the given
14693 /// template name.
14694 ///
14695 /// \param Template The template name that will be traversed to find
14696 /// unexpanded parameter packs.
14700
14701 /// Collect the set of unexpanded parameter packs within the given
14702 /// type.
14703 ///
14704 /// \param TL The type that will be traversed to find
14705 /// unexpanded parameter packs.
14708
14709 /// Collect the set of unexpanded parameter packs within the given
14710 /// nested-name-specifier.
14711 ///
14712 /// \param NNS The nested-name-specifier that will be traversed to find
14713 /// unexpanded parameter packs.
14717
14718 /// Collect the set of unexpanded parameter packs within the given
14719 /// name.
14720 ///
14721 /// \param NameInfo The name that will be traversed to find
14722 /// unexpanded parameter packs.
14724 const DeclarationNameInfo &NameInfo,
14726
14727 /// Collect the set of unexpanded parameter packs within the given
14728 /// expression.
14731
14732 /// Invoked when parsing a template argument.
14733 ///
14734 /// \param Arg the template argument, which may already be invalid.
14735 ///
14736 /// If it is followed by ellipsis, this function is called before
14737 /// `ActOnPackExpansion`.
14740
14741 /// Invoked when parsing a template argument followed by an
14742 /// ellipsis, which creates a pack expansion.
14743 ///
14744 /// \param Arg The template argument preceding the ellipsis, which
14745 /// may already be invalid.
14746 ///
14747 /// \param EllipsisLoc The location of the ellipsis.
14749 SourceLocation EllipsisLoc);
14750
14751 /// Invoked when parsing a type followed by an ellipsis, which
14752 /// creates a pack expansion.
14753 ///
14754 /// \param Type The type preceding the ellipsis, which will become
14755 /// the pattern of the pack expansion.
14756 ///
14757 /// \param EllipsisLoc The location of the ellipsis.
14759
14760 /// Construct a pack expansion type from the pattern of the pack
14761 /// expansion.
14763 SourceLocation EllipsisLoc,
14764 UnsignedOrNone NumExpansions);
14765
14766 /// Construct a pack expansion type from the pattern of the pack
14767 /// expansion.
14768 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14769 SourceLocation EllipsisLoc,
14770 UnsignedOrNone NumExpansions);
14771
14772 /// Invoked when parsing an expression followed by an ellipsis, which
14773 /// creates a pack expansion.
14774 ///
14775 /// \param Pattern The expression preceding the ellipsis, which will become
14776 /// the pattern of the pack expansion.
14777 ///
14778 /// \param EllipsisLoc The location of the ellipsis.
14779 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14780
14781 /// Invoked when parsing an expression followed by an ellipsis, which
14782 /// creates a pack expansion.
14783 ///
14784 /// \param Pattern The expression preceding the ellipsis, which will become
14785 /// the pattern of the pack expansion.
14786 ///
14787 /// \param EllipsisLoc The location of the ellipsis.
14788 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14789 UnsignedOrNone NumExpansions);
14790
14791 /// Determine whether we could expand a pack expansion with the
14792 /// given set of parameter packs into separate arguments by repeatedly
14793 /// transforming the pattern.
14794 ///
14795 /// \param EllipsisLoc The location of the ellipsis that identifies the
14796 /// pack expansion.
14797 ///
14798 /// \param PatternRange The source range that covers the entire pattern of
14799 /// the pack expansion.
14800 ///
14801 /// \param Unexpanded The set of unexpanded parameter packs within the
14802 /// pattern.
14803 ///
14804 /// \param ShouldExpand Will be set to \c true if the transformer should
14805 /// expand the corresponding pack expansions into separate arguments. When
14806 /// set, \c NumExpansions must also be set.
14807 ///
14808 /// \param RetainExpansion Whether the caller should add an unexpanded
14809 /// pack expansion after all of the expanded arguments. This is used
14810 /// when extending explicitly-specified template argument packs per
14811 /// C++0x [temp.arg.explicit]p9.
14812 ///
14813 /// \param NumExpansions The number of separate arguments that will be in
14814 /// the expanded form of the corresponding pack expansion. This is both an
14815 /// input and an output parameter, which can be set by the caller if the
14816 /// number of expansions is known a priori (e.g., due to a prior substitution)
14817 /// and will be set by the callee when the number of expansions is known.
14818 /// The callee must set this value when \c ShouldExpand is \c true; it may
14819 /// set this value in other cases.
14820 ///
14821 /// \returns true if an error occurred (e.g., because the parameter packs
14822 /// are to be instantiated with arguments of different lengths), false
14823 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14824 /// must be set.
14826 SourceLocation EllipsisLoc, SourceRange PatternRange,
14828 const MultiLevelTemplateArgumentList &TemplateArgs,
14829 bool FailOnPackProducingTemplates, bool &ShouldExpand,
14830 bool &RetainExpansion, UnsignedOrNone &NumExpansions,
14831 bool Diagnose = true);
14832
14833 /// Determine the number of arguments in the given pack expansion
14834 /// type.
14835 ///
14836 /// This routine assumes that the number of arguments in the expansion is
14837 /// consistent across all of the unexpanded parameter packs in its pattern.
14838 ///
14839 /// Returns an empty Optional if the type can't be expanded.
14841 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14842
14845 const MultiLevelTemplateArgumentList &TemplateArgs);
14846
14847 /// Determine whether the given declarator contains any unexpanded
14848 /// parameter packs.
14849 ///
14850 /// This routine is used by the parser to disambiguate function declarators
14851 /// with an ellipsis prior to the ')', e.g.,
14852 ///
14853 /// \code
14854 /// void f(T...);
14855 /// \endcode
14856 ///
14857 /// To determine whether we have an (unnamed) function parameter pack or
14858 /// a variadic function.
14859 ///
14860 /// \returns true if the declarator contains any unexpanded parameter packs,
14861 /// false otherwise.
14863
14864 /// Returns the pattern of the pack expansion for a template argument.
14865 ///
14866 /// \param OrigLoc The template argument to expand.
14867 ///
14868 /// \param Ellipsis Will be set to the location of the ellipsis.
14869 ///
14870 /// \param NumExpansions Will be set to the number of expansions that will
14871 /// be generated from this pack expansion, if known a priori.
14874 SourceLocation &Ellipsis,
14875 UnsignedOrNone &NumExpansions) const;
14876
14877 /// Given a template argument that contains an unexpanded parameter pack, but
14878 /// which has already been substituted, attempt to determine the number of
14879 /// elements that will be produced once this argument is fully-expanded.
14880 ///
14881 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14882 /// avoid actually expanding the pack where possible.
14884
14885 /// Called when an expression computing the size of a parameter pack
14886 /// is parsed.
14887 ///
14888 /// \code
14889 /// template<typename ...Types> struct count {
14890 /// static const unsigned value = sizeof...(Types);
14891 /// };
14892 /// \endcode
14893 ///
14894 //
14895 /// \param OpLoc The location of the "sizeof" keyword.
14896 /// \param Name The name of the parameter pack whose size will be determined.
14897 /// \param NameLoc The source location of the name of the parameter pack.
14898 /// \param RParenLoc The location of the closing parentheses.
14900 IdentifierInfo &Name,
14901 SourceLocation NameLoc,
14902 SourceLocation RParenLoc);
14903
14904 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14905 SourceLocation EllipsisLoc,
14906 SourceLocation LSquareLoc, Expr *IndexExpr,
14907 SourceLocation RSquareLoc);
14908
14909 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14910 SourceLocation EllipsisLoc, Expr *IndexExpr,
14911 SourceLocation RSquareLoc,
14912 ArrayRef<Expr *> ExpandedExprs = {},
14913 bool FullySubstituted = false);
14914
14916 SourceLocation NameLoc,
14917 Expr *IndexExpr);
14918
14920 BuildPackIndexingTemplateName(TemplateName Pattern, Expr *IndexExpr,
14921 bool FullySubstituted = false,
14922 ArrayRef<TemplateName> Expansions = {});
14923
14926 SourceLocation NameLoc);
14927
14928 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14929 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14930 tok::TokenKind Operator,
14931 SourceLocation EllipsisLoc, Expr *RHS,
14932 SourceLocation RParenLoc);
14933 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14934 SourceLocation LParenLoc, Expr *LHS,
14935 BinaryOperatorKind Operator,
14936 SourceLocation EllipsisLoc, Expr *RHS,
14937 SourceLocation RParenLoc,
14938 UnsignedOrNone NumExpansions);
14939 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14940 BinaryOperatorKind Operator);
14941
14942 ///@}
14943
14944 //
14945 //
14946 // -------------------------------------------------------------------------
14947 //
14948 //
14949
14950 /// \name Constraints and Concepts
14951 /// Implementations are in SemaConcept.cpp
14952 ///@{
14953
14954public:
14955 ExprResult ActOnCXXReflectExpr(SourceLocation OpLoc, TypeSourceInfo *TSI);
14956
14957 ExprResult BuildCXXReflectExpr(SourceLocation OperatorLoc,
14958 TypeSourceInfo *TSI);
14959
14960public:
14962 const llvm::FoldingSetNodeID &ID) {
14963 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14964 SatisfactionStack.emplace_back(Can, ID);
14965 }
14966
14967 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14968
14970 const llvm::FoldingSetNodeID &ID) const {
14971 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14972 return llvm::is_contained(SatisfactionStack,
14973 SatisfactionStackEntryTy{Can, ID});
14974 }
14975
14977 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
14978
14979 // Resets the current SatisfactionStack for cases where we are instantiating
14980 // constraints as a 'side effect' of normal instantiation in a way that is not
14981 // indicative of recursive definition.
14984 Sema &SemaRef;
14985
14986 public:
14988 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14989 }
14990
14992 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14993 }
14994
14998 };
14999
15002 SatisfactionStack.swap(NewSS);
15003 }
15004
15006 llvm::PointerUnion<const NamedDecl *,
15008
15009 /// Check whether the given expression is a valid constraint expression.
15010 /// A diagnostic is emitted if it is not, false is returned, and
15011 /// PossibleNonPrimary will be set to true if the failure might be due to a
15012 /// non-primary expression being used as an atomic constraint.
15013 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
15014 bool *PossibleNonPrimary = nullptr,
15015 bool IsTrailingRequiresClause = false);
15016
15017 /// \brief Check whether the given list of constraint expressions are
15018 /// satisfied (as if in a 'conjunction') given template arguments.
15019 /// \param Template the template-like entity that triggered the constraints
15020 /// check (either a concept or a constrained entity).
15021 /// \param ConstraintExprs a list of constraint expressions, treated as if
15022 /// they were 'AND'ed together.
15023 /// \param TemplateArgLists the list of template arguments to substitute into
15024 /// the constraint expression.
15025 /// \param TemplateIDRange The source range of the template id that
15026 /// caused the constraints check.
15027 /// \param Satisfaction if true is returned, will contain details of the
15028 /// satisfaction, with enough information to diagnose an unsatisfied
15029 /// expression.
15030 /// \returns true if an error occurred and satisfaction could not be checked,
15031 /// false otherwise.
15034 ArrayRef<AssociatedConstraint> AssociatedConstraints,
15035 const MultiLevelTemplateArgumentList &TemplateArgLists,
15036 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction,
15037 const ConceptReference *TopLevelConceptId = nullptr,
15038 Expr **ConvertedExpr = nullptr);
15039
15040 /// Check whether the given function decl's trailing requires clause is
15041 /// satisfied, if any. Returns false and updates Satisfaction with the
15042 /// satisfaction verdict if successful, emits a diagnostic and returns true if
15043 /// an error occurred and satisfaction could not be determined.
15044 ///
15045 /// \returns true if an error occurred, false otherwise.
15047 ConstraintSatisfaction &Satisfaction,
15048 SourceLocation UsageLoc = SourceLocation(),
15049 bool ForOverloadResolution = false);
15050
15051 // Calculates whether two constraint expressions are equal irrespective of a
15052 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
15053 // 'New', which are the "source" of the constraint, since this is necessary
15054 // for figuring out the relative 'depth' of the constraint. The depth of the
15055 // 'primary template' and the 'instantiated from' templates aren't necessarily
15056 // the same, such as a case when one is a 'friend' defined in a class.
15058 const Expr *OldConstr,
15060 const Expr *NewConstr);
15061
15062 // Calculates whether the friend function depends on an enclosing template for
15063 // the purposes of [temp.friend] p9.
15065
15066 /// \brief Ensure that the given template arguments satisfy the constraints
15067 /// associated with the given template, emitting a diagnostic if they do not.
15068 ///
15069 /// \param Template The template to which the template arguments are being
15070 /// provided.
15071 ///
15072 /// \param TemplateArgs The converted, canonicalized template arguments.
15073 ///
15074 /// \param TemplateIDRange The source range of the template id that
15075 /// caused the constraints check.
15076 ///
15077 /// \returns true if the constrains are not satisfied or could not be checked
15078 /// for satisfaction, false if the constraints are satisfied.
15081 const MultiLevelTemplateArgumentList &TemplateArgs,
15082 SourceRange TemplateIDRange);
15083
15084 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
15086 ArrayRef<TemplateArgument> TemplateArgs,
15087 ConstraintSatisfaction &Satisfaction);
15088
15089 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15090 /// unsatisfied.
15091 /// \param First whether this is the first time an unsatisfied constraint is
15092 /// diagnosed for this error.
15094 SourceLocation Loc = {},
15095 bool First = true);
15096
15097 /// \brief Emit diagnostics explaining why a constraint expression was deemed
15098 /// unsatisfied.
15099 void
15101 bool First = true);
15102
15104 bool First = true);
15105
15108 ArrayRef<AssociatedConstraint> AssociatedConstraints);
15109
15110 /// \brief Check whether the given declaration's associated constraints are
15111 /// at least as constrained than another declaration's according to the
15112 /// partial ordering of constraints.
15113 ///
15114 /// \param Result If no error occurred, receives the result of true if D1 is
15115 /// at least constrained than D2, and false otherwise.
15116 ///
15117 /// \returns true if an error occurred, false otherwise.
15118 bool IsAtLeastAsConstrained(const NamedDecl *D1,
15120 const NamedDecl *D2,
15122 bool &Result);
15123
15124 /// If D1 was not at least as constrained as D2, but would've been if a pair
15125 /// of atomic constraints involved had been declared in a concept and not
15126 /// repeated in two separate places in code.
15127 /// \returns true if such a diagnostic was emitted, false otherwise.
15131
15132 /// Cache the satisfaction of an atomic constraint.
15133 /// The key is based on the unsubstituted expression and the parameter
15134 /// mapping. This lets us not substituting the mapping more than once,
15135 /// which is (very!) expensive.
15136 /// FIXME: this should be private.
15137 llvm::DenseMap<llvm::FoldingSetNodeID,
15140
15141 /// Cache the instantiation results of template parameter mappings within
15142 /// concepts. Substituting into normalized concepts can be extremely expensive
15143 /// due to the redundancy of template parameters. This cache is intended for
15144 /// use by TemplateInstantiator to avoid redundant semantic checking.
15145 llvm::DenseMap<llvm::FoldingSetNodeID, TemplateArgumentLoc>
15147
15148private:
15149 /// Caches pairs of template-like decls whose associated constraints were
15150 /// checked for subsumption and whether or not the first's constraints did in
15151 /// fact subsume the second's.
15152 llvm::DenseMap<std::pair<const NamedDecl *, const NamedDecl *>, bool>
15153 SubsumptionCache;
15154 /// Caches the normalized associated constraints of declarations (concepts or
15155 /// constrained declarations). If an error occurred while normalizing the
15156 /// associated constraints of the template or concept, nullptr will be cached
15157 /// here.
15158 llvm::DenseMap<ConstrainedDeclOrNestedRequirement, NormalizedConstraint *>
15159 NormalizationCache;
15160
15161 /// Cache whether the associated constraint of a declaration
15162 /// is satisfied.
15163 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
15164 SatisfactionCache;
15165
15166 // The current stack of constraint satisfactions, so we can exit-early.
15168
15169 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to set up the
15170 /// LocalInstantiationScope of the current non-lambda function. For lambdas,
15171 /// use LambdaScopeForCallOperatorInstantiationRAII.
15172 bool
15173 SetupConstraintScope(FunctionDecl *FD,
15174 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15175 const MultiLevelTemplateArgumentList &MLTAL,
15177
15178 /// Used during constraint checking, sets up the constraint template argument
15179 /// lists, and calls SetupConstraintScope to set up the
15180 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
15181 std::optional<MultiLevelTemplateArgumentList>
15182 SetupConstraintCheckingTemplateArgumentsAndScope(
15183 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
15185
15186 ///@}
15187
15188 //
15189 //
15190 // -------------------------------------------------------------------------
15191 //
15192 //
15193
15194 /// \name Types
15195 /// Implementations are in SemaType.cpp
15196 ///@{
15197
15198public:
15199 /// A mapping that describes the nullability we've seen in each header file.
15201
15202 static int getPrintable(int I) { return I; }
15203 static unsigned getPrintable(unsigned I) { return I; }
15204 static bool getPrintable(bool B) { return B; }
15205 static const char *getPrintable(const char *S) { return S; }
15206 static StringRef getPrintable(StringRef S) { return S; }
15207 static const std::string &getPrintable(const std::string &S) { return S; }
15208 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
15209 return II;
15210 }
15212 static QualType getPrintable(QualType T) { return T; }
15213 static SourceRange getPrintable(SourceRange R) { return R; }
15215 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
15217
15218 enum class CompleteTypeKind {
15219 /// Apply the normal rules for complete types. In particular,
15220 /// treat all sizeless types as incomplete.
15222
15223 /// Relax the normal rules for complete types so that they include
15224 /// sizeless built-in types.
15226
15227 // FIXME: Eventually we should flip the default to Normal and opt in
15228 // to AcceptSizeless rather than opt out of it.
15230 };
15231
15233 const DeclSpec *DS = nullptr);
15235 const DeclSpec *DS = nullptr);
15236
15237 /// Build a pointer type.
15238 ///
15239 /// \param T The type to which we'll be building a pointer.
15240 ///
15241 /// \param Loc The location of the entity whose type involves this
15242 /// pointer type or, if there is no such entity, the location of the
15243 /// type that will have pointer type.
15244 ///
15245 /// \param Entity The name of the entity that involves the pointer
15246 /// type, if known.
15247 ///
15248 /// \returns A suitable pointer type, if there are no
15249 /// errors. Otherwise, returns a NULL type.
15251 DeclarationName Entity);
15252
15253 /// Build a reference type.
15254 ///
15255 /// \param T The type to which we'll be building a reference.
15256 ///
15257 /// \param Loc The location of the entity whose type involves this
15258 /// reference type or, if there is no such entity, the location of the
15259 /// type that will have reference type.
15260 ///
15261 /// \param Entity The name of the entity that involves the reference
15262 /// type, if known.
15263 ///
15264 /// \returns A suitable reference type, if there are no
15265 /// errors. Otherwise, returns a NULL type.
15267 DeclarationName Entity);
15268
15269 /// Build an array type.
15270 ///
15271 /// \param T The type of each element in the array.
15272 ///
15273 /// \param ASM C99 array size modifier (e.g., '*', 'static').
15274 ///
15275 /// \param ArraySize Expression describing the size of the array.
15276 ///
15277 /// \param Brackets The range from the opening '[' to the closing ']'.
15278 ///
15279 /// \param Entity The name of the entity that involves the array
15280 /// type, if known.
15281 ///
15282 /// \returns A suitable array type, if there are no errors. Otherwise,
15283 /// returns a NULL type.
15285 unsigned Quals, SourceRange Brackets,
15286 DeclarationName Entity);
15288
15289 /// Build an ext-vector type.
15290 ///
15291 /// Run the required checks for the extended vector type.
15293 SourceLocation AttrLoc);
15294 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
15295 SourceLocation AttrLoc);
15296
15298 Expr *CountExpr,
15299 bool CountInBytes,
15300 bool OrNull);
15301
15302 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
15303 /// expression is uninstantiated. If instantiated it will apply the
15304 /// appropriate address space to the type. This function allows dependent
15305 /// template variables to be used in conjunction with the address_space
15306 /// attribute
15307 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
15308 SourceLocation AttrLoc);
15309
15310 /// Same as above, but constructs the AddressSpace index if not provided.
15312 SourceLocation AttrLoc);
15313
15315
15317
15318 /// Build a function type.
15319 ///
15320 /// This routine checks the function type according to C++ rules and
15321 /// under the assumption that the result type and parameter types have
15322 /// just been instantiated from a template. It therefore duplicates
15323 /// some of the behavior of GetTypeForDeclarator, but in a much
15324 /// simpler form that is only suitable for this narrow use case.
15325 ///
15326 /// \param T The return type of the function.
15327 ///
15328 /// \param ParamTypes The parameter types of the function. This array
15329 /// will be modified to account for adjustments to the types of the
15330 /// function parameters.
15331 ///
15332 /// \param Loc The location of the entity whose type involves this
15333 /// function type or, if there is no such entity, the location of the
15334 /// type that will have function type.
15335 ///
15336 /// \param Entity The name of the entity that involves the function
15337 /// type, if known.
15338 ///
15339 /// \param EPI Extra information about the function type. Usually this will
15340 /// be taken from an existing function with the same prototype.
15341 ///
15342 /// \returns A suitable function type, if there are no errors. The
15343 /// unqualified type will always be a FunctionProtoType.
15344 /// Otherwise, returns a NULL type.
15346 SourceLocation Loc, DeclarationName Entity,
15348
15349 /// Build a member pointer type \c T Class::*.
15350 ///
15351 /// \param T the type to which the member pointer refers.
15352 /// \param Class the class type into which the member pointer points.
15353 /// \param Loc the location where this type begins
15354 /// \param Entity the name of the entity that will have this member pointer
15355 /// type
15356 ///
15357 /// \returns a member pointer type, if successful, or a NULL type if there was
15358 /// an error.
15360 CXXRecordDecl *Cls, SourceLocation Loc,
15361 DeclarationName Entity);
15362
15363 /// Build a block pointer type.
15364 ///
15365 /// \param T The type to which we'll be building a block pointer.
15366 ///
15367 /// \param Loc The source location, used for diagnostics.
15368 ///
15369 /// \param Entity The name of the entity that involves the block pointer
15370 /// type, if known.
15371 ///
15372 /// \returns A suitable block pointer type, if there are no
15373 /// errors. Otherwise, returns a NULL type.
15375 DeclarationName Entity);
15376
15377 /// Build a paren type including \p T.
15380
15381 /// Build a Read-only Pipe type.
15382 ///
15383 /// \param T The type to which we'll be building a Pipe.
15384 ///
15385 /// \param Loc We do not use it for now.
15386 ///
15387 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15388 /// a NULL type.
15390
15391 /// Build a Write-only Pipe type.
15392 ///
15393 /// \param T The type to which we'll be building a Pipe.
15394 ///
15395 /// \param Loc We do not use it for now.
15396 ///
15397 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15398 /// a NULL type.
15400
15401 /// Build a bit-precise integer type.
15402 ///
15403 /// \param IsUnsigned Boolean representing the signedness of the type.
15404 ///
15405 /// \param BitWidth Size of this int type in bits, or an expression
15406 /// representing that.
15407 ///
15408 /// \param Loc Location of the keyword.
15409 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
15410
15411 /// GetTypeForDeclarator - Convert the type for the specified
15412 /// declarator to Type instances.
15413 ///
15414 /// The result of this call will never be null, but the associated
15415 /// type may be a null type if there's an unrecoverable error.
15418
15419 /// Package the given type and TSI into a ParsedType.
15422 TypeSourceInfo **TInfo = nullptr);
15423
15425
15426 // Check whether the size of array element of type \p EltTy is a multiple of
15427 // its alignment and return false if it isn't.
15429
15430 void
15431 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
15432 SourceLocation FallbackLoc,
15433 SourceLocation ConstQualLoc = SourceLocation(),
15434 SourceLocation VolatileQualLoc = SourceLocation(),
15435 SourceLocation RestrictQualLoc = SourceLocation(),
15436 SourceLocation AtomicQualLoc = SourceLocation(),
15437 SourceLocation UnalignedQualLoc = SourceLocation());
15438
15439 /// Retrieve the keyword associated
15441
15442 /// Adjust the calling convention of a method to be the ABI default if it
15443 /// wasn't specified explicitly. This handles method types formed from
15444 /// function type typedefs and typename template arguments.
15445 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
15446 bool IsCtorOrDtor, SourceLocation Loc);
15447
15448 // Check if there is an explicit attribute, but only look through parens.
15449 // The intent is to look for an attribute on the current declarator, but not
15450 // one that came from a typedef.
15452
15453 /// Check whether a nullability type specifier can be added to the given
15454 /// type through some means not written in source (e.g. API notes).
15455 ///
15456 /// \param Type The type to which the nullability specifier will be
15457 /// added. On success, this type will be updated appropriately.
15458 ///
15459 /// \param Nullability The nullability specifier to add.
15460 ///
15461 /// \param DiagLoc The location to use for diagnostics.
15462 ///
15463 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
15464 /// array type (e.g., because it will decay to a pointer).
15465 ///
15466 /// \param OverrideExisting Whether to override an existing, locally-specified
15467 /// nullability specifier rather than complaining about the conflict.
15468 ///
15469 /// \returns true if nullability cannot be applied, false otherwise.
15471 NullabilityKind Nullability,
15472 SourceLocation DiagLoc,
15473 bool AllowArrayTypes,
15474 bool OverrideExisting);
15475
15476 /// Check whether the given variable declaration has a size that fits within
15477 /// the address space it is declared in. This issues a diagnostic if not.
15478 ///
15479 /// \param VD The variable declaration to check the size of.
15480 ///
15481 /// \param AS The address space to check the size of \p VD against.
15482 ///
15483 /// \returns true if the variable's size fits within the address space, false
15484 /// otherwise.
15485 bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS);
15486
15487 /// Get the type of expression E, triggering instantiation to complete the
15488 /// type if necessary -- that is, if the expression refers to a templated
15489 /// static data member of incomplete array type.
15490 ///
15491 /// May still return an incomplete type if instantiation was not possible or
15492 /// if the type is incomplete for a different reason. Use
15493 /// RequireCompleteExprType instead if a diagnostic is expected for an
15494 /// incomplete expression type.
15496
15498
15499 /// Ensure that the type of the given expression is complete.
15500 ///
15501 /// This routine checks whether the expression \p E has a complete type. If
15502 /// the expression refers to an instantiable construct, that instantiation is
15503 /// performed as needed to complete its type. Furthermore
15504 /// Sema::RequireCompleteType is called for the expression's type (or in the
15505 /// case of a reference type, the referred-to type).
15506 ///
15507 /// \param E The expression whose type is required to be complete.
15508 /// \param Kind Selects which completeness rules should be applied.
15509 /// \param Diagnoser The object that will emit a diagnostic if the type is
15510 /// incomplete.
15511 ///
15512 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
15513 /// otherwise.
15515 TypeDiagnoser &Diagnoser);
15516 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
15517
15518 template <typename... Ts>
15519 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
15520 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15522 }
15523
15524 // Returns the underlying type of a decltype with the given expression.
15526
15528 /// If AsUnevaluated is false, E is treated as though it were an evaluated
15529 /// context, such as when building a type for decltype(auto).
15530 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
15531
15532 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
15533 SourceLocation Loc,
15534 SourceLocation EllipsisLoc);
15535 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
15536 SourceLocation Loc, SourceLocation EllipsisLoc,
15537 bool FullySubstituted = false,
15538 ArrayRef<QualType> Expansions = {});
15539
15540 using UTTKind = UnaryTransformType::UTTKind;
15542 SourceLocation Loc);
15548 SourceLocation Loc);
15550 SourceLocation Loc);
15552 SourceLocation Loc);
15553
15555 return BuiltinRemoveReference(BaseType, UTTKind::RemoveCVRef, Loc);
15556 }
15557
15559 SourceLocation Loc);
15561 SourceLocation Loc);
15562
15563 bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
15564
15565 /// Ensure that the type T is a literal type.
15566 ///
15567 /// This routine checks whether the type @p T is a literal type. If @p T is an
15568 /// incomplete type, an attempt is made to complete it. If @p T is a literal
15569 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
15570 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
15571 /// it the type @p T), along with notes explaining why the type is not a
15572 /// literal type, and returns true.
15573 ///
15574 /// @param Loc The location in the source that the non-literal type
15575 /// diagnostic should refer to.
15576 ///
15577 /// @param T The type that this routine is examining for literalness.
15578 ///
15579 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
15580 ///
15581 /// @returns @c true if @p T is not a literal type and a diagnostic was
15582 /// emitted, @c false otherwise.
15584 TypeDiagnoser &Diagnoser);
15585 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
15586
15587 template <typename... Ts>
15588 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID,
15589 const Ts &...Args) {
15590 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15591 return RequireLiteralType(Loc, T, Diagnoser);
15592 }
15593
15596 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
15597 }
15598
15599 /// Ensure that the type T is a complete type.
15600 ///
15601 /// This routine checks whether the type @p T is complete in any
15602 /// context where a complete type is required. If @p T is a complete
15603 /// type, returns false. If @p T is a class template specialization,
15604 /// this routine then attempts to perform class template
15605 /// instantiation. If instantiation fails, or if @p T is incomplete
15606 /// and cannot be completed, issues the diagnostic @p diag (giving it
15607 /// the type @p T) and returns true.
15608 ///
15609 /// @param Loc The location in the source that the incomplete type
15610 /// diagnostic should refer to.
15611 ///
15612 /// @param T The type that this routine is examining for completeness.
15613 ///
15614 /// @param Kind Selects which completeness rules should be applied.
15615 ///
15616 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
15617 /// @c false otherwise.
15619 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
15621 CompleteTypeKind Kind, unsigned DiagID);
15622
15624 TypeDiagnoser &Diagnoser) {
15625 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, Diagnoser);
15626 }
15627 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID) {
15628 return RequireCompleteType(Loc, T, CompleteTypeKind::Default, DiagID);
15629 }
15630
15631 template <typename... Ts>
15632 bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID,
15633 const Ts &...Args) {
15634 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15635 return RequireCompleteType(Loc, T, Diagnoser);
15636 }
15637
15638 /// Determine whether a declaration is visible to name lookup.
15639 bool isVisible(const NamedDecl *D) {
15640 return D->isUnconditionallyVisible() ||
15641 isAcceptableSlow(D, AcceptableKind::Visible);
15642 }
15643
15644 /// Determine whether a declaration is reachable.
15645 bool isReachable(const NamedDecl *D) {
15646 // All visible declarations are reachable.
15647 return D->isUnconditionallyVisible() ||
15648 isAcceptableSlow(D, AcceptableKind::Reachable);
15649 }
15650
15651 /// Determine whether a declaration is acceptable (visible/reachable).
15653 return Kind == AcceptableKind::Visible ? isVisible(D) : isReachable(D);
15654 }
15655
15656 /// Determine if \p D and \p Suggested have a structurally compatible
15657 /// layout as described in C11 6.2.7/1.
15658 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15659
15660 /// Determine if \p D has a visible definition. If not, suggest a declaration
15661 /// that should be made visible to expose the definition.
15662 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15663 bool OnlyNeedComplete = false);
15665 NamedDecl *Hidden;
15666 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15667 }
15668 /// Determine if \p D has a definition which allows we redefine it in current
15669 /// TU. \p Suggested is the definition that should be made visible to expose
15670 /// the definition.
15671 bool isRedefinitionAllowedFor(NamedDecl *D, SourceLocation NewDefinitionLoc,
15672 NamedDecl **Suggested, bool &Visible);
15674 bool &Visible) {
15675 NamedDecl *Hidden;
15676 return isRedefinitionAllowedFor(const_cast<NamedDecl *>(D), NewLoc, &Hidden,
15677 Visible);
15678 }
15679
15680 /// Determine if \p D has a reachable definition. If not, suggest a
15681 /// declaration that should be made reachable to expose the definition.
15682 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15683 bool OnlyNeedComplete = false);
15685 NamedDecl *Hidden;
15686 return hasReachableDefinition(D, &Hidden);
15687 }
15688
15689 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15690 AcceptableKind Kind,
15691 bool OnlyNeedComplete = false);
15693 NamedDecl *Hidden;
15694 return hasAcceptableDefinition(D, &Hidden, Kind);
15695 }
15696
15697 /// Determine if a definition at \p NewLoc coincides with \p PrevD.
15698 ///
15699 /// Including the same header as a non-modular and a modular allows to process
15700 /// its content twice despite guards against multiple inclusions. To handle
15701 /// such cases this method allows to detect if a currently-parsed decl is at
15702 /// the same location as an existing decl imported from a module.
15703 bool isFromSameSingleIncludeHeader(const Decl *PrevD, SourceLocation NewLoc);
15704
15705 /// Try to parse the conditional expression attached to an effect attribute
15706 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15707 /// optional on error.
15708 std::optional<FunctionEffectMode>
15709 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15710
15711 void ActOnCleanupAttr(Decl *D, const Attr *A);
15712 void ActOnInitPriorityAttr(Decl *D, const Attr *A);
15713
15714private:
15715 /// The implementation of RequireCompleteType
15716 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15717 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15718
15719 /// Nullability type specifiers.
15720 IdentifierInfo *Ident__Nonnull = nullptr;
15721 IdentifierInfo *Ident__Nullable = nullptr;
15722 IdentifierInfo *Ident__Nullable_result = nullptr;
15723 IdentifierInfo *Ident__Null_unspecified = nullptr;
15724
15725 ///@}
15726
15727 //
15728 //
15729 // -------------------------------------------------------------------------
15730 //
15731 //
15732
15733 /// \name FixIt Helpers
15734 /// Implementations are in SemaFixItUtils.cpp
15735 ///@{
15736
15737public:
15738 /// Get a string to suggest for zero-initialization of a type.
15740 SourceLocation Loc) const;
15741 std::string getFixItZeroLiteralForType(QualType T, SourceLocation Loc) const;
15742
15743 ///@}
15744
15745 //
15746 //
15747 // -------------------------------------------------------------------------
15748 //
15749 //
15750
15751 /// \name Function Effects
15752 /// Implementations are in SemaFunctionEffects.cpp
15753 ///@{
15754public:
15757
15760 std::optional<FunctionEffectWithCondition>
15761 Old; // Invalid when 'Kind' is 'Added'.
15762 std::optional<FunctionEffectWithCondition>
15763 New; // Invalid when 'Kind' is 'Removed'.
15764
15765 StringRef effectName() const {
15766 if (Old)
15767 return Old.value().Effect.name();
15768 return New.value().Effect.name();
15769 }
15770
15771 /// Describes the result of effects differing between a base class's virtual
15772 /// method and an overriding method in a subclass.
15773 enum class OverrideResult {
15776 Merge // Merge missing effect from base to derived.
15777 };
15778
15779 /// Return true if adding or removing the effect as part of a type
15780 /// conversion should generate a diagnostic.
15782 const FunctionEffectsRef &SrcFX,
15783 QualType DstType,
15784 const FunctionEffectsRef &DstFX) const;
15785
15786 /// Return true if adding or removing the effect in a redeclaration should
15787 /// generate a diagnostic.
15788 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15789 const FunctionEffectsRef &OldFX,
15790 const FunctionDecl &NewFunction,
15791 const FunctionEffectsRef &NewFX) const;
15792
15793 /// Return true if adding or removing the effect in a C++ virtual method
15794 /// override should generate a diagnostic.
15796 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15797 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15798 };
15799
15800 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15801 /// Caller should short-circuit by checking for equality first.
15803 const FunctionEffectsRef &New);
15804 };
15805
15806 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15807 /// FunctionEffectsRef to be verified.
15809
15810 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15811 /// are all null.
15813
15814public:
15815 /// Warn and return true if adding a function effect to a set would create a
15816 /// conflict.
15819 SourceLocation NewAttrLoc);
15820
15821 // Report a failure to merge function effects between declarations due to a
15822 // conflict.
15823 void
15825 SourceLocation NewLoc,
15826 SourceLocation OldLoc);
15827
15828 /// Inline checks from the start of maybeAddDeclWithEffects, to
15829 /// minimize performance impact on code not using effects.
15830 template <class FuncOrBlockDecl>
15831 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15832 if (Context.hasAnyFunctionEffects())
15833 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15835 }
15836
15837 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15838 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15839
15840 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15841 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15842
15844
15845 ///@}
15846
15847 //
15848 //
15849 // -------------------------------------------------------------------------
15850 //
15851 //
15852
15853 /// \name Expansion Statements
15854 /// Implementations are in SemaExpand.cpp
15855 ///@{
15856public:
15857 CXXExpansionStmtDecl *ActOnCXXExpansionStmtDecl(unsigned TemplateDepth,
15858 SourceLocation TemplateKWLoc);
15859
15863
15865 SourceLocation LBraceLoc,
15866 SourceLocation RBraceLoc);
15867
15869 CXXExpansionStmtDecl *ESD, Stmt *Init, Stmt *ExpansionVarStmt,
15870 Expr *ExpansionInitializer, SourceLocation LParenLoc,
15871 SourceLocation ColonLoc, SourceLocation RParenLoc,
15872 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps);
15873
15874 StmtResult FinishCXXExpansionStmt(Stmt *Expansion, Stmt *Body);
15875
15877 Stmt *ExpansionVar,
15878 SourceLocation LParenLoc,
15879 SourceLocation ColonLoc,
15880 SourceLocation RParenLoc);
15881
15883 CXXExpansionStmtDecl *ESD, Stmt *Init, DeclStmt *ExpansionVarStmt,
15884 Expr *ExpansionInitializer, SourceLocation LParenLoc,
15885 SourceLocation ColonLoc, SourceLocation RParenLoc,
15886 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
15887
15888 ExprResult BuildCXXExpansionSelectExpr(InitListExpr *Range, Expr *Idx);
15889
15890 std::optional<uint64_t>
15891 ComputeExpansionSize(CXXExpansionStmtPattern *Expansion);
15892 ///@}
15893};
15894
15898
15899/// Contains a late templated function.
15900/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15903 /// The template function declaration to be late parsed.
15905 /// Floating-point options in the point of definition.
15907};
15908
15909template <>
15911 PragmaMsStackAction Action,
15912 llvm::StringRef StackSlotLabel,
15914
15915} // end namespace clang
15916
15917#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:122
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:35
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h: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:3800
Attr - This represents one attribute.
Definition Attr.h:46
Represents a C++ declaration that introduces decls from somewhere else.
Definition DeclCXX.h:3525
A binding in a decomposition declaration.
Definition DeclCXX.h:4214
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4807
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:2641
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2976
Represents a C++ base or member initializer.
Definition DeclCXX.h:2406
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:2906
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:2149
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:5079
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
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
Abstract interface for a consumer of code-completion information.
Declaration of a C++20 concept.
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
Represents the specialization of a concept - evaluates to a prvalue of type bool.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:47
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3706
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:4278
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:234
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:1948
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:5239
SmallVector< Conflict > Conflicts
Definition TypeBase.h:5353
Kind
Identifies the particular effect.
Definition TypeBase.h:5001
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5185
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:5385
Declaration of a template function.
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition TypeBase.h:4607
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4581
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:4432
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4378
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:3731
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:8059
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:937
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:2118
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:13765
ArgPackSubstIndexRAII & operator=(const ArgPackSubstIndexRAII &)=delete
ArgPackSubstIndexRAII(const ArgPackSubstIndexRAII &)=delete
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8307
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8312
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition Sema.h:8299
std::tuple< const Ts &... > Args
Definition Sema.h:8296
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:7847
std::optional< bool > getKnownValue() const
Definition Sema.h:7851
A RAII object to temporarily push a declaration context.
Definition Sema.h:3532
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition Sema.h:3542
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:10361
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:10366
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:10089
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:13129
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:13148
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition Sema.h:13136
FPFeaturesStateRAII(const FPFeaturesStateRAII &)=delete
FPOptionsOverride getOverrides()
Definition Sema.h:14161
FPFeaturesStateRAII & operator=(const FPFeaturesStateRAII &)=delete
FpPragmaStackSaveRAII(const FpPragmaStackSaveRAII &)=delete
FpPragmaStackSaveRAII & operator=(const FpPragmaStackSaveRAII &)=delete
FullExprArg(Sema &actions)
Definition Sema.h:7791
ExprResult release()
Definition Sema.h:7793
friend class Sema
Definition Sema.h:7802
Expr * get() const
Definition Sema.h:7795
GlobalEagerInstantiationScope(const GlobalEagerInstantiationScope &)=delete
GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
Definition Sema.h:14173
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:10425
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:10417
unsigned size() const
The number of exceptions in the exception specification.
Definition Sema.h:5593
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition Sema.h:5586
const QualType * data() const
The set of exceptions in the exception specification.
Definition Sema.h:5596
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:5602
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition Sema.h:5609
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:14124
LocalEagerInstantiationScope(const LocalEagerInstantiationScope &)=delete
static NameClassification DependentNonType()
Definition Sema.h:3758
static NameClassification VarTemplate(TemplateName Name)
Definition Sema.h:3768
ExprResult getExpression() const
Definition Sema.h:3794
NameClassification(const IdentifierInfo *Keyword)
Definition Sema.h:3731
static NameClassification Unknown()
Definition Sema.h:3738
static NameClassification OverloadSet(ExprResult E)
Definition Sema.h:3742
NameClassificationKind getKind() const
Definition Sema.h:3792
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition Sema.h:3786
static NameClassification FunctionTemplate(TemplateName Name)
Definition Sema.h:3774
NamedDecl * getNonTypeDecl() const
Definition Sema.h:3804
NameClassification(ParsedType Type)
Definition Sema.h:3728
TemplateName getTemplateName() const
Definition Sema.h:3809
ParsedType getType() const
Definition Sema.h:3799
TemplateNameKind getTemplateNameKind() const
Definition Sema.h:3818
static NameClassification NonType(NamedDecl *D)
Definition Sema.h:3748
static NameClassification Concept(TemplateName Name)
Definition Sema.h:3780
static NameClassification UndeclaredNonType()
Definition Sema.h:3754
static NameClassification TypeTemplate(TemplateName Name)
Definition Sema.h:3762
static NameClassification Error()
Definition Sema.h:3734
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:11497
SourceLocation getTemplateKeywordLoc() const
Definition Sema.h:11499
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition Sema.h:11494
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12549
SFINAETrap & operator=(const SFINAETrap &)=delete
SFINAETrap(const SFINAETrap &)=delete
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition Sema.h:12583
SFINAETrap(Sema &S, bool WithAccessChecking=false)
Definition Sema.h:12565
bool withAccessChecking() const
Definition Sema.h:12586
sema::TemplateDeductionInfo * getDeductionInfo() const
Definition Sema.h:12578
SFINAETrap(Sema &S, sema::TemplateDeductionInfo &Info)
Definition Sema.h:12568
SatisfactionStackResetRAII(const SatisfactionStackResetRAII &)=delete
SatisfactionStackResetRAII & operator=(const SatisfactionStackResetRAII &)=delete
ScopedCodeSynthesisContext(Sema &S, const CodeSynthesisContext &Ctx)
Definition Sema.h:13692
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:8324
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition Sema.h:8329
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition Sema.h:8326
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition Sema.h:9341
CXXMethodDecl * getMethod() const
Definition Sema.h:9344
void setMethod(CXXMethodDecl *MD)
Definition Sema.h:9345
void addContextNote(SourceLocation UseLoc)
Definition Sema.h:13658
SynthesizedFunctionScope(const SynthesizedFunctionScope &)=delete
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition Sema.h:13646
SynthesizedFunctionScope & operator=(const SynthesizedFunctionScope &)=delete
SourceLocation getLocation() const
Definition Sema.h:12307
bool ContainsDecl(const NamedDecl *ND) const
Definition Sema.h:12297
const DeclContext * getDeclContext() const
Definition Sema.h:12303
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition Sema.h:12281
const NamedDecl * getDecl() const
Definition Sema.h:12295
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition Sema.h:12280
const DeclContext * getLexicalDeclContext() const
Definition Sema.h:12299
TentativeAnalysisScope(Sema &SemaRef)
Definition Sema.h:12600
TentativeAnalysisScope & operator=(const TentativeAnalysisScope &)=delete
TentativeAnalysisScope(const TentativeAnalysisScope &)=delete
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition Sema.h:7750
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:3636
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:13723
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:8233
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:13707
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:11015
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13158
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:14109
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void PopParsingClass(ParsingClassState state)
Definition Sema.h:6591
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:10102
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:6580
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:8279
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:8201
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:6987
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:8272
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:9366
@ LookupLabel
Label name lookup.
Definition Sema.h:9375
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9370
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition Sema.h:9397
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition Sema.h:9389
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition Sema.h:9411
@ LookupLocalFriendName
Look up a friend of a local class.
Definition Sema.h:9405
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition Sema.h:9407
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition Sema.h:9402
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition Sema.h:9382
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition Sema.h:9409
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9393
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9378
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition Sema.h:9385
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9373
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition Sema.h:9413
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9415
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:9320
UnaryTransformType::UTTKind UTTKind
Definition Sema.h:15540
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:6332
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:13777
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:9351
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:9806
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:4917
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:5146
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:13786
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:9319
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:6370
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition Sema.h:9682
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:3587
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:15208
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:4819
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:15664
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:6553
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:5245
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:6534
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:7867
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7869
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
Definition Sema.h:7868
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:15623
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition Sema.h:15214
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:8221
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:9920
@ Interface
'export module X;'
Definition Sema.h:9917
@ Implementation
'module X;'
Definition Sema.h:9918
@ PartitionInterface
'export module X:Y;'
Definition Sema.h:9919
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition Sema.h:8359
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:9629
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition Sema.h:10444
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10447
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10453
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10451
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:15221
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
Definition Sema.h:15225
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:6965
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:8348
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:15215
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:15812
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:4977
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:6794
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:11217
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
void AddAlignmentAttributesForRecord(RecordDecl *RD)
AddAlignmentAttributesForRecord - Adds any needed alignment attributes to a the record decl,...
Definition SemaAttr.cpp:54
void PopParsingDeclaration(ParsingDeclState state, Decl *decl)
ErrorAttr * mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic)
Decl * ActOnConversionDeclarator(CXXConversionDecl *Conversion)
ActOnConversionDeclarator - Called by ActOnDeclarator to complete the declaration of the given C++ co...
bool CheckFormatStringsCompatible(FormatStringType FST, const StringLiteral *AuthoritativeFormatString, const StringLiteral *TestedFormatString, const Expr *FunctionCallArg=nullptr)
Verify that two format strings (as understood by attribute(format) and attribute(format_matches) are ...
void CheckMain(FunctionDecl *FD, const DeclSpec &D)
void AddKnownFunctionAttributes(FunctionDecl *FD)
Adds any function attributes that we know a priori based on the declaration of this function.
void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver)
If VD is set but not otherwise used, diagnose, for a parameter or a variable.
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
ExprResult LookupInlineAsmIdentifier(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool IsUnevaluatedContext)
QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversion, bool AllowBoolOperation, bool ReportInvalid)
type checking for vector binary operators.
void ActOnComment(SourceRange Comment)
Definition Sema.cpp: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:4213
@ Default
= default ;
Definition Sema.h:4215
@ Delete
deleted-function-body
Definition Sema.h:4221
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:14071
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.
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture)
Build a FieldDecl suitable to hold the given capture.
concepts::Requirement * ActOnCompoundRequirement(Expr *E, SourceLocation NoexceptLoc)
void ActOnPragmaMSSeg(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, StringLiteral *SegmentName, llvm::StringRef PragmaName)
Called on well formed #pragma bss_seg/data_seg/const_seg/code_seg.
Definition SemaAttr.cpp: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.
llvm::DenseMap< llvm::FoldingSetNodeID, UnsubstitutedConstraintSatisfactionCacheResult > UnsubstitutedConstraintSatisfactionCache
Cache the satisfaction of an atomic constraint.
Definition Sema.h:15139
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:6977
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:843
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition Sema.h:11462
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:12060
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition Sema.h:12071
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition Sema.h:12063
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition Sema.h:12067
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:9314
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:13727
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:8188
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:9325
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition Sema.h:7812
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:4439
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:15588
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:11443
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition Sema.h:15692
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:9903
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:15204
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:3205
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:13790
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:3626
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:764
bool isImmediateFunctionContext() const
Definition Sema.h:8213
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:774
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:6560
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:6644
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:893
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:6587
@ FRS_Success
Definition Sema.h:10832
@ FRS_DiagnosticIssued
Definition Sema.h:10834
@ FRS_NoViableFunction
Definition Sema.h:10833
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:14244
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:9363
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:9317
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)
llvm::SmallVector< QualType, 4 > CurrentParameterCopyTypes
Stack of types that correspond to the parameter entities that are currently being copy-initialized.
Definition Sema.h:9056
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:15808
@ Conversions
Allow explicit conversion functions but not explicit constructors.
Definition Sema.h:10153
@ All
Allow both explicit conversion functions and explicit constructors.
Definition Sema.h:10155
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:6575
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:15005
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:3649
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
bool CheckAttrNoArgs(const ParsedAttr &CurrAttr)
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition Sema.cpp: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:3529
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:12239
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition Sema.h:12257
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition Sema.h:12247
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition Sema.h:12267
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:4968
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:8390
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:11512
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
Definition Sema.h:11519
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
Definition Sema.h:11516
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:11448
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:8248
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:15211
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition Sema.h:4657
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:8342
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:15632
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:14504
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition Sema.h:14524
@ UPPC_RequiresClause
Definition Sema.h:14575
@ UPPC_UsingDeclaration
A using declaration.
Definition Sema.h:14530
@ UPPC_IfExists
Microsoft __if_exists.
Definition Sema.h:14557
@ UPPC_Requirement
Definition Sema.h:14572
@ UPPC_ExceptionType
The type of an exception.
Definition Sema.h:14548
@ UPPC_EnumeratorValue
The enumerator value.
Definition Sema.h:14527
@ UPPC_Lambda
Lambda expression.
Definition Sema.h:14563
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition Sema.h:14560
@ UPPC_PartialSpecialization
Partial specialization.
Definition Sema.h:14554
@ UPPC_Initializer
An initializer.
Definition Sema.h:14539
@ UPPC_BaseType
The base type of a class type.
Definition Sema.h:14509
@ UPPC_FriendDeclaration
A friend declaration.
Definition Sema.h:14533
@ UPPC_DefaultArgument
A default argument.
Definition Sema.h:14542
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14512
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14506
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition Sema.h:14551
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition Sema.h:14536
@ UPPC_DataMemberType
The type of a data member.
Definition Sema.h:14515
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition Sema.h:14521
@ UPPC_Block
Block expression.
Definition Sema.h:14566
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition Sema.h:14518
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition Sema.h:14545
@ UPPC_TypeConstraint
A type constraint.
Definition Sema.h:14569
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:12619
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:13172
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:5962
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:3643
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:15000
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:7056
@ ReuseLambdaContextDecl
Definition Sema.h:7056
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:6536
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:9059
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:962
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition SemaStmt.cpp:417
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition Sema.h:15645
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:6538
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:11461
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition Sema.h:1234
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition Sema.h:9362
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:6971
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:15831
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:5968
bool DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *RetExpr, const AutoType *AT)
Deduce the return type for a function from a returned expression, per C++1y [dcl.spec....
ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr)
Prepare SplattedExpr for a matrix splat operation, adding implicit casts if necessary.
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
Definition SemaExpr.cpp: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:5340
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
Definition Sema.h:5343
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
Definition Sema.h:5347
@ Builtin
A builtin needed 'std::strong_ordering' (eg. '__builtin_type_order').
Definition Sema.h:5349
MemberPointerConversionDirection
Definition Sema.h:10285
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition Sema.h:14107
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition Sema.h:6531
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:15206
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:6636
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:7001
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition Sema.h:6568
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:11865
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
Definition Sema.h:14111
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:15673
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:4834
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:10472
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition Sema.h:15200
ProcessingContextState ParsingClassState
Definition Sema.h:6586
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:3895
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:15554
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
llvm::DenseMap< llvm::FoldingSetNodeID, TemplateArgumentLoc > * CurrentCachedTemplateArgs
Cache the instantiation results of template parameter mappings within concepts.
Definition Sema.h:15146
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.
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:6998
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:11860
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:13170
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:4928
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:5958
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:15639
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8217
llvm::MapVector< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
Definition Sema.h:3609
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:9898
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:4972
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:8084
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:7013
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:6545
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:12620
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6564
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:14120
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:15216
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:8209
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition Sema.h:13161
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:3622
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:15652
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:14976
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:8401
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:3640
ExprResult CheckVarOrConceptTemplateTemplateId(const DeclarationNameInfo &NameInfo, TemplateName Template, const TemplateArgumentListInfo *TemplateArgs)
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition Sema.h:6797
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:13738
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:14055
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition Sema.h:15627
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:8472
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:4906
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:3583
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:12339
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:14060
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:6078
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:7510
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:4152
@ NTCUK_Destruct
Definition Sema.h:4154
@ NTCUK_Init
Definition Sema.h:4153
@ NTCUK_Copy
Definition Sema.h:4155
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:8358
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:3630
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:9155
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:6795
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:13798
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition Sema.h:8827
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:15213
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:13754
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:14961
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:15594
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:8397
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:14967
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:15684
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:6556
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:11323
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
StmtResult ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc)
void ApplyNullability(Decl *D, NullabilityKind Nullability)
Apply the 'Nullability:' annotation to the specified declaration.
void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)
If it's a file scoped decl that must warn if not used, keep track of it.
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:4720
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:7005
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:14103
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:9926
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
Definition Sema.h:9933
@ ImportFinished
after any non-import decl.
Definition Sema.h:9930
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
Definition Sema.h:9931
@ FirstDecl
Parsing the first decl in a TU.
Definition Sema.h:9927
@ GlobalFragment
after 'module;' but before 'module X;'
Definition Sema.h:9928
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
Definition Sema.h:9935
@ ImportAllowed
after 'module X;' but before any non-import decl.
Definition Sema.h:9929
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:15212
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:6739
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
Definition Sema.h:6761
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
Definition Sema.h:6751
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6766
@ DiscardedStatement
The current expression occurs within a discarded statement.
Definition Sema.h:6756
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6776
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6745
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6771
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
Definition Sema.h:6786
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:13746
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:4882
@ AP_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute.
Definition Sema.h:4896
@ AP_PragmaClangAttribute
The availability attribute was applied using 'pragma clang attribute'.
Definition Sema.h:4888
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition Sema.h:4892
@ AP_PragmaClangAttribute_InferredFromAnyAppleOS
The availability attribute was inferred from an 'anyAppleOS' availability attribute that was applied ...
Definition Sema.h:4901
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition Sema.h:4885
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:14065
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:4965
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:14969
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:8408
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:3633
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:10081
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:8199
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:3613
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8345
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:10277
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:9912
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:6549
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:11489
@ TemplateNameIsRequired
Definition Sema.h:11489
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:793
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:7816
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:6540
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)
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:11672
@ TPC_TemplateTemplateParameterPack
Definition Sema.h:11682
@ TPC_FriendFunctionTemplate
Definition Sema.h:11680
@ TPC_ClassTemplateMember
Definition Sema.h:11678
@ TPC_FunctionTemplate
Definition Sema.h:11677
@ TPC_FriendClassTemplate
Definition Sema.h:11679
@ TPC_FriendFunctionTemplateDefinition
Definition Sema.h:11681
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
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
friend class InitializationSequence
Definition Sema.h: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:7775
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:6572
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition Sema.h:13718
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:15203
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:11109
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11117
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11111
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11114
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:6369
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:3602
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:6315
@ AbstractSynthesizedIvarType
Definition Sema.h:6322
@ AbstractVariableType
Definition Sema.h:6319
@ AbstractReturnType
Definition Sema.h:6317
@ AbstractNone
Definition Sema.h:6316
@ AbstractFieldType
Definition Sema.h:6320
@ AbstractArrayType
Definition Sema.h:6323
@ AbstractParamType
Definition Sema.h:6318
@ AbstractIvarType
Definition Sema.h:6321
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:8394
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:9356
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:8007
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:9419
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition Sema.h:9423
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition Sema.h:9429
@ LOLR_Error
The lookup resulted in an error.
Definition Sema.h:9421
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition Sema.h:9426
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition Sema.h:9437
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition Sema.h:9433
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:6983
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:6451
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6456
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6453
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:14099
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:3579
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:15519
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:7853
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:3525
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:13714
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:11454
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:7809
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:8353
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition Sema.h:1295
static int getPrintable(int I)
Definition Sema.h:15202
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:9691
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:13001
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:3881
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:15207
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:8225
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:13729
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:13710
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:15205
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:11019
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:8689
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:13795
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:8389
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:3620
Represents C++ using-directive.
Definition DeclCXX.h:3125
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3428
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:4253
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:3797
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:6008
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:5983
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5994
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5997
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Definition TypeBase.h:6001
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
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_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:5122
Holds information about the various types of exception specification.
Definition TypeBase.h:5442
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5444
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5447
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition TypeBase.h:5450
Extra information about a function prototype.
Definition TypeBase.h:5470
Represents a complete lambda introducer.
Definition DeclSpec.h:2884
Contains a late templated function.
Definition Sema.h:15901
FPOptions FPO
Floating-point options in the point of definition.
Definition Sema.h:15906
Decl * D
The template function declaration to be late parsed.
Definition Sema.h:15904
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:10564
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
Definition Sema.h:10571
CheckNonDependentConversionsFlag(bool SuppressUserConversions, bool OnlyInitializeNonUserDefinedConversions)
Definition Sema.h:10573
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
Definition Sema.h:12098
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition Sema.h:12094
CheckTemplateArgumentInfo(const CheckTemplateArgumentInfo &)=delete
CheckTemplateArgumentInfo(bool PartialOrdering=false, bool MatchingTTP=false)
Definition Sema.h:12075
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition Sema.h:12087
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
Definition Sema.h:12084
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition Sema.h:12084
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:13209
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition Sema.h:13380
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
bool InParameterMappingSubstitution
Whether we're substituting into the parameter mapping of a constraint.
Definition Sema.h:13337
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition Sema.h:13353
ArrayRef< TemplateArgument > template_arguments() const
Definition Sema.h:13372
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition Sema.h:13348
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13340
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition Sema.h:13366
bool InConstraintSubstitution
Whether we're substituting into constraints.
Definition Sema.h:13334
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition Sema.h:13356
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition Sema.h:13363
SynthesisKind
The kind of template instantiation we are performing.
Definition Sema.h:13211
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13300
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition Sema.h:13221
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:13230
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition Sema.h:13249
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13297
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition Sema.h:13257
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition Sema.h:13264
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition Sema.h:13304
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition Sema.h:13275
@ Memoization
Added for Template instantiation observation.
Definition Sema.h:13310
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition Sema.h:13240
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition Sema.h:13316
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition Sema.h:13313
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition Sema.h:13319
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:13237
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition Sema.h:13245
@ SYCLKernelLaunchOverloadResolution
We are performing overload resolution for a call to a function template or variable template named 's...
Definition Sema.h:13327
@ ExpansionStmtInstantiation
We are instantiating an expansion statement.
Definition Sema.h:13330
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13253
@ TemplateInstantiation
We are instantiating a template declaration.
Definition Sema.h:13214
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition Sema.h:13267
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13271
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition Sema.h:13226
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13294
@ SYCLKernelLaunchLookup
We are performing name lookup for a function template or variable template named 'sycl_kernel_launch'...
Definition Sema.h:13323
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition Sema.h:13260
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13343
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition Sema.h:13369
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:6900
Data structure used to record current or nested expression evaluation contexts.
Definition Sema.h:6801
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:6834
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition Sema.h:6836
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition Sema.h:6887
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition Sema.h:6821
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:6830
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition Sema.h:6841
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:6849
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition Sema.h:6845
bool IsCaseExpr
Whether evaluating an expression for a switch case label.
Definition Sema.h:6890
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6855
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:6816
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition Sema.h:6863
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6893
SmallVector< MisalignedMember, 4 > MisalignedMembers
Small set of gathered accesses to potentially misaligned members due to the packed attribute.
Definition Sema.h:6859
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition Sema.h:6806
VarDecl * DeclForInitializer
Declaration for initializer if one is currently being parsed.
Definition Sema.h:6826
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6910
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition Sema.h:6912
ExpressionEvaluationContext Context
The expression evaluation context.
Definition Sema.h:6803
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition Sema.h:6810
Holds the 'begin' and 'end' variables of a range-based for loop or expansion statement; begin-expr an...
Definition Sema.h:11160
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:15761
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:15765
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:15773
std::optional< FunctionEffectWithCondition > New
Definition Sema.h:15763
FunctionEffect::Kind EffectKind
Definition Sema.h:15758
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13556
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:14237
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition Sema.h:14240
bool isMoveEligible() const
Definition Sema.h:11214
bool isCopyElidable() const
Definition Sema.h:11215
const VarDecl * Candidate
Definition Sema.h:11209
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition Sema.h:3338
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition Sema.h:3347
SourceLocation IdentifierLoc
The location of the identifier.
Definition Sema.h:3341
SourceLocation CCLoc
The location of the '::'.
Definition Sema.h:3344
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition Sema.h:3335
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition Sema.h:3353
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition Sema.h:12720
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:5180
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition Sema.h:5174
RecursiveInstGuard(Sema &S, Decl *D, Kind Kind)
Definition Sema.h:13181
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:10461
SFINAEContextBase & operator=(const SFINAEContextBase &)=delete
SFINAEContextBase(Sema &S, SFINAETrap *Cur)
Definition Sema.h:12529
SFINAEContextBase(const SFINAEContextBase &)=delete
Abstract class used to diagnose incomplete types.
Definition Sema.h:8286
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.