clang 22.0.0git
Sema.h
Go to the documentation of this file.
1//===--- Sema.h - Semantic Analysis & AST Building --------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the Sema class, which performs semantic analysis and
10// builds ASTs.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SEMA_SEMA_H
15#define LLVM_CLANG_SEMA_SEMA_H
16
18#include "clang/AST/ASTFwd.h"
19#include "clang/AST/ASTLambda.h"
20#include "clang/AST/Attr.h"
22#include "clang/AST/CharUnits.h"
23#include "clang/AST/DeclBase.h"
24#include "clang/AST/DeclCXX.h"
27#include "clang/AST/Expr.h"
28#include "clang/AST/ExprCXX.h"
33#include "clang/AST/StmtCXX.h"
34#include "clang/AST/Type.h"
35#include "clang/AST/TypeLoc.h"
39#include "clang/Basic/Cuda.h"
43#include "clang/Basic/LLVM.h"
44#include "clang/Basic/Lambda.h"
46#include "clang/Basic/Module.h"
58#include "clang/Sema/Attr.h"
60#include "clang/Sema/DeclSpec.h"
66#include "clang/Sema/Scope.h"
67#include "clang/Sema/SemaBase.h"
69#include "clang/Sema/Weak.h"
70#include "llvm/ADT/APInt.h"
71#include "llvm/ADT/ArrayRef.h"
72#include "llvm/ADT/BitmaskEnum.h"
73#include "llvm/ADT/DenseMap.h"
74#include "llvm/ADT/DenseSet.h"
75#include "llvm/ADT/FloatingPointMode.h"
76#include "llvm/ADT/FoldingSet.h"
77#include "llvm/ADT/MapVector.h"
78#include "llvm/ADT/PointerIntPair.h"
79#include "llvm/ADT/PointerUnion.h"
80#include "llvm/ADT/STLExtras.h"
81#include "llvm/ADT/STLForwardCompat.h"
82#include "llvm/ADT/STLFunctionalExtras.h"
83#include "llvm/ADT/SetVector.h"
84#include "llvm/ADT/SmallBitVector.h"
85#include "llvm/ADT/SmallPtrSet.h"
86#include "llvm/ADT/SmallSet.h"
87#include "llvm/ADT/SmallVector.h"
88#include "llvm/ADT/StringExtras.h"
89#include "llvm/ADT/StringMap.h"
90#include "llvm/ADT/TinyPtrVector.h"
91#include "llvm/Support/Allocator.h"
92#include "llvm/Support/Compiler.h"
93#include "llvm/Support/Error.h"
94#include "llvm/Support/ErrorHandling.h"
95#include <cassert>
96#include <climits>
97#include <cstddef>
98#include <cstdint>
99#include <deque>
100#include <functional>
101#include <iterator>
102#include <memory>
103#include <optional>
104#include <string>
105#include <tuple>
106#include <type_traits>
107#include <utility>
108#include <vector>
109
110namespace llvm {
111struct InlineAsmIdentifierInfo;
112} // namespace llvm
113
114namespace clang {
115class ADLResult;
116class APValue;
117struct ASTConstraintSatisfaction;
118class ASTConsumer;
119class ASTContext;
120class ASTDeclReader;
121class ASTMutationListener;
122class ASTReader;
123class ASTWriter;
124class CXXBasePath;
125class CXXBasePaths;
126class CXXFieldCollector;
127class CodeCompleteConsumer;
128enum class ComparisonCategoryType : unsigned char;
129class ConstraintSatisfaction;
130class DarwinSDKInfo;
131class DeclGroupRef;
132class DeducedTemplateArgument;
133struct DeductionFailureInfo;
134class DependentDiagnostic;
135class Designation;
136class IdentifierInfo;
137class ImplicitConversionSequence;
138typedef MutableArrayRef<ImplicitConversionSequence> ConversionSequenceList;
139class InitializationKind;
140class InitializationSequence;
141class InitializedEntity;
142enum class LangAS : unsigned int;
143class LocalInstantiationScope;
144class LookupResult;
145class MangleNumberingContext;
146typedef ArrayRef<IdentifierLoc> ModuleIdPath;
147class ModuleLoader;
148class MultiLevelTemplateArgumentList;
149struct NormalizedConstraint;
150class ObjCInterfaceDecl;
151class ObjCMethodDecl;
152struct OverloadCandidate;
153enum class OverloadCandidateParamOrder : char;
155class OverloadCandidateSet;
156class Preprocessor;
157class SemaAMDGPU;
158class SemaARM;
159class SemaAVR;
160class SemaBPF;
161class SemaCodeCompletion;
162class SemaCUDA;
163class SemaDirectX;
164class SemaHLSL;
165class SemaHexagon;
166class SemaLoongArch;
167class SemaM68k;
168class SemaMIPS;
169class SemaMSP430;
170class SemaNVPTX;
171class SemaObjC;
172class SemaOpenACC;
173class SemaOpenCL;
174class SemaOpenMP;
175class SemaPPC;
176class SemaPseudoObject;
177class SemaRISCV;
178class SemaSPIRV;
179class SemaSYCL;
180class SemaSwift;
181class SemaSystemZ;
182class SemaWasm;
183class SemaX86;
184class StandardConversionSequence;
185class TemplateArgument;
186class TemplateArgumentLoc;
187class TemplateInstantiationCallback;
188class TemplatePartialOrderingContext;
189class TemplateSpecCandidateSet;
190class Token;
191class TypeConstraint;
192class TypoCorrectionConsumer;
193class UnresolvedSetImpl;
194class UnresolvedSetIterator;
195class VisibleDeclConsumer;
196
197namespace sema {
198class BlockScopeInfo;
199class Capture;
200class CapturedRegionScopeInfo;
201class CapturingScopeInfo;
202class CompoundScopeInfo;
203class DelayedDiagnostic;
204class DelayedDiagnosticPool;
205class FunctionScopeInfo;
206class LambdaScopeInfo;
207class SemaPPCallbacks;
208class TemplateDeductionInfo;
209} // namespace sema
210
211// AssignmentAction - This is used by all the assignment diagnostic functions
212// to represent what is actually causing the operation
214 Assigning,
215 Passing,
216 Returning,
219 Sending,
220 Casting,
222};
223
224namespace threadSafety {
225class BeforeSet;
226void threadSafetyCleanup(BeforeSet *Cache);
227} // namespace threadSafety
228
229// FIXME: No way to easily map from TemplateTypeParmTypes to
230// TemplateTypeParmDecls, so we have this horrible PointerUnion.
231typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *,
232 const TemplateSpecializationType *,
233 const SubstBuiltinTemplatePackType *>,
234 SourceLocation>
236
237/// Describes whether we've seen any nullability information for the given
238/// file.
240 /// The first pointer declarator (of any pointer kind) in the file that does
241 /// not have a corresponding nullability annotation.
243
244 /// The end location for the first pointer declarator in the file. Used for
245 /// placing fix-its.
247
248 /// Which kind of pointer declarator we saw.
249 uint8_t PointerKind;
250
251 /// Whether we saw any type nullability annotations in the given file.
252 bool SawTypeNullability = false;
253};
254
255/// A mapping from file IDs to a record of whether we've seen nullability
256/// information in that file.
258 /// A mapping from file IDs to the nullability information for each file ID.
259 llvm::DenseMap<FileID, FileNullability> Map;
260
261 /// A single-element cache based on the file ID.
262 struct {
265 } Cache;
266
267public:
269 // Check the single-element cache.
270 if (file == Cache.File)
271 return Cache.Nullability;
272
273 // It's not in the single-element cache; flush the cache if we have one.
274 if (!Cache.File.isInvalid()) {
275 Map[Cache.File] = Cache.Nullability;
276 }
277
278 // Pull this entry into the cache.
279 Cache.File = file;
280 Cache.Nullability = Map[file];
281 return Cache.Nullability;
282 }
283};
284
285/// Tracks expected type during expression parsing, for use in code completion.
286/// The type is tied to a particular token, all functions that update or consume
287/// the type take a start location of the token they are looking at as a
288/// parameter. This avoids updating the type on hot paths in the parser.
290public:
292 : Ctx(Ctx), Enabled(Enabled) {}
293
294 void enterCondition(Sema &S, SourceLocation Tok);
295 void enterReturn(Sema &S, SourceLocation Tok);
297 /// Handles e.g. BaseType{ .D = Tok...
299 const Designation &D);
300 /// Computing a type for the function argument may require running
301 /// overloading, so we postpone its computation until it is actually needed.
302 ///
303 /// Clients should be very careful when using this function, as it stores a
304 /// function_ref, clients should make sure all calls to get() with the same
305 /// location happen while function_ref is alive.
306 ///
307 /// The callback should also emit signature help as a side-effect, but only
308 /// if the completion point has been reached.
310 llvm::function_ref<QualType()> ComputeType);
311
313 void enterUnary(Sema &S, SourceLocation Tok, tok::TokenKind OpKind,
314 SourceLocation OpLoc);
315 void enterBinary(Sema &S, SourceLocation Tok, Expr *LHS, tok::TokenKind Op);
317 void enterSubscript(Sema &S, SourceLocation Tok, Expr *LHS);
318 /// Handles all type casts, including C-style cast, C++ casts, etc.
320
321 /// Get the expected type associated with this location, if any.
322 ///
323 /// If the location is a function argument, determining the expected type
324 /// involves considering all function overloads and the arguments so far.
325 /// In this case, signature help for these function overloads will be reported
326 /// as a side-effect (only if the completion point has been reached).
328 if (!Enabled || Tok != ExpectedLoc)
329 return QualType();
330 if (!Type.isNull())
331 return Type;
332 if (ComputeType)
333 return ComputeType();
334 return QualType();
335 }
336
337private:
338 ASTContext *Ctx;
339 bool Enabled;
340 /// Start position of a token for which we store expected type.
341 SourceLocation ExpectedLoc;
342 /// Expected type for a token starting at ExpectedLoc.
344 /// A function to compute expected type at ExpectedLoc. It is only considered
345 /// if Type is null.
346 llvm::function_ref<QualType()> ComputeType;
347};
348
350 SkipBodyInfo() = default;
351 bool ShouldSkip = false;
353 NamedDecl *Previous = nullptr;
354 NamedDecl *New = nullptr;
355};
356
357/// Describes the result of template argument deduction.
358///
359/// The TemplateDeductionResult enumeration describes the result of
360/// template argument deduction, as returned from
361/// DeduceTemplateArguments(). The separate TemplateDeductionInfo
362/// structure provides additional information about the results of
363/// template argument deduction, e.g., the deduced template argument
364/// list (if successful) or the specific template parameters or
365/// deduced arguments that were involved in the failure.
367 /// Template argument deduction was successful.
368 Success = 0,
369 /// The declaration was invalid; do nothing.
370 Invalid,
371 /// Template argument deduction exceeded the maximum template
372 /// instantiation depth (which has already been diagnosed).
374 /// Template argument deduction did not deduce a value
375 /// for every template parameter.
377 /// Template argument deduction did not deduce a value for every
378 /// expansion of an expanded template parameter pack.
380 /// Template argument deduction produced inconsistent
381 /// deduced values for the given template parameter.
383 /// Template argument deduction failed due to inconsistent
384 /// cv-qualifiers on a template parameter type that would
385 /// otherwise be deduced, e.g., we tried to deduce T in "const T"
386 /// but were given a non-const "X".
388 /// Substitution of the deduced template argument values
389 /// resulted in an error.
391 /// After substituting deduced template arguments, a dependent
392 /// parameter type did not match the corresponding argument.
394 /// After substituting deduced template arguments, an element of
395 /// a dependent parameter type did not match the corresponding element
396 /// of the corresponding argument (when deducing from an initializer list).
398 /// A non-depnedent component of the parameter did not match the
399 /// corresponding component of the argument.
401 /// When performing template argument deduction for a function
402 /// template, there were too many call arguments.
404 /// When performing template argument deduction for a function
405 /// template, there were too few call arguments.
407 /// The explicitly-specified template arguments were not valid
408 /// template arguments for the given template.
410 /// Checking non-dependent argument conversions failed.
412 /// The deduced arguments did not satisfy the constraints associated
413 /// with the template.
415 /// Deduction failed; that's all we know.
417 /// CUDA Target attributes do not match.
419 /// Some error which was already diagnosed.
421};
422
423/// Kinds of C++ special members.
431 Invalid
432};
433
434/// The kind of conversion being performed.
436 /// An implicit conversion.
437 Implicit,
438 /// A C-style cast.
440 /// A functional-style cast.
442 /// A cast other than a C-style cast.
443 OtherCast,
444 /// A conversion for an operand of a builtin overloaded operator.
446};
447
448enum class TagUseKind {
449 Reference, // Reference to a tag: 'struct foo *X;'
450 Declaration, // Fwd decl of a tag: 'struct foo;'
451 Definition, // Definition of a tag: 'struct foo { int X; } Y;'
452 Friend // Friend declaration: 'friend struct foo;'
453};
454
455/// Used with attributes/effects with a boolean condition, e.g. `nonblocking`.
456enum class FunctionEffectMode : uint8_t {
457 None, // effect is not present.
458 False, // effect(false).
459 True, // effect(true).
460 Dependent // effect(expr) where expr is dependent.
461};
462
463/// pragma clang section kind
465 Invalid = 0,
466 BSS = 1,
467 Data = 2,
468 Rodata = 3,
469 Text = 4,
470 Relro = 5
471};
472
473enum class PragmaClangSectionAction { Set = 0, Clear = 1 };
474
476 Native, // #pragma options align=native
477 Natural, // #pragma options align=natural
478 Packed, // #pragma options align=packed
479 Power, // #pragma options align=power
480 Mac68k, // #pragma options align=mac68k
481 Reset // #pragma options align=reset
482};
483
484enum class TUFragmentKind {
485 /// The global module fragment, between 'module;' and a module-declaration.
486 Global,
487 /// A normal translation unit fragment. For a non-module unit, this is the
488 /// entire translation unit. Otherwise, it runs from the module-declaration
489 /// to the private-module-fragment (if any) or the end of the TU (if not).
490 Normal,
491 /// The private module fragment, between 'module :private;' and the end of
492 /// the translation unit.
493 Private
494};
495
497 Scanf,
498 Printf,
499 NSString,
500 Strftime,
501 Strfmon,
502 Kprintf,
504 OSTrace,
505 OSLog,
506 Syslog,
507 Unknown
508};
509
510// Used for emitting the right warning by DefaultVariadicArgumentPromotion
512 Function,
513 Block,
514 Method,
517};
518
523 ReturnArg,
526};
527
528// Contexts where using non-trivial C union types can be disallowed. This is
529// passed to err_non_trivial_c_union_in_invalid_context.
531 // Function parameter.
533 // Function return.
535 // Default-initialized object.
537 // Variable with automatic storage duration.
538 AutoVar,
539 // Initializer expression that might copy from another object.
540 CopyInit,
541 // Assignment.
543 // Compound literal.
545 // Block capture.
547 // lvalue-to-rvalue conversion of volatile type.
549};
550
551/// Describes the result of the name lookup and resolution performed
552/// by \c Sema::ClassifyName().
554 /// This name is not a type or template in this context, but might be
555 /// something else.
556 Unknown,
557 /// Classification failed; an error has been produced.
558 Error,
559 /// The name has been typo-corrected to a keyword.
560 Keyword,
561 /// The name was classified as a type.
562 Type,
563 /// The name was classified as a specific non-type, non-template
564 /// declaration. ActOnNameClassifiedAsNonType should be called to
565 /// convert the declaration to an expression.
566 NonType,
567 /// The name was classified as an ADL-only function name.
568 /// ActOnNameClassifiedAsUndeclaredNonType should be called to convert the
569 /// result to an expression.
571 /// The name denotes a member of a dependent type that could not be
572 /// resolved. ActOnNameClassifiedAsDependentNonType should be called to
573 /// convert the result to an expression.
575 /// The name was classified as an overload set, and an expression
576 /// representing that overload set has been formed.
577 /// ActOnNameClassifiedAsOverloadSet should be called to form a suitable
578 /// expression referencing the overload set.
580 /// The name was classified as a template whose specializations are types.
582 /// The name was classified as a variable template name.
584 /// The name was classified as a function template name.
586 /// The name was classified as an ADL-only function template name.
588 /// The name was classified as a concept name.
589 Concept,
590};
591
593 // Address discrimination argument of __ptrauth.
594 Addr,
595
596 // Extra discriminator argument of __ptrauth.
597 Extra,
598};
599
600/// Common ways to introduce type names without a tag for use in diagnostics.
601/// Keep in sync with err_tag_reference_non_tag.
602enum class NonTagKind {
603 NonStruct,
604 NonClass,
605 NonUnion,
606 NonEnum,
607 Typedef,
608 TypeAlias,
609 Template,
612};
613
614enum class OffsetOfKind {
615 // Not parsing a type within __builtin_offsetof.
616 Outside,
617 // Parsing a type within __builtin_offsetof.
618 Builtin,
619 // Parsing a type within macro "offsetof", defined in __buitin_offsetof
620 // To improve our diagnostic message.
621 Macro,
622};
623
624/// Describes the kind of merge to perform for availability
625/// attributes (including "deprecated", "unavailable", and "availability").
627 /// Don't merge availability attributes at all.
628 None,
629 /// Merge availability attributes for a redeclaration, which requires
630 /// an exact match.
632 /// Merge availability attributes for an override, which requires
633 /// an exact match or a weakening of constraints.
634 Override,
635 /// Merge availability attributes for an implementation of
636 /// a protocol requirement.
638 /// Merge availability attributes for an implementation of
639 /// an optional protocol requirement.
641};
642
644 /// The triviality of a method unaffected by "trivial_abi".
646
647 /// The triviality of a method affected by "trivial_abi".
649};
650
652
653enum class AllowFoldKind {
654 No,
655 Allow,
656};
657
658/// Context in which we're performing a usual arithmetic conversion.
659enum class ArithConvKind {
660 /// An arithmetic operation.
662 /// A bitwise operation.
663 BitwiseOp,
664 /// A comparison.
666 /// A conditional (?:) operator.
668 /// A compound assignment expression.
670};
671
672// Used for determining in which context a type is allowed to be passed to a
673// vararg function.
674enum class VarArgKind {
675 Valid,
677 Undefined,
679 Invalid
680};
681
682/// AssignConvertType - All of the 'assignment' semantic checks return this
683/// enum to indicate whether the assignment was allowed. These checks are
684/// done for simple assignments, as well as initialization, return from
685/// function, argument passing, etc. The query is phrased in terms of a
686/// source and destination type.
688 /// Compatible - the types are compatible according to the standard.
690
691 /// CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because
692 /// a void * can implicitly convert to another pointer type, which we
693 /// differentiate for better diagnostic behavior.
695
696 /// PointerToInt - The assignment converts a pointer to an int, which we
697 /// accept as an extension.
699
700 /// IntToPointer - The assignment converts an int to a pointer, which we
701 /// accept as an extension.
703
704 /// FunctionVoidPointer - The assignment is between a function pointer and
705 /// void*, which the standard doesn't allow, but we accept as an extension.
707
708 /// IncompatiblePointer - The assignment is between two pointers types that
709 /// are not compatible, but we accept them as an extension.
711
712 /// IncompatibleFunctionPointer - The assignment is between two function
713 /// pointers types that are not compatible, but we accept them as an
714 /// extension.
716
717 /// IncompatibleFunctionPointerStrict - The assignment is between two
718 /// function pointer types that are not identical, but are compatible,
719 /// unless compiled with -fsanitize=cfi, in which case the type mismatch
720 /// may trip an indirect call runtime check.
722
723 /// IncompatiblePointerSign - The assignment is between two pointers types
724 /// which point to integers which have a different sign, but are otherwise
725 /// identical. This is a subset of the above, but broken out because it's by
726 /// far the most common case of incompatible pointers.
728
729 /// CompatiblePointerDiscardsQualifiers - The assignment discards
730 /// c/v/r qualifiers, which we accept as an extension.
732
733 /// IncompatiblePointerDiscardsQualifiers - The assignment
734 /// discards qualifiers that we don't permit to be discarded,
735 /// like address spaces.
737
738 /// IncompatibleNestedPointerAddressSpaceMismatch - The assignment
739 /// changes address spaces in nested pointer types which is not allowed.
740 /// For instance, converting __private int ** to __generic int ** is
741 /// illegal even though __private could be converted to __generic.
743
744 /// IncompatibleNestedPointerQualifiers - The assignment is between two
745 /// nested pointer types, and the qualifiers other than the first two
746 /// levels differ e.g. char ** -> const char **, but we accept them as an
747 /// extension.
749
750 /// IncompatibleVectors - The assignment is between two vector types that
751 /// have the same size, which we accept as an extension.
753
754 /// IntToBlockPointer - The assignment converts an int to a block
755 /// pointer. We disallow this.
757
758 /// IncompatibleBlockPointer - The assignment is between two block
759 /// pointers types that are not compatible.
761
762 /// IncompatibleObjCQualifiedId - The assignment is between a qualified
763 /// id type and something else (that is incompatible with it). For example,
764 /// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
766
767 /// IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an
768 /// object with __weak qualifier.
770
771 /// Incompatible - We reject this conversion outright, it is invalid to
772 /// represent it in the AST.
774};
775
776/// The scope in which to find allocation functions.
778 /// Only look for allocation functions in the global scope.
779 Global,
780 /// Only look for allocation functions in the scope of the
781 /// allocated class.
782 Class,
783 /// Look for allocation functions in both the global scope
784 /// and in the scope of the allocated class.
785 Both
786};
787
788/// Describes the result of an "if-exists" condition check.
789enum class IfExistsResult {
790 /// The symbol exists.
791 Exists,
792
793 /// The symbol does not exist.
795
796 /// The name is a dependent name, so the results will differ
797 /// from one instantiation to the next.
798 Dependent,
799
800 /// An error occurred.
801 Error
802};
803
804enum class CorrectTypoKind {
805 NonError, // CorrectTypo used in a non error recovery situation.
806 ErrorRecovery // CorrectTypo used in normal error recovery.
807};
808
809enum class OverloadKind {
810 /// This is a legitimate overload: the existing declarations are
811 /// functions or function templates with different signatures.
812 Overload,
813
814 /// This is not an overload because the signature exactly matches
815 /// an existing declaration.
816 Match,
817
818 /// This is not an overload because the lookup results contain a
819 /// non-function.
821};
822
823/// Contexts in which a converted constant expression is required.
824enum class CCEKind {
825 CaseValue, ///< Expression in a case label.
826 Enumerator, ///< Enumerator value with fixed underlying type.
827 TemplateArg, ///< Value of a non-type template parameter.
828 TempArgStrict, ///< As above, but applies strict template checking
829 ///< rules.
830 ArrayBound, ///< Array bound in array declarator or new-expression.
831 ExplicitBool, ///< Condition in an explicit(bool) specifier.
832 Noexcept, ///< Condition in a noexcept(bool) specifier.
833 StaticAssertMessageSize, ///< Call to size() in a static assert
834 ///< message.
835 StaticAssertMessageData, ///< Call to data() in a static assert
836 ///< message.
837};
838
839/// Enums for the diagnostics of target, target_version and target_clones.
840namespace DiagAttrParams {
844} // end namespace DiagAttrParams
845
846void inferNoReturnAttr(Sema &S, const Decl *D);
847
848/// Sema - This implements semantic analysis and AST building for C.
849/// \nosubgrouping
850class Sema final : public SemaBase {
851 // Table of Contents
852 // -----------------
853 // 1. Semantic Analysis (Sema.cpp)
854 // 2. API Notes (SemaAPINotes.cpp)
855 // 3. C++ Access Control (SemaAccess.cpp)
856 // 4. Attributes (SemaAttr.cpp)
857 // 5. Availability Attribute Handling (SemaAvailability.cpp)
858 // 6. Bounds Safety (SemaBoundsSafety.cpp)
859 // 7. Casts (SemaCast.cpp)
860 // 8. Extra Semantic Checking (SemaChecking.cpp)
861 // 9. C++ Coroutines (SemaCoroutine.cpp)
862 // 10. C++ Scope Specifiers (SemaCXXScopeSpec.cpp)
863 // 11. Declarations (SemaDecl.cpp)
864 // 12. Declaration Attribute Handling (SemaDeclAttr.cpp)
865 // 13. C++ Declarations (SemaDeclCXX.cpp)
866 // 14. C++ Exception Specifications (SemaExceptionSpec.cpp)
867 // 15. Expressions (SemaExpr.cpp)
868 // 16. C++ Expressions (SemaExprCXX.cpp)
869 // 17. Member Access Expressions (SemaExprMember.cpp)
870 // 18. Initializers (SemaInit.cpp)
871 // 19. C++ Lambda Expressions (SemaLambda.cpp)
872 // 20. Name Lookup (SemaLookup.cpp)
873 // 21. Modules (SemaModule.cpp)
874 // 22. C++ Overloading (SemaOverload.cpp)
875 // 23. Statements (SemaStmt.cpp)
876 // 24. `inline asm` Statement (SemaStmtAsm.cpp)
877 // 25. Statement Attribute Handling (SemaStmtAttr.cpp)
878 // 26. C++ Templates (SemaTemplate.cpp)
879 // 27. C++ Template Argument Deduction (SemaTemplateDeduction.cpp)
880 // 28. C++ Template Deduction Guide (SemaTemplateDeductionGuide.cpp)
881 // 29. C++ Template Instantiation (SemaTemplateInstantiate.cpp)
882 // 30. C++ Template Declaration Instantiation
883 // (SemaTemplateInstantiateDecl.cpp)
884 // 31. C++ Variadic Templates (SemaTemplateVariadic.cpp)
885 // 32. Constraints and Concepts (SemaConcept.cpp)
886 // 33. Types (SemaType.cpp)
887 // 34. FixIt Helpers (SemaFixItUtils.cpp)
888 // 35. Function Effects (SemaFunctionEffects.cpp)
889
890 /// \name Semantic Analysis
891 /// Implementations are in Sema.cpp
892 ///@{
893
894public:
895 Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
897 CodeCompleteConsumer *CompletionConsumer = nullptr);
898 ~Sema();
899
900 /// Perform initialization that occurs after the parser has been
901 /// initialized but before it parses anything.
902 void Initialize();
903
904 /// This virtual key function only exists to limit the emission of debug info
905 /// describing the Sema class. GCC and Clang only emit debug info for a class
906 /// with a vtable when the vtable is emitted. Sema is final and not
907 /// polymorphic, but the debug info size savings are so significant that it is
908 /// worth adding a vtable just to take advantage of this optimization.
910
911 const LangOptions &getLangOpts() const { return LangOpts; }
914
917 Preprocessor &getPreprocessor() const { return PP; }
918 ASTContext &getASTContext() const { return Context; }
922
924 StringRef Platform);
926
927 /// Registers an external source. If an external source already exists,
928 /// creates a multiplex external source and appends to it.
929 ///
930 ///\param[in] E - A non-null external sema source.
931 ///
933
934 /// Print out statistics about the semantic analysis.
935 void PrintStats() const;
936
937 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
938 /// guaranteed). Produces a warning if we're low on stack space and allocates
939 /// more in that case. Use this in code that may recurse deeply (for example,
940 /// in template instantiation) to avoid stack overflow.
942 llvm::function_ref<void()> Fn);
943
944 /// Returns default addr space for method qualifiers.
946
947 /// Load weak undeclared identifiers from the external source.
949
950 /// Determine if VD, which must be a variable or function, is an external
951 /// symbol that nonetheless can't be referenced from outside this translation
952 /// unit because its type has no linkage and it's not extern "C".
953 bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
954
955 /// Obtain a sorted list of functions that are undefined but ODR-used.
957 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation>> &Undefined);
958
959 typedef std::pair<SourceLocation, bool> DeleteExprLoc;
961 /// Retrieves list of suspicious delete-expressions that will be checked at
962 /// the end of translation unit.
963 const llvm::MapVector<FieldDecl *, DeleteLocs> &
965
966 /// Cause the built diagnostic to be emitted on the DiagosticsEngine.
967 /// This is closely coupled to the SemaDiagnosticBuilder class and
968 /// should not be used elsewhere.
969 void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB);
970
971 void addImplicitTypedef(StringRef Name, QualType T);
972
973 /// Whether uncompilable error has occurred. This includes error happens
974 /// in deferred diagnostics.
975 bool hasUncompilableErrorOccurred() const;
976
977 /// Looks through the macro-expansion chain for the given
978 /// location, looking for a macro expansion with the given name.
979 /// If one is found, returns true and sets the location to that
980 /// expansion loc.
981 bool findMacroSpelling(SourceLocation &loc, StringRef name);
982
983 /// Calls \c Lexer::getLocForEndOfToken()
985
986 /// Calls \c Lexer::findNextToken() to find the next token, and if the
987 /// locations of both ends of the token can be resolved it return that
988 /// range; Otherwise it returns an invalid SourceRange.
990 SourceLocation Loc, bool IncludeMacros, bool IncludeComments,
991 std::optional<tok::TokenKind> ExpectedToken = std::nullopt);
992
993 /// Retrieve the module loader associated with the preprocessor.
995
996 /// Invent a new identifier for parameters of abbreviated templates.
999 unsigned Index);
1000
1002
1003 // Emit all deferred diagnostics.
1004 void emitDeferredDiags();
1005
1006 /// This is called before the very first declaration in the translation unit
1007 /// is parsed. Note that the ASTContext may have already injected some
1008 /// declarations.
1010 /// ActOnEndOfTranslationUnit - This is called at the very end of the
1011 /// translation unit when EOF is reached and all but the top-level scope is
1012 /// popped.
1015
1016 /// Determines the active Scope associated with the given declaration
1017 /// context.
1018 ///
1019 /// This routine maps a declaration context to the active Scope object that
1020 /// represents that declaration context in the parser. It is typically used
1021 /// from "scope-less" code (e.g., template instantiation, lazy creation of
1022 /// declarations) that injects a name for name-lookup purposes and, therefore,
1023 /// must update the Scope.
1024 ///
1025 /// \returns The scope corresponding to the given declaraion context, or NULL
1026 /// if no such scope is open.
1028
1029 void PushFunctionScope();
1030 void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
1032
1033 /// This is used to inform Sema what the current TemplateParameterDepth
1034 /// is during Parsing. Currently it is used to pass on the depth
1035 /// when parsing generic lambda 'auto' parameters.
1036 void RecordParsingTemplateParameterDepth(unsigned Depth);
1037
1038 void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
1040 unsigned OpenMPCaptureLevel = 0);
1041
1042 /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
1043 /// time after they've been popped.
1045 Sema *Self;
1046
1047 public:
1048 explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
1050 };
1051
1053 std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
1054
1055 /// Pop a function (or block or lambda or captured region) scope from the
1056 /// stack.
1057 ///
1058 /// \param WP The warning policy to use for CFG-based warnings, or null if
1059 /// such warnings should not be produced.
1060 /// \param D The declaration corresponding to this function scope, if
1061 /// producing CFG-based warnings.
1062 /// \param BlockType The type of the block expression, if D is a BlockDecl.
1065 const Decl *D = nullptr,
1066 QualType BlockType = QualType());
1067
1069
1074
1075 void PushCompoundScope(bool IsStmtExpr);
1076 void PopCompoundScope();
1077
1078 /// Determine whether any errors occurred within this function/method/
1079 /// block.
1081
1082 /// Retrieve the current block, if any.
1084
1085 /// Get the innermost lambda or block enclosing the current location, if any.
1086 /// This looks through intervening non-lambda, non-block scopes such as local
1087 /// functions.
1089
1090 /// Retrieve the current lambda scope info, if any.
1091 /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
1092 /// lambda scope info ignoring all inner capturing scopes that are not
1093 /// lambda scopes.
1095 getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
1096
1097 /// Retrieve the current generic lambda info, if any.
1099
1100 /// Retrieve the current captured region, if any.
1102
1103 void ActOnComment(SourceRange Comment);
1104
1105 /// Retrieve the parser's current scope.
1106 ///
1107 /// This routine must only be used when it is certain that semantic analysis
1108 /// and the parser are in precisely the same context, which is not the case
1109 /// when, e.g., we are performing any kind of template instantiation.
1110 /// Therefore, the only safe places to use this scope are in the parser
1111 /// itself and in routines directly invoked from the parser and *never* from
1112 /// template substitution or instantiation.
1113 Scope *getCurScope() const { return CurScope; }
1114
1116
1119 }
1120
1121 SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
1122 const FunctionDecl *FD = nullptr);
1124 const PartialDiagnostic &PD,
1125 const FunctionDecl *FD = nullptr) {
1126 return targetDiag(Loc, PD.getDiagID(), FD) << PD;
1127 }
1128
1129 /// Check if the type is allowed to be used for the current target.
1131 ValueDecl *D = nullptr);
1132
1133 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
1134 /// cast. If there is already an implicit cast, merge into the existing one.
1135 /// If isLvalue, the result of the cast is an lvalue.
1138 const CXXCastPath *BasePath = nullptr,
1140
1141 /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
1142 /// to the conversion from scalar type ScalarTy to the Boolean type.
1144
1145 /// If \p AllowLambda is true, treat lambda as function.
1146 DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
1147
1148 /// Returns a pointer to the innermost enclosing function, or nullptr if the
1149 /// current context is not inside a function. If \p AllowLambda is true,
1150 /// this can return the call operator of an enclosing lambda, otherwise
1151 /// lambdas are skipped when looking for an enclosing function.
1152 FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
1153
1154 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
1155 /// the method decl for the method being parsed. If we're currently
1156 /// in a 'block', this returns the containing context.
1158
1159 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
1160 /// or C function we're in, otherwise return null. If we're currently
1161 /// in a 'block', this returns the containing context.
1163
1164 /// Warn if we're implicitly casting from a _Nullable pointer type to a
1165 /// _Nonnull one.
1168
1169 /// Warn when implicitly casting 0 to nullptr.
1171
1172 /// Warn when implicitly changing function effects.
1175
1176 /// makeUnavailableInSystemHeader - There is an error in the current
1177 /// context. If we're still in a system header, and we can plausibly
1178 /// make the relevant declaration unavailable instead of erroring, do
1179 /// so and return true.
1181 UnavailableAttr::ImplicitReason reason);
1182
1183 /// Retrieve a suitable printing policy for diagnostics.
1185 return getPrintingPolicy(Context, PP);
1186 }
1187
1188 /// Retrieve a suitable printing policy for diagnostics.
1190 const Preprocessor &PP);
1191
1192 /// Scope actions.
1194
1195 /// Determine whether \param D is function like (function or function
1196 /// template) for parsing.
1198
1199 /// The maximum alignment, same as in llvm::Value. We duplicate them here
1200 /// because that allows us not to duplicate the constants in clang code,
1201 /// which we must to since we can't directly use the llvm constants.
1202 /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
1203 ///
1204 /// This is the greatest alignment value supported by load, store, and alloca
1205 /// instructions, and global values.
1206 static const unsigned MaxAlignmentExponent = 32;
1207 static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
1208
1209 /// Flag indicating whether or not to collect detailed statistics.
1211
1212 std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
1213
1214 /// Stack containing information about each of the nested
1215 /// function, block, and method scopes that are currently active.
1217
1218 /// The index of the first FunctionScope that corresponds to the current
1219 /// context.
1221
1222 /// Track the number of currently active capturing scopes.
1224
1225 llvm::BumpPtrAllocator BumpAlloc;
1226
1227 /// The kind of translation unit we are processing.
1228 ///
1229 /// When we're processing a complete translation unit, Sema will perform
1230 /// end-of-translation-unit semantic tasks (such as creating
1231 /// initializers for tentative definitions in C) once parsing has
1232 /// completed. Modules and precompiled headers perform different kinds of
1233 /// checks.
1235
1236 /// Translation Unit Scope - useful to Objective-C actions that need
1237 /// to lookup file scope declarations in the "ordinary" C decl namespace.
1238 /// For example, user-defined classes, built-in "id" type, etc.
1240
1242 return CurScope->incrementMSManglingNumber();
1243 }
1244
1245 /// Try to recover by turning the given expression into a
1246 /// call. Returns true if recovery was attempted or an error was
1247 /// emitted; this may also leave the ExprResult invalid.
1249 bool ForceComplain = false,
1250 bool (*IsPlausibleResult)(QualType) = nullptr);
1251
1252 /// Figure out if an expression could be turned into a call.
1253 ///
1254 /// Use this when trying to recover from an error where the programmer may
1255 /// have written just the name of a function instead of actually calling it.
1256 ///
1257 /// \param E - The expression to examine.
1258 /// \param ZeroArgCallReturnTy - If the expression can be turned into a call
1259 /// with no arguments, this parameter is set to the type returned by such a
1260 /// call; otherwise, it is set to an empty QualType.
1261 /// \param OverloadSet - If the expression is an overloaded function
1262 /// name, this parameter is populated with the decls of the various
1263 /// overloads.
1264 bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
1265 UnresolvedSetImpl &NonTemplateOverloads);
1266
1270
1273
1281
1282 /// A RAII object to enter scope of a compound statement.
1284 public:
1285 CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
1286 S.ActOnStartOfCompoundStmt(IsStmtExpr);
1287 }
1288
1290
1291 private:
1292 Sema &S;
1293 };
1294
1295 /// An RAII helper that pops function a function scope on exit.
1301 if (Active)
1303 }
1304 void disable() { Active = false; }
1305 };
1306
1308 return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
1309 }
1310
1311 /// Worker object for performing CFG-based warnings.
1314
1315 /// Callback to the parser to parse templated functions when needed.
1316 typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
1317 typedef void LateTemplateParserCleanupCB(void *P);
1321
1323 LateTemplateParserCleanupCB *LTPCleanup, void *P) {
1324 LateTemplateParser = LTP;
1325 LateTemplateParserCleanup = LTPCleanup;
1326 OpaqueParser = P;
1327 }
1328
1329 /// Callback to the parser to parse a type expressed as a string.
1330 std::function<TypeResult(StringRef, StringRef, SourceLocation)>
1332
1333 /// VAListTagName - The declaration name corresponding to __va_list_tag.
1334 /// This is used as part of a hack to omit that class from ADL results.
1336
1337 /// Is the last error level diagnostic immediate. This is used to determined
1338 /// whether the next info diagnostic should be immediate.
1340
1341 class DelayedDiagnostics;
1342
1344 sema::DelayedDiagnosticPool *SavedPool = nullptr;
1346 };
1349
1350 /// A class which encapsulates the logic for delaying diagnostics
1351 /// during parsing and other processing.
1353 /// The current pool of diagnostics into which delayed
1354 /// diagnostics should go.
1355 sema::DelayedDiagnosticPool *CurPool = nullptr;
1356
1357 public:
1359
1360 /// Adds a delayed diagnostic.
1361 void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
1362
1363 /// Determines whether diagnostics should be delayed.
1364 bool shouldDelayDiagnostics() { return CurPool != nullptr; }
1365
1366 /// Returns the current delayed-diagnostics pool.
1367 sema::DelayedDiagnosticPool *getCurrentPool() const { return CurPool; }
1368
1369 /// Enter a new scope. Access and deprecation diagnostics will be
1370 /// collected in this pool.
1373 state.SavedPool = CurPool;
1374 CurPool = &pool;
1375 return state;
1376 }
1377
1378 /// Leave a delayed-diagnostic state that was previously pushed.
1379 /// Do not emit any of the diagnostics. This is performed as part
1380 /// of the bookkeeping of popping a pool "properly".
1382 CurPool = state.SavedPool;
1383 }
1384
1385 /// Enter a new scope where access and deprecation diagnostics are
1386 /// not delayed.
1389 state.SavedPool = CurPool;
1390 CurPool = nullptr;
1391 return state;
1392 }
1393
1394 /// Undo a previous pushUndelayed().
1396 assert(CurPool == nullptr);
1397 CurPool = state.SavedPool;
1398 }
1399 } DelayedDiagnostics;
1400
1402 return DelayedDiagnostics.push(pool);
1403 }
1404
1405 /// Diagnostics that are emitted only if we discover that the given function
1406 /// must be codegen'ed. Because handling these correctly adds overhead to
1407 /// compilation, this is currently only enabled for CUDA compilations.
1408 SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags;
1409
1410 /// CurContext - This is the current declaration context of parsing.
1412
1414 assert(AMDGPUPtr);
1415 return *AMDGPUPtr;
1416 }
1417
1419 assert(ARMPtr);
1420 return *ARMPtr;
1421 }
1422
1424 assert(AVRPtr);
1425 return *AVRPtr;
1426 }
1427
1429 assert(BPFPtr);
1430 return *BPFPtr;
1431 }
1432
1434 assert(CodeCompletionPtr);
1435 return *CodeCompletionPtr;
1436 }
1437
1439 assert(CUDAPtr);
1440 return *CUDAPtr;
1441 }
1442
1444 assert(DirectXPtr);
1445 return *DirectXPtr;
1446 }
1447
1449 assert(HLSLPtr);
1450 return *HLSLPtr;
1451 }
1452
1454 assert(HexagonPtr);
1455 return *HexagonPtr;
1456 }
1457
1459 assert(LoongArchPtr);
1460 return *LoongArchPtr;
1461 }
1462
1464 assert(M68kPtr);
1465 return *M68kPtr;
1466 }
1467
1469 assert(MIPSPtr);
1470 return *MIPSPtr;
1471 }
1472
1474 assert(MSP430Ptr);
1475 return *MSP430Ptr;
1476 }
1477
1479 assert(NVPTXPtr);
1480 return *NVPTXPtr;
1481 }
1482
1484 assert(ObjCPtr);
1485 return *ObjCPtr;
1486 }
1487
1489 assert(OpenACCPtr);
1490 return *OpenACCPtr;
1491 }
1492
1494 assert(OpenCLPtr);
1495 return *OpenCLPtr;
1496 }
1497
1499 assert(OpenMPPtr && "SemaOpenMP is dead");
1500 return *OpenMPPtr;
1501 }
1502
1504 assert(PPCPtr);
1505 return *PPCPtr;
1506 }
1507
1509 assert(PseudoObjectPtr);
1510 return *PseudoObjectPtr;
1511 }
1512
1514 assert(RISCVPtr);
1515 return *RISCVPtr;
1516 }
1517
1519 assert(SPIRVPtr);
1520 return *SPIRVPtr;
1521 }
1522
1524 assert(SYCLPtr);
1525 return *SYCLPtr;
1526 }
1527
1529 assert(SwiftPtr);
1530 return *SwiftPtr;
1531 }
1532
1534 assert(SystemZPtr);
1535 return *SystemZPtr;
1536 }
1537
1539 assert(WasmPtr);
1540 return *WasmPtr;
1541 }
1542
1544 assert(X86Ptr);
1545 return *X86Ptr;
1546 }
1547
1548 /// Source of additional semantic information.
1550
1551protected:
1552 friend class Parser;
1554 friend class ASTReader;
1555 friend class ASTDeclReader;
1556 friend class ASTWriter;
1557
1558private:
1559 std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1560 bool WarnedDarwinSDKInfoMissing = false;
1561
1562 StackExhaustionHandler StackHandler;
1563
1564 Sema(const Sema &) = delete;
1565 void operator=(const Sema &) = delete;
1566
1567 /// The handler for the FileChanged preprocessor events.
1568 ///
1569 /// Used for diagnostics that implement custom semantic analysis for #include
1570 /// directives, like -Wpragma-pack.
1571 sema::SemaPPCallbacks *SemaPPCallbackHandler;
1572
1573 /// The parser's current scope.
1574 ///
1575 /// The parser maintains this state here.
1576 Scope *CurScope;
1577
1578 mutable IdentifierInfo *Ident_super;
1579
1580 std::unique_ptr<SemaAMDGPU> AMDGPUPtr;
1581 std::unique_ptr<SemaARM> ARMPtr;
1582 std::unique_ptr<SemaAVR> AVRPtr;
1583 std::unique_ptr<SemaBPF> BPFPtr;
1584 std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
1585 std::unique_ptr<SemaCUDA> CUDAPtr;
1586 std::unique_ptr<SemaDirectX> DirectXPtr;
1587 std::unique_ptr<SemaHLSL> HLSLPtr;
1588 std::unique_ptr<SemaHexagon> HexagonPtr;
1589 std::unique_ptr<SemaLoongArch> LoongArchPtr;
1590 std::unique_ptr<SemaM68k> M68kPtr;
1591 std::unique_ptr<SemaMIPS> MIPSPtr;
1592 std::unique_ptr<SemaMSP430> MSP430Ptr;
1593 std::unique_ptr<SemaNVPTX> NVPTXPtr;
1594 std::unique_ptr<SemaObjC> ObjCPtr;
1595 std::unique_ptr<SemaOpenACC> OpenACCPtr;
1596 std::unique_ptr<SemaOpenCL> OpenCLPtr;
1597 std::unique_ptr<SemaOpenMP> OpenMPPtr;
1598 std::unique_ptr<SemaPPC> PPCPtr;
1599 std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
1600 std::unique_ptr<SemaRISCV> RISCVPtr;
1601 std::unique_ptr<SemaSPIRV> SPIRVPtr;
1602 std::unique_ptr<SemaSYCL> SYCLPtr;
1603 std::unique_ptr<SemaSwift> SwiftPtr;
1604 std::unique_ptr<SemaSystemZ> SystemZPtr;
1605 std::unique_ptr<SemaWasm> WasmPtr;
1606 std::unique_ptr<SemaX86> X86Ptr;
1607
1608 ///@}
1609
1610 //
1611 //
1612 // -------------------------------------------------------------------------
1613 //
1614 //
1615
1616 /// \name API Notes
1617 /// Implementations are in SemaAPINotes.cpp
1618 ///@{
1619
1620public:
1621 /// Map any API notes provided for this declaration to attributes on the
1622 /// declaration.
1623 ///
1624 /// Triggered by declaration-attribute processing.
1625 void ProcessAPINotes(Decl *D);
1626 /// Apply the 'Nullability:' annotation to the specified declaration
1627 void ApplyNullability(Decl *D, NullabilityKind Nullability);
1628 /// Apply the 'Type:' annotation to the specified declaration
1629 void ApplyAPINotesType(Decl *D, StringRef TypeString);
1630
1631 /// Whether APINotes should be gathered for all applicable Swift language
1632 /// versions, without being applied. Leaving clients of the current module
1633 /// to select and apply the correct version.
1636 }
1637 ///@}
1638
1639 //
1640 //
1641 // -------------------------------------------------------------------------
1642 //
1643 //
1644
1645 /// \name C++ Access Control
1646 /// Implementations are in SemaAccess.cpp
1647 ///@{
1648
1649public:
1656
1657 /// SetMemberAccessSpecifier - Set the access specifier of a member.
1658 /// Returns true on error (when the previous member decl access specifier
1659 /// is different from the new member decl access specifier).
1660 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1661 NamedDecl *PrevMemberDecl,
1662 AccessSpecifier LexicalAS);
1663
1664 /// Perform access-control checking on a previously-unresolved member
1665 /// access which has now been resolved to a member.
1667 DeclAccessPair FoundDecl);
1669 DeclAccessPair FoundDecl);
1670
1671 /// Checks access to an overloaded operator new or delete.
1673 SourceRange PlacementRange,
1674 CXXRecordDecl *NamingClass,
1675 DeclAccessPair FoundDecl,
1676 bool Diagnose = true);
1677
1678 /// Checks access to a constructor.
1680 DeclAccessPair FoundDecl,
1681 const InitializedEntity &Entity,
1682 bool IsCopyBindingRefToTemp = false);
1683
1684 /// Checks access to a constructor.
1686 DeclAccessPair FoundDecl,
1687 const InitializedEntity &Entity,
1688 const PartialDiagnostic &PDiag);
1690 CXXDestructorDecl *Dtor,
1691 const PartialDiagnostic &PDiag,
1692 QualType objectType = QualType());
1693
1694 /// Checks access to the target of a friend declaration.
1696
1697 /// Checks access to a member.
1699 CXXRecordDecl *NamingClass,
1701
1702 /// Checks implicit access to a member in a structured binding.
1705 CXXRecordDecl *DecomposedClass,
1706 DeclAccessPair Field);
1708 const SourceRange &,
1709 DeclAccessPair FoundDecl);
1710
1711 /// Checks access to an overloaded member operator, including
1712 /// conversion operators.
1714 Expr *ArgExpr,
1715 DeclAccessPair FoundDecl);
1717 ArrayRef<Expr *> ArgExprs,
1718 DeclAccessPair FoundDecl);
1720 DeclAccessPair FoundDecl);
1721
1722 /// Checks access for a hierarchy conversion.
1723 ///
1724 /// \param ForceCheck true if this check should be performed even if access
1725 /// control is disabled; some things rely on this for semantics
1726 /// \param ForceUnprivileged true if this check should proceed as if the
1727 /// context had no special privileges
1729 QualType Derived, const CXXBasePath &Path,
1730 unsigned DiagID, bool ForceCheck = false,
1731 bool ForceUnprivileged = false);
1732
1734 SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived,
1735 const CXXBasePath &Path, unsigned DiagID,
1736 llvm::function_ref<void(PartialDiagnostic &PD)> SetupPDiag,
1737 bool ForceCheck = false, bool ForceUnprivileged = false);
1738
1739 /// Checks access to all the declarations in the given result set.
1740 void CheckLookupAccess(const LookupResult &R);
1741
1742 /// Checks access to Target from the given class. The check will take access
1743 /// specifiers into account, but no member access expressions and such.
1744 ///
1745 /// \param Target the declaration to check if it can be accessed
1746 /// \param NamingClass the class in which the lookup was started.
1747 /// \param BaseType type of the left side of member access expression.
1748 /// \p BaseType and \p NamingClass are used for C++ access control.
1749 /// Depending on the lookup case, they should be set to the following:
1750 /// - lhs.target (member access without a qualifier):
1751 /// \p BaseType and \p NamingClass are both the type of 'lhs'.
1752 /// - lhs.X::target (member access with a qualifier):
1753 /// BaseType is the type of 'lhs', NamingClass is 'X'
1754 /// - X::target (qualified lookup without member access):
1755 /// BaseType is null, NamingClass is 'X'.
1756 /// - target (unqualified lookup).
1757 /// BaseType is null, NamingClass is the parent class of 'target'.
1758 /// \return true if the Target is accessible from the Class, false otherwise.
1759 bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
1760 QualType BaseType);
1761
1762 /// Is the given member accessible for the purposes of deciding whether to
1763 /// define a special member function as deleted?
1765 DeclAccessPair Found, QualType ObjectType,
1767 const PartialDiagnostic &Diag);
1770 QualType ObjectType) {
1771 return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
1772 SourceLocation(), PDiag());
1773 }
1774
1776 const DependentDiagnostic &DD,
1777 const MultiLevelTemplateArgumentList &TemplateArgs);
1779
1780 ///@}
1781
1782 //
1783 //
1784 // -------------------------------------------------------------------------
1785 //
1786 //
1787
1788 /// \name Attributes
1789 /// Implementations are in SemaAttr.cpp
1790 ///@{
1791
1792public:
1793 /// Controls member pointer representation format under the MS ABI.
1796
1797 bool MSStructPragmaOn; // True when \#pragma ms_struct on
1798
1799 /// Source location for newly created implicit MSInheritanceAttrs
1801
1803 std::string SectionName;
1804 bool Valid = false;
1806 };
1807
1813
1815 PSK_Reset = 0x0, // #pragma ()
1816 PSK_Set = 0x1, // #pragma (value)
1817 PSK_Push = 0x2, // #pragma (push[, id])
1818 PSK_Pop = 0x4, // #pragma (pop[, id])
1819 PSK_Show = 0x8, // #pragma (show) -- only for "pack"!
1820 PSK_Push_Set = PSK_Push | PSK_Set, // #pragma (push[, id], value)
1821 PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value)
1822 };
1823
1826 StringRef SlotLabel;
1828 };
1829
1830 // #pragma pack and align.
1832 public:
1833 // `Native` represents default align mode, which may vary based on the
1834 // platform.
1835 enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
1836
1837 // #pragma pack info constructor
1838 AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
1839 : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
1840 assert(Num == PackNumber && "The pack number has been truncated.");
1841 }
1842
1843 // #pragma align info constructor
1845 : PackAttr(false), AlignMode(M),
1846 PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
1847
1848 explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
1849
1851
1852 // When a AlignPackInfo itself cannot be used, this returns an 32-bit
1853 // integer encoding for it. This should only be passed to
1854 // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
1855 static uint32_t getRawEncoding(const AlignPackInfo &Info) {
1856 std::uint32_t Encoding{};
1857 if (Info.IsXLStack())
1858 Encoding |= IsXLMask;
1859
1860 Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
1861
1862 if (Info.IsPackAttr())
1863 Encoding |= PackAttrMask;
1864
1865 Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
1866
1867 return Encoding;
1868 }
1869
1870 static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
1871 bool IsXL = static_cast<bool>(Encoding & IsXLMask);
1873 static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
1874 int PackNumber = (Encoding & PackNumMask) >> 4;
1875
1876 if (Encoding & PackAttrMask)
1877 return AlignPackInfo(M, PackNumber, IsXL);
1878
1879 return AlignPackInfo(M, IsXL);
1880 }
1881
1882 bool IsPackAttr() const { return PackAttr; }
1883
1884 bool IsAlignAttr() const { return !PackAttr; }
1885
1886 Mode getAlignMode() const { return AlignMode; }
1887
1888 unsigned getPackNumber() const { return PackNumber; }
1889
1890 bool IsPackSet() const {
1891 // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
1892 // attriute on a decl.
1893 return PackNumber != UninitPackVal && PackNumber != 0;
1894 }
1895
1896 bool IsXLStack() const { return XLStack; }
1897
1898 bool operator==(const AlignPackInfo &Info) const {
1899 return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
1900 std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
1901 Info.XLStack);
1902 }
1903
1904 bool operator!=(const AlignPackInfo &Info) const {
1905 return !(*this == Info);
1906 }
1907
1908 private:
1909 /// \brief True if this is a pragma pack attribute,
1910 /// not a pragma align attribute.
1911 bool PackAttr;
1912
1913 /// \brief The alignment mode that is in effect.
1914 Mode AlignMode;
1915
1916 /// \brief The pack number of the stack.
1917 unsigned char PackNumber;
1918
1919 /// \brief True if it is a XL #pragma align/pack stack.
1920 bool XLStack;
1921
1922 /// \brief Uninitialized pack value.
1923 static constexpr unsigned char UninitPackVal = -1;
1924
1925 // Masks to encode and decode an AlignPackInfo.
1926 static constexpr uint32_t IsXLMask{0x0000'0001};
1927 static constexpr uint32_t AlignModeMask{0x0000'0006};
1928 static constexpr uint32_t PackAttrMask{0x00000'0008};
1929 static constexpr uint32_t PackNumMask{0x0000'01F0};
1930 };
1931
1932 template <typename ValueType> struct PragmaStack {
1933 struct Slot {
1934 llvm::StringRef StackSlotLabel;
1935 ValueType Value;
1938 Slot(llvm::StringRef StackSlotLabel, ValueType Value,
1943 };
1944
1945 void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
1946 llvm::StringRef StackSlotLabel, ValueType Value) {
1947 if (Action == PSK_Reset) {
1949 CurrentPragmaLocation = PragmaLocation;
1950 return;
1951 }
1952 if (Action & PSK_Push)
1953 Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
1954 PragmaLocation);
1955 else if (Action & PSK_Pop) {
1956 if (!StackSlotLabel.empty()) {
1957 // If we've got a label, try to find it and jump there.
1958 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
1959 return x.StackSlotLabel == StackSlotLabel;
1960 });
1961 // If we found the label so pop from there.
1962 if (I != Stack.rend()) {
1963 CurrentValue = I->Value;
1964 CurrentPragmaLocation = I->PragmaLocation;
1965 Stack.erase(std::prev(I.base()), Stack.end());
1966 }
1967 } else if (!Stack.empty()) {
1968 // We do not have a label, just pop the last entry.
1969 CurrentValue = Stack.back().Value;
1970 CurrentPragmaLocation = Stack.back().PragmaLocation;
1971 Stack.pop_back();
1972 }
1973 }
1974 if (Action & PSK_Set) {
1976 CurrentPragmaLocation = PragmaLocation;
1977 }
1978 }
1979
1980 // MSVC seems to add artificial slots to #pragma stacks on entering a C++
1981 // method body to restore the stacks on exit, so it works like this:
1982 //
1983 // struct S {
1984 // #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
1985 // void Method {}
1986 // #pragma <name>(pop, InternalPragmaSlot)
1987 // };
1988 //
1989 // It works even with #pragma vtordisp, although MSVC doesn't support
1990 // #pragma vtordisp(push [, id], n)
1991 // syntax.
1992 //
1993 // Push / pop a named sentinel slot.
1994 void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
1995 assert((Action == PSK_Push || Action == PSK_Pop) &&
1996 "Can only push / pop #pragma stack sentinels!");
1998 }
1999
2000 // Constructors.
2001 explicit PragmaStack(const ValueType &Default)
2003
2004 bool hasValue() const { return CurrentValue != DefaultValue; }
2005
2007 ValueType DefaultValue; // Value used for PSK_Reset action.
2008 ValueType CurrentValue;
2010 };
2011 // FIXME: We should serialize / deserialize these if they occur in a PCH (but
2012 // we shouldn't do so if they're in a module).
2013
2014 /// Whether to insert vtordisps prior to virtual bases in the Microsoft
2015 /// C++ ABI. Possible values are 0, 1, and 2, which mean:
2016 ///
2017 /// 0: Suppress all vtordisps
2018 /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
2019 /// structors
2020 /// 2: Always insert vtordisps to support RTTI on partially constructed
2021 /// objects
2024 // The current #pragma align/pack values and locations at each #include.
2029 };
2031 // Segment #pragmas.
2036
2037 // #pragma strict_gs_check.
2039
2040 // This stack tracks the current state of Sema.CurFPFeatures.
2043 FPOptionsOverride result;
2044 if (!FpPragmaStack.hasValue()) {
2045 result = FPOptionsOverride();
2046 } else {
2047 result = FpPragmaStack.CurrentValue;
2048 }
2049 return result;
2050 }
2051
2057 };
2058
2059 // RAII object to push / pop sentinel slots for all MS #pragma stacks.
2060 // Actions should be performed only if we enter / exit a C++ method body.
2062 public:
2063 PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
2065
2066 private:
2067 Sema &S;
2068 StringRef SlotLabel;
2069 bool ShouldAct;
2070 };
2071
2072 /// Last section used with #pragma init_seg.
2075
2076 /// Sections used with #pragma alloc_text.
2077 llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
2078
2079 /// VisContext - Manages the stack for \#pragma GCC visibility.
2080 void *VisContext; // Really a "PragmaVisStack*"
2081
2082 /// This an attribute introduced by \#pragma clang attribute.
2088 };
2089
2090 /// A push'd group of PragmaAttributeEntries.
2092 /// The location of the push attribute.
2094 /// The namespace of this push group.
2097 };
2098
2100
2101 /// The declaration that is currently receiving an attribute from the
2102 /// #pragma attribute stack.
2104
2105 /// This represents the last location of a "#pragma clang optimize off"
2106 /// directive if such a directive has not been closed by an "on" yet. If
2107 /// optimizations are currently "on", this is set to an invalid location.
2109
2110 /// Get the location for the currently active "\#pragma clang optimize
2111 /// off". If this location is invalid, then the state of the pragma is "on".
2114 }
2115
2116 /// The "on" or "off" argument passed by \#pragma optimize, that denotes
2117 /// whether the optimizations in the list passed to the pragma should be
2118 /// turned off or on. This boolean is true by default because command line
2119 /// options are honored when `#pragma optimize("", on)`.
2120 /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
2122
2123 /// Set of no-builtin functions listed by \#pragma function.
2125
2126 /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
2127 /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
2129
2130 /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
2132
2133 /// Add gsl::Pointer attribute to std::container::iterator
2134 /// \param ND The declaration that introduces the name
2135 /// std::container::iterator. \param UnderlyingRecord The record named by ND.
2136 void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
2137
2138 /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
2140
2141 /// Add [[clang:::lifetimebound]] attr for std:: functions and methods.
2143
2144 /// Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
2146
2147 /// Add [[gsl::Pointer]] attributes for std:: types.
2149
2150 LifetimeCaptureByAttr *ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
2151 StringRef ParamName);
2152 // Processes the argument 'X' in [[clang::lifetime_capture_by(X)]]. Since 'X'
2153 // can be the name of a function parameter, we need to parse the function
2154 // declaration and rest of the parameters before processesing 'X'. Therefore
2155 // do this lazily instead of processing while parsing the annotation itself.
2157
2158 /// Add _Nullable attributes for std:: types.
2160
2161 /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
2164 PragmaClangSectionKind SecKind,
2165 StringRef SecName);
2166
2167 /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
2169 SourceLocation PragmaLoc);
2170
2171 /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
2172 void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
2173 StringRef SlotLabel, Expr *Alignment);
2174
2175 /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
2176 /// (unless they are value dependent or type dependent). Returns false
2177 /// and emits a diagnostic if one or more of the arguments could not be
2178 /// folded into a constant.
2181
2185 };
2186
2188 SourceLocation IncludeLoc);
2190
2191 /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
2193
2194 /// ActOnPragmaMSComment - Called on well formed
2195 /// \#pragma comment(kind, "arg").
2197 StringRef Arg);
2198
2199 /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
2200 void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
2201 StringRef Value);
2202
2203 /// Are precise floating point semantics currently enabled?
2205 return !CurFPFeatures.getAllowFPReassociate() &&
2206 !CurFPFeatures.getNoSignedZero() &&
2207 !CurFPFeatures.getAllowReciprocal() &&
2208 !CurFPFeatures.getAllowApproxFunc();
2209 }
2210
2213
2214 /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
2217
2218 /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
2219 /// pointers_to_members(representation method[, general purpose
2220 /// representation]).
2223 SourceLocation PragmaLoc);
2224
2225 /// Called on well formed \#pragma vtordisp().
2228
2229 bool UnifySection(StringRef SectionName, int SectionFlags,
2230 NamedDecl *TheDecl);
2231 bool UnifySection(StringRef SectionName, int SectionFlags,
2232 SourceLocation PragmaSectionLocation);
2233
2234 /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
2235 void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
2236 PragmaMsStackAction Action,
2237 llvm::StringRef StackSlotLabel,
2238 StringLiteral *SegmentName, llvm::StringRef PragmaName);
2239
2240 /// Called on well formed \#pragma section().
2241 void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags,
2242 StringLiteral *SegmentName);
2243
2244 /// Called on well-formed \#pragma init_seg().
2245 void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
2246 StringLiteral *SegmentName);
2247
2248 /// Called on well-formed \#pragma alloc_text().
2250 SourceLocation PragmaLocation, StringRef Section,
2251 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
2252 &Functions);
2253
2254 /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
2255 /// strict_gs_check.
2257 PragmaMsStackAction Action,
2258 bool Value);
2259
2260 /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
2261 void ActOnPragmaUnused(const Token &Identifier, Scope *curScope,
2262 SourceLocation PragmaLoc);
2263
2265 SourceLocation PragmaLoc,
2268 const IdentifierInfo *Namespace);
2269
2270 /// Called on well-formed '\#pragma clang attribute pop'.
2272 const IdentifierInfo *Namespace);
2273
2274 /// Adds the attributes that have been specified using the
2275 /// '\#pragma clang attribute push' directives to the given declaration.
2276 void AddPragmaAttributes(Scope *S, Decl *D);
2277
2279 llvm::function_ref<void(SourceLocation, PartialDiagnostic)>;
2281 return [this](SourceLocation Loc, PartialDiagnostic PD) {
2282 // This bypasses a lot of the filters in the diag engine, as it's
2283 // to be used to attach notes to diagnostics which have already
2284 // been filtered through.
2285 DiagnosticBuilder Builder(Diags.Report(Loc, PD.getDiagID()));
2286 PD.Emit(Builder);
2287 };
2288 }
2289
2294 }
2295
2297
2298 /// Called on well formed \#pragma clang optimize.
2299 void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
2300
2301 /// #pragma optimize("[optimization-list]", on | off).
2302 void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
2303
2304 /// Call on well formed \#pragma function.
2305 void
2307 const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
2308
2309 /// Only called on function definitions; if there is a pragma in scope
2310 /// with the effect of a range-based optnone, consider marking the function
2311 /// with attribute optnone.
2313
2314 /// Only called on function definitions; if there is a `#pragma alloc_text`
2315 /// that decides which code section the function should be in, add
2316 /// attribute section to the function.
2318
2319 /// Adds the 'optnone' attribute to the function declaration if there
2320 /// are no conflicts; Loc represents the location causing the 'optnone'
2321 /// attribute to be added (usually because of a pragma).
2323
2324 /// Only called on function definitions; if there is a MSVC #pragma optimize
2325 /// in scope, consider changing the function's attributes based on the
2326 /// optimization list passed to the pragma.
2328
2329 /// Only called on function definitions; if there is a pragma in scope
2330 /// with the effect of a range-based no_builtin, consider marking the function
2331 /// with attribute no_builtin.
2333
2334 /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
2335 /// add an appropriate visibility attribute.
2337
2338 /// FreeVisContext - Deallocate and null out VisContext.
2339 void FreeVisContext();
2340
2341 /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
2342 void ActOnPragmaVisibility(const IdentifierInfo *VisType,
2343 SourceLocation PragmaLoc);
2344
2345 /// ActOnPragmaFPContract - Called on well formed
2346 /// \#pragma {STDC,OPENCL} FP_CONTRACT and
2347 /// \#pragma clang fp contract
2349
2350 /// Called on well formed
2351 /// \#pragma clang fp reassociate
2352 /// or
2353 /// \#pragma clang fp reciprocal
2355 bool IsEnabled);
2356
2357 /// ActOnPragmaFenvAccess - Called on well formed
2358 /// \#pragma STDC FENV_ACCESS
2359 void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
2360
2361 /// ActOnPragmaCXLimitedRange - Called on well formed
2362 /// \#pragma STDC CX_LIMITED_RANGE
2365
2366 /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
2369
2370 /// Called to set constant rounding mode for floating point operations.
2371 void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
2372
2373 /// Called to set exception behavior for floating point operations.
2375
2376 /// PushNamespaceVisibilityAttr - Note that we've entered a
2377 /// namespace with a visibility attribute.
2378 void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
2380
2381 /// PopPragmaVisibility - Pop the top element of the visibility stack; used
2382 /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
2383 void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
2384
2385 /// Handles semantic checking for features that are common to all attributes,
2386 /// such as checking whether a parameter was properly specified, or the
2387 /// correct number of arguments were passed, etc. Returns true if the
2388 /// attribute has been diagnosed.
2389 bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
2390 bool SkipArgCountCheck = false);
2391 bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
2392 bool SkipArgCountCheck = false);
2393
2394 ///@}
2395
2396 //
2397 //
2398 // -------------------------------------------------------------------------
2399 //
2400 //
2401
2402 /// \name Availability Attribute Handling
2403 /// Implementations are in SemaAvailability.cpp
2404 ///@{
2405
2406public:
2407 /// Issue any -Wunguarded-availability warnings in \c FD
2409
2411
2412 /// Retrieve the current function, if any, that should be analyzed for
2413 /// potential availability violations.
2415
2417 const ObjCInterfaceDecl *UnknownObjCClass,
2418 bool ObjCPropertyAccess,
2419 bool AvoidPartialAvailabilityChecks,
2420 ObjCInterfaceDecl *ClassReceiver);
2421
2423
2424 std::pair<AvailabilityResult, const NamedDecl *>
2425 ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message,
2426 ObjCInterfaceDecl *ClassReceiver);
2427 ///@}
2428
2429 //
2430 //
2431 // -------------------------------------------------------------------------
2432 //
2433 //
2434
2435 /// \name Bounds Safety
2436 /// Implementations are in SemaBoundsSafety.cpp
2437 ///@{
2438public:
2439 /// Check if applying the specified attribute variant from the "counted by"
2440 /// family of attributes to FieldDecl \p FD is semantically valid. If
2441 /// semantically invalid diagnostics will be emitted explaining the problems.
2442 ///
2443 /// \param FD The FieldDecl to apply the attribute to
2444 /// \param E The count expression on the attribute
2445 /// \param CountInBytes If true the attribute is from the "sized_by" family of
2446 /// attributes. If the false the attribute is from
2447 /// "counted_by" family of attributes.
2448 /// \param OrNull If true the attribute is from the "_or_null" suffixed family
2449 /// of attributes. If false the attribute does not have the
2450 /// suffix.
2451 ///
2452 /// Together \p CountInBytes and \p OrNull decide the attribute variant. E.g.
2453 /// \p CountInBytes and \p OrNull both being true indicates the
2454 /// `counted_by_or_null` attribute.
2455 ///
2456 /// \returns false iff semantically valid.
2457 bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
2458 bool OrNull);
2459
2460 /// Perform Bounds Safety Semantic checks for assigning to a `__counted_by` or
2461 /// `__counted_by_or_null` pointer type \param LHSTy.
2462 ///
2463 /// \param LHSTy The type being assigned to. Checks will only be performed if
2464 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2465 /// \param RHSExpr The expression being assigned from.
2466 /// \param Action The type assignment being performed
2467 /// \param Loc The SourceLocation to use for error diagnostics
2468 /// \param Assignee The ValueDecl being assigned. This is used to compute
2469 /// the name of the assignee. If the assignee isn't known this can
2470 /// be set to nullptr.
2471 /// \param ShowFullyQualifiedAssigneeName If set to true when using \p
2472 /// Assignee to compute the name of the assignee use the fully
2473 /// qualified name, otherwise use the unqualified name.
2474 ///
2475 /// \returns True iff no diagnostic where emitted, false otherwise.
2477 QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
2478 SourceLocation Loc, const ValueDecl *Assignee,
2479 bool ShowFullyQualifiedAssigneeName);
2480
2481 /// Perform Bounds Safety Semantic checks for initializing a Bounds Safety
2482 /// pointer.
2483 ///
2484 /// \param Entity The entity being initialized
2485 /// \param Kind The kind of initialization being performed
2486 /// \param Action The type assignment being performed
2487 /// \param LHSTy The type being assigned to. Checks will only be performed if
2488 /// the type is a `counted_by` or `counted_by_or_null ` pointer.
2489 /// \param RHSExpr The expression being used for initialization.
2490 ///
2491 /// \returns True iff no diagnostic where emitted, false otherwise.
2493 const InitializationKind &Kind,
2494 AssignmentAction Action,
2495 QualType LHSType, Expr *RHSExpr);
2496
2497 /// Perform Bounds Safety semantic checks for uses of invalid uses counted_by
2498 /// or counted_by_or_null pointers in \param E.
2499 ///
2500 /// \param E the expression to check
2501 ///
2502 /// \returns True iff no diagnostic where emitted, false otherwise.
2504 ///@}
2505
2506 //
2507 //
2508 // -------------------------------------------------------------------------
2509 //
2510 //
2511
2512 /// \name Casts
2513 /// Implementations are in SemaCast.cpp
2514 ///@{
2515
2516public:
2518 return CCK == CheckedConversionKind::CStyleCast ||
2521 }
2522
2523 /// ActOnCXXNamedCast - Parse
2524 /// {dynamic,static,reinterpret,const,addrspace}_cast's.
2526 SourceLocation LAngleBracketLoc, Declarator &D,
2527 SourceLocation RAngleBracketLoc,
2528 SourceLocation LParenLoc, Expr *E,
2529 SourceLocation RParenLoc);
2530
2532 TypeSourceInfo *Ty, Expr *E,
2533 SourceRange AngleBrackets, SourceRange Parens);
2534
2536 ExprResult Operand,
2537 SourceLocation RParenLoc);
2538
2540 Expr *Operand, SourceLocation RParenLoc);
2541
2542 // Checks that reinterpret casts don't have undefined behavior.
2543 void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2544 bool IsDereference, SourceRange Range);
2545
2546 // Checks that the vector type should be initialized from a scalar
2547 // by splatting the value rather than populating a single element.
2548 // This is the case for AltiVecVector types as well as with
2549 // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
2550 bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
2551
2552 // Checks if the -faltivec-src-compat=gcc option is specified.
2553 // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
2554 // treated the same way as they are when trying to initialize
2555 // these vectors on gcc (an error is emitted).
2557 QualType SrcTy);
2558
2560 SourceLocation RParenLoc, Expr *Op);
2561
2563 SourceLocation LParenLoc,
2564 Expr *CastExpr,
2565 SourceLocation RParenLoc);
2566
2567 ///@}
2568
2569 //
2570 //
2571 // -------------------------------------------------------------------------
2572 //
2573 //
2574
2575 /// \name Extra Semantic Checking
2576 /// Implementations are in SemaChecking.cpp
2577 ///@{
2578
2579public:
2580 /// Used to change context to isConstantEvaluated without pushing a heavy
2581 /// ExpressionEvaluationContextRecord object.
2583
2587 }
2588
2590 unsigned ByteNo) const;
2591
2593 FAPK_Fixed, // values to format are fixed (no C-style variadic arguments)
2594 FAPK_Variadic, // values to format are passed as variadic arguments
2595 FAPK_VAList, // values to format are passed in a va_list
2596 FAPK_Elsewhere, // values to format are not passed to this function
2597 };
2598
2599 // Used to grab the relevant information from a FormatAttr and a
2600 // FunctionDeclaration.
2602 unsigned FormatIdx;
2605 };
2606
2607 /// Given a function and its FormatAttr or FormatMatchesAttr info, attempts to
2608 /// populate the FomatStringInfo parameter with the attribute's correct
2609 /// format_idx and firstDataArg. Returns true when the format fits the
2610 /// function and the FormatStringInfo has been populated.
2611 static bool getFormatStringInfo(const Decl *Function, unsigned FormatIdx,
2612 unsigned FirstArg, FormatStringInfo *FSI);
2613 static bool getFormatStringInfo(unsigned FormatIdx, unsigned FirstArg,
2614 bool IsCXXMember, bool IsVariadic,
2615 FormatStringInfo *FSI);
2616
2617 // Used by C++ template instantiation.
2619
2620 /// ConvertVectorExpr - Handle __builtin_convertvector
2622 SourceLocation BuiltinLoc,
2623 SourceLocation RParenLoc);
2624
2625 static StringRef GetFormatStringTypeName(FormatStringType FST);
2626 static FormatStringType GetFormatStringType(StringRef FormatFlavor);
2627 static FormatStringType GetFormatStringType(const FormatAttr *Format);
2628 static FormatStringType GetFormatStringType(const FormatMatchesAttr *Format);
2629
2630 bool FormatStringHasSArg(const StringLiteral *FExpr);
2631
2632 /// Check for comparisons of floating-point values using == and !=. Issue a
2633 /// warning if the comparison is not likely to do what the programmer
2634 /// intended.
2636 const Expr *RHS, BinaryOperatorKind Opcode);
2637
2638 /// Register a magic integral constant to be used as a type tag.
2639 void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
2640 uint64_t MagicValue, QualType Type,
2641 bool LayoutCompatible, bool MustBeNull);
2642
2645
2649
2651
2652 /// If true, \c Type should be compared with other expression's types for
2653 /// layout-compatibility.
2654 LLVM_PREFERRED_TYPE(bool)
2656 LLVM_PREFERRED_TYPE(bool)
2657 unsigned MustBeNull : 1;
2658 };
2659
2660 /// A pair of ArgumentKind identifier and magic value. This uniquely
2661 /// identifies the magic value.
2662 typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
2663
2664 /// Diagnoses the current set of gathered accesses. This happens at the end of
2665 /// each expression evaluation context. Diagnostics are emitted only for
2666 /// accesses gathered in the current evaluation context.
2668
2669 /// This function checks if the expression is in the sef of potentially
2670 /// misaligned members and it is converted to some pointer type T with lower
2671 /// or equal alignment requirements. If so it removes it. This is used when
2672 /// we do not want to diagnose such misaligned access (e.g. in conversions to
2673 /// void*).
2675
2676 /// Returns true if `From` is a function or pointer to a function with the
2677 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2678 /// function without this attribute.
2679 bool DiscardingCFIUncheckedCallee(QualType From, QualType To) const;
2680
2681 /// Returns true if `From` is a function or pointer to a function without the
2682 /// `cfi_unchecked_callee` attribute but `To` is a function or pointer to
2683 /// function with this attribute.
2684 bool AddingCFIUncheckedCallee(QualType From, QualType To) const;
2685
2686 /// This function calls Action when it determines that E designates a
2687 /// misaligned member due to the packed attribute. This is used to emit
2688 /// local diagnostics like in reference binding.
2690 Expr *E,
2691 llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
2692 Action);
2693
2694 enum class AtomicArgumentOrder { API, AST };
2696 BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
2697 SourceLocation RParenLoc, MultiExprArg Args,
2700
2701 /// Check to see if a given expression could have '.c_str()' called on it.
2702 bool hasCStrMethod(const Expr *E);
2703
2704 /// Diagnose pointers that are always non-null.
2705 /// \param E the expression containing the pointer
2706 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
2707 /// compared to a null pointer
2708 /// \param IsEqual True when the comparison is equal to a null pointer
2709 /// \param Range Extra SourceRange to highlight in the diagnostic
2712 bool IsEqual, SourceRange Range);
2713
2714 /// CheckParmsForFunctionDef - Check that the parameters of the given
2715 /// function are appropriate for the definition of a function. This
2716 /// takes care of any checks that cannot be performed on the
2717 /// declaration itself, e.g., that the types of each of the function
2718 /// parameters are complete.
2720 bool CheckParameterNames);
2721
2722 /// CheckCastAlign - Implements -Wcast-align, which warns when a
2723 /// pointer cast increases the alignment requirements.
2724 void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2725
2726 /// checkUnsafeAssigns - Check whether +1 expr is being assigned
2727 /// to weak/__unsafe_unretained type.
2729
2730 /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
2731 /// to weak/__unsafe_unretained expression.
2733
2734 /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
2735 /// statement as a \p Body, and it is located on the same line.
2736 ///
2737 /// This helps prevent bugs due to typos, such as:
2738 /// if (condition);
2739 /// do_stuff();
2740 void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body,
2741 unsigned DiagID);
2742
2743 /// Warn if a for/while loop statement \p S, which is followed by
2744 /// \p PossibleBody, has a suspicious null statement as a body.
2745 void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody);
2746
2747 /// DiagnoseSelfMove - Emits a warning if a value is moved to itself.
2748 void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
2749 SourceLocation OpLoc);
2750
2751 bool IsLayoutCompatible(QualType T1, QualType T2) const;
2753 const TypeSourceInfo *Derived);
2754
2755 /// CheckFunctionCall - Check a direct function call for various correctness
2756 /// and safety properties not strictly enforced by the C type system.
2757 bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
2758 const FunctionProtoType *Proto);
2759
2761 None,
2762 FloatTy,
2763 IntegerTy,
2765 };
2766
2767 /// \param FPOnly restricts the arguments to floating-point types.
2768 std::optional<QualType>
2769 BuiltinVectorMath(CallExpr *TheCall,
2772 bool BuiltinVectorToScalarMath(CallExpr *TheCall);
2773
2774 void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction,
2775 const Expr *ThisArg, ArrayRef<const Expr *> Args);
2776
2777 /// Handles the checks for format strings, non-POD arguments to vararg
2778 /// functions, NULL arguments passed to non-NULL parameters, diagnose_if
2779 /// attributes and AArch64 SME attributes.
2780 void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
2781 const Expr *ThisArg, ArrayRef<const Expr *> Args,
2782 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
2783 VariadicCallType CallType);
2784
2785 /// Verify that two format strings (as understood by attribute(format) and
2786 /// attribute(format_matches) are compatible. If they are incompatible,
2787 /// diagnostics are emitted with the assumption that \c
2788 /// AuthoritativeFormatString is correct and
2789 /// \c TestedFormatString is wrong. If \c FunctionCallArg is provided,
2790 /// diagnostics will point to it and a note will refer to \c
2791 /// TestedFormatString or \c AuthoritativeFormatString as appropriate.
2792 bool
2794 const StringLiteral *AuthoritativeFormatString,
2795 const StringLiteral *TestedFormatString,
2796 const Expr *FunctionCallArg = nullptr);
2797
2798 /// Verify that one format string (as understood by attribute(format)) is
2799 /// self-consistent; for instance, that it doesn't have multiple positional
2800 /// arguments referring to the same argument in incompatible ways. Diagnose
2801 /// if it isn't.
2803
2804 /// \brief Enforce the bounds of a TCB
2805 /// CheckTCBEnforcement - Enforces that every function in a named TCB only
2806 /// directly calls other functions in the same TCB as marked by the
2807 /// enforce_tcb and enforce_tcb_leaf attributes.
2808 void CheckTCBEnforcement(const SourceLocation CallExprLoc,
2809 const NamedDecl *Callee);
2810
2811 void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
2812
2813 /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr
2814 /// TheCall is a constant expression.
2815 bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result);
2816
2817 /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr
2818 /// TheCall is a constant expression in the range [Low, High].
2819 bool BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, int High,
2820 bool RangeIsError = true);
2821
2822 /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr
2823 /// TheCall is a constant expression is a multiple of Num..
2824 bool BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum,
2825 unsigned Multiple);
2826
2827 /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a
2828 /// constant expression representing a power of 2.
2829 bool BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum);
2830
2831 /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is
2832 /// a constant expression representing an arbitrary byte value shifted left by
2833 /// a multiple of 8 bits.
2834 bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum,
2835 unsigned ArgBits);
2836
2837 /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of
2838 /// TheCall is a constant expression representing either a shifted byte value,
2839 /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression
2840 /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some
2841 /// Arm MVE intrinsics.
2842 bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum,
2843 unsigned ArgBits);
2844
2845 /// Checks that a call expression's argument count is at least the desired
2846 /// number. This is useful when doing custom type-checking on a variadic
2847 /// function. Returns true on error.
2848 bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
2849
2850 /// Checks that a call expression's argument count is at most the desired
2851 /// number. This is useful when doing custom type-checking on a variadic
2852 /// function. Returns true on error.
2853 bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
2854
2855 /// Checks that a call expression's argument count is in the desired range.
2856 /// This is useful when doing custom type-checking on a variadic function.
2857 /// Returns true on error.
2858 bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
2859 unsigned MaxArgCount);
2860
2861 /// Checks that a call expression's argument count is the desired number.
2862 /// This is useful when doing custom type-checking. Returns true on error.
2863 bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
2864
2865 /// Returns true if the argument consists of one contiguous run of 1s with any
2866 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2867 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2868 /// since all 1s are not contiguous.
2869 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2870
2872 bool *ICContext = nullptr,
2873 bool IsListInit = false);
2874
2875 bool
2880 CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr =
2882
2883private:
2884 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2885 const ArraySubscriptExpr *ASE = nullptr,
2886 bool AllowOnePastEnd = true, bool IndexNegated = false);
2887 void CheckArrayAccess(const Expr *E);
2888
2889 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2890 const FunctionProtoType *Proto);
2891
2892 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2893 /// such as function pointers returned from functions.
2894 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2895
2896 /// CheckConstructorCall - Check a constructor call for correctness and safety
2897 /// properties not enforced by the C type system.
2898 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2900 const FunctionProtoType *Proto, SourceLocation Loc);
2901
2902 /// Warn if a pointer or reference argument passed to a function points to an
2903 /// object that is less aligned than the parameter. This can happen when
2904 /// creating a typedef with a lower alignment than the original type and then
2905 /// calling functions defined in terms of the original type.
2906 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2907 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2908
2909 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2910
2911 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2912 CallExpr *TheCall);
2913
2914 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2915 CallExpr *TheCall);
2916
2917 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2918
2919 /// Check the arguments to '__builtin_va_start', '__builtin_ms_va_start',
2920 /// or '__builtin_c23_va_start' for validity. Emit an error and return true
2921 /// on failure; return false on success.
2922 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2923 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2924
2925 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2926 /// friends. This is declared to take (...), so we have to check everything.
2927 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2928
2929 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2930 /// __builtin_isnan and friends. This is declared to take (...), so we have
2931 /// to check everything.
2932 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2933 unsigned BuiltinID);
2934
2935 /// Perform semantic analysis for a call to __builtin_complex.
2936 bool BuiltinComplex(CallExpr *TheCall);
2937 bool BuiltinOSLogFormat(CallExpr *TheCall);
2938
2939 /// BuiltinPrefetch - Handle __builtin_prefetch.
2940 /// This is declared to take (const void*, ...) and can take two
2941 /// optional constant int args.
2942 bool BuiltinPrefetch(CallExpr *TheCall);
2943
2944 /// Handle __builtin_alloca_with_align. This is declared
2945 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
2946 /// than 8.
2947 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
2948
2949 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
2950 bool BuiltinArithmeticFence(CallExpr *TheCall);
2951
2952 /// BuiltinAssume - Handle __assume (MS Extension).
2953 /// __assume does not evaluate its arguments, and should warn if its argument
2954 /// has side effects.
2955 bool BuiltinAssume(CallExpr *TheCall);
2956
2957 /// Handle __builtin_assume_aligned. This is declared
2958 /// as (const void*, size_t, ...) and can take one optional constant int arg.
2959 bool BuiltinAssumeAligned(CallExpr *TheCall);
2960
2961 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
2962 /// This checks that the target supports __builtin_longjmp and
2963 /// that val is a constant 1.
2964 bool BuiltinLongjmp(CallExpr *TheCall);
2965
2966 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
2967 /// This checks that the target supports __builtin_setjmp.
2968 bool BuiltinSetjmp(CallExpr *TheCall);
2969
2970 /// We have a call to a function like __sync_fetch_and_add, which is an
2971 /// overloaded function based on the pointer type of its first argument.
2972 /// The main BuildCallExpr routines have already promoted the types of
2973 /// arguments because all of these calls are prototyped as void(...).
2974 ///
2975 /// This function goes through and does final semantic checking for these
2976 /// builtins, as well as generating any warnings.
2977 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
2978
2979 /// BuiltinNontemporalOverloaded - We have a call to
2980 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
2981 /// overloaded function based on the pointer type of its last argument.
2982 ///
2983 /// This function goes through and does final semantic checking for these
2984 /// builtins.
2985 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
2986 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
2988
2989 /// \param FPOnly restricts the arguments to floating-point types.
2990 bool BuiltinElementwiseMath(CallExpr *TheCall,
2993 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
2994
2995 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
2996
2997 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
2999 bool BuiltinCountedByRef(CallExpr *TheCall);
3000
3001 // Matrix builtin handling.
3002 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
3003 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
3004 ExprResult CallResult);
3005 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
3006 ExprResult CallResult);
3007
3008 /// CheckFormatArguments - Check calls to printf and scanf (and similar
3009 /// functions) for correct use of format strings.
3010 /// Returns true if a format string has been fully checked.
3011 bool CheckFormatArguments(const FormatAttr *Format,
3012 ArrayRef<const Expr *> Args, bool IsCXXMember,
3015 llvm::SmallBitVector &CheckedVarArgs);
3016 bool CheckFormatString(const FormatMatchesAttr *Format,
3017 ArrayRef<const Expr *> Args, bool IsCXXMember,
3020 llvm::SmallBitVector &CheckedVarArgs);
3021 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
3023 const StringLiteral *ReferenceFormatString,
3024 unsigned format_idx, unsigned firstDataArg,
3027 llvm::SmallBitVector &CheckedVarArgs);
3028
3029 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
3030
3031 /// Warn when using the wrong abs() function.
3032 void CheckAbsoluteValueFunction(const CallExpr *Call,
3033 const FunctionDecl *FDecl);
3034
3035 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
3036
3037 /// Check for dangerous or invalid arguments to memset().
3038 ///
3039 /// This issues warnings on known problematic, dangerous or unspecified
3040 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
3041 /// function calls.
3042 ///
3043 /// \param Call The call expression to diagnose.
3044 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
3045 IdentifierInfo *FnName);
3046
3047 // Warn if the user has made the 'size' argument to strlcpy or strlcat
3048 // be the size of the source, instead of the destination.
3049 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
3050
3051 // Warn on anti-patterns as the 'size' argument to strncat.
3052 // The correct size argument should look like following:
3053 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
3054 void CheckStrncatArguments(const CallExpr *Call,
3055 const IdentifierInfo *FnName);
3056
3057 /// Alerts the user that they are attempting to free a non-malloc'd object.
3058 void CheckFreeArguments(const CallExpr *E);
3059
3060 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
3061 SourceLocation ReturnLoc, bool isObjCMethod = false,
3062 const AttrVec *Attrs = nullptr,
3063 const FunctionDecl *FD = nullptr);
3064
3065 /// Diagnoses "dangerous" implicit conversions within the given
3066 /// expression (which is a full expression). Implements -Wconversion
3067 /// and -Wsign-compare.
3068 ///
3069 /// \param CC the "context" location of the implicit conversion, i.e.
3070 /// the most location of the syntactic entity requiring the implicit
3071 /// conversion
3072 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
3073
3074 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
3075 /// Input argument E is a logical expression.
3076 void CheckBoolLikeConversion(Expr *E, SourceLocation CC);
3077
3078 /// Diagnose when expression is an integer constant expression and its
3079 /// evaluation results in integer overflow
3080 void CheckForIntOverflow(const Expr *E);
3081 void CheckUnsequencedOperations(const Expr *E);
3082
3083 /// Perform semantic checks on a completed expression. This will either
3084 /// be a full-expression or a default argument expression.
3085 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
3086 bool IsConstexpr = false);
3087
3088 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
3089 Expr *Init);
3090
3091 /// A map from magic value to type information.
3092 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
3093 TypeTagForDatatypeMagicValues;
3094
3095 /// Peform checks on a call of a function with argument_with_type_tag
3096 /// or pointer_with_type_tag attributes.
3097 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
3098 const ArrayRef<const Expr *> ExprArgs,
3099 SourceLocation CallSiteLoc);
3100
3101 /// Check if we are taking the address of a packed field
3102 /// as this may be a problem if the pointer value is dereferenced.
3103 void CheckAddressOfPackedMember(Expr *rhs);
3104
3105 /// Helper class that collects misaligned member designations and
3106 /// their location info for delayed diagnostics.
3107 struct MisalignedMember {
3108 Expr *E;
3109 RecordDecl *RD;
3110 ValueDecl *MD;
3111 CharUnits Alignment;
3112
3113 MisalignedMember() : E(), RD(), MD() {}
3114 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
3115 CharUnits Alignment)
3116 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
3117 explicit MisalignedMember(Expr *E)
3118 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
3119
3120 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
3121 };
3122
3123 /// Adds an expression to the set of gathered misaligned members.
3124 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
3125 CharUnits Alignment);
3126 ///@}
3127
3128 //
3129 //
3130 // -------------------------------------------------------------------------
3131 //
3132 //
3133
3134 /// \name C++ Coroutines
3135 /// Implementations are in SemaCoroutine.cpp
3136 ///@{
3137
3138public:
3139 /// The C++ "std::coroutine_traits" template, which is defined in
3140 /// <coroutine_traits>
3142
3144 StringRef Keyword);
3148
3151 UnresolvedLookupExpr *Lookup);
3153 Expr *Awaiter, bool IsImplicit = false);
3155 UnresolvedLookupExpr *Lookup);
3158 bool IsImplicit = false);
3163
3164 // As a clang extension, enforces that a non-coroutine function must be marked
3165 // with [[clang::coro_wrapper]] if it returns a type marked with
3166 // [[clang::coro_return_type]].
3167 // Expects that FD is not a coroutine.
3169 /// Lookup 'coroutine_traits' in std namespace and std::experimental
3170 /// namespace. The namespace found is recorded in Namespace.
3172 SourceLocation FuncLoc);
3173 /// Check that the expression co_await promise.final_suspend() shall not be
3174 /// potentially-throwing.
3175 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
3176
3177 ///@}
3178
3179 //
3180 //
3181 // -------------------------------------------------------------------------
3182 //
3183 //
3184
3185 /// \name C++ Scope Specifiers
3186 /// Implementations are in SemaCXXScopeSpec.cpp
3187 ///@{
3188
3189public:
3190 // Marks SS invalid if it represents an incomplete type.
3192 // Complete an enum decl, maybe without a scope spec.
3194 CXXScopeSpec *SS = nullptr);
3195
3196 /// Compute the DeclContext that is associated with the given type.
3197 ///
3198 /// \param T the type for which we are attempting to find a DeclContext.
3199 ///
3200 /// \returns the declaration context represented by the type T,
3201 /// or NULL if the declaration context cannot be computed (e.g., because it is
3202 /// dependent and not the current instantiation).
3204
3205 /// Compute the DeclContext that is associated with the given
3206 /// scope specifier.
3207 ///
3208 /// \param SS the C++ scope specifier as it appears in the source
3209 ///
3210 /// \param EnteringContext when true, we will be entering the context of
3211 /// this scope specifier, so we can retrieve the declaration context of a
3212 /// class template or class template partial specialization even if it is
3213 /// not the current instantiation.
3214 ///
3215 /// \returns the declaration context represented by the scope specifier @p SS,
3216 /// or NULL if the declaration context cannot be computed (e.g., because it is
3217 /// dependent and not the current instantiation).
3219 bool EnteringContext = false);
3221
3222 /// If the given nested name specifier refers to the current
3223 /// instantiation, return the declaration that corresponds to that
3224 /// current instantiation (C++0x [temp.dep.type]p1).
3225 ///
3226 /// \param NNS a dependent nested name specifier.
3228
3229 /// The parser has parsed a global nested-name-specifier '::'.
3230 ///
3231 /// \param CCLoc The location of the '::'.
3232 ///
3233 /// \param SS The nested-name-specifier, which will be updated in-place
3234 /// to reflect the parsed nested-name-specifier.
3235 ///
3236 /// \returns true if an error occurred, false otherwise.
3238
3239 /// The parser has parsed a '__super' nested-name-specifier.
3240 ///
3241 /// \param SuperLoc The location of the '__super' keyword.
3242 ///
3243 /// \param ColonColonLoc The location of the '::'.
3244 ///
3245 /// \param SS The nested-name-specifier, which will be updated in-place
3246 /// to reflect the parsed nested-name-specifier.
3247 ///
3248 /// \returns true if an error occurred, false otherwise.
3250 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
3251
3252 /// Determines whether the given declaration is an valid acceptable
3253 /// result for name lookup of a nested-name-specifier.
3254 /// \param SD Declaration checked for nested-name-specifier.
3255 /// \param IsExtension If not null and the declaration is accepted as an
3256 /// extension, the pointed variable is assigned true.
3258 bool *CanCorrect = nullptr);
3259
3260 /// If the given nested-name-specifier begins with a bare identifier
3261 /// (e.g., Base::), perform name lookup for that identifier as a
3262 /// nested-name-specifier within the given scope, and return the result of
3263 /// that name lookup.
3265
3266 /// Keeps information about an identifier in a nested-name-spec.
3267 ///
3269 /// The type of the object, if we're parsing nested-name-specifier in
3270 /// a member access expression.
3272
3273 /// The identifier preceding the '::'.
3275
3276 /// The location of the identifier.
3278
3279 /// The location of the '::'.
3281
3282 /// Creates info object for the most typical case.
3284 SourceLocation ColonColonLoc,
3285 ParsedType ObjectType = ParsedType())
3286 : ObjectType(ObjectType), Identifier(II), IdentifierLoc(IdLoc),
3287 CCLoc(ColonColonLoc) {}
3288
3290 SourceLocation ColonColonLoc, QualType ObjectType)
3291 : ObjectType(ParsedType::make(ObjectType)), Identifier(II),
3292 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
3293 };
3294
3295 /// Build a new nested-name-specifier for "identifier::", as described
3296 /// by ActOnCXXNestedNameSpecifier.
3297 ///
3298 /// \param S Scope in which the nested-name-specifier occurs.
3299 /// \param IdInfo Parser information about an identifier in the
3300 /// nested-name-spec.
3301 /// \param EnteringContext If true, enter the context specified by the
3302 /// nested-name-specifier.
3303 /// \param SS Optional nested name specifier preceding the identifier.
3304 /// \param ScopeLookupResult Provides the result of name lookup within the
3305 /// scope of the nested-name-specifier that was computed at template
3306 /// definition time.
3307 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
3308 /// error recovery and what kind of recovery is performed.
3309 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
3310 /// are allowed. The bool value pointed by this parameter is set to
3311 /// 'true' if the identifier is treated as if it was followed by ':',
3312 /// not '::'.
3313 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3314 ///
3315 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
3316 /// that it contains an extra parameter \p ScopeLookupResult, which provides
3317 /// the result of name lookup within the scope of the nested-name-specifier
3318 /// that was computed at template definition time.
3319 ///
3320 /// If ErrorRecoveryLookup is true, then this call is used to improve error
3321 /// recovery. This means that it should not emit diagnostics, it should
3322 /// just return true on failure. It also means it should only return a valid
3323 /// scope if it *knows* that the result is correct. It should not return in a
3324 /// dependent context, for example. Nor will it extend \p SS with the scope
3325 /// specifier.
3326 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3327 bool EnteringContext, CXXScopeSpec &SS,
3328 NamedDecl *ScopeLookupResult,
3329 bool ErrorRecoveryLookup,
3330 bool *IsCorrectedToColon = nullptr,
3331 bool OnlyNamespace = false);
3332
3333 /// The parser has parsed a nested-name-specifier 'identifier::'.
3334 ///
3335 /// \param S The scope in which this nested-name-specifier occurs.
3336 ///
3337 /// \param IdInfo Parser information about an identifier in the
3338 /// nested-name-spec.
3339 ///
3340 /// \param EnteringContext Whether we're entering the context nominated by
3341 /// this nested-name-specifier.
3342 ///
3343 /// \param SS The nested-name-specifier, which is both an input
3344 /// parameter (the nested-name-specifier before this type) and an
3345 /// output parameter (containing the full nested-name-specifier,
3346 /// including this new type).
3347 ///
3348 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
3349 /// are allowed. The bool value pointed by this parameter is set to 'true'
3350 /// if the identifier is treated as if it was followed by ':', not '::'.
3351 ///
3352 /// \param OnlyNamespace If true, only considers namespaces in lookup.
3353 ///
3354 /// \returns true if an error occurred, false otherwise.
3355 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
3356 bool EnteringContext, CXXScopeSpec &SS,
3357 bool *IsCorrectedToColon = nullptr,
3358 bool OnlyNamespace = false);
3359
3360 /// The parser has parsed a nested-name-specifier
3361 /// 'template[opt] template-name < template-args >::'.
3362 ///
3363 /// \param S The scope in which this nested-name-specifier occurs.
3364 ///
3365 /// \param SS The nested-name-specifier, which is both an input
3366 /// parameter (the nested-name-specifier before this type) and an
3367 /// output parameter (containing the full nested-name-specifier,
3368 /// including this new type).
3369 ///
3370 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
3371 /// \param TemplateName the template name.
3372 /// \param TemplateNameLoc The location of the template name.
3373 /// \param LAngleLoc The location of the opening angle bracket ('<').
3374 /// \param TemplateArgs The template arguments.
3375 /// \param RAngleLoc The location of the closing angle bracket ('>').
3376 /// \param CCLoc The location of the '::'.
3377 ///
3378 /// \param EnteringContext Whether we're entering the context of the
3379 /// nested-name-specifier.
3380 ///
3381 ///
3382 /// \returns true if an error occurred, false otherwise.
3384 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
3385 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
3386 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
3387 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
3388
3390 SourceLocation ColonColonLoc);
3391
3393 const DeclSpec &DS,
3394 SourceLocation ColonColonLoc,
3395 QualType Type);
3396
3397 /// IsInvalidUnlessNestedName - This method is used for error recovery
3398 /// purposes to determine whether the specified identifier is only valid as
3399 /// a nested name specifier, for example a namespace name. It is
3400 /// conservatively correct to always return false from this method.
3401 ///
3402 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
3404 NestedNameSpecInfo &IdInfo,
3405 bool EnteringContext);
3406
3407 /// Given a C++ nested-name-specifier, produce an annotation value
3408 /// that the parser can use later to reconstruct the given
3409 /// nested-name-specifier.
3410 ///
3411 /// \param SS A nested-name-specifier.
3412 ///
3413 /// \returns A pointer containing all of the information in the
3414 /// nested-name-specifier \p SS.
3416
3417 /// Given an annotation pointer for a nested-name-specifier, restore
3418 /// the nested-name-specifier structure.
3419 ///
3420 /// \param Annotation The annotation pointer, produced by
3421 /// \c SaveNestedNameSpecifierAnnotation().
3422 ///
3423 /// \param AnnotationRange The source range corresponding to the annotation.
3424 ///
3425 /// \param SS The nested-name-specifier that will be updated with the contents
3426 /// of the annotation pointer.
3427 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
3428 SourceRange AnnotationRange,
3429 CXXScopeSpec &SS);
3430
3431 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
3432
3433 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
3434 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
3435 /// After this method is called, according to [C++ 3.4.3p3], names should be
3436 /// looked up in the declarator-id's scope, until the declarator is parsed and
3437 /// ActOnCXXExitDeclaratorScope is called.
3438 /// The 'SS' should be a non-empty valid CXXScopeSpec.
3440
3441 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
3442 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
3443 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
3444 /// Used to indicate that names should revert to being looked up in the
3445 /// defining scope.
3447
3448 ///@}
3449
3450 //
3451 //
3452 // -------------------------------------------------------------------------
3453 //
3454 //
3455
3456 /// \name Declarations
3457 /// Implementations are in SemaDecl.cpp
3458 ///@{
3459
3460public:
3462
3463 /// The index of the first InventedParameterInfo that refers to the current
3464 /// context.
3466
3467 /// A RAII object to temporarily push a declaration context.
3469 private:
3470 Sema &S;
3471 DeclContext *SavedContext;
3472 ProcessingContextState SavedContextState;
3473 QualType SavedCXXThisTypeOverride;
3474 unsigned SavedFunctionScopesStart;
3475 unsigned SavedInventedParameterInfosStart;
3476
3477 public:
3478 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3479 : S(S), SavedContext(S.CurContext),
3480 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3481 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3482 SavedFunctionScopesStart(S.FunctionScopesStart),
3483 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3484 assert(ContextToPush && "pushing null context");
3485 S.CurContext = ContextToPush;
3486 if (NewThisContext)
3487 S.CXXThisTypeOverride = QualType();
3488 // Any saved FunctionScopes do not refer to this context.
3489 S.FunctionScopesStart = S.FunctionScopes.size();
3490 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3491 }
3492
3493 void pop() {
3494 if (!SavedContext)
3495 return;
3496 S.CurContext = SavedContext;
3497 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3498 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3499 S.FunctionScopesStart = SavedFunctionScopesStart;
3500 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3501 SavedContext = nullptr;
3502 }
3503
3504 ~ContextRAII() { pop(); }
3505 };
3506
3507 void DiagnoseInvalidJumps(Stmt *Body);
3508
3509 /// The function definitions which were renamed as part of typo-correction
3510 /// to match their respective declarations. We want to keep track of them
3511 /// to ensure that we don't emit a "redefinition" error if we encounter a
3512 /// correctly named definition after the renamed definition.
3514
3515 /// A cache of the flags available in enumerations with the flag_bits
3516 /// attribute.
3517 mutable llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3518
3519 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3520 /// declared. Rare. May alias another identifier, declared or undeclared.
3521 ///
3522 /// For aliases, the target identifier is used as a key for eventual
3523 /// processing when the target is declared. For the single-identifier form,
3524 /// the sole identifier is used as the key. Each entry is a `SetVector`
3525 /// (ordered by parse order) of aliases (identified by the alias name) in case
3526 /// of multiple aliases to the same undeclared identifier.
3527 llvm::MapVector<
3529 llvm::SetVector<
3531 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3533
3534 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3535 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3536 /// to define functions that occur in multiple standards to call the version
3537 /// in the currently selected standard.
3538 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *> ExtnameUndeclaredIdentifiers;
3539
3540 /// Set containing all typedefs that are likely unused.
3543
3547
3548 /// The set of file scoped decls seen so far that have not been used
3549 /// and must warn if not used. Only contains the first declaration.
3551
3555
3556 /// All the tentative definitions encountered in the TU.
3558
3559 /// All the external declarations encoutered and used in the TU.
3561
3562 /// Generally null except when we temporarily switch decl contexts,
3563 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3565
3566 /// Is the module scope we are in a C++ Header Unit?
3568 return ModuleScopes.empty() ? false
3569 : ModuleScopes.back().Module->isHeaderUnit();
3570 }
3571
3572 /// Get the module owning an entity.
3573 Module *getOwningModule(const Decl *Entity) {
3574 return Entity->getOwningModule();
3575 }
3576
3577 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3578
3580 /// Returns the TypeDeclType for the given type declaration,
3581 /// as ASTContext::getTypeDeclType would, but
3582 /// performs the required semantic checks for name lookup of said entity.
3583 void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD,
3584 SourceLocation NameLoc);
3585
3586 /// If the identifier refers to a type name within this scope,
3587 /// return the declaration of that type.
3588 ///
3589 /// This routine performs ordinary name lookup of the identifier II
3590 /// within the given scope, with optional C++ scope specifier SS, to
3591 /// determine whether the name refers to a type. If so, returns an
3592 /// opaque pointer (actually a QualType) corresponding to that
3593 /// type. Otherwise, returns NULL.
3595 Scope *S, CXXScopeSpec *SS = nullptr,
3596 bool isClassName = false, bool HasTrailingDot = false,
3597 ParsedType ObjectType = nullptr,
3598 bool IsCtorOrDtorName = false,
3599 bool WantNontrivialTypeSourceInfo = false,
3600 bool IsClassTemplateDeductionContext = true,
3601 ImplicitTypenameContext AllowImplicitTypename =
3603 IdentifierInfo **CorrectedII = nullptr);
3604
3605 /// isTagName() - This method is called *for error recovery purposes only*
3606 /// to determine if the specified name is a valid tag name ("struct foo"). If
3607 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3608 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3609 /// diagnose cases in C where the user forgot to specify the tag.
3611
3612 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3613 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3614 /// then downgrade the missing typename error to a warning.
3615 /// This is needed for MSVC compatibility; Example:
3616 /// @code
3617 /// template<class T> class A {
3618 /// public:
3619 /// typedef int TYPE;
3620 /// };
3621 /// template<class T> class B : public A<T> {
3622 /// public:
3623 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3624 /// };
3625 /// @endcode
3626 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3628 Scope *S, CXXScopeSpec *SS,
3629 ParsedType &SuggestedType,
3630 bool IsTemplateName = false);
3631
3632 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3633 /// type name has failed in a dependent context. In these situations, we
3634 /// automatically form a DependentTypeName that will retry lookup in a related
3635 /// scope during instantiation.
3637 SourceLocation NameLoc,
3638 bool IsTemplateTypeArg);
3639
3642 union {
3647 };
3648
3650
3651 public:
3654
3657
3659 return NameClassification(NameClassificationKind::Error);
3660 }
3661
3663 return NameClassification(NameClassificationKind::Unknown);
3664 }
3665
3667 NameClassification Result(NameClassificationKind::OverloadSet);
3668 Result.Expr = E;
3669 return Result;
3670 }
3671
3673 NameClassification Result(NameClassificationKind::NonType);
3674 Result.NonTypeDecl = D;
3675 return Result;
3676 }
3677
3679 return NameClassification(NameClassificationKind::UndeclaredNonType);
3680 }
3681
3683 return NameClassification(NameClassificationKind::DependentNonType);
3684 }
3685
3687 NameClassification Result(NameClassificationKind::TypeTemplate);
3688 Result.Template = Name;
3689 return Result;
3690 }
3691
3693 NameClassification Result(NameClassificationKind::VarTemplate);
3694 Result.Template = Name;
3695 return Result;
3696 }
3697
3699 NameClassification Result(NameClassificationKind::FunctionTemplate);
3700 Result.Template = Name;
3701 return Result;
3702 }
3703
3705 NameClassification Result(NameClassificationKind::Concept);
3706 Result.Template = Name;
3707 return Result;
3708 }
3709
3711 NameClassification Result(NameClassificationKind::UndeclaredTemplate);
3712 Result.Template = Name;
3713 return Result;
3714 }
3715
3717
3719 assert(Kind == NameClassificationKind::OverloadSet);
3720 return Expr;
3721 }
3722
3724 assert(Kind == NameClassificationKind::Type);
3725 return Type;
3726 }
3727
3729 assert(Kind == NameClassificationKind::NonType);
3730 return NonTypeDecl;
3731 }
3732
3734 assert(Kind == NameClassificationKind::TypeTemplate ||
3735 Kind == NameClassificationKind::FunctionTemplate ||
3736 Kind == NameClassificationKind::VarTemplate ||
3737 Kind == NameClassificationKind::Concept ||
3738 Kind == NameClassificationKind::UndeclaredTemplate);
3739 return Template;
3740 }
3741
3743 switch (Kind) {
3744 case NameClassificationKind::TypeTemplate:
3745 return TNK_Type_template;
3746 case NameClassificationKind::FunctionTemplate:
3747 return TNK_Function_template;
3748 case NameClassificationKind::VarTemplate:
3749 return TNK_Var_template;
3750 case NameClassificationKind::Concept:
3751 return TNK_Concept_template;
3752 case NameClassificationKind::UndeclaredTemplate:
3754 default:
3755 llvm_unreachable("unsupported name classification.");
3756 }
3757 }
3758 };
3759
3760 /// Perform name lookup on the given name, classifying it based on
3761 /// the results of name lookup and the following token.
3762 ///
3763 /// This routine is used by the parser to resolve identifiers and help direct
3764 /// parsing. When the identifier cannot be found, this routine will attempt
3765 /// to correct the typo and classify based on the resulting name.
3766 ///
3767 /// \param S The scope in which we're performing name lookup.
3768 ///
3769 /// \param SS The nested-name-specifier that precedes the name.
3770 ///
3771 /// \param Name The identifier. If typo correction finds an alternative name,
3772 /// this pointer parameter will be updated accordingly.
3773 ///
3774 /// \param NameLoc The location of the identifier.
3775 ///
3776 /// \param NextToken The token following the identifier. Used to help
3777 /// disambiguate the name.
3778 ///
3779 /// \param CCC The correction callback, if typo correction is desired.
3780 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3781 IdentifierInfo *&Name, SourceLocation NameLoc,
3782 const Token &NextToken,
3783 CorrectionCandidateCallback *CCC = nullptr);
3784
3785 /// Act on the result of classifying a name as an undeclared (ADL-only)
3786 /// non-type declaration.
3788 SourceLocation NameLoc);
3789 /// Act on the result of classifying a name as an undeclared member of a
3790 /// dependent base class.
3792 IdentifierInfo *Name,
3793 SourceLocation NameLoc,
3794 bool IsAddressOfOperand);
3795 /// Act on the result of classifying a name as a specific non-type
3796 /// declaration.
3799 SourceLocation NameLoc,
3800 const Token &NextToken);
3801 /// Act on the result of classifying a name as an overload set.
3803
3804 /// Describes the detailed kind of a template name. Used in diagnostics.
3811 Concept,
3813 };
3816
3817 /// Determine whether it's plausible that E was intended to be a
3818 /// template-name.
3820 if (!getLangOpts().CPlusPlus || E.isInvalid())
3821 return false;
3822 Dependent = false;
3823 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3824 return !DRE->hasExplicitTemplateArgs();
3825 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3826 return !ME->hasExplicitTemplateArgs();
3827 Dependent = true;
3828 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3829 return !DSDRE->hasExplicitTemplateArgs();
3830 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3831 return !DSME->hasExplicitTemplateArgs();
3832 // Any additional cases recognized here should also be handled by
3833 // diagnoseExprIntendedAsTemplateName.
3834 return false;
3835 }
3836
3839
3841
3843 MultiTemplateParamsArg TemplateParameterLists);
3844
3845 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3846 /// true if we were successful.
3849 unsigned FailedFoldDiagID);
3850
3851 /// Register the given locally-scoped extern "C" declaration so
3852 /// that it can be found later for redeclarations. We include any extern "C"
3853 /// declaration that is not visible in the translation unit here, not just
3854 /// function-scope declarations.
3856
3857 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3858 /// If T is the name of a class, then each of the following shall have a
3859 /// name different from T:
3860 /// - every static data member of class T;
3861 /// - every member function of class T
3862 /// - every member of class T that is itself a type;
3863 /// \returns true if the declaration name violates these rules.
3865
3866 /// Diagnose a declaration whose declarator-id has the given
3867 /// nested-name-specifier.
3868 ///
3869 /// \param SS The nested-name-specifier of the declarator-id.
3870 ///
3871 /// \param DC The declaration context to which the nested-name-specifier
3872 /// resolves.
3873 ///
3874 /// \param Name The name of the entity being declared.
3875 ///
3876 /// \param Loc The location of the name of the entity being declared.
3877 ///
3878 /// \param IsMemberSpecialization Whether we are declaring a member
3879 /// specialization.
3880 ///
3881 /// \param TemplateId The template-id, if any.
3882 ///
3883 /// \returns true if we cannot safely recover from this error, false
3884 /// otherwise.
3887 TemplateIdAnnotation *TemplateId,
3888 bool IsMemberSpecialization);
3889
3891
3892 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3893
3895 unsigned &IntVal);
3896
3897 /// Diagnose function specifiers on a declaration of an identifier that
3898 /// does not identify a function.
3899 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3900
3901 /// Return the declaration shadowed by the given typedef \p D, or null
3902 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3904 const LookupResult &R);
3905
3906 /// Return the declaration shadowed by the given variable \p D, or null
3907 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3909
3910 /// Return the declaration shadowed by the given variable \p D, or null
3911 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3913 const LookupResult &R);
3914 /// Diagnose variable or built-in function shadowing. Implements
3915 /// -Wshadow.
3916 ///
3917 /// This method is called whenever a VarDecl is added to a "useful"
3918 /// scope.
3919 ///
3920 /// \param ShadowedDecl the declaration that is shadowed by the given variable
3921 /// \param R the lookup of the name
3922 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
3923 const LookupResult &R);
3924
3925 /// Check -Wshadow without the advantage of a previous lookup.
3926 void CheckShadow(Scope *S, VarDecl *D);
3927
3928 /// Warn if 'E', which is an expression that is about to be modified, refers
3929 /// to a shadowing declaration.
3931
3932 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
3933 /// when these variables are captured by the lambda.
3935
3936 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
3937 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
3938 TypedefNameDecl *NewTD);
3941 TypeSourceInfo *TInfo,
3943
3944 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
3945 /// declares a typedef-name, either using the 'typedef' type specifier or via
3946 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
3950 TypeSourceInfo *TInfo,
3952 MultiTemplateParamsArg TemplateParamLists,
3953 bool &AddToScope,
3955
3956 /// Perform semantic checking on a newly-created variable
3957 /// declaration.
3958 ///
3959 /// This routine performs all of the type-checking required for a
3960 /// variable declaration once it has been built. It is used both to
3961 /// check variables after they have been parsed and their declarators
3962 /// have been translated into a declaration, and to check variables
3963 /// that have been instantiated from a template.
3964 ///
3965 /// Sets NewVD->isInvalidDecl() if an error was encountered.
3966 ///
3967 /// Returns true if the variable declaration is a redeclaration.
3968 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
3969 void CheckVariableDeclarationType(VarDecl *NewVD);
3970 void CheckCompleteVariableDeclaration(VarDecl *VD);
3971
3972 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
3973 TypeSourceInfo *TInfo,
3974 LookupResult &Previous,
3975 MultiTemplateParamsArg TemplateParamLists,
3976 bool &AddToScope);
3977
3978 /// AddOverriddenMethods - See if a method overrides any in the base classes,
3979 /// and if so, check that it's a valid override and remember it.
3980 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
3981
3982 /// Perform semantic checking of a new function declaration.
3983 ///
3984 /// Performs semantic analysis of the new function declaration
3985 /// NewFD. This routine performs all semantic checking that does not
3986 /// require the actual declarator involved in the declaration, and is
3987 /// used both for the declaration of functions as they are parsed
3988 /// (called via ActOnDeclarator) and for the declaration of functions
3989 /// that have been instantiated via C++ template instantiation (called
3990 /// via InstantiateDecl).
3991 ///
3992 /// \param IsMemberSpecialization whether this new function declaration is
3993 /// a member specialization (that replaces any definition provided by the
3994 /// previous declaration).
3995 ///
3996 /// This sets NewFD->isInvalidDecl() to true if there was an error.
3997 ///
3998 /// \returns true if the function declaration is a redeclaration.
3999 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
4000 LookupResult &Previous,
4001 bool IsMemberSpecialization, bool DeclIsDefn);
4002
4003 /// Checks if the new declaration declared in dependent context must be
4004 /// put in the same redeclaration chain as the specified declaration.
4005 ///
4006 /// \param D Declaration that is checked.
4007 /// \param PrevDecl Previous declaration found with proper lookup method for
4008 /// the same declaration name.
4009 /// \returns True if D must be added to the redeclaration chain which PrevDecl
4010 /// belongs to.
4011 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
4012
4013 /// Determines if we can perform a correct type check for \p D as a
4014 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
4015 /// best-effort check.
4016 ///
4017 /// \param NewD The new declaration.
4018 /// \param OldD The old declaration.
4019 /// \param NewT The portion of the type of the new declaration to check.
4020 /// \param OldT The portion of the type of the old declaration to check.
4021 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
4022 QualType NewT, QualType OldT);
4023 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
4024 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
4025
4026 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
4027 /// containing class. Otherwise it will return implicit SectionAttr if the
4028 /// function is a definition and there is an active value on CodeSegStack
4029 /// (from the current #pragma code-seg value).
4030 ///
4031 /// \param FD Function being declared.
4032 /// \param IsDefinition Whether it is a definition or just a declaration.
4033 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
4034 /// nullptr if no attribute should be added.
4035 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
4036 bool IsDefinition);
4037
4038 /// Common checks for a parameter-declaration that should apply to both
4039 /// function parameters and non-type template parameters.
4040 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
4041
4042 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
4043 /// to introduce parameters into function prototype scope.
4044 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
4045 SourceLocation ExplicitThisLoc = {});
4046
4047 /// Synthesizes a variable for a parameter arising from a
4048 /// typedef.
4049 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
4050 QualType T);
4051 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
4052 SourceLocation NameLoc,
4053 const IdentifierInfo *Name, QualType T,
4054 TypeSourceInfo *TSInfo, StorageClass SC);
4055
4056 /// Emit diagnostics if the initializer or any of its explicit or
4057 /// implicitly-generated subexpressions require copying or
4058 /// default-initializing a type that is or contains a C union type that is
4059 /// non-trivial to copy or default-initialize.
4060 void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc);
4061
4062 // These flags are passed to checkNonTrivialCUnion.
4067 };
4068
4069 /// Emit diagnostics if a non-trivial C union type or a struct that contains
4070 /// a non-trivial C union is used in an invalid context.
4072 NonTrivialCUnionContext UseContext,
4073 unsigned NonTrivialKind);
4074
4075 /// Certain globally-unique variables might be accidentally duplicated if
4076 /// built into multiple shared libraries with hidden visibility. This can
4077 /// cause problems if the variable is mutable, its initialization is
4078 /// effectful, or its address is taken.
4081
4082 /// AddInitializerToDecl - Adds the initializer Init to the
4083 /// declaration dcl. If DirectInit is true, this is C++ direct
4084 /// initialization rather than copy initialization.
4085 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
4086 void ActOnUninitializedDecl(Decl *dcl);
4087
4088 /// ActOnInitializerError - Given that there was an error parsing an
4089 /// initializer for the given declaration, try to at least re-establish
4090 /// invariants such as whether a variable's type is either dependent or
4091 /// complete.
4092 void ActOnInitializerError(Decl *Dcl);
4093
4096 IdentifierInfo *Ident,
4097 ParsedAttributes &Attrs);
4098
4099 /// Check if VD needs to be dllexport/dllimport due to being in a
4100 /// dllexport/import function.
4103
4104 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
4105 /// any semantic actions necessary after any initializer has been attached.
4106 void FinalizeDeclaration(Decl *D);
4108 ArrayRef<Decl *> Group);
4109
4110 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
4111 /// group, performing any necessary semantic checking.
4113
4114 /// Should be called on all declarations that might have attached
4115 /// documentation comments.
4118
4119 enum class FnBodyKind {
4120 /// C++26 [dcl.fct.def.general]p1
4121 /// function-body:
4122 /// ctor-initializer[opt] compound-statement
4123 /// function-try-block
4124 Other,
4125 /// = default ;
4126 Default,
4127 /// deleted-function-body
4128 ///
4129 /// deleted-function-body:
4130 /// = delete ;
4131 /// = delete ( unevaluated-string ) ;
4132 Delete
4133 };
4134
4136 SourceLocation LocAfterDecls);
4138 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
4139 SkipBodyInfo *SkipBody = nullptr);
4141 MultiTemplateParamsArg TemplateParamLists,
4142 SkipBodyInfo *SkipBody = nullptr,
4143 FnBodyKind BodyKind = FnBodyKind::Other);
4145 SkipBodyInfo *SkipBody = nullptr,
4146 FnBodyKind BodyKind = FnBodyKind::Other);
4148
4149 /// Determine whether we can delay parsing the body of a function or
4150 /// function template until it is used, assuming we don't care about emitting
4151 /// code for that function.
4152 ///
4153 /// This will be \c false if we may need the body of the function in the
4154 /// middle of parsing an expression (where it's impractical to switch to
4155 /// parsing a different function), for instance, if it's constexpr in C++11
4156 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
4157 bool canDelayFunctionBody(const Declarator &D);
4158
4159 /// Determine whether we can skip parsing the body of a function
4160 /// definition, assuming we don't care about analyzing its body or emitting
4161 /// code for that function.
4162 ///
4163 /// This will be \c false only if we may need the body of the function in
4164 /// order to parse the rest of the program (for instance, if it is
4165 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
4166 bool canSkipFunctionBody(Decl *D);
4167
4168 /// Given the set of return statements within a function body,
4169 /// compute the variables that are subject to the named return value
4170 /// optimization.
4171 ///
4172 /// Each of the variables that is subject to the named return value
4173 /// optimization will be marked as NRVO variables in the AST, and any
4174 /// return statement that has a marked NRVO variable as its NRVO candidate can
4175 /// use the named return value optimization.
4176 ///
4177 /// This function applies a very simplistic algorithm for NRVO: if every
4178 /// return statement in the scope of a variable has the same NRVO candidate,
4179 /// that candidate is an NRVO variable.
4181
4182 /// Performs semantic analysis at the end of a function body.
4183 ///
4184 /// \param RetainFunctionScopeInfo If \c true, the client is responsible for
4185 /// releasing the associated \p FunctionScopeInfo. This is useful when
4186 /// building e.g. LambdaExprs.
4188 bool IsInstantiation = false,
4189 bool RetainFunctionScopeInfo = false);
4192
4193 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
4194 /// attribute for which parsing is delayed.
4196
4197 /// Diagnose any unused parameters in the given sequence of
4198 /// ParmVarDecl pointers.
4200
4201 /// Diagnose whether the size of parameters or return value of a
4202 /// function or obj-c method definition is pass-by-value and larger than a
4203 /// specified threshold.
4204 void
4206 QualType ReturnTy, NamedDecl *D);
4207
4209 SourceLocation RParenLoc);
4210
4213
4215
4216 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4217 /// no declarator (e.g. "struct foo;") is parsed.
4219 const ParsedAttributesView &DeclAttrs,
4220 RecordDecl *&AnonRecord);
4221
4222 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
4223 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
4224 /// parameters to cope with template friend declarations.
4226 const ParsedAttributesView &DeclAttrs,
4227 MultiTemplateParamsArg TemplateParams,
4228 bool IsExplicitInstantiation,
4229 RecordDecl *&AnonRecord,
4230 SourceLocation EllipsisLoc = {});
4231
4232 /// BuildAnonymousStructOrUnion - Handle the declaration of an
4233 /// anonymous structure or union. Anonymous unions are a C++ feature
4234 /// (C++ [class.union]) and a C11 feature; anonymous structures
4235 /// are a C11 feature and GNU C++ extension.
4236 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
4237 RecordDecl *Record,
4238 const PrintingPolicy &Policy);
4239
4240 /// Called once it is known whether
4241 /// a tag declaration is an anonymous union or struct.
4243
4244 /// Emit diagnostic warnings for placeholder members.
4245 /// We can only do that after the class is fully constructed,
4246 /// as anonymous union/structs can insert placeholders
4247 /// in their parent scope (which might be a Record).
4249
4250 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
4251 /// Microsoft C anonymous structure.
4252 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
4253 /// Example:
4254 ///
4255 /// struct A { int a; };
4256 /// struct B { struct A; int b; };
4257 ///
4258 /// void foo() {
4259 /// B var;
4260 /// var.a = 3;
4261 /// }
4262 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
4263 RecordDecl *Record);
4264
4265 /// Given a non-tag type declaration, returns an enum useful for indicating
4266 /// what kind of non-tag type this is.
4268
4269 /// Determine whether a tag with a given kind is acceptable
4270 /// as a redeclaration of the given tag declaration.
4271 ///
4272 /// \returns true if the new tag kind is acceptable, false otherwise.
4274 bool isDefinition, SourceLocation NewTagLoc,
4275 const IdentifierInfo *Name);
4276
4277 /// This is invoked when we see 'struct foo' or 'struct {'. In the
4278 /// former case, Name will be non-null. In the later case, Name will be null.
4279 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
4280 /// a reference/declaration/definition of a tag.
4281 ///
4282 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
4283 /// trailing-type-specifier) other than one in an alias-declaration.
4284 ///
4285 /// \param SkipBody If non-null, will be set to indicate if the caller should
4286 /// skip the definition of this tag and treat it as if it were a declaration.
4287 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
4288 SourceLocation KWLoc, CXXScopeSpec &SS,
4289 IdentifierInfo *Name, SourceLocation NameLoc,
4290 const ParsedAttributesView &Attr, AccessSpecifier AS,
4291 SourceLocation ModulePrivateLoc,
4292 MultiTemplateParamsArg TemplateParameterLists,
4293 bool &OwnedDecl, bool &IsDependent,
4294 SourceLocation ScopedEnumKWLoc,
4295 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
4296 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
4297 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
4298
4299 /// ActOnField - Each field of a C struct/union is passed into this in order
4300 /// to create a FieldDecl object for it.
4301 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
4302 Declarator &D, Expr *BitfieldWidth);
4303
4304 /// HandleField - Analyze a field of a C struct or a C++ data member.
4305 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
4306 Declarator &D, Expr *BitfieldWidth,
4307 InClassInitStyle InitStyle, AccessSpecifier AS);
4308
4309 /// Build a new FieldDecl and check its well-formedness.
4310 ///
4311 /// This routine builds a new FieldDecl given the fields name, type,
4312 /// record, etc. \p PrevDecl should refer to any previous declaration
4313 /// with the same name and in the same scope as the field to be
4314 /// created.
4315 ///
4316 /// \returns a new FieldDecl.
4317 ///
4318 /// \todo The Declarator argument is a hack. It will be removed once
4319 FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T,
4320 TypeSourceInfo *TInfo, RecordDecl *Record,
4321 SourceLocation Loc, bool Mutable,
4322 Expr *BitfieldWidth, InClassInitStyle InitStyle,
4323 SourceLocation TSSL, AccessSpecifier AS,
4324 NamedDecl *PrevDecl, Declarator *D = nullptr);
4325
4326 bool CheckNontrivialField(FieldDecl *FD);
4327
4328 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
4329 /// class and class extensions. For every class \@interface and class
4330 /// extension \@interface, if the last ivar is a bitfield of any type,
4331 /// then add an implicit `char :0` ivar to the end of that interface.
4332 void ActOnLastBitfield(SourceLocation DeclStart,
4333 SmallVectorImpl<Decl *> &AllIvarDecls);
4334
4335 // This is used for both record definitions and ObjC interface declarations.
4336 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
4337 ArrayRef<Decl *> Fields, SourceLocation LBrac,
4338 SourceLocation RBrac, const ParsedAttributesView &AttrList);
4339
4340 /// ActOnTagStartDefinition - Invoked when we have entered the
4341 /// scope of a tag's definition (e.g., for an enumeration, class,
4342 /// struct, or union).
4343 void ActOnTagStartDefinition(Scope *S, Decl *TagDecl);
4344
4345 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
4346 /// Differently from C++, actually parse the body and reject / error out
4347 /// in case of a structural mismatch.
4348 bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody);
4349
4351
4352 /// Invoked when we enter a tag definition that we're skipping.
4354
4355 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
4356 /// C++ record definition's base-specifiers clause and are starting its
4357 /// member declarations.
4359 SourceLocation FinalLoc,
4360 bool IsFinalSpelledSealed,
4361 bool IsAbstract,
4362 SourceLocation TriviallyRelocatable,
4363 SourceLocation Replaceable,
4364 SourceLocation LBraceLoc);
4365
4366 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
4367 /// the definition of a tag (enumeration, class, struct, or union).
4369 SourceRange BraceRange);
4370
4373
4375
4376 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
4377 /// error parsing the definition of a tag.
4379
4381 EnumConstantDecl *LastEnumConst,
4383 Expr *val);
4384
4385 /// Check that this is a valid underlying type for an enum declaration.
4387
4388 /// Check whether this is a valid redeclaration of a previous enumeration.
4389 /// \return true if the redeclaration was invalid.
4390 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
4391 QualType EnumUnderlyingTy, bool IsFixed,
4392 const EnumDecl *Prev);
4393
4394 /// Determine whether the body of an anonymous enumeration should be skipped.
4395 /// \param II The name of the first enumerator.
4397 SourceLocation IILoc);
4398
4399 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
4401 const ParsedAttributesView &Attrs,
4402 SourceLocation EqualLoc, Expr *Val,
4403 SkipBodyInfo *SkipBody = nullptr);
4404 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
4405 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
4406 const ParsedAttributesView &Attr);
4407
4408 /// Set the current declaration context until it gets popped.
4409 void PushDeclContext(Scope *S, DeclContext *DC);
4410 void PopDeclContext();
4411
4412 /// EnterDeclaratorContext - Used when we must lookup names in the context
4413 /// of a declarator's nested name specifier.
4416
4417 /// Enter a template parameter scope, after it's been associated with a
4418 /// particular DeclContext. Causes lookup within the scope to chain through
4419 /// enclosing contexts in the correct order.
4421
4422 /// Push the parameters of D, which must be a function, into scope.
4425
4426 /// Add this decl to the scope shadowed decl chains.
4427 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4428
4429 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4430 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4431 /// true if 'D' belongs to the given declaration context.
4432 ///
4433 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4434 /// enclosing namespace set of the context, rather than contained
4435 /// directly within it.
4436 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4437 bool AllowInlineNamespace = false) const;
4438
4439 /// Finds the scope corresponding to the given decl context, if it
4440 /// happens to be an enclosing scope. Otherwise return NULL.
4442
4443 /// Subroutines of ActOnDeclarator().
4445 TypeSourceInfo *TInfo);
4447
4448 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4450 NamedDecl *New, Decl *Old,
4452
4453 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4454 /// same name and scope as a previous declaration 'Old'. Figure out
4455 /// how to resolve this situation, merging decls or emitting
4456 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4458 LookupResult &OldDecls);
4459
4460 /// CleanupMergedEnum - We have just merged the decl 'New' by making another
4461 /// definition visible.
4462 /// This method performs any necessary cleanup on the parser state to discard
4463 /// child nodes from newly parsed decl we are retiring.
4464 void CleanupMergedEnum(Scope *S, Decl *New);
4465
4466 /// MergeFunctionDecl - We just parsed a function 'New' from
4467 /// declarator D which has the same name and scope as a previous
4468 /// declaration 'Old'. Figure out how to resolve this situation,
4469 /// merging decls or emitting diagnostics as appropriate.
4470 ///
4471 /// In C++, New and Old must be declarations that are not
4472 /// overloaded. Use IsOverload to determine whether New and Old are
4473 /// overloaded, and to select the Old declaration that New should be
4474 /// merged with.
4475 ///
4476 /// Returns true if there was an error, false otherwise.
4478 bool MergeTypeWithOld, bool NewDeclIsDefn);
4479
4480 /// Completes the merge of two function declarations that are
4481 /// known to be compatible.
4482 ///
4483 /// This routine handles the merging of attributes and other
4484 /// properties of function declarations from the old declaration to
4485 /// the new declaration, once we know that New is in fact a
4486 /// redeclaration of Old.
4487 ///
4488 /// \returns false
4490 Scope *S, bool MergeTypeWithOld);
4492
4493 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4494 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4495 /// situation, merging decls or emitting diagnostics as appropriate.
4496 ///
4497 /// Tentative definition rules (C99 6.9.2p2) are checked by
4498 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4499 /// definitions here, since the initializer hasn't been attached.
4501
4502 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4503 /// scope as a previous declaration 'Old'. Figure out how to merge their
4504 /// types, emitting diagnostics as appropriate.
4505 ///
4506 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4507 /// back to here in AddInitializerToDecl. We can't check them before the
4508 /// initializer is attached.
4509 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4510
4511 /// We've just determined that \p Old and \p New both appear to be definitions
4512 /// of the same variable. Either diagnose or fix the problem.
4513 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4515
4516 /// Filters out lookup results that don't fall within the given scope
4517 /// as determined by isDeclInScope.
4519 bool ConsiderLinkage, bool AllowInlineNamespace);
4520
4521 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4522 /// have compatible owning modules.
4524
4525 /// [module.interface]p6:
4526 /// A redeclaration of an entity X is implicitly exported if X was introduced
4527 /// by an exported declaration; otherwise it shall not be exported.
4529
4530 /// A wrapper function for checking the semantic restrictions of
4531 /// a redeclaration within a module.
4533
4534 /// Check the redefinition in C++20 Modules.
4535 ///
4536 /// [basic.def.odr]p14:
4537 /// For any definable item D with definitions in multiple translation units,
4538 /// - if D is a non-inline non-templated function or variable, or
4539 /// - if the definitions in different translation units do not satisfy the
4540 /// following requirements,
4541 /// the program is ill-formed; a diagnostic is required only if the
4542 /// definable item is attached to a named module and a prior definition is
4543 /// reachable at the point where a later definition occurs.
4544 /// - Each such definition shall not be attached to a named module
4545 /// ([module.unit]).
4546 /// - Each such definition shall consist of the same sequence of tokens, ...
4547 /// ...
4548 ///
4549 /// Return true if the redefinition is not allowed. Return false otherwise.
4550 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4551
4553
4554 /// If it's a file scoped decl that must warn if not used, keep track
4555 /// of it.
4557
4558 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4560
4563 DiagReceiverTy DiagReceiver);
4564 void DiagnoseUnusedDecl(const NamedDecl *ND);
4565
4566 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4567 /// unless they are marked attr(unused).
4568 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4569
4570 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4571 /// variable.
4572 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4573
4574 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4575 /// from S, where a non-field would be declared. This routine copes
4576 /// with the difference between C and C++ scoping rules in structs and
4577 /// unions. For example, the following code is well-formed in C but
4578 /// ill-formed in C++:
4579 /// @code
4580 /// struct S6 {
4581 /// enum { BAR } e;
4582 /// };
4583 ///
4584 /// void test_S6() {
4585 /// struct S6 a;
4586 /// a.e = BAR;
4587 /// }
4588 /// @endcode
4589 /// For the declaration of BAR, this routine will return a different
4590 /// scope. The scope S will be the scope of the unnamed enumeration
4591 /// within S6. In C++, this routine will return the scope associated
4592 /// with S6, because the enumeration's scope is a transparent
4593 /// context but structures can contain non-field names. In C, this
4594 /// routine will return the translation unit scope, since the
4595 /// enumeration's scope is a transparent context and structures cannot
4596 /// contain non-field names.
4598
4601
4602 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4603 /// file scope. lazily create a decl for it. ForRedeclaration is true
4604 /// if we're creating this built-in in anticipation of redeclaring the
4605 /// built-in.
4607 bool ForRedeclaration, SourceLocation Loc);
4608
4609 /// Get the outermost AttributedType node that sets a calling convention.
4610 /// Valid types should not have multiple attributes with different CCs.
4612
4613 /// GetNameForDeclarator - Determine the full declaration name for the
4614 /// given Declarator.
4616
4617 /// Retrieves the declaration name from a parsed unqualified-id.
4619
4620 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4621 /// we are currently parsing the initializer.
4623
4624 /// Look for a locally scoped extern "C" declaration by the given name.
4626
4629
4630 /// Adjust the \c DeclContext for a function or variable that might be a
4631 /// function-local external declaration.
4633
4635
4636 /// Checks if the variant/multiversion functions are compatible.
4638 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4639 const PartialDiagnostic &NoProtoDiagID,
4640 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4641 const PartialDiagnosticAt &NoSupportDiagIDAt,
4642 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4643 bool ConstexprSupported, bool CLinkageMayDiffer);
4644
4645 /// type checking declaration initializers (C99 6.7.8)
4647 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4648
4652 Expr *Init);
4653
4655 Expr *Init);
4656
4658
4659 // Heuristically tells if the function is `get_return_object` member of a
4660 // coroutine promise_type by matching the function name.
4661 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4662 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4663
4664 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4665 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4667 Scope *S);
4668
4669 /// If this function is a C++ replaceable global allocation function
4670 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4671 /// adds any function attributes that we know a priori based on the standard.
4672 ///
4673 /// We need to check for duplicate attributes both here and where user-written
4674 /// attributes are applied to declarations.
4676 FunctionDecl *FD);
4677
4678 /// Adds any function attributes that we know a priori based on
4679 /// the declaration of this function.
4680 ///
4681 /// These attributes can apply both to implicitly-declared builtins
4682 /// (like __builtin___printf_chk) or to library-declared functions
4683 /// like NSLog or printf.
4684 ///
4685 /// We need to check for duplicate attributes both here and where user-written
4686 /// attributes are applied to declarations.
4688
4689 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4690 /// the correct width, and that the field type is valid.
4691 /// Returns false on success.
4693 const IdentifierInfo *FieldName, QualType FieldTy,
4694 bool IsMsStruct, Expr *BitWidth);
4695
4696 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4697 /// enum. If AllowMask is true, then we also allow the complement of a valid
4698 /// value, to be used as a mask.
4699 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4700 bool AllowMask) const;
4701
4702 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4703 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4704 SourceLocation WeakNameLoc);
4705
4706 /// ActOnPragmaRedefineExtname - Called on well formed
4707 /// \#pragma redefine_extname oldname newname.
4709 IdentifierInfo *AliasName,
4710 SourceLocation PragmaLoc,
4711 SourceLocation WeakNameLoc,
4712 SourceLocation AliasNameLoc);
4713
4714 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4715 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4716 SourceLocation PragmaLoc,
4717 SourceLocation WeakNameLoc,
4718 SourceLocation AliasNameLoc);
4719
4720 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4722 Emitted,
4723 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4724 OMPDiscarded, // Discarded due to OpenMP hostness
4725 TemplateDiscarded, // Discarded due to uninstantiated templates
4726 Unknown,
4727 };
4728 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4729 bool Final = false);
4730
4731 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4733
4734 /// Function or variable declarations to be checked for whether the deferred
4735 /// diagnostics should be emitted.
4737
4738private:
4739 /// Map of current shadowing declarations to shadowed declarations. Warn if
4740 /// it looks like the user is trying to modify the shadowing declaration.
4741 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4742
4743 // We need this to handle
4744 //
4745 // typedef struct {
4746 // void *foo() { return 0; }
4747 // } A;
4748 //
4749 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4750 // for example. If 'A', foo will have external linkage. If we have '*A',
4751 // foo will have no linkage. Since we can't know until we get to the end
4752 // of the typedef, this function finds out if D might have non-external
4753 // linkage. Callers should verify at the end of the TU if it D has external
4754 // linkage or not.
4755 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4756
4757 ///@}
4758
4759 //
4760 //
4761 // -------------------------------------------------------------------------
4762 //
4763 //
4764
4765 /// \name Declaration Attribute Handling
4766 /// Implementations are in SemaDeclAttr.cpp
4767 ///@{
4768
4769public:
4770 /// Describes the kind of priority given to an availability attribute.
4771 ///
4772 /// The sum of priorities deteremines the final priority of the attribute.
4773 /// The final priority determines how the attribute will be merged.
4774 /// An attribute with a lower priority will always remove higher priority
4775 /// attributes for the specified platform when it is being applied. An
4776 /// attribute with a higher priority will not be applied if the declaration
4777 /// already has an availability attribute with a lower priority for the
4778 /// specified platform. The final prirority values are not expected to match
4779 /// the values in this enumeration, but instead should be treated as a plain
4780 /// integer value. This enumeration just names the priority weights that are
4781 /// used to calculate that final vaue.
4783 /// The availability attribute was specified explicitly next to the
4784 /// declaration.
4786
4787 /// The availability attribute was applied using '#pragma clang attribute'.
4789
4790 /// The availability attribute for a specific platform was inferred from
4791 /// an availability attribute for another platform.
4794
4795 /// Describes the reason a calling convention specification was ignored, used
4796 /// for diagnostics.
4798 ForThisTarget = 0,
4802 };
4803
4804 /// A helper function to provide Attribute Location for the Attr types
4805 /// AND the ParsedAttr.
4806 template <typename AttrInfo>
4807 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4808 getAttrLoc(const AttrInfo &AL) {
4809 return AL.getLocation();
4810 }
4812
4813 /// If Expr is a valid integer constant, get the value of the integer
4814 /// expression and return success or failure. May output an error.
4815 ///
4816 /// Negative argument is implicitly converted to unsigned, unless
4817 /// \p StrictlyUnsigned is true.
4818 template <typename AttrInfo>
4819 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4820 unsigned Idx = UINT_MAX,
4821 bool StrictlyUnsigned = false) {
4822 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4823 if (Expr->isTypeDependent() ||
4825 if (Idx != UINT_MAX)
4826 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4827 << &AI << Idx << AANT_ArgumentIntegerConstant
4828 << Expr->getSourceRange();
4829 else
4830 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4832 return false;
4833 }
4834
4835 if (!I->isIntN(32)) {
4836 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4837 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4838 return false;
4839 }
4840
4841 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4842 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4843 << &AI << /*non-negative*/ 1;
4844 return false;
4845 }
4846
4847 Val = (uint32_t)I->getZExtValue();
4848 return true;
4849 }
4850
4851 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4852 /// \#pragma weak during processing of other Decls.
4853 /// I couldn't figure out a clean way to generate these in-line, so
4854 /// we store them here and handle separately -- which is a hack.
4855 /// It would be best to refactor this.
4857
4858 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4860
4864
4865 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4866 /// us to associate a raw vector type with one of the ext_vector type names.
4867 /// This is only necessary for issuing pretty diagnostics.
4869
4870 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4871 /// and return false, otherwise set \p Str to the value of the string literal
4872 /// and return true.
4874 const Expr *E, StringRef &Str,
4875 SourceLocation *ArgLocation = nullptr);
4876
4877 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4878 /// If not emit an error and return false. If the argument is an identifier it
4879 /// will emit an error with a fixit hint and treat it as if it was a string
4880 /// literal.
4881 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4882 StringRef &Str,
4883 SourceLocation *ArgLocation = nullptr);
4884
4885 /// Determine if type T is a valid subject for a nonnull and similar
4886 /// attributes. Dependent types are considered valid so they can be checked
4887 /// during instantiation time. By default, we look through references (the
4888 /// behavior used by nonnull), but if the second parameter is true, then we
4889 /// treat a reference type as valid.
4890 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
4891
4892 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
4893 /// declaration.
4895 Expr *OE);
4896
4897 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
4898 /// declaration.
4900 Expr *ParamExpr);
4901
4902 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
4903 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
4904
4905 AvailabilityAttr *mergeAvailabilityAttr(
4906 NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform,
4907 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
4908 VersionTuple Obsoleted, bool IsUnavailable, StringRef Message,
4909 bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK,
4910 int Priority, IdentifierInfo *IIEnvironment);
4911
4912 TypeVisibilityAttr *
4914 TypeVisibilityAttr::VisibilityType Vis);
4915 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
4916 VisibilityAttr::VisibilityType Vis);
4917 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
4918 StringRef Name);
4919
4920 /// Used to implement to perform semantic checking on
4921 /// attribute((section("foo"))) specifiers.
4922 ///
4923 /// In this case, "foo" is passed in to be checked. If the section
4924 /// specifier is invalid, return an Error that indicates the problem.
4925 ///
4926 /// This is a simple quality of implementation feature to catch errors
4927 /// and give good diagnostics in cases when the assembler or code generator
4928 /// would otherwise reject the section specifier.
4929 llvm::Error isValidSectionSpecifier(StringRef Str);
4930 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
4931 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
4932 StringRef Name);
4933
4934 // Check for things we'd like to warn about. Multiversioning issues are
4935 // handled later in the process, once we know how many exist.
4936 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
4937
4938 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
4939 StringRef NewUserDiagnostic);
4940 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
4941 IdentifierInfo *Format, int FormatIdx,
4942 int FirstArg);
4943 FormatMatchesAttr *mergeFormatMatchesAttr(Decl *D,
4944 const AttributeCommonInfo &CI,
4945 IdentifierInfo *Format,
4946 int FormatIdx,
4947 StringLiteral *FormatStr);
4948
4949 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
4950 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4951 bool IsPackExpansion);
4953 bool IsPackExpansion);
4954
4955 /// AddAlignValueAttr - Adds an align_value attribute to a particular
4956 /// declaration.
4957 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
4958
4959 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
4960 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
4963
4965 bool BestCase,
4966 MSInheritanceModel SemanticSpelling);
4967
4969
4970 /// AddModeAttr - Adds a mode attribute to a particular declaration.
4971 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name,
4972 bool InInstantiation = false);
4973 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
4974 const AttributeCommonInfo &CI,
4975 const IdentifierInfo *Ident);
4976 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
4977 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
4978 const AttributeCommonInfo &CI);
4979 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
4980 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
4981 const InternalLinkageAttr &AL);
4982
4983 /// Check validaty of calling convention attribute \p attr. If \p FD
4984 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
4985 /// target. Otherwise, it is specified by \p CFT.
4987 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
4989
4990 /// Checks a regparm attribute, returning true if it is ill-formed and
4991 /// otherwise setting numParams to the appropriate value.
4992 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
4993
4994 /// Create an CUDALaunchBoundsAttr attribute.
4995 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
4996 Expr *MaxThreads,
4997 Expr *MinBlocks,
4998 Expr *MaxBlocks);
4999
5000 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
5001 /// declaration.
5003 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
5004
5005 enum class RetainOwnershipKind { NS, CF, OS };
5006
5007 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
5008 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
5009
5010 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
5011
5012 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
5013 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
5014 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
5015 const AttributeCommonInfo &CI,
5016 bool BestCase,
5017 MSInheritanceModel Model);
5018
5019 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
5020 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
5021 const EnforceTCBLeafAttr &AL);
5022
5023 /// Helper for delayed processing TransparentUnion or
5024 /// BPFPreserveAccessIndexAttr attribute.
5026 const ParsedAttributesView &AttrList);
5027
5028 // Options for ProcessDeclAttributeList().
5031 : IncludeCXX11Attributes(true), IgnoreTypeAttributes(false) {}
5032
5034 ProcessDeclAttributeOptions Result = *this;
5035 Result.IncludeCXX11Attributes = Val;
5036 return Result;
5037 }
5038
5040 ProcessDeclAttributeOptions Result = *this;
5041 Result.IgnoreTypeAttributes = Val;
5042 return Result;
5043 }
5044
5045 // Should C++11 attributes be processed?
5047
5048 // Should any type attributes encountered be ignored?
5049 // If this option is false, a diagnostic will be emitted for any type
5050 // attributes of a kind that does not "slide" from the declaration to
5051 // the decl-specifier-seq.
5053 };
5054
5055 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
5056 /// attribute list to the specified decl, ignoring any type attributes.
5058 const ParsedAttributesView &AttrList,
5059 const ProcessDeclAttributeOptions &Options =
5061
5062 /// Annotation attributes are the only attributes allowed after an access
5063 /// specifier.
5065 const ParsedAttributesView &AttrList);
5066
5067 /// checkUnusedDeclAttributes - Given a declarator which is not being
5068 /// used to build a declaration, complain about any decl attributes
5069 /// which might be lying around on it.
5071
5072 void DiagnoseUnknownAttribute(const ParsedAttr &AL);
5073
5074 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
5075 /// \#pragma weak needs a non-definition decl and source may not have one.
5078
5079 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5080 /// applied to it, possibly with an alias.
5081 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
5082
5083 void ProcessPragmaWeak(Scope *S, Decl *D);
5084 // Decl attributes - this routine is the top level dispatcher.
5085 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
5086
5088
5089 /// Given a set of delayed diagnostics, re-emit them as if they had
5090 /// been delayed in the current context instead of in the given pool.
5091 /// Essentially, this just moves them to the current pool.
5093
5094 /// Check if IdxExpr is a valid parameter index for a function or
5095 /// instance method D. May output an error.
5096 ///
5097 /// \returns true if IdxExpr is a valid index.
5098 template <typename AttrInfo>
5100 const Decl *D, const AttrInfo &AI, unsigned AttrArgNum,
5101 const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis = false,
5102 bool CanIndexVariadicArguments = false) {
5104
5105 // In C++ the implicit 'this' function parameter also counts.
5106 // Parameters are counted from one.
5107 bool HP = hasFunctionProto(D);
5108 bool HasImplicitThisParam = isInstanceMethod(D);
5109 bool IV = HP && isFunctionOrMethodVariadic(D);
5110 unsigned NumParams =
5111 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
5112
5113 std::optional<llvm::APSInt> IdxInt;
5114 if (IdxExpr->isTypeDependent() ||
5115 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
5116 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
5117 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
5118 << IdxExpr->getSourceRange();
5119 return false;
5120 }
5121
5122 unsigned IdxSource = IdxInt->getLimitedValue(UINT_MAX);
5123 if (IdxSource < 1 ||
5124 ((!IV || !CanIndexVariadicArguments) && IdxSource > NumParams)) {
5125 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
5126 << &AI << AttrArgNum << IdxExpr->getSourceRange();
5127 return false;
5128 }
5129 if (HasImplicitThisParam && !CanIndexImplicitThis) {
5130 if (IdxSource == 1) {
5131 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
5132 << &AI << IdxExpr->getSourceRange();
5133 return false;
5134 }
5135 }
5136
5137 Idx = ParamIdx(IdxSource, D);
5138 return true;
5139 }
5140
5141 ///@}
5142
5143 //
5144 //
5145 // -------------------------------------------------------------------------
5146 //
5147 //
5148
5149 /// \name C++ Declarations
5150 /// Implementations are in SemaDeclCXX.cpp
5151 ///@{
5152
5153public:
5155
5156 /// Called before parsing a function declarator belonging to a function
5157 /// declaration.
5159 unsigned TemplateParameterDepth);
5160
5161 /// Called after parsing a function declarator belonging to a function
5162 /// declaration.
5164
5165 // Act on C++ namespaces
5167 SourceLocation NamespaceLoc,
5168 SourceLocation IdentLoc, IdentifierInfo *Ident,
5169 SourceLocation LBrace,
5170 const ParsedAttributesView &AttrList,
5171 UsingDirectiveDecl *&UsingDecl, bool IsNested);
5172
5173 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
5174 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
5175 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
5176
5178
5179 /// Retrieve the special "std" namespace, which may require us to
5180 /// implicitly define the namespace.
5182
5184 EnumDecl *getStdAlignValT() const;
5185
5188 QualType AllocType, SourceLocation);
5189
5191 const IdentifierInfo *MemberOrBase);
5192
5194 /// The '<=>' operator was used in an expression and a builtin operator
5195 /// was selected.
5197 /// A defaulted 'operator<=>' needed the comparison category. This
5198 /// typically only applies to 'std::strong_ordering', due to the implicit
5199 /// fallback return value.
5201 };
5202
5203 /// Lookup the specified comparison category types in the standard
5204 /// library, an check the VarDecls possibly returned by the operator<=>
5205 /// builtins for that type.
5206 ///
5207 /// \return The type of the comparison category type corresponding to the
5208 /// specified Kind, or a null type if an error occurs
5212
5213 /// Tests whether Ty is an instance of std::initializer_list and, if
5214 /// it is and Element is not NULL, assigns the element type to Element.
5215 bool isStdInitializerList(QualType Ty, QualType *Element);
5216
5217 /// Tests whether Ty is an instance of std::type_identity and, if
5218 /// it is and TypeArgument is not NULL, assigns the element type to Element.
5219 /// If MalformedDecl is not null, and type_identity was ruled out due to being
5220 /// incorrectly structured despite having the correct name, the faulty Decl
5221 /// will be assigned to MalformedDecl.
5222 bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument,
5223 const Decl **MalformedDecl = nullptr);
5224
5225 /// Looks for the std::initializer_list template and instantiates it
5226 /// with Element, or emits an error if it's not found.
5227 ///
5228 /// \returns The instantiated template, or null on error.
5230
5231 /// Looks for the std::type_identity template and instantiates it
5232 /// with Type, or returns a null type if type_identity has not been declared
5233 ///
5234 /// \returns The instantiated template, or null if std::type_identity is not
5235 /// declared
5237
5238 /// Determine whether Ctor is an initializer-list constructor, as
5239 /// defined in [dcl.init.list]p2.
5240 bool isInitListConstructor(const FunctionDecl *Ctor);
5241
5242 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
5243 SourceLocation NamespcLoc, CXXScopeSpec &SS,
5244 SourceLocation IdentLoc,
5245 IdentifierInfo *NamespcName,
5246 const ParsedAttributesView &AttrList);
5247
5249
5250 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
5251 SourceLocation AliasLoc, IdentifierInfo *Alias,
5252 CXXScopeSpec &SS, SourceLocation IdentLoc,
5253 IdentifierInfo *Ident);
5254
5255 /// Remove decls we can't actually see from a lookup being used to declare
5256 /// shadow using decls.
5257 ///
5258 /// \param S - The scope of the potential shadow decl
5259 /// \param Previous - The lookup of a potential shadow decl's name.
5260 void FilterUsingLookup(Scope *S, LookupResult &lookup);
5261
5262 /// Hides a using shadow declaration. This is required by the current
5263 /// using-decl implementation when a resolvable using declaration in a
5264 /// class is followed by a declaration which would hide or override
5265 /// one or more of the using decl's targets; for example:
5266 ///
5267 /// struct Base { void foo(int); };
5268 /// struct Derived : Base {
5269 /// using Base::foo;
5270 /// void foo(int);
5271 /// };
5272 ///
5273 /// The governing language is C++03 [namespace.udecl]p12:
5274 ///
5275 /// When a using-declaration brings names from a base class into a
5276 /// derived class scope, member functions in the derived class
5277 /// override and/or hide member functions with the same name and
5278 /// parameter types in a base class (rather than conflicting).
5279 ///
5280 /// There are two ways to implement this:
5281 /// (1) optimistically create shadow decls when they're not hidden
5282 /// by existing declarations, or
5283 /// (2) don't create any shadow decls (or at least don't make them
5284 /// visible) until we've fully parsed/instantiated the class.
5285 /// The problem with (1) is that we might have to retroactively remove
5286 /// a shadow decl, which requires several O(n) operations because the
5287 /// decl structures are (very reasonably) not designed for removal.
5288 /// (2) avoids this but is very fiddly and phase-dependent.
5289 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
5290
5291 /// Determines whether to create a using shadow decl for a particular
5292 /// decl, given the set of decls existing prior to this using lookup.
5294 const LookupResult &PreviousDecls,
5295 UsingShadowDecl *&PrevShadow);
5296
5297 /// Builds a shadow declaration corresponding to a 'using' declaration.
5300 UsingShadowDecl *PrevDecl);
5301
5302 /// Checks that the given using declaration is not an invalid
5303 /// redeclaration. Note that this is checking only for the using decl
5304 /// itself, not for any ill-formedness among the UsingShadowDecls.
5306 bool HasTypenameKeyword,
5307 const CXXScopeSpec &SS,
5308 SourceLocation NameLoc,
5309 const LookupResult &Previous);
5310
5311 /// Checks that the given nested-name qualifier used in a using decl
5312 /// in the current context is appropriately related to the current
5313 /// scope. If an error is found, diagnoses it and returns true.
5314 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
5315 /// the result of that lookup. UD is likewise nullptr, except when we have an
5316 /// already-populated UsingDecl whose shadow decls contain the same
5317 /// information (i.e. we're instantiating a UsingDecl with non-dependent
5318 /// scope).
5319 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
5320 const CXXScopeSpec &SS,
5321 const DeclarationNameInfo &NameInfo,
5322 SourceLocation NameLoc,
5323 const LookupResult *R = nullptr,
5324 const UsingDecl *UD = nullptr);
5325
5326 /// Builds a using declaration.
5327 ///
5328 /// \param IsInstantiation - Whether this call arises from an
5329 /// instantiation of an unresolved using declaration. We treat
5330 /// the lookup differently for these declarations.
5332 SourceLocation UsingLoc,
5333 bool HasTypenameKeyword,
5334 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5335 DeclarationNameInfo NameInfo,
5336 SourceLocation EllipsisLoc,
5337 const ParsedAttributesView &AttrList,
5338 bool IsInstantiation, bool IsUsingIfExists);
5340 SourceLocation UsingLoc,
5341 SourceLocation EnumLoc,
5342 SourceLocation NameLoc,
5344 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
5345 ArrayRef<NamedDecl *> Expansions);
5346
5347 /// Additional checks for a using declaration referring to a constructor name.
5349
5350 /// Given a derived-class using shadow declaration for a constructor and the
5351 /// correspnding base class constructor, find or create the implicit
5352 /// synthesized derived class constructor to use for this initialization.
5355 ConstructorUsingShadowDecl *DerivedShadow);
5356
5358 SourceLocation UsingLoc,
5359 SourceLocation TypenameLoc, CXXScopeSpec &SS,
5360 UnqualifiedId &Name, SourceLocation EllipsisLoc,
5361 const ParsedAttributesView &AttrList);
5363 SourceLocation UsingLoc,
5364 SourceLocation EnumLoc, SourceRange TyLoc,
5365 const IdentifierInfo &II, ParsedType Ty,
5366 CXXScopeSpec *SS = nullptr);
5368 MultiTemplateParamsArg TemplateParams,
5369 SourceLocation UsingLoc, UnqualifiedId &Name,
5370 const ParsedAttributesView &AttrList,
5371 TypeResult Type, Decl *DeclFromDeclSpec);
5372
5373 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
5374 /// including handling of its default argument expressions.
5375 ///
5376 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
5378 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5380 bool HadMultipleCandidates, bool IsListInitialization,
5381 bool IsStdInitListInitialization, bool RequiresZeroInit,
5382 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5383
5384 /// Build a CXXConstructExpr whose constructor has already been resolved if
5385 /// it denotes an inherited constructor.
5387 SourceLocation ConstructLoc, QualType DeclInitType,
5388 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5389 bool HadMultipleCandidates, bool IsListInitialization,
5390 bool IsStdInitListInitialization, bool RequiresZeroInit,
5391 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5392
5393 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
5394 // the constructor can be elidable?
5396 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
5397 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
5398 bool HadMultipleCandidates, bool IsListInitialization,
5399 bool IsStdInitListInitialization, bool RequiresZeroInit,
5400 CXXConstructionKind ConstructKind, SourceRange ParenRange);
5401
5403 SourceLocation InitLoc);
5404
5405 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
5406 /// constructed variable.
5407 void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit);
5408
5409 /// Helper class that collects exception specifications for
5410 /// implicitly-declared special member functions.
5412 // Pointer to allow copying
5413 Sema *Self;
5414 // We order exception specifications thus:
5415 // noexcept is the most restrictive, but is only used in C++11.
5416 // throw() comes next.
5417 // Then a throw(collected exceptions)
5418 // Finally no specification, which is expressed as noexcept(false).
5419 // throw(...) is used instead if any called function uses it.
5420 ExceptionSpecificationType ComputedEST;
5421 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5422 SmallVector<QualType, 4> Exceptions;
5423
5424 void ClearExceptions() {
5425 ExceptionsSeen.clear();
5426 Exceptions.clear();
5427 }
5428
5429 public:
5431 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5432 if (!Self.getLangOpts().CPlusPlus11)
5433 ComputedEST = EST_DynamicNone;
5434 }
5435
5436 /// Get the computed exception specification type.
5438 assert(!isComputedNoexcept(ComputedEST) &&
5439 "noexcept(expr) should not be a possible result");
5440 return ComputedEST;
5441 }
5442
5443 /// The number of exceptions in the exception specification.
5444 unsigned size() const { return Exceptions.size(); }
5445
5446 /// The set of exceptions in the exception specification.
5447 const QualType *data() const { return Exceptions.data(); }
5448
5449 /// Integrate another called method into the collected data.
5450 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5451
5452 /// Integrate an invoked expression into the collected data.
5453 void CalledExpr(Expr *E) { CalledStmt(E); }
5454
5455 /// Integrate an invoked statement into the collected data.
5456 void CalledStmt(Stmt *S);
5457
5458 /// Overwrite an EPI's exception specification with this
5459 /// computed exception specification.
5462 ESI.Type = getExceptionSpecType();
5463 if (ESI.Type == EST_Dynamic) {
5464 ESI.Exceptions = Exceptions;
5465 } else if (ESI.Type == EST_None) {
5466 /// C++11 [except.spec]p14:
5467 /// The exception-specification is noexcept(false) if the set of
5468 /// potential exceptions of the special member function contains "any"
5469 ESI.Type = EST_NoexceptFalse;
5470 ESI.NoexceptExpr =
5471 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5472 }
5473 return ESI;
5474 }
5475 };
5476
5477 /// Evaluate the implicit exception specification for a defaulted
5478 /// special member function.
5480
5481 /// Check the given exception-specification and update the
5482 /// exception specification information with the results.
5483 void checkExceptionSpecification(bool IsTopLevel,
5485 ArrayRef<ParsedType> DynamicExceptions,
5486 ArrayRef<SourceRange> DynamicExceptionRanges,
5487 Expr *NoexceptExpr,
5488 SmallVectorImpl<QualType> &Exceptions,
5490
5491 /// Add an exception-specification to the given member or friend function
5492 /// (or function template). The exception-specification was parsed
5493 /// after the function itself was declared.
5495 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5496 ArrayRef<ParsedType> DynamicExceptions,
5497 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5498
5499 class InheritedConstructorInfo;
5500
5501 /// Determine if a special member function should have a deleted
5502 /// definition when it is defaulted.
5504 InheritedConstructorInfo *ICI = nullptr,
5505 bool Diagnose = false);
5506
5507 /// Produce notes explaining why a defaulted function was defined as deleted.
5509
5510 /// Declare the implicit default constructor for the given class.
5511 ///
5512 /// \param ClassDecl The class declaration into which the implicit
5513 /// default constructor will be added.
5514 ///
5515 /// \returns The implicitly-declared default constructor.
5518
5519 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5520 /// defining this constructor as the default constructor.
5523
5524 /// Declare the implicit destructor for the given class.
5525 ///
5526 /// \param ClassDecl The class declaration into which the implicit
5527 /// destructor will be added.
5528 ///
5529 /// \returns The implicitly-declared destructor.
5531
5532 /// DefineImplicitDestructor - Checks for feasibility of
5533 /// defining this destructor as the default destructor.
5534 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5536
5537 /// Build an exception spec for destructors that don't have one.
5538 ///
5539 /// C++11 says that user-defined destructors with no exception spec get one
5540 /// that looks as if the destructor was implicitly declared.
5542
5543 /// Define the specified inheriting constructor.
5546
5547 /// Declare the implicit copy constructor for the given class.
5548 ///
5549 /// \param ClassDecl The class declaration into which the implicit
5550 /// copy constructor will be added.
5551 ///
5552 /// \returns The implicitly-declared copy constructor.
5554
5555 /// DefineImplicitCopyConstructor - Checks for feasibility of
5556 /// defining this constructor as the copy constructor.
5557 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5559
5560 /// Declare the implicit move constructor for the given class.
5561 ///
5562 /// \param ClassDecl The Class declaration into which the implicit
5563 /// move constructor will be added.
5564 ///
5565 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5566 /// declared.
5568
5569 /// DefineImplicitMoveConstructor - Checks for feasibility of
5570 /// defining this constructor as the move constructor.
5571 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5573
5574 /// Declare the implicit copy assignment operator for the given class.
5575 ///
5576 /// \param ClassDecl The class declaration into which the implicit
5577 /// copy assignment operator will be added.
5578 ///
5579 /// \returns The implicitly-declared copy assignment operator.
5581
5582 /// Defines an implicitly-declared copy assignment operator.
5583 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5584 CXXMethodDecl *MethodDecl);
5585
5586 /// Declare the implicit move assignment operator for the given class.
5587 ///
5588 /// \param ClassDecl The Class declaration into which the implicit
5589 /// move assignment operator will be added.
5590 ///
5591 /// \returns The implicitly-declared move assignment operator, or NULL if it
5592 /// wasn't declared.
5594
5595 /// Defines an implicitly-declared move assignment operator.
5596 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5597 CXXMethodDecl *MethodDecl);
5598
5599 /// Check a completed declaration of an implicit special member.
5601
5602 /// Determine whether the given function is an implicitly-deleted
5603 /// special member function.
5605
5606 /// Check whether 'this' shows up in the type of a static member
5607 /// function after the (naturally empty) cv-qualifier-seq would be.
5608 ///
5609 /// \returns true if an error occurred.
5611
5612 /// Whether this' shows up in the exception specification of a static
5613 /// member function.
5615
5616 /// Check whether 'this' shows up in the attributes of the given
5617 /// static member function.
5618 ///
5619 /// \returns true if an error occurred.
5621
5623 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5624
5626
5627 /// Given a constructor and the set of arguments provided for the
5628 /// constructor, convert the arguments and add any required default arguments
5629 /// to form a proper call to this constructor.
5630 ///
5631 /// \returns true if an error occurred, false otherwise.
5633 QualType DeclInitType, MultiExprArg ArgsPtr,
5635 SmallVectorImpl<Expr *> &ConvertedArgs,
5636 bool AllowExplicit = false,
5637 bool IsListInitialization = false);
5638
5639 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5640 /// initializer for the declaration 'Dcl'.
5641 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5642 /// static data member of class X, names should be looked up in the scope of
5643 /// class X.
5645
5646 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5647 /// initializer for the declaration 'Dcl'.
5648 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5649
5650 /// Define the "body" of the conversion from a lambda object to a
5651 /// function pointer.
5652 ///
5653 /// This routine doesn't actually define a sensible body; rather, it fills
5654 /// in the initialization expression needed to copy the lambda object into
5655 /// the block, and IR generation actually generates the real body of the
5656 /// block pointer conversion.
5657 void
5659 CXXConversionDecl *Conv);
5660
5661 /// Define the "body" of the conversion from a lambda object to a
5662 /// block pointer.
5663 ///
5664 /// This routine doesn't actually define a sensible body; rather, it fills
5665 /// in the initialization expression needed to copy the lambda object into
5666 /// the block, and IR generation actually generates the real body of the
5667 /// block pointer conversion.
5669 CXXConversionDecl *Conv);
5670
5671 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5672 /// linkage specification, including the language and (if present)
5673 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5674 /// language string literal. LBraceLoc, if valid, provides the location of
5675 /// the '{' brace. Otherwise, this linkage specification does not
5676 /// have any braces.
5678 Expr *LangStr, SourceLocation LBraceLoc);
5679
5680 /// ActOnFinishLinkageSpecification - Complete the definition of
5681 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5682 /// valid, it's the position of the closing '}' brace in a linkage
5683 /// specification that uses braces.
5685 SourceLocation RBraceLoc);
5686
5687 //===--------------------------------------------------------------------===//
5688 // C++ Classes
5689 //
5690
5691 /// Get the class that is directly named by the current context. This is the
5692 /// class for which an unqualified-id in this scope could name a constructor
5693 /// or destructor.
5694 ///
5695 /// If the scope specifier denotes a class, this will be that class.
5696 /// If the scope specifier is empty, this will be the class whose
5697 /// member-specification we are currently within. Otherwise, there
5698 /// is no such class.
5700
5701 /// isCurrentClassName - Determine whether the identifier II is the
5702 /// name of the class type currently being defined. In the case of
5703 /// nested classes, this will only return true if II is the name of
5704 /// the innermost class.
5705 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5706 const CXXScopeSpec *SS = nullptr);
5707
5708 /// Determine whether the identifier II is a typo for the name of
5709 /// the class type currently being defined. If so, update it to the identifier
5710 /// that should have been used.
5712
5713 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5715 SourceLocation ColonLoc,
5716 const ParsedAttributesView &Attrs);
5717
5718 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5719 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5720 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5721 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5722 /// present (but parsing it has been deferred).
5723 NamedDecl *
5725 MultiTemplateParamsArg TemplateParameterLists,
5726 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5727 InClassInitStyle InitStyle);
5728
5729 /// Enter a new C++ default initializer scope. After calling this, the
5730 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5731 /// parsing or instantiating the initializer failed.
5733
5734 /// This is invoked after parsing an in-class initializer for a
5735 /// non-static C++ class member, and after instantiating an in-class
5736 /// initializer in a class template. Such actions are deferred until the class
5737 /// is complete.
5739 SourceLocation EqualLoc,
5741
5742 /// Handle a C++ member initializer using parentheses syntax.
5744 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5745 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5746 const DeclSpec &DS, SourceLocation IdLoc,
5747 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5748 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5749
5750 /// Handle a C++ member initializer using braced-init-list syntax.
5751 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5752 CXXScopeSpec &SS,
5753 IdentifierInfo *MemberOrBase,
5754 ParsedType TemplateTypeTy,
5755 const DeclSpec &DS, SourceLocation IdLoc,
5756 Expr *InitList, SourceLocation EllipsisLoc);
5757
5758 /// Handle a C++ member initializer.
5759 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5760 CXXScopeSpec &SS,
5761 IdentifierInfo *MemberOrBase,
5762 ParsedType TemplateTypeTy,
5763 const DeclSpec &DS, SourceLocation IdLoc,
5764 Expr *Init, SourceLocation EllipsisLoc);
5765
5767 SourceLocation IdLoc);
5768
5770 TypeSourceInfo *BaseTInfo, Expr *Init,
5771 CXXRecordDecl *ClassDecl,
5772 SourceLocation EllipsisLoc);
5773
5775 CXXRecordDecl *ClassDecl);
5776
5779
5781 ArrayRef<CXXCtorInitializer *> Initializers = {});
5782
5783 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5784 /// mark all the non-trivial destructors of its members and bases as
5785 /// referenced.
5786 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5787 CXXRecordDecl *Record);
5788
5789 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5790 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5791 /// class. In the Microsoft C++ ABI, this is done any time a class's
5792 /// destructor is referenced.
5794 SourceLocation Location, CXXRecordDecl *ClassDecl,
5795 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases =
5796 nullptr);
5797
5798 /// Do semantic checks to allow the complete destructor variant to be emitted
5799 /// when the destructor is defined in another translation unit. In the Itanium
5800 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5801 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5802 /// of the checks performed when emitting a regular destructor.
5803 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5804 CXXDestructorDecl *Dtor);
5805
5806 /// The list of classes whose vtables have been used within
5807 /// this translation unit, and the source locations at which the
5808 /// first use occurred.
5809 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5810
5811 /// The list of vtables that are required but have not yet been
5812 /// materialized.
5814
5815 /// The set of classes whose vtables have been used within
5816 /// this translation unit, and a bit that will be true if the vtable is
5817 /// required to be emitted (otherwise, it should be emitted only if needed
5818 /// by code generation).
5819 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5820
5821 /// Load any externally-stored vtable uses.
5823
5824 /// Note that the vtable for the given class was used at the
5825 /// given location.
5827 bool DefinitionRequired = false);
5828
5829 /// Mark the exception specifications of all virtual member functions
5830 /// in the given class as needed.
5832 const CXXRecordDecl *RD);
5833
5834 /// MarkVirtualMembersReferenced - Will mark all members of the given
5835 /// CXXRecordDecl referenced.
5837 bool ConstexprOnly = false);
5838
5839 /// Define all of the vtables that have been used in this
5840 /// translation unit and reference any virtual members used by those
5841 /// vtables.
5842 ///
5843 /// \returns true if any work was done, false otherwise.
5844 bool DefineUsedVTables();
5845
5846 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
5847 /// special functions, such as the default constructor, copy
5848 /// constructor, or destructor, to the given C++ class (C++
5849 /// [special]p1). This routine can only be executed just before the
5850 /// definition of the class is complete.
5852
5853 /// ActOnMemInitializers - Handle the member initializers for a constructor.
5854 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
5856 bool AnyErrors);
5857
5858 /// Check class-level dllimport/dllexport attribute. The caller must
5859 /// ensure that referenceDLLExportedClassMethods is called some point later
5860 /// when all outer classes of Class are complete.
5863
5865
5866 /// Perform propagation of DLL attributes from a derived class to a
5867 /// templated base class for MS compatibility.
5869 CXXRecordDecl *Class, Attr *ClassAttr,
5870 ClassTemplateSpecializationDecl *BaseTemplateSpec,
5871 SourceLocation BaseLoc);
5872
5873 /// Perform semantic checks on a class definition that has been
5874 /// completing, introducing implicitly-declared members, checking for
5875 /// abstract types, etc.
5876 ///
5877 /// \param S The scope in which the class was parsed. Null if we didn't just
5878 /// parse a class definition.
5879 /// \param Record The completed class.
5881
5882 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
5883 /// conditions that are needed for the attribute to have an effect.
5885
5886 /// Check that VTable Pointer authentication is only being set on the first
5887 /// first instantiation of the vtable
5889
5891 Decl *TagDecl, SourceLocation LBrac,
5892 SourceLocation RBrac,
5893 const ParsedAttributesView &AttrList);
5894
5895 /// Perform any semantic analysis which needs to be delayed until all
5896 /// pending class member declarations have been parsed.
5899
5900 /// This is used to implement the constant expression evaluation part of the
5901 /// attribute enable_if extension. There is nothing in standard C++ which
5902 /// would require reentering parameters.
5905 llvm::function_ref<Scope *()> EnterScope);
5907
5908 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
5909 /// parsing a top-level (non-nested) C++ class, and we are now
5910 /// parsing those parts of the given Method declaration that could
5911 /// not be parsed earlier (C++ [class.mem]p2), such as default
5912 /// arguments. This action should enter the scope of the given
5913 /// Method declaration as if we had just parsed the qualified method
5914 /// name. However, it should not bring the parameters into scope;
5915 /// that will be performed by ActOnDelayedCXXMethodParameter.
5917 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
5919
5920 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
5921 /// processing the delayed method declaration for Method. The method
5922 /// declaration is now considered finished. There may be a separate
5923 /// ActOnStartOfFunctionDef action later (not necessarily
5924 /// immediately!) for this method, if it was also defined inside the
5925 /// class body.
5928
5930
5931 bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
5932 StringEvaluationContext EvalContext,
5933 bool ErrorOnInvalidMessage);
5934 bool EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
5935 StringEvaluationContext EvalContext,
5936 bool ErrorOnInvalidMessage);
5937
5939 Expr *AssertExpr, Expr *AssertMessageExpr,
5940 SourceLocation RParenLoc);
5942 Expr *AssertExpr, Expr *AssertMessageExpr,
5943 SourceLocation RParenLoc, bool Failed);
5944
5945 /// Try to print more useful information about a failed static_assert
5946 /// with expression \E
5947 void DiagnoseStaticAssertDetails(const Expr *E);
5948
5949 /// If E represents a built-in type trait, or a known standard type trait,
5950 /// try to print more information about why the type type-trait failed.
5951 /// This assumes we already evaluated the expression to a false boolean value.
5952 void DiagnoseTypeTraitDetails(const Expr *E);
5953
5954 /// Handle a friend type declaration. This works in tandem with
5955 /// ActOnTag.
5956 ///
5957 /// Notes on friend class templates:
5958 ///
5959 /// We generally treat friend class declarations as if they were
5960 /// declaring a class. So, for example, the elaborated type specifier
5961 /// in a friend declaration is required to obey the restrictions of a
5962 /// class-head (i.e. no typedefs in the scope chain), template
5963 /// parameters are required to match up with simple template-ids, &c.
5964 /// However, unlike when declaring a template specialization, it's
5965 /// okay to refer to a template specialization without an empty
5966 /// template parameter declaration, e.g.
5967 /// friend class A<T>::B<unsigned>;
5968 /// We permit this as a special case; if there are any template
5969 /// parameters present at all, require proper matching, i.e.
5970 /// template <> template <class T> friend class A<int>::B;
5971 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
5972 MultiTemplateParamsArg TemplateParams,
5973 SourceLocation EllipsisLoc);
5975 MultiTemplateParamsArg TemplateParams);
5976
5977 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
5978 /// the well-formedness of the constructor declarator @p D with type @p
5979 /// R. If there are any errors in the declarator, this routine will
5980 /// emit diagnostics and set the invalid bit to true. In any case, the type
5981 /// will be updated to reflect a well-formed type for the constructor and
5982 /// returned.
5984 StorageClass &SC);
5985
5986 /// CheckConstructor - Checks a fully-formed constructor for
5987 /// well-formedness, issuing any diagnostics required. Returns true if
5988 /// the constructor declarator is invalid.
5990
5991 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
5992 /// the well-formednes of the destructor declarator @p D with type @p
5993 /// R. If there are any errors in the declarator, this routine will
5994 /// emit diagnostics and set the declarator to invalid. Even if this happens,
5995 /// will be updated to reflect a well-formed type for the destructor and
5996 /// returned.
5998 StorageClass &SC);
5999
6000 /// CheckDestructor - Checks a fully-formed destructor definition for
6001 /// well-formedness, issuing any diagnostics required. Returns true
6002 /// on error.
6004
6005 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
6006 /// well-formednes of the conversion function declarator @p D with
6007 /// type @p R. If there are any errors in the declarator, this routine
6008 /// will emit diagnostics and return true. Otherwise, it will return
6009 /// false. Either way, the type @p R will be updated to reflect a
6010 /// well-formed type for the conversion operator.
6012
6013 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
6014 /// the declaration of the given C++ conversion function. This routine
6015 /// is responsible for recording the conversion function in the C++
6016 /// class, if possible.
6018
6019 /// Check the validity of a declarator that we parsed for a deduction-guide.
6020 /// These aren't actually declarators in the grammar, so we need to check that
6021 /// the user didn't specify any pieces that are not part of the
6022 /// deduction-guide grammar. Return true on invalid deduction-guide.
6024 StorageClass &SC);
6025
6027
6030 SourceLocation DefaultLoc);
6032
6033 /// Kinds of defaulted comparison operator functions.
6034 enum class DefaultedComparisonKind : unsigned char {
6035 /// This is not a defaultable comparison operator.
6036 None,
6037 /// This is an operator== that should be implemented as a series of
6038 /// subobject comparisons.
6039 Equal,
6040 /// This is an operator<=> that should be implemented as a series of
6041 /// subobject comparisons.
6042 ThreeWay,
6043 /// This is an operator!= that should be implemented as a rewrite in terms
6044 /// of a == comparison.
6045 NotEqual,
6046 /// This is an <, <=, >, or >= that should be implemented as a rewrite in
6047 /// terms of a <=> comparison.
6048 Relational,
6049 };
6050
6054 FunctionDecl *Spaceship);
6057
6059 QualType R, bool IsLambda,
6060 DeclContext *DC = nullptr);
6062 DeclarationName Name, QualType R);
6064
6065 //===--------------------------------------------------------------------===//
6066 // C++ Derived Classes
6067 //
6068
6069 /// Check the validity of a C++ base class specifier.
6070 ///
6071 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
6072 /// and returns NULL otherwise.
6074 SourceRange SpecifierRange, bool Virtual,
6075 AccessSpecifier Access,
6076 TypeSourceInfo *TInfo,
6077 SourceLocation EllipsisLoc);
6078
6079 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
6080 /// one entry in the base class list of a class specifier, for
6081 /// example:
6082 /// class foo : public bar, virtual private baz {
6083 /// 'public bar' and 'virtual private baz' are each base-specifiers.
6084 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
6085 const ParsedAttributesView &Attrs, bool Virtual,
6086 AccessSpecifier Access, ParsedType basetype,
6087 SourceLocation BaseLoc,
6088 SourceLocation EllipsisLoc);
6089
6090 /// Performs the actual work of attaching the given base class
6091 /// specifiers to a C++ class.
6094
6095 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
6096 /// class, after checking whether there are any duplicate base
6097 /// classes.
6098 void ActOnBaseSpecifiers(Decl *ClassDecl,
6100
6101 /// Determine whether the type \p Derived is a C++ class that is
6102 /// derived from the type \p Base.
6109 CXXBasePaths &Paths);
6110
6111 // FIXME: I don't like this name.
6112 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
6113
6116 CXXCastPath *BasePath = nullptr,
6117 bool IgnoreAccess = false);
6118
6119 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
6120 /// conversion (where Derived and Base are class types) is
6121 /// well-formed, meaning that the conversion is unambiguous (and
6122 /// that all of the base classes are accessible). Returns true
6123 /// and emits a diagnostic if the code is ill-formed, returns false
6124 /// otherwise. Loc is the location where this routine should point to
6125 /// if there is an error, and Range is the source range to highlight
6126 /// if there is an error.
6127 ///
6128 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
6129 /// diagnostic for the respective type of error will be suppressed, but the
6130 /// check for ill-formed code will still be performed.
6132 unsigned InaccessibleBaseID,
6133 unsigned AmbiguousBaseConvID,
6135 DeclarationName Name, CXXCastPath *BasePath,
6136 bool IgnoreAccess = false);
6137
6138 /// Builds a string representing ambiguous paths from a
6139 /// specific derived class to different subobjects of the same base
6140 /// class.
6141 ///
6142 /// This function builds a string that can be used in error messages
6143 /// to show the different paths that one can take through the
6144 /// inheritance hierarchy to go from the derived class to different
6145 /// subobjects of a base class. The result looks something like this:
6146 /// @code
6147 /// struct D -> struct B -> struct A
6148 /// struct D -> struct C -> struct A
6149 /// @endcode
6150 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
6151
6153 const CXXMethodDecl *Old);
6154
6155 /// CheckOverridingFunctionReturnType - Checks whether the return types are
6156 /// covariant, according to C++ [class.virtual]p5.
6158 const CXXMethodDecl *Old);
6159
6160 // Check that the overriding method has no explicit object parameter.
6162 const CXXMethodDecl *Old);
6163
6164 /// Mark the given method pure.
6165 ///
6166 /// \param Method the method to be marked pure.
6167 ///
6168 /// \param InitRange the source range that covers the "0" initializer.
6170
6171 /// CheckOverrideControl - Check C++11 override control semantics.
6173
6174 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
6175 /// not used in the declaration of an overriding method.
6177
6178 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
6179 /// function overrides a virtual member function marked 'final', according to
6180 /// C++11 [class.virtual]p4.
6182 const CXXMethodDecl *Old);
6183
6194
6195 struct TypeDiagnoser;
6196
6199 TypeDiagnoser &Diagnoser);
6200 template <typename... Ts>
6202 const Ts &...Args) {
6203 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
6204 return RequireNonAbstractType(Loc, T, Diagnoser);
6205 }
6206
6207 void DiagnoseAbstractType(const CXXRecordDecl *RD);
6208
6209 //===--------------------------------------------------------------------===//
6210 // C++ Overloaded Operators [C++ 13.5]
6211 //
6212
6213 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
6214 /// of this overloaded operator is well-formed. If so, returns false;
6215 /// otherwise, emits appropriate diagnostics and returns true.
6217
6218 /// CheckLiteralOperatorDeclaration - Check whether the declaration
6219 /// of this literal operator function is well-formed. If so, returns
6220 /// false; otherwise, emits appropriate diagnostics and returns true.
6222
6223 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
6224 /// found in an explicit(bool) specifier.
6226
6227 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
6228 /// Returns true if the explicit specifier is now resolved.
6230
6231 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
6232 /// C++ if/switch/while/for statement.
6233 /// e.g: "if (int x = f()) {...}"
6235
6236 // Emitting members of dllexported classes is delayed until the class
6237 // (including field initializers) is fully parsed.
6240
6241 /// Merge the exception specifications of two variable declarations.
6242 ///
6243 /// This is called when there's a redeclaration of a VarDecl. The function
6244 /// checks if the redeclaration might have an exception specification and
6245 /// validates compatibility and merges the specs if necessary.
6247
6248 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
6249 /// function, once we already know that they have the same
6250 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
6251 /// error, false otherwise.
6253
6254 /// Helpers for dealing with blocks and functions.
6256
6257 /// CheckExtraCXXDefaultArguments - Check for any extra default
6258 /// arguments in the declarator, which is not a function declaration
6259 /// or definition and therefore is not permitted to have default
6260 /// arguments. This routine should be invoked for every declarator
6261 /// that is not a function declaration or definition.
6263
6266 }
6267
6268 /// Perform semantic analysis for the variable declaration that
6269 /// occurs within a C++ catch clause, returning the newly-created
6270 /// variable.
6272 SourceLocation StartLoc,
6273 SourceLocation IdLoc,
6274 const IdentifierInfo *Id);
6275
6276 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
6277 /// handler.
6279
6281
6282 /// Handle a friend tag declaration where the scope specifier was
6283 /// templated.
6285 unsigned TagSpec, SourceLocation TagLoc,
6286 CXXScopeSpec &SS, IdentifierInfo *Name,
6287 SourceLocation NameLoc,
6288 SourceLocation EllipsisLoc,
6290 MultiTemplateParamsArg TempParamLists);
6291
6293 SourceLocation DeclStart, Declarator &D,
6294 Expr *BitfieldWidth,
6295 InClassInitStyle InitStyle,
6296 AccessSpecifier AS,
6297 const ParsedAttr &MSPropertyAttr);
6298
6299 /// Diagnose why the specified class does not have a trivial special member of
6300 /// the given kind.
6303
6304 /// Determine whether a defaulted or deleted special member function is
6305 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
6306 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
6310 bool Diagnose = false);
6311
6312 /// For a defaulted function, the kind of defaulted function that it is.
6314 LLVM_PREFERRED_TYPE(CXXSpecialMemberKind)
6315 unsigned SpecialMember : 8;
6316 unsigned Comparison : 8;
6317
6318 public:
6320 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6321 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6323 : SpecialMember(llvm::to_underlying(CSM)),
6324 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
6326 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
6327 Comparison(llvm::to_underlying(Comp)) {}
6328
6329 bool isSpecialMember() const {
6330 return static_cast<CXXSpecialMemberKind>(SpecialMember) !=
6331 CXXSpecialMemberKind::Invalid;
6332 }
6333 bool isComparison() const {
6334 return static_cast<DefaultedComparisonKind>(Comparison) !=
6335 DefaultedComparisonKind::None;
6336 }
6337
6338 explicit operator bool() const {
6339 return isSpecialMember() || isComparison();
6340 }
6341
6343 return static_cast<CXXSpecialMemberKind>(SpecialMember);
6344 }
6346 return static_cast<DefaultedComparisonKind>(Comparison);
6347 }
6348
6349 /// Get the index of this function kind for use in diagnostics.
6350 unsigned getDiagnosticIndex() const {
6351 static_assert(llvm::to_underlying(CXXSpecialMemberKind::Invalid) >
6352 llvm::to_underlying(CXXSpecialMemberKind::Destructor),
6353 "invalid should have highest index");
6354 static_assert((unsigned)DefaultedComparisonKind::None == 0,
6355 "none should be equal to zero");
6356 return SpecialMember + Comparison;
6357 }
6358 };
6359
6360 /// Determine the kind of defaulting that would be done for a given function.
6361 ///
6362 /// If the function is both a default constructor and a copy / move
6363 /// constructor (due to having a default argument for the first parameter),
6364 /// this picks CXXSpecialMemberKind::DefaultConstructor.
6365 ///
6366 /// FIXME: Check that case is properly handled by all callers.
6367 DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD);
6368
6369 /// Handle a C++11 empty-declaration and attribute-declaration.
6371 SourceLocation SemiLoc);
6372
6374 /// Diagnose issues that are non-constant or that are extensions.
6375 Diagnose,
6376 /// Identify whether this function satisfies the formal rules for constexpr
6377 /// functions in the current lanugage mode (with no extensions).
6379 };
6380
6381 // Check whether a function declaration satisfies the requirements of a
6382 // constexpr function definition or a constexpr constructor definition. If so,
6383 // return true. If not, produce appropriate diagnostics (unless asked not to
6384 // by Kind) and return false.
6385 //
6386 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
6389
6390 /// Diagnose methods which overload virtual methods in a base class
6391 /// without overriding any.
6393
6394 /// Check if a method overloads virtual methods in a base class without
6395 /// overriding any.
6396 void
6398 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6399 void
6401 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
6402
6403 /// ActOnParamDefaultArgument - Check whether the default argument
6404 /// provided for a function parameter is well-formed. If so, attach it
6405 /// to the parameter declaration.
6406 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
6407 Expr *defarg);
6408
6409 /// ActOnParamUnparsedDefaultArgument - We've seen a default
6410 /// argument for a function parameter, but we can't parse it yet
6411 /// because we're inside a class definition. Note that this default
6412 /// argument will be parsed later.
6414 SourceLocation ArgLoc);
6415
6416 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
6417 /// the default argument for the parameter param failed.
6419 Expr *DefaultArg);
6421 SourceLocation EqualLoc);
6422 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6423 SourceLocation EqualLoc);
6424
6425 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6426 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6427 StringLiteral *Message = nullptr);
6428 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6429
6431 StringLiteral *DeletedMessage = nullptr);
6435
6436 NamedDecl *
6438 MultiTemplateParamsArg TemplateParamLists);
6441 RecordDecl *ClassDecl,
6442 const IdentifierInfo *Name);
6443
6447
6448 /// Stack containing information needed when in C++2a an 'auto' is encountered
6449 /// in a function declaration parameter type specifier in order to invent a
6450 /// corresponding template parameter in the enclosing abbreviated function
6451 /// template. This information is also present in LambdaScopeInfo, stored in
6452 /// the FunctionScopes stack.
6454
6455 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6456 std::unique_ptr<CXXFieldCollector> FieldCollector;
6457
6459 /// Set containing all declared private fields that are not used.
6461
6463
6464 /// PureVirtualClassDiagSet - a set of class declarations which we have
6465 /// emitted a list of pure virtual functions. Used to prevent emitting the
6466 /// same list more than once.
6467 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6468
6472
6473 /// All the delegating constructors seen so far in the file, used for
6474 /// cycle detection at the end of the TU.
6476
6477 /// The C++ "std" namespace, where the standard library resides.
6479
6480 /// The C++ "std::initializer_list" template, which is defined in
6481 /// <initializer_list>.
6483
6484 /// The C++ "std::type_identity" template, which is defined in
6485 /// <type_traits>.
6487
6488 // Contains the locations of the beginning of unparsed default
6489 // argument locations.
6490 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6491
6492 /// UndefinedInternals - all the used, undefined objects which require a
6493 /// definition in this translation unit.
6494 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6495
6496 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6498
6499 /// The C++ special members which we are currently in the process of
6500 /// declaring. If this process recursively triggers the declaration of the
6501 /// same special member, we should act as if it is not yet declared.
6503
6505
6506 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6507
6510 ParsingClassDepth++;
6512 }
6514 ParsingClassDepth--;
6516 }
6517
6519 CXXScopeSpec &SS,
6520 ParsedType TemplateTypeTy,
6521 IdentifierInfo *MemberOrBase);
6522
6523private:
6524 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6525 QualType ResultTy,
6526 ArrayRef<QualType> Args);
6527 // Helper for ActOnFields to check for all function pointer members.
6528 bool EntirelyFunctionPointers(const RecordDecl *Record);
6529
6530 // A cache representing if we've fully checked the various comparison category
6531 // types stored in ASTContext. The bit-index corresponds to the integer value
6532 // of a ComparisonCategoryType enumerator.
6533 llvm::SmallBitVector FullyCheckedComparisonCategories;
6534
6535 /// Check if there is a field shadowing.
6536 void CheckShadowInheritedFields(const SourceLocation &Loc,
6537 DeclarationName FieldName,
6538 const CXXRecordDecl *RD,
6539 bool DeclIsField = true);
6540
6541 ///@}
6542
6543 //
6544 //
6545 // -------------------------------------------------------------------------
6546 //
6547 //
6548
6549 /// \name C++ Exception Specifications
6550 /// Implementations are in SemaExceptionSpec.cpp
6551 ///@{
6552
6553public:
6554 /// All the overriding functions seen during a class definition
6555 /// that had their exception spec checks delayed, plus the overridden
6556 /// function.
6559
6560 /// All the function redeclarations seen during a class definition that had
6561 /// their exception spec checks delayed, plus the prior declaration they
6562 /// should be checked against. Except during error recovery, the new decl
6563 /// should always be a friend declaration, as that's the only valid way to
6564 /// redeclare a special member before its class is complete.
6567
6568 /// Determine if we're in a case where we need to (incorrectly) eagerly
6569 /// parse an exception specification to work around a libstdc++ bug.
6571
6572 /// Check the given noexcept-specifier, convert its expression, and compute
6573 /// the appropriate ExceptionSpecificationType.
6574 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6576
6577 CanThrowResult canThrow(const Stmt *E);
6578 /// Determine whether the callee of a particular function call can throw.
6579 /// E, D and Loc are all optional.
6580 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6583 const FunctionProtoType *FPT);
6586
6587 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6588 /// exception specification. Incomplete types, or pointers to incomplete types
6589 /// other than void are not allowed.
6590 ///
6591 /// \param[in,out] T The exception type. This will be decayed to a pointer
6592 /// type
6593 /// when the input is an array or a function type.
6595
6596 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6597 /// pointer to member to a function with an exception specification. This
6598 /// means that it is invalid to add another level of indirection.
6601
6602 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6603 /// exception specifications. Exception specifications are equivalent if
6604 /// they allow exactly the same set of exception types. It does not matter how
6605 /// that is achieved. See C++ [except.spec]p2.
6607 SourceLocation OldLoc,
6608 const FunctionProtoType *New,
6609 SourceLocation NewLoc);
6611 const PartialDiagnostic &NoteID,
6612 const FunctionProtoType *Old,
6613 SourceLocation OldLoc,
6614 const FunctionProtoType *New,
6615 SourceLocation NewLoc);
6616 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6617
6618 /// CheckExceptionSpecSubset - Check whether the second function type's
6619 /// exception specification is a subset (or equivalent) of the first function
6620 /// type. This is used by override and pointer assignment checks.
6622 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6623 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6624 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6625 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6626 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6627
6628 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6629 /// two functions have equivalent exception specs. This is part of the
6630 /// assignment and override compatibility check. We do not check the
6631 /// parameters of parameter function pointers recursively, as no sane
6632 /// programmer would even be able to write such a function type.
6634 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6635 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6636 SourceLocation TargetLoc, const FunctionProtoType *Source,
6637 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6638
6639 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6640
6641 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6642 /// spec is a subset of base spec.
6644 const CXXMethodDecl *Old);
6645
6646 ///@}
6647
6648 //
6649 //
6650 // -------------------------------------------------------------------------
6651 //
6652 //
6653
6654 /// \name Expressions
6655 /// Implementations are in SemaExpr.cpp
6656 ///@{
6657
6658public:
6659 /// Describes how the expressions currently being parsed are
6660 /// evaluated at run-time, if at all.
6662 /// The current expression and its subexpressions occur within an
6663 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6664 /// \c sizeof, where the type of the expression may be significant but
6665 /// no code will be generated to evaluate the value of the expression at
6666 /// run time.
6668
6669 /// The current expression occurs within a braced-init-list within
6670 /// an unevaluated operand. This is mostly like a regular unevaluated
6671 /// context, except that we still instantiate constexpr functions that are
6672 /// referenced here so that we can perform narrowing checks correctly.
6674
6675 /// The current expression occurs within a discarded statement.
6676 /// This behaves largely similarly to an unevaluated operand in preventing
6677 /// definitions from being required, but not in other ways.
6679
6680 /// The current expression occurs within an unevaluated
6681 /// operand that unconditionally permits abstract references to
6682 /// fields, such as a SIZE operator in MS-style inline assembly.
6684
6685 /// The current context is "potentially evaluated" in C++11 terms,
6686 /// but the expression is evaluated at compile-time (like the values of
6687 /// cases in a switch statement).
6689
6690 /// In addition of being constant evaluated, the current expression
6691 /// occurs in an immediate function context - either a consteval function
6692 /// or a consteval if statement.
6694
6695 /// The current expression is potentially evaluated at run time,
6696 /// which means that code may be generated to evaluate the value of the
6697 /// expression at run time.
6699
6700 /// The current expression is potentially evaluated, but any
6701 /// declarations referenced inside that expression are only used if
6702 /// in fact the current expression is used.
6703 ///
6704 /// This value is used when parsing default function arguments, for which
6705 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6706 /// through varargs) but do not want to mark declarations as "referenced"
6707 /// until the default argument is used.
6709 };
6710
6711 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6712 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6713 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6714 /// have been applied to all subexpressions of the enclosing full expression.
6715 /// This is cleared at the end of each full expression.
6718
6719 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6720
6721 /// Data structure used to record current or nested
6722 /// expression evaluation contexts.
6724 /// The expression evaluation context.
6726
6727 /// Whether the enclosing context needed a cleanup.
6729
6730 /// The number of active cleanup objects when we entered
6731 /// this expression evaluation context.
6733
6735
6736 /// The lambdas that are present within this context, if it
6737 /// is indeed an unevaluated context.
6739
6740 /// The declaration that provides context for lambda expressions
6741 /// and block literals if the normal declaration context does not
6742 /// suffice, e.g., in a default function argument.
6744
6745 /// If we are processing a decltype type, a set of call expressions
6746 /// for which we have deferred checking the completeness of the return type.
6748
6749 /// If we are processing a decltype type, a set of temporary binding
6750 /// expressions for which we have deferred checking the destructor.
6752
6754
6755 /// Expressions appearing as the LHS of a volatile assignment in this
6756 /// context. We produce a warning for these when popping the context if
6757 /// they are not discarded-value expressions nor unevaluated operands.
6759
6760 /// Set of candidates for starting an immediate invocation.
6763
6764 /// Set of DeclRefExprs referencing a consteval function when used in a
6765 /// context not already known to be immediately invoked.
6767
6768 /// P2718R0 - Lifetime extension in range-based for loops.
6769 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6770 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6771 /// InLifetimeExtendingContext is true.
6773
6774 /// Small set of gathered accesses to potentially misaligned members
6775 /// due to the packed attribute.
6777
6778 /// \brief Describes whether we are in an expression constext which we have
6779 /// to handle differently.
6785 EK_Other
6786 } ExprContext;
6787
6788 // A context can be nested in both a discarded statement context and
6789 // an immediate function context, so they need to be tracked independently.
6793
6794 bool IsCurrentlyCheckingDefaultArgumentOrInitializer = false;
6795
6796 // We are in a constant context, but we also allow
6797 // non constant expressions, for example for array bounds (which may be
6798 // VLAs).
6799 bool InConditionallyConstantEvaluateContext = false;
6800
6801 /// Whether we are currently in a context in which all temporaries must be
6802 /// lifetime-extended, even if they're not bound to a reference (for
6803 /// example, in a for-range initializer).
6804 bool InLifetimeExtendingContext = false;
6805
6806 /// Whether evaluating an expression for a switch case label.
6807 bool IsCaseExpr = false;
6808
6809 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6810 bool RebuildDefaultArgOrDefaultInit = false;
6811
6812 // When evaluating immediate functions in the initializer of a default
6813 // argument or default member initializer, this is the declaration whose
6814 // default initializer is being evaluated and the location of the call
6815 // or constructor definition.
6818 DeclContext *Context)
6819 : Loc(Loc), Decl(Decl), Context(Context) {
6820 assert(Decl && Context && "invalid initialization context");
6821 }
6822
6824 ValueDecl *Decl = nullptr;
6825 DeclContext *Context = nullptr;
6826 };
6827 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6828
6830 unsigned NumCleanupObjects,
6831 CleanupInfo ParentCleanup,
6832 Decl *ManglingContextDecl,
6833 ExpressionKind ExprContext)
6834 : Context(Context), ParentCleanup(ParentCleanup),
6835 NumCleanupObjects(NumCleanupObjects),
6836 ManglingContextDecl(ManglingContextDecl), ExprContext(ExprContext),
6837 InDiscardedStatement(false), InImmediateFunctionContext(false),
6838 InImmediateEscalatingFunctionContext(false) {}
6839
6840 bool isUnevaluated() const {
6841 return Context == ExpressionEvaluationContext::Unevaluated ||
6842 Context == ExpressionEvaluationContext::UnevaluatedAbstract ||
6843 Context == ExpressionEvaluationContext::UnevaluatedList;
6844 }
6845
6847 return Context == ExpressionEvaluationContext::PotentiallyEvaluated ||
6848 Context ==
6849 ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed ||
6850 Context == ExpressionEvaluationContext::ConstantEvaluated;
6851 }
6852
6853 bool isConstantEvaluated() const {
6854 return Context == ExpressionEvaluationContext::ConstantEvaluated ||
6855 Context == ExpressionEvaluationContext::ImmediateFunctionContext;
6856 }
6857
6859 return Context == ExpressionEvaluationContext::ImmediateFunctionContext ||
6860 (Context == ExpressionEvaluationContext::DiscardedStatement &&
6861 InImmediateFunctionContext) ||
6862 // C++23 [expr.const]p14:
6863 // An expression or conversion is in an immediate function
6864 // context if it is potentially evaluated and either:
6865 // * its innermost enclosing non-block scope is a function
6866 // parameter scope of an immediate function, or
6867 // * its enclosing statement is enclosed by the compound-
6868 // statement of a consteval if statement.
6869 (Context == ExpressionEvaluationContext::PotentiallyEvaluated &&
6870 InImmediateFunctionContext);
6871 }
6872
6874 return Context == ExpressionEvaluationContext::DiscardedStatement ||
6875 ((Context ==
6876 ExpressionEvaluationContext::ImmediateFunctionContext ||
6877 isPotentiallyEvaluated()) &&
6878 InDiscardedStatement);
6879 }
6880 };
6881
6883 assert(!ExprEvalContexts.empty() &&
6884 "Must be in an expression evaluation context");
6885 return ExprEvalContexts.back();
6886 }
6887
6889 assert(!ExprEvalContexts.empty() &&
6890 "Must be in an expression evaluation context");
6891 return ExprEvalContexts.back();
6892 }
6893
6895 assert(ExprEvalContexts.size() >= 2 &&
6896 "Must be in an expression evaluation context");
6897 return ExprEvalContexts[ExprEvalContexts.size() - 2];
6898 }
6899
6901 return const_cast<Sema *>(this)->parentEvaluationContext();
6902 }
6903
6904 bool isAttrContext() const {
6905 return ExprEvalContexts.back().ExprContext ==
6907 }
6908
6909 /// Increment when we find a reference; decrement when we find an ignored
6910 /// assignment. Ultimately the value is 0 if every reference is an ignored
6911 /// assignment.
6912 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
6913
6914 /// Used to control the generation of ExprWithCleanups.
6916
6917 /// ExprCleanupObjects - This is the stack of objects requiring
6918 /// cleanup that are created by the current full expression.
6920
6921 /// Determine whether the use of this declaration is valid, without
6922 /// emitting diagnostics.
6923 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
6924 // A version of DiagnoseUseOfDecl that should be used if overload resolution
6925 // has been used to find this declaration, which means we don't have to bother
6926 // checking the trailing requires clause.
6928 return DiagnoseUseOfDecl(
6929 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
6930 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
6931 /*SkipTrailingRequiresClause=*/true);
6932 }
6933
6934 /// Determine whether the use of this declaration is valid, and
6935 /// emit any corresponding diagnostics.
6936 ///
6937 /// This routine diagnoses various problems with referencing
6938 /// declarations that can occur when using a declaration. For example,
6939 /// it might warn if a deprecated or unavailable declaration is being
6940 /// used, or produce an error (and return true) if a C++0x deleted
6941 /// function is being used.
6942 ///
6943 /// \returns true if there was an error (this declaration cannot be
6944 /// referenced), false otherwise.
6946 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
6947 bool ObjCPropertyAccess = false,
6948 bool AvoidPartialAvailabilityChecks = false,
6949 ObjCInterfaceDecl *ClassReciever = nullptr,
6950 bool SkipTrailingRequiresClause = false);
6951
6952 /// Emit a note explaining that this function is deleted.
6954
6955 /// DiagnoseSentinelCalls - This routine checks whether a call or
6956 /// message-send is to a declaration with the sentinel attribute, and
6957 /// if so, it checks that the requirements of the sentinel are
6958 /// satisfied.
6960 ArrayRef<Expr *> Args);
6961
6963 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
6966
6969
6976
6978
6982
6983 /// Check whether E, which is either a discarded-value expression or an
6984 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
6985 /// lvalue, and if so, remove it from the list of volatile-qualified
6986 /// assignments that we are going to warn are deprecated.
6988
6990
6991 // Functions for marking a declaration referenced. These functions also
6992 // contain the relevant logic for marking if a reference to a function or
6993 // variable is an odr-use (in the C++11 sense). There are separate variants
6994 // for expressions referring to a decl; these exist because odr-use marking
6995 // needs to be delayed for some constant variables when we build one of the
6996 // named expressions.
6997 //
6998 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
6999 // should usually be true. This only needs to be set to false if the lack of
7000 // odr-use cannot be determined from the current context (for instance,
7001 // because the name denotes a virtual function and was written without an
7002 // explicit nested-name-specifier).
7003 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
7004
7005 /// Mark a function referenced, and check whether it is odr-used
7006 /// (C++ [basic.def.odr]p2, C99 6.9p3)
7008 bool MightBeOdrUse = true);
7009
7010 /// Mark a variable referenced, and check whether it is odr-used
7011 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
7012 /// used directly for normal expressions referring to VarDecl.
7014
7015 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
7016 ///
7017 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
7018 /// be handled with care if the DeclRefExpr is not newly-created.
7019 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
7020
7021 /// Perform reference-marking and odr-use handling for a MemberExpr.
7023
7024 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
7027 unsigned CapturingScopeIndex);
7028
7030 void CleanupVarDeclMarking();
7031
7032 /// Try to capture the given variable.
7033 ///
7034 /// \param Var The variable to capture.
7035 ///
7036 /// \param Loc The location at which the capture occurs.
7037 ///
7038 /// \param Kind The kind of capture, which may be implicit (for either a
7039 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
7040 ///
7041 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
7042 /// an explicit lambda capture.
7043 ///
7044 /// \param BuildAndDiagnose Whether we are actually supposed to add the
7045 /// captures or diagnose errors. If false, this routine merely check whether
7046 /// the capture can occur without performing the capture itself or complaining
7047 /// if the variable cannot be captured.
7048 ///
7049 /// \param CaptureType Will be set to the type of the field used to capture
7050 /// this variable in the innermost block or lambda. Only valid when the
7051 /// variable can be captured.
7052 ///
7053 /// \param DeclRefType Will be set to the type of a reference to the capture
7054 /// from within the current scope. Only valid when the variable can be
7055 /// captured.
7056 ///
7057 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
7058 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
7059 /// This is useful when enclosing lambdas must speculatively capture
7060 /// variables that may or may not be used in certain specializations of
7061 /// a nested generic lambda.
7062 ///
7063 /// \returns true if an error occurred (i.e., the variable cannot be
7064 /// captured) and false if the capture succeeded.
7066 TryCaptureKind Kind, SourceLocation EllipsisLoc,
7067 bool BuildAndDiagnose, QualType &CaptureType,
7068 QualType &DeclRefType,
7069 const unsigned *const FunctionScopeIndexToStopAt);
7070
7071 /// Try to capture the given variable.
7074 SourceLocation EllipsisLoc = SourceLocation());
7075
7076 /// Checks if the variable must be captured.
7078
7079 /// Given a variable, determine the type that a reference to that
7080 /// variable will have in the given scope.
7082
7083 /// Mark all of the declarations referenced within a particular AST node as
7084 /// referenced. Used when template instantiation instantiates a non-dependent
7085 /// type -- entities referenced by the type are now referenced.
7087
7088 /// Mark any declarations that appear within this expression or any
7089 /// potentially-evaluated subexpressions as "referenced".
7090 ///
7091 /// \param SkipLocalVariables If true, don't mark local variables as
7092 /// 'referenced'.
7093 /// \param StopAt Subexpressions that we shouldn't recurse into.
7095 bool SkipLocalVariables = false,
7096 ArrayRef<const Expr *> StopAt = {});
7097
7098 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
7099 /// conversion.
7100 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
7101
7102 /// Conditionally issue a diagnostic based on the statements's reachability
7103 /// analysis.
7104 ///
7105 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
7106 /// the function body is parsed, and then do a basic reachability analysis to
7107 /// determine if the statement is reachable. If it is unreachable, the
7108 /// diagnostic will not be emitted.
7109 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7110 const PartialDiagnostic &PD);
7111
7112 /// Conditionally issue a diagnostic based on the current
7113 /// evaluation context.
7114 ///
7115 /// \param Statement If Statement is non-null, delay reporting the
7116 /// diagnostic until the function body is parsed, and then do a basic
7117 /// reachability analysis to determine if the statement is reachable.
7118 /// If it is unreachable, the diagnostic will not be emitted.
7119 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
7120 const PartialDiagnostic &PD);
7121 /// Similar, but diagnostic is only produced if all the specified statements
7122 /// are reachable.
7123 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
7124 const PartialDiagnostic &PD);
7125
7126 // Primary Expressions.
7127 SourceRange getExprRange(Expr *E) const;
7128
7129 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
7130 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
7131 bool HasTrailingLParen, bool IsAddressOfOperand,
7132 CorrectionCandidateCallback *CCC = nullptr,
7133 bool IsInlineAsmIdentifier = false,
7134 Token *KeywordReplacement = nullptr);
7135
7136 /// Decomposes the given name into a DeclarationNameInfo, its location, and
7137 /// possibly a list of template arguments.
7138 ///
7139 /// If this produces template arguments, it is permitted to call
7140 /// DecomposeTemplateName.
7141 ///
7142 /// This actually loses a lot of source location information for
7143 /// non-standard name kinds; we should consider preserving that in
7144 /// some way.
7145 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
7146 TemplateArgumentListInfo &Buffer,
7147 DeclarationNameInfo &NameInfo,
7148 const TemplateArgumentListInfo *&TemplateArgs);
7149
7150 /// Diagnose a lookup that found results in an enclosing class during error
7151 /// recovery. This usually indicates that the results were found in a
7152 /// dependent base class that could not be searched as part of a template
7153 /// definition. Always issues a diagnostic (though this may be only a warning
7154 /// in MS compatibility mode).
7155 ///
7156 /// Return \c true if the error is unrecoverable, or \c false if the caller
7157 /// should attempt to recover using these lookup results.
7158 bool DiagnoseDependentMemberLookup(const LookupResult &R);
7159
7160 /// Diagnose an empty lookup.
7161 ///
7162 /// \return false if new lookup candidates were found
7163 bool
7164 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
7165 CorrectionCandidateCallback &CCC,
7166 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
7167 ArrayRef<Expr *> Args = {},
7168 DeclContext *LookupCtx = nullptr);
7169
7170 /// If \p D cannot be odr-used in the current expression evaluation context,
7171 /// return a reason explaining why. Otherwise, return NOUR_None.
7173
7174 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7175 SourceLocation Loc,
7176 const CXXScopeSpec *SS = nullptr);
7177 DeclRefExpr *
7178 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7179 const DeclarationNameInfo &NameInfo,
7180 const CXXScopeSpec *SS = nullptr,
7181 NamedDecl *FoundD = nullptr,
7182 SourceLocation TemplateKWLoc = SourceLocation(),
7183 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7184
7185 /// BuildDeclRefExpr - Build an expression that references a
7186 /// declaration that does not require a closure capture.
7187 DeclRefExpr *
7188 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
7189 const DeclarationNameInfo &NameInfo,
7190 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
7191 SourceLocation TemplateKWLoc = SourceLocation(),
7192 const TemplateArgumentListInfo *TemplateArgs = nullptr);
7193
7194 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
7195 bool HasTrailingLParen);
7196
7197 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
7198 /// declaration name, generally during template instantiation.
7199 /// There's a large number of things which don't need to be done along
7200 /// this path.
7202 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
7203 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
7204
7205 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
7206 bool NeedsADL,
7207 bool AcceptInvalidDecl = false);
7208
7209 /// Complete semantic analysis for a reference to the given declaration.
7211 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
7212 NamedDecl *FoundD = nullptr,
7213 const TemplateArgumentListInfo *TemplateArgs = nullptr,
7214 bool AcceptInvalidDecl = false);
7215
7216 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
7217 // where Tokens representing function local predefined macros (such as
7218 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
7219 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
7220
7223 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
7224
7225 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
7226
7227 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
7228 ExprResult ActOnCharacterConstant(const Token &Tok,
7229 Scope *UDLScope = nullptr);
7230 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
7231 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
7232 MultiExprArg Val);
7233 ExprResult ActOnCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
7234 unsigned NumUserSpecifiedExprs,
7235 SourceLocation InitLoc,
7236 SourceLocation LParenLoc,
7237 SourceLocation RParenLoc);
7238
7239 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
7240 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
7241 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
7242 /// from multiple tokens. However, the common case is that StringToks points
7243 /// to one string.
7244 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
7245 Scope *UDLScope = nullptr);
7246
7247 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
7248
7249 /// ControllingExprOrType is either an opaque pointer coming out of a
7250 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
7251 /// into two so we don't take a void *, but that's awkward because one of
7252 /// the operands is either a ParsedType or an Expr *, which doesn't lend
7253 /// itself to generic code very well.
7254 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
7255 SourceLocation DefaultLoc,
7256 SourceLocation RParenLoc,
7257 bool PredicateIsExpr,
7258 void *ControllingExprOrType,
7259 ArrayRef<ParsedType> ArgTypes,
7260 ArrayRef<Expr *> ArgExprs);
7261 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
7262 /// it'd be better to split this interface into two so we don't take a
7263 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
7264 /// isn't a trivial change.
7265 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
7266 SourceLocation DefaultLoc,
7267 SourceLocation RParenLoc,
7268 bool PredicateIsExpr,
7269 void *ControllingExprOrType,
7270 ArrayRef<TypeSourceInfo *> Types,
7271 ArrayRef<Expr *> Exprs);
7272
7273 // Binary/Unary Operators. 'Tok' is the token for the operator.
7274 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
7275 Expr *InputExpr, bool IsAfterAmp = false);
7276 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
7277 Expr *Input, bool IsAfterAmp = false);
7278
7279 /// Unary Operators. 'Tok' is the token for the operator.
7280 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
7281 Expr *Input, bool IsAfterAmp = false);
7282
7283 /// Determine whether the given expression is a qualified member
7284 /// access expression, of a form that could be turned into a pointer to member
7285 /// with the address-of operator.
7286 bool isQualifiedMemberAccess(Expr *E);
7287 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
7288 const Expr *Op,
7289 const CXXMethodDecl *MD);
7290
7291 /// CheckAddressOfOperand - The operand of & must be either a function
7292 /// designator or an lvalue designating an object. If it is an lvalue, the
7293 /// object cannot be declared with storage class register or be a bit field.
7294 /// Note: The usual conversions are *not* applied to the operand of the &
7295 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
7296 /// In C++, the operand might be an overloaded function name, in which case
7297 /// we allow the '&' but retain the overloaded-function type.
7298 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
7299
7300 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
7301 /// _Alignas(type-name) .
7302 /// [dcl.align] An alignment-specifier of the form
7303 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
7304 ///
7305 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
7306 /// _Alignas(_Alignof(type-name)).
7307 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
7308 SourceLocation OpLoc, SourceRange R);
7309 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
7310 SourceLocation OpLoc, SourceRange R);
7311
7312 /// Build a sizeof or alignof expression given a type operand.
7313 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
7314 SourceLocation OpLoc,
7315 UnaryExprOrTypeTrait ExprKind,
7316 SourceRange R);
7317
7318 /// Build a sizeof or alignof expression given an expression
7319 /// operand.
7320 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
7321 UnaryExprOrTypeTrait ExprKind);
7322
7323 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
7324 /// expr and the same for @c alignof and @c __alignof
7325 /// Note that the ArgRange is invalid if isType is false.
7326 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
7327 UnaryExprOrTypeTrait ExprKind,
7328 bool IsType, void *TyOrEx,
7329 SourceRange ArgRange);
7330
7331 /// Check for operands with placeholder types and complain if found.
7332 /// Returns ExprError() if there was an error and no recovery was possible.
7334 bool CheckVecStepExpr(Expr *E);
7335
7336 /// Check the constraints on expression operands to unary type expression
7337 /// and type traits.
7338 ///
7339 /// Completes any types necessary and validates the constraints on the operand
7340 /// expression. The logic mostly mirrors the type-based overload, but may
7341 /// modify the expression as it completes the type for that expression through
7342 /// template instantiation, etc.
7344
7345 /// Check the constraints on operands to unary expression and type
7346 /// traits.
7347 ///
7348 /// This will complete any types necessary, and validate the various
7349 /// constraints on those operands.
7350 ///
7351 /// The UsualUnaryConversions() function is *not* called by this routine.
7352 /// C99 6.3.2.1p[2-4] all state:
7353 /// Except when it is the operand of the sizeof operator ...
7354 ///
7355 /// C++ [expr.sizeof]p4
7356 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
7357 /// standard conversions are not applied to the operand of sizeof.
7358 ///
7359 /// This policy is followed for all of the unary trait expressions.
7360 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
7361 SourceRange ExprRange,
7362 UnaryExprOrTypeTrait ExprKind,
7363 StringRef KWName);
7364
7365 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
7366 tok::TokenKind Kind, Expr *Input);
7367
7368 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
7369 MultiExprArg ArgExprs,
7370 SourceLocation RLoc);
7371 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
7372 Expr *Idx, SourceLocation RLoc);
7373
7375 Expr *ColumnIdx,
7376 SourceLocation RBLoc);
7377
7378 /// ConvertArgumentsForCall - Converts the arguments specified in
7379 /// Args/NumArgs to the parameter types of the function FDecl with
7380 /// function prototype Proto. Call is the call expression itself, and
7381 /// Fn is the function expression. For a C++ member function, this
7382 /// routine does not attempt to convert the object argument. Returns
7383 /// true if the call is ill-formed.
7384 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
7385 const FunctionProtoType *Proto,
7386 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
7387 bool ExecConfig = false);
7388
7389 /// CheckStaticArrayArgument - If the given argument corresponds to a static
7390 /// array parameter, check that it is non-null, and that if it is formed by
7391 /// array-to-pointer decay, the underlying array is sufficiently large.
7392 ///
7393 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
7394 /// the array type derivation, then for each call to the function, the value
7395 /// of the corresponding actual argument shall provide access to the first
7396 /// element of an array with at least as many elements as specified by the
7397 /// size expression.
7398 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
7399 const Expr *ArgExpr);
7400
7401 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
7402 /// This provides the location of the left/right parens and a list of comma
7403 /// locations.
7404 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7405 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7406 Expr *ExecConfig = nullptr);
7407
7408 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
7409 /// This provides the location of the left/right parens and a list of comma
7410 /// locations.
7411 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
7412 MultiExprArg ArgExprs, SourceLocation RParenLoc,
7413 Expr *ExecConfig = nullptr,
7414 bool IsExecConfig = false,
7415 bool AllowRecovery = false);
7416
7417 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
7418 // with the specified CallArgs
7419 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
7420 MultiExprArg CallArgs);
7421
7423
7424 /// BuildResolvedCallExpr - Build a call to a resolved expression,
7425 /// i.e. an expression not of \p OverloadTy. The expression should
7426 /// unary-convert to an expression of function-pointer or
7427 /// block-pointer type.
7428 ///
7429 /// \param NDecl the declaration being called, if available
7431 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
7432 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
7433 Expr *Config = nullptr, bool IsExecConfig = false,
7434 ADLCallKind UsesADL = ADLCallKind::NotADL);
7435
7437 ParsedType &Ty, SourceLocation RParenLoc,
7438 Expr *CastExpr);
7439
7440 /// Prepares for a scalar cast, performing all the necessary stages
7441 /// except the final cast and returning the kind required.
7443
7444 /// Build an altivec or OpenCL literal.
7446 SourceLocation RParenLoc, Expr *E,
7447 TypeSourceInfo *TInfo);
7448
7449 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7450 /// the ParenListExpr into a sequence of comma binary operators.
7452
7454 SourceLocation RParenLoc, Expr *InitExpr);
7455
7457 TypeSourceInfo *TInfo,
7458 SourceLocation RParenLoc,
7459 Expr *LiteralExpr);
7460
7461 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7462 SourceLocation RBraceLoc);
7463
7464 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7465 SourceLocation RBraceLoc);
7466
7467 /// Binary Operators. 'Tok' is the token for the operator.
7469 Expr *LHSExpr, Expr *RHSExpr);
7471 Expr *LHSExpr, Expr *RHSExpr,
7472 bool ForFoldExpression = false);
7473
7474 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7475 /// operator @p Opc at location @c TokLoc. This routine only supports
7476 /// built-in operations; ActOnBinOp handles overloaded operators.
7478 Expr *LHSExpr, Expr *RHSExpr,
7479 bool ForFoldExpression = false);
7481 UnresolvedSetImpl &Functions);
7482
7483 /// Look for instances where it is likely the comma operator is confused with
7484 /// another operator. There is an explicit list of acceptable expressions for
7485 /// the left hand side of the comma operator, otherwise emit a warning.
7486 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7487
7488 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7489 /// in the case of a the GNU conditional expr extension.
7491 SourceLocation ColonLoc, Expr *CondExpr,
7492 Expr *LHSExpr, Expr *RHSExpr);
7493
7494 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7496 LabelDecl *TheDecl);
7497
7498 void ActOnStartStmtExpr();
7499 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7500 SourceLocation RPLoc);
7502 SourceLocation RPLoc, unsigned TemplateDepth);
7503 // Handle the final expression in a statement expression.
7505 void ActOnStmtExprError();
7506
7507 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
7510 bool isBrackets; // true if [expr], false if .ident
7511 union {
7514 } U;
7515 };
7516
7517 /// __builtin_offsetof(type, a.b[123][456].c)
7519 TypeSourceInfo *TInfo,
7520 ArrayRef<OffsetOfComponent> Components,
7521 SourceLocation RParenLoc);
7524 ParsedType ParsedArgTy,
7525 ArrayRef<OffsetOfComponent> Components,
7526 SourceLocation RParenLoc);
7527
7528 // __builtin_choose_expr(constExpr, expr1, expr2)
7529 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7530 Expr *LHSExpr, Expr *RHSExpr,
7531 SourceLocation RPLoc);
7532
7533 // __builtin_va_arg(expr, type)
7535 SourceLocation RPLoc);
7537 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7538
7539 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7540 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7542 SourceLocation BuiltinLoc,
7543 SourceLocation RPLoc);
7544
7545 // #embed
7547 StringLiteral *BinaryData, StringRef FileName);
7548
7549 // Build a potentially resolved SourceLocExpr.
7551 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7552 DeclContext *ParentContext);
7553
7554 // __null
7556
7557 bool CheckCaseExpression(Expr *E);
7558
7559 //===------------------------- "Block" Extension ------------------------===//
7560
7561 /// ActOnBlockStart - This callback is invoked when a block literal is
7562 /// started.
7563 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7564
7565 /// ActOnBlockArguments - This callback allows processing of block arguments.
7566 /// If there are no arguments, this is still invoked.
7567 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7568 Scope *CurScope);
7569
7570 /// ActOnBlockError - If there is an error parsing a block, this callback
7571 /// is invoked to pop the information about the block from the action impl.
7572 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7573
7574 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7575 /// literal was successfully completed. ^(int x){...}
7577 Scope *CurScope);
7578
7579 //===---------------------------- Clang Extensions ----------------------===//
7580
7581 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7582 /// provided arguments.
7583 ///
7584 /// __builtin_convertvector( value, dst type )
7585 ///
7587 SourceLocation BuiltinLoc,
7588 SourceLocation RParenLoc);
7589
7590 //===---------------------------- OpenCL Features -----------------------===//
7591
7592 /// Parse a __builtin_astype expression.
7593 ///
7594 /// __builtin_astype( value, dst type )
7595 ///
7597 SourceLocation BuiltinLoc,
7598 SourceLocation RParenLoc);
7599
7600 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7602 SourceLocation BuiltinLoc,
7603 SourceLocation RParenLoc);
7604
7605 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7607 ArrayRef<Expr *> SubExprs,
7608 QualType T = QualType());
7609
7610 /// Cast a base object to a member's actual type.
7611 ///
7612 /// There are two relevant checks:
7613 ///
7614 /// C++ [class.access.base]p7:
7615 ///
7616 /// If a class member access operator [...] is used to access a non-static
7617 /// data member or non-static member function, the reference is ill-formed
7618 /// if the left operand [...] cannot be implicitly converted to a pointer to
7619 /// the naming class of the right operand.
7620 ///
7621 /// C++ [expr.ref]p7:
7622 ///
7623 /// If E2 is a non-static data member or a non-static member function, the
7624 /// program is ill-formed if the class of which E2 is directly a member is
7625 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7626 ///
7627 /// Note that the latter check does not consider access; the access of the
7628 /// "real" base class is checked as appropriate when checking the access of
7629 /// the member name.
7631 NestedNameSpecifier Qualifier,
7632 NamedDecl *FoundDecl,
7633 NamedDecl *Member);
7634
7635 /// CheckCallReturnType - Checks that a call expression's return type is
7636 /// complete. Returns true on failure. The location passed in is the location
7637 /// that best represents the call.
7639 CallExpr *CE, FunctionDecl *FD);
7640
7641 /// Emit a warning for all pending noderef expressions that we recorded.
7642 void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec);
7643
7645
7646 /// Instantiate or parse a C++ default argument expression as necessary.
7647 /// Return true on error.
7649 ParmVarDecl *Param, Expr *Init = nullptr,
7650 bool SkipImmediateInvocations = true);
7651
7652 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7653 /// the default expr if needed.
7655 ParmVarDecl *Param, Expr *Init = nullptr);
7656
7657 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7658 /// invocation.
7660
7662
7663 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7664 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7665
7666 /// Abstract base class used for diagnosing integer constant
7667 /// expression violations.
7669 public:
7671
7672 VerifyICEDiagnoser(bool Suppress = false) : Suppress(Suppress) {}
7673
7674 virtual SemaDiagnosticBuilder
7675 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7677 SourceLocation Loc) = 0;
7678 virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc);
7680 };
7681
7682 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7683 /// and reports the appropriate diagnostics. Returns false on success.
7684 /// Can optionally return the value of the expression.
7687 VerifyICEDiagnoser &Diagnoser,
7691 unsigned DiagID,
7694 VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result = nullptr,
7698 AllowFoldKind CanFold = AllowFoldKind::No) {
7699 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7700 }
7701
7702 /// DiagnoseAssignmentAsCondition - Given that an expression is
7703 /// being used as a boolean condition, warn if it's an assignment.
7705
7706 /// Redundant parentheses over an equality comparison can indicate
7707 /// that the user intended an assignment used as condition.
7709
7711 public:
7712 FullExprArg() : E(nullptr) {}
7713 FullExprArg(Sema &actions) : E(nullptr) {}
7714
7715 ExprResult release() { return E; }
7716
7717 Expr *get() const { return E; }
7718
7719 Expr *operator->() { return E; }
7720
7721 private:
7722 // FIXME: No need to make the entire Sema class a friend when it's just
7723 // Sema::MakeFullExpr that needs access to the constructor below.
7724 friend class Sema;
7725
7726 explicit FullExprArg(Expr *expr) : E(expr) {}
7727
7728 Expr *E;
7729 };
7730
7732 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7733 }
7735 return FullExprArg(
7736 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7737 }
7739 ExprResult FE =
7740 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7741 /*DiscardedValue*/ true);
7742 return FullExprArg(FE.get());
7743 }
7744
7746 Decl *ConditionVar;
7748 bool Invalid;
7749 std::optional<bool> KnownValue;
7750
7751 friend class Sema;
7752 ConditionResult(Sema &S, Decl *ConditionVar, ExprResult Condition,
7753 bool IsConstexpr)
7754 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7755 if (IsConstexpr && Condition.get()) {
7756 if (std::optional<llvm::APSInt> Val =
7757 Condition.get()->getIntegerConstantExpr(S.Context)) {
7758 KnownValue = !!(*Val);
7759 }
7760 }
7761 }
7762 explicit ConditionResult(bool Invalid)
7763 : ConditionVar(nullptr), Condition(Invalid), Invalid(Invalid),
7764 KnownValue(std::nullopt) {}
7765
7766 public:
7768 bool isInvalid() const { return Invalid; }
7769 std::pair<VarDecl *, Expr *> get() const {
7770 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7771 Condition.get());
7772 }
7773 std::optional<bool> getKnownValue() const { return KnownValue; }
7774 };
7776
7777 /// CheckBooleanCondition - Diagnose problems involving the use of
7778 /// the given expression as a boolean condition (e.g. in an if
7779 /// statement). Also performs the standard function and array
7780 /// decays, possibly changing the input variable.
7781 ///
7782 /// \param Loc - A location associated with the condition, e.g. the
7783 /// 'if' keyword.
7784 /// \return true iff there were any errors
7786 bool IsConstexpr = false);
7787
7788 enum class ConditionKind {
7789 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7790 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7791 Switch ///< An integral condition for a 'switch' statement.
7792 };
7793
7794 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7795 ConditionKind CK, bool MissingOK = false);
7796
7797 QualType CheckConditionalOperands( // C99 6.5.15
7798 ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK,
7799 ExprObjectKind &OK, SourceLocation QuestionLoc);
7800
7801 /// Emit a specialized diagnostic when one expression is a null pointer
7802 /// constant and the other is not a pointer. Returns true if a diagnostic is
7803 /// emitted.
7804 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7805 SourceLocation QuestionLoc);
7806
7807 /// type checking for vector binary operators.
7809 SourceLocation Loc, bool IsCompAssign,
7810 bool AllowBothBool, bool AllowBoolConversion,
7811 bool AllowBoolOperation, bool ReportInvalid);
7812
7813 /// Return a signed ext_vector_type that is of identical size and number of
7814 /// elements. For floating point vectors, return an integer type of identical
7815 /// size and number of elements. In the non ext_vector_type case, search from
7816 /// the largest type to the smallest type to avoid cases where long long ==
7817 /// long, where long gets picked over long long.
7820
7821 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7822 /// operates on extended vector types. Instead of producing an IntTy result,
7823 /// like a scalar comparison, a vector comparison produces a vector of integer
7824 /// types.
7827 BinaryOperatorKind Opc);
7830 BinaryOperatorKind Opc);
7833 BinaryOperatorKind Opc);
7834
7835 // type checking for sizeless vector binary operators.
7837 SourceLocation Loc, bool IsCompAssign,
7838 ArithConvKind OperationKind);
7839
7840 /// Type checking for matrix binary operators.
7843 bool IsCompAssign);
7845 SourceLocation Loc, bool IsCompAssign);
7846
7847 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7848 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7849 /// VLST) allowed?
7850 ///
7851 /// This will also return false if the two given types do not make sense from
7852 /// the perspective of SVE bitcasts.
7853 bool isValidSveBitcast(QualType srcType, QualType destType);
7854
7855 /// Are the two types matrix types and do they have the same dimensions i.e.
7856 /// do they have the same number of rows and the same number of columns?
7858
7859 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7860
7861 /// Are the two types lax-compatible vector types? That is, given
7862 /// that one of them is a vector, do they have equal storage sizes,
7863 /// where the storage size is the number of elements times the element
7864 /// size?
7865 ///
7866 /// This will also return false if either of the types is neither a
7867 /// vector nor a real type.
7868 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
7869
7870 /// Is this a legal conversion between two types, one of which is
7871 /// known to be a vector type?
7872 bool isLaxVectorConversion(QualType srcType, QualType destType);
7873
7874 // This returns true if at least one of the types is an altivec vector.
7875 bool anyAltivecTypes(QualType srcType, QualType destType);
7876
7877 // type checking C++ declaration initializers (C++ [dcl.init]).
7878
7879 /// Check a cast of an unknown-any type. We intentionally only
7880 /// trigger this for C-style casts.
7884
7885 /// Force an expression with unknown-type to an expression of the
7886 /// given type.
7888
7889 /// Type-check an expression that's being passed to an
7890 /// __unknown_anytype parameter.
7892 QualType &paramType);
7893
7894 // CheckMatrixCast - Check type constraints for matrix casts.
7895 // We allow casting between matrixes of the same dimensions i.e. when they
7896 // have the same number of rows and column. Returns true if the cast is
7897 // invalid.
7898 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
7899 CastKind &Kind);
7900
7901 // CheckVectorCast - check type constraints for vectors.
7902 // Since vectors are an extension, there are no C standard reference for this.
7903 // We allow casting between vectors and integer datatypes of the same size.
7904 // returns true if the cast is invalid
7905 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
7906 CastKind &Kind);
7907
7908 /// Prepare `SplattedExpr` for a vector splat operation, adding
7909 /// implicit casts if necessary.
7910 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
7911
7912 // CheckExtVectorCast - check type constraints for extended vectors.
7913 // Since vectors are an extension, there are no C standard reference for this.
7914 // We allow casting between vectors and integer datatypes of the same size,
7915 // or vectors and the element type of that vector.
7916 // returns the cast expr
7918 CastKind &Kind);
7919
7922 }
7923
7924 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2), converts
7925 // functions and arrays to their respective pointers (C99 6.3.2.1), and
7926 // promotes floating-piont types according to the language semantics.
7928
7929 // UsualUnaryFPConversions - promotes floating-point types according to the
7930 // current language semantics.
7932
7933 /// CallExprUnaryConversions - a special case of an unary conversion
7934 /// performed on a function designator of a call expression.
7936
7937 // DefaultFunctionArrayConversion - converts functions and arrays
7938 // to their respective pointers (C99 6.3.2.1).
7940
7941 // DefaultFunctionArrayLvalueConversion - converts functions and
7942 // arrays to their respective pointers and performs the
7943 // lvalue-to-rvalue conversion.
7945 bool Diagnose = true);
7946
7947 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
7948 // the operand. This function is a no-op if the operand has a function type
7949 // or an array type.
7951
7952 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
7953 // do not have a prototype. Integer promotions are performed on each
7954 // argument, and arguments that have type float are promoted to double.
7956
7958 const FunctionProtoType *Proto,
7959 Expr *Fn);
7960
7961 /// Determine the degree of POD-ness for an expression.
7962 /// Incomplete types are considered POD, since this check can be performed
7963 /// when we're in an unevaluated context.
7965
7966 /// Check to see if the given expression is a valid argument to a variadic
7967 /// function, issuing a diagnostic if not.
7969
7970 /// GatherArgumentsForCall - Collector argument expressions for various
7971 /// form of call prototypes.
7973 SourceLocation CallLoc, FunctionDecl *FDecl,
7974 const FunctionProtoType *Proto, unsigned FirstParam,
7977 bool AllowExplicit = false, bool IsListInitialization = false);
7978
7979 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
7980 // will create a runtime trap if the resulting type is not a POD type.
7982 FunctionDecl *FDecl);
7983
7984 // Check that the usual arithmetic conversions can be performed on this pair
7985 // of expressions that might be of enumeration type.
7987 ArithConvKind ACK);
7988
7989 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
7990 // operands and then handles various conversions that are common to binary
7991 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
7992 // routine returns the first non-arithmetic type found. The client is
7993 // responsible for emitting appropriate error diagnostics.
7996
7998 switch (ConvTy) {
7999 default:
8000 return false;
8004 return true;
8005 }
8006 llvm_unreachable("impossible");
8007 }
8008
8009 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
8010 /// assignment conversion type specified by ConvTy. This returns true if the
8011 /// conversion was invalid or false if the conversion was accepted.
8013 QualType DstType, QualType SrcType,
8014 Expr *SrcExpr, AssignmentAction Action,
8015 bool *Complained = nullptr);
8016
8017 /// CheckAssignmentConstraints - Perform type checking for assignment,
8018 /// argument passing, variable initialization, and function return values.
8019 /// C99 6.5.16.
8021 QualType LHSType,
8022 QualType RHSType);
8023
8024 /// Check assignment constraints and optionally prepare for a conversion of
8025 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
8026 /// is true.
8028 ExprResult &RHS, CastKind &Kind,
8029 bool ConvertRHS = true);
8030
8031 /// Check assignment constraints for an assignment of RHS to LHSType.
8032 ///
8033 /// \param LHSType The destination type for the assignment.
8034 /// \param RHS The source expression for the assignment.
8035 /// \param Diagnose If \c true, diagnostics may be produced when checking
8036 /// for assignability. If a diagnostic is produced, \p RHS will be
8037 /// set to ExprError(). Note that this function may still return
8038 /// without producing a diagnostic, even for an invalid assignment.
8039 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
8040 /// in an audited Core Foundation API and does not need to be checked
8041 /// for ARC retain issues.
8042 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
8043 /// conversions necessary to perform the assignment. If \c false,
8044 /// \p Diagnose must also be \c false.
8046 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
8047 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
8048
8049 // If the lhs type is a transparent union, check whether we
8050 // can initialize the transparent union with the given expression.
8052 ExprResult &RHS);
8053
8054 /// the following "Check" methods will return a valid/converted QualType
8055 /// or a null QualType (indicating an error diagnostic was issued).
8056
8057 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
8059 ExprResult &RHS);
8060
8061 /// Diagnose cases where a scalar was implicitly converted to a vector and
8062 /// diagnose the underlying types. Otherwise, diagnose the error
8063 /// as invalid vector logical operands for non-C++ cases.
8065 ExprResult &RHS);
8066
8069 BinaryOperatorKind Opc);
8070 QualType CheckRemainderOperands( // C99 6.5.5
8072 bool IsCompAssign = false);
8073 QualType CheckAdditionOperands( // C99 6.5.6
8075 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8078 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
8079 QualType CheckShiftOperands( // C99 6.5.7
8081 BinaryOperatorKind Opc, bool IsCompAssign = false);
8083 QualType CheckCompareOperands( // C99 6.5.8/9
8085 BinaryOperatorKind Opc);
8086 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
8088 BinaryOperatorKind Opc);
8089 QualType CheckLogicalOperands( // C99 6.5.[13,14]
8091 BinaryOperatorKind Opc);
8092 // CheckAssignmentOperands is used for both simple and compound assignment.
8093 // For simple assignment, pass both expressions and a null converted type.
8094 // For compound assignment, pass both expressions and the converted type.
8095 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
8096 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
8097 BinaryOperatorKind Opc);
8098
8099 /// To be used for checking whether the arguments being passed to
8100 /// function exceeds the number of parameters expected for it.
8101 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
8102 bool PartialOverloading = false) {
8103 // We check whether we're just after a comma in code-completion.
8104 if (NumArgs > 0 && PartialOverloading)
8105 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
8106 return NumArgs > NumParams;
8107 }
8108
8109 /// Whether the AST is currently being rebuilt to correct immediate
8110 /// invocations. Immediate invocation candidates and references to consteval
8111 /// functions aren't tracked when this is set.
8113
8116 return (Ctx.isConstantEvaluated() || isConstantEvaluatedOverride) &&
8117 !Ctx.InConditionallyConstantEvaluateContext;
8118 }
8119
8120 /// Determines whether we are currently in a context that
8121 /// is not evaluated as per C++ [expr] p5.
8124 }
8125
8128 }
8129
8132 }
8133
8136 }
8137
8140 return (Ctx.Context ==
8142 Ctx.IsCurrentlyCheckingDefaultArgumentOrInitializer;
8143 }
8144
8145 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8147 assert(!ExprEvalContexts.empty() &&
8148 "Must be in an expression evaluation context");
8149 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8151 Ctx.DelayedDefaultInitializationContext)
8152 return Ctx.DelayedDefaultInitializationContext;
8153 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8154 Ctx.isUnevaluated())
8155 break;
8156 }
8157 return std::nullopt;
8158 }
8159
8160 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
8162 assert(!ExprEvalContexts.empty() &&
8163 "Must be in an expression evaluation context");
8164 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
8165 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
8167 !Ctx.DelayedDefaultInitializationContext && Res)
8168 break;
8169 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
8170 Ctx.isUnevaluated())
8171 break;
8172 Res = Ctx.DelayedDefaultInitializationContext;
8173 }
8174 return Res;
8175 }
8176
8179 }
8180
8181 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
8182 /// SelfAssigned when inside a CXXMethodDecl.
8183 const FieldDecl *
8185
8187
8188 template <typename... Ts>
8190 const Ts &...Args) {
8191 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8193 }
8194
8195 template <typename... Ts>
8196 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
8197 const Ts &...Args) {
8198 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
8200 }
8201
8202 /// Abstract class used to diagnose incomplete types.
8205
8206 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
8207 virtual ~TypeDiagnoser() {}
8208 };
8209
8210 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
8211 protected:
8212 unsigned DiagID;
8213 std::tuple<const Ts &...> Args;
8214
8215 template <std::size_t... Is>
8217 std::index_sequence<Is...>) const {
8218 // Apply all tuple elements to the builder in order.
8219 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
8220 (void)Dummy;
8221 }
8222
8223 public:
8224 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8225 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
8226 assert(DiagID != 0 && "no diagnostic for type diagnoser");
8227 }
8228
8229 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8230 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
8231 emit(DB, std::index_sequence_for<Ts...>());
8232 DB << T;
8233 }
8234 };
8235
8236 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
8237 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
8238 /// For example, a diagnostic with no other parameters would generally have
8239 /// the form "...%select{incomplete|sizeless}0 type %1...".
8240 template <typename... Ts>
8242 public:
8243 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
8244 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
8245
8246 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
8247 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
8248 this->emit(DB, std::index_sequence_for<Ts...>());
8249 DB << T->isSizelessType() << T;
8250 }
8251 };
8252
8253 /// Check an argument list for placeholders that we won't try to
8254 /// handle later.
8256
8257 /// The C++ "std::source_location::__impl" struct, defined in
8258 /// <source_location>.
8260
8261 /// A stack of expression evaluation contexts.
8263
8264 // Set of failed immediate invocations to avoid double diagnosing.
8266
8267 /// List of SourceLocations where 'self' is implicitly retained inside a
8268 /// block.
8271
8272 /// Do an explicit extend of the given block pointer if we're in ARC.
8274
8275 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
8278
8279private:
8280 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
8281
8282 /// Methods for marking which expressions involve dereferencing a pointer
8283 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
8284 /// they are parsed, meaning that a noderef pointer may not be accessed. For
8285 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
8286 /// `*p`, but need to check that `address of` is called on it. This requires
8287 /// keeping a container of all pending expressions and checking if the address
8288 /// of them are eventually taken.
8289 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
8290 void CheckAddressOfNoDeref(const Expr *E);
8291
8292 ///@}
8293
8294 //
8295 //
8296 // -------------------------------------------------------------------------
8297 //
8298 //
8299
8300 /// \name C++ Expressions
8301 /// Implementations are in SemaExprCXX.cpp
8302 ///@{
8303
8304public:
8305 /// The C++ "std::bad_alloc" class, which is defined by the C++
8306 /// standard library.
8308
8309 /// The C++ "std::align_val_t" enum class, which is defined by the C++
8310 /// standard library.
8312
8313 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
8315
8316 /// A flag to remember whether the implicit forms of operator new and delete
8317 /// have been declared.
8319
8320 /// Delete-expressions to be analyzed at the end of translation unit
8321 ///
8322 /// This list contains class members, and locations of delete-expressions
8323 /// that could not be proven as to whether they mismatch with new-expression
8324 /// used in initializer of the field.
8325 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
8326
8327 /// Handle the result of the special case name lookup for inheriting
8328 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
8329 /// constructor names in member using declarations, even if 'X' is not the
8330 /// name of the corresponding type.
8332 SourceLocation NameLoc,
8333 const IdentifierInfo &Name);
8334
8336 SourceLocation NameLoc, Scope *S,
8337 CXXScopeSpec &SS, bool EnteringContext);
8339 Scope *S, CXXScopeSpec &SS,
8340 ParsedType ObjectType, bool EnteringContext);
8341
8343 ParsedType ObjectType);
8344
8345 /// Build a C++ typeid expression with a type operand.
8346 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8347 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8348
8349 /// Build a C++ typeid expression with an expression operand.
8350 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8351 Expr *Operand, SourceLocation RParenLoc);
8352
8353 /// ActOnCXXTypeid - Parse typeid( something ).
8355 bool isType, void *TyOrExpr,
8356 SourceLocation RParenLoc);
8357
8358 /// Build a Microsoft __uuidof expression with a type operand.
8359 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8360 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8361
8362 /// Build a Microsoft __uuidof expression with an expression operand.
8363 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8364 Expr *Operand, SourceLocation RParenLoc);
8365
8366 /// ActOnCXXUuidof - Parse __uuidof( something ).
8368 bool isType, void *TyOrExpr,
8369 SourceLocation RParenLoc);
8370
8371 //// ActOnCXXThis - Parse 'this' pointer.
8373
8374 /// Check whether the type of 'this' is valid in the current context.
8376
8377 /// Build a CXXThisExpr and mark it referenced in the current context.
8380
8381 /// Try to retrieve the type of the 'this' pointer.
8382 ///
8383 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8385
8386 /// When non-NULL, the C++ 'this' expression is allowed despite the
8387 /// current context not being a non-static member function. In such cases,
8388 /// this provides the type used for 'this'.
8390
8391 /// RAII object used to temporarily allow the C++ 'this' expression
8392 /// to be used, with the given qualifiers on the current class type.
8394 Sema &S;
8395 QualType OldCXXThisTypeOverride;
8396 bool Enabled;
8397
8398 public:
8399 /// Introduce a new scope where 'this' may be allowed (when enabled),
8400 /// using the given declaration (which is either a class template or a
8401 /// class) along with the given qualifiers.
8402 /// along with the qualifiers placed on '*this'.
8403 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8404 bool Enabled = true);
8405
8407 };
8408
8409 /// Make sure the value of 'this' is actually available in the current
8410 /// context, if it is a potentially evaluated context.
8411 ///
8412 /// \param Loc The location at which the capture of 'this' occurs.
8413 ///
8414 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8415 /// capture list.
8416 ///
8417 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8418 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8419 /// This is useful when enclosing lambdas must speculatively capture
8420 /// 'this' that may or may not be used in certain specializations of
8421 /// a nested generic lambda (depending on whether the name resolves to
8422 /// a non-static member function or a static function).
8423 /// \return returns 'true' if failed, 'false' if success.
8425 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8426 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8427 bool ByCopy = false);
8428
8429 /// Determine whether the given type is the type of *this that is used
8430 /// outside of the body of a member function for a type that is currently
8431 /// being defined.
8433
8434 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8436
8437 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8439
8440 //// ActOnCXXThrow - Parse throw expressions.
8443 bool IsThrownVarInScope);
8444
8445 /// CheckCXXThrowOperand - Validate the operand of a throw.
8446 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8447
8448 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8449 /// Can be interpreted either as function-style casting ("int(x)")
8450 /// or class type construction ("ClassType(x,y,z)")
8451 /// or creation of a value-initialized type ("int()").
8453 SourceLocation LParenOrBraceLoc,
8454 MultiExprArg Exprs,
8455 SourceLocation RParenOrBraceLoc,
8456 bool ListInitialization);
8457
8459 SourceLocation LParenLoc,
8460 MultiExprArg Exprs,
8461 SourceLocation RParenLoc,
8462 bool ListInitialization);
8463
8464 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8465 ///
8466 /// E.g.:
8467 /// @code new (memory) int[size][4] @endcode
8468 /// or
8469 /// @code ::new Foo(23, "hello") @endcode
8470 ///
8471 /// \param StartLoc The first location of the expression.
8472 /// \param UseGlobal True if 'new' was prefixed with '::'.
8473 /// \param PlacementLParen Opening paren of the placement arguments.
8474 /// \param PlacementArgs Placement new arguments.
8475 /// \param PlacementRParen Closing paren of the placement arguments.
8476 /// \param TypeIdParens If the type is in parens, the source range.
8477 /// \param D The type to be allocated, as well as array dimensions.
8478 /// \param Initializer The initializing expression or initializer-list, or
8479 /// null if there is none.
8480 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8481 SourceLocation PlacementLParen,
8482 MultiExprArg PlacementArgs,
8483 SourceLocation PlacementRParen,
8484 SourceRange TypeIdParens, Declarator &D,
8485 Expr *Initializer);
8487 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8488 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8489 SourceRange TypeIdParens, QualType AllocType,
8490 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8491 SourceRange DirectInitRange, Expr *Initializer);
8492
8493 /// Determine whether \p FD is an aligned allocation or deallocation
8494 /// function that is unavailable.
8496
8497 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8498 /// function that is unavailable.
8501
8502 /// Checks that a type is suitable as the allocated type
8503 /// in a new-expression.
8505 SourceRange R);
8506
8507 /// Finds the overloads of operator new and delete that are appropriate
8508 /// for the allocation.
8512 QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP,
8513 MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew,
8514 FunctionDecl *&OperatorDelete, bool Diagnose = true);
8515
8516 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8517 /// delete. These are:
8518 /// @code
8519 /// // C++03:
8520 /// void* operator new(std::size_t) throw(std::bad_alloc);
8521 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8522 /// void operator delete(void *) throw();
8523 /// void operator delete[](void *) throw();
8524 /// // C++11:
8525 /// void* operator new(std::size_t);
8526 /// void* operator new[](std::size_t);
8527 /// void operator delete(void *) noexcept;
8528 /// void operator delete[](void *) noexcept;
8529 /// // C++1y:
8530 /// void* operator new(std::size_t);
8531 /// void* operator new[](std::size_t);
8532 /// void operator delete(void *) noexcept;
8533 /// void operator delete[](void *) noexcept;
8534 /// void operator delete(void *, std::size_t) noexcept;
8535 /// void operator delete[](void *, std::size_t) noexcept;
8536 /// @endcode
8537 /// Note that the placement and nothrow forms of new are *not* implicitly
8538 /// declared. Their use requires including <new>.
8541 ArrayRef<QualType> Params);
8542
8544 DeclarationName Name, FunctionDecl *&Operator,
8546 bool Diagnose = true);
8549 DeclarationName Name);
8551 CXXRecordDecl *RD,
8552 bool Diagnose = true);
8553
8554 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8555 /// @code ::delete ptr; @endcode
8556 /// or
8557 /// @code delete [] ptr; @endcode
8558 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8559 bool ArrayForm, Expr *Operand);
8561 bool IsDelete, bool CallCanBeVirtual,
8562 bool WarnOnNonAbstractTypes,
8563 SourceLocation DtorLoc);
8564
8566 Expr *Operand, SourceLocation RParen);
8568 SourceLocation RParen);
8569
8571 SourceLocation OpLoc,
8572 tok::TokenKind OpKind,
8573 ParsedType &ObjectType,
8574 bool &MayBePseudoDestructor);
8575
8577 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8578 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8579 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8580
8582 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8583 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8584 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8585
8587 SourceLocation OpLoc,
8588 tok::TokenKind OpKind,
8589 SourceLocation TildeLoc,
8590 const DeclSpec &DS);
8591
8592 /// MaybeCreateExprWithCleanups - If the current full-expression
8593 /// requires any cleanups, surround it with a ExprWithCleanups node.
8594 /// Otherwise, just returns the passed-in expression.
8598
8599 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8600 return ActOnFinishFullExpr(
8601 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8602 }
8604 bool DiscardedValue, bool IsConstexpr = false,
8605 bool IsTemplateArgument = false);
8607
8608 /// Process the expression contained within a decltype. For such expressions,
8609 /// certain semantic checks on temporaries are delayed until this point, and
8610 /// are omitted for the 'topmost' call in the decltype expression. If the
8611 /// topmost call bound a temporary, strip that temporary off the expression.
8613
8614 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8615 bool IsUDSuffix);
8616
8618
8619 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8620 SourceLocation StmtLoc,
8621 ConditionKind CK);
8622
8623 /// Check the use of the given variable as a C++ condition in an if,
8624 /// while, do-while, or switch statement.
8626 SourceLocation StmtLoc, ConditionKind CK);
8627
8628 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8629 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8630
8631 /// Helper function to determine whether this is the (deprecated) C++
8632 /// conversion from a string literal to a pointer to non-const char or
8633 /// non-const wchar_t (for narrow and wide string literals,
8634 /// respectively).
8636
8637 /// PerformImplicitConversion - Perform an implicit conversion of the
8638 /// expression From to the type ToType using the pre-computed implicit
8639 /// conversion sequence ICS. Returns the converted
8640 /// expression. Action is the kind of conversion we're performing,
8641 /// used in the error message.
8643 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8644 AssignmentAction Action,
8646
8647 /// PerformImplicitConversion - Perform an implicit conversion of the
8648 /// expression From to the type ToType by following the standard
8649 /// conversion sequence SCS. Returns the converted
8650 /// expression. Flavor is the context in which we're performing this
8651 /// conversion, for use in error messages.
8653 const StandardConversionSequence &SCS,
8654 AssignmentAction Action,
8656
8657 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8658
8659 /// Parsed one of the type trait support pseudo-functions.
8662 SourceLocation RParenLoc);
8665 SourceLocation RParenLoc);
8666
8667 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8668 /// pseudo-functions.
8670 ParsedType LhsTy, Expr *DimExpr,
8671 SourceLocation RParen);
8672
8674 TypeSourceInfo *TSInfo, Expr *DimExpr,
8675 SourceLocation RParen);
8676
8677 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8678 /// pseudo-functions.
8680 Expr *Queried, SourceLocation RParen);
8681
8683 Expr *Queried, SourceLocation RParen);
8684
8687 bool isIndirect);
8689 ExprResult &RHS,
8690 SourceLocation QuestionLoc);
8691
8693 ExprResult &LHS, ExprResult &RHS,
8694 SourceLocation QuestionLoc);
8695
8696 //// Determines if a type is trivially relocatable
8697 /// according to the C++26 rules.
8698 // FIXME: This is in Sema because it requires
8699 // overload resolution, can we move to ASTContext?
8702
8703 //// Determines if a type is replaceable
8704 /// according to the C++26 rules.
8705 // FIXME: This is in Sema because it requires
8706 // overload resolution, can we move to ASTContext?
8708
8709 /// Check the operands of ?: under C++ semantics.
8710 ///
8711 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8712 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8713 ///
8714 /// This function also implements GCC's vector extension and the
8715 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8716 /// permit the use of a?b:c where the type of a is that of a integer vector
8717 /// with the same number of elements and size as the vectors of b and c. If
8718 /// one of either b or c is a scalar it is implicitly converted to match the
8719 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8720 /// c are scalars, then b and c are checked and converted to the type of a if
8721 /// possible.
8722 ///
8723 /// The expressions are evaluated differently for GCC's and OpenCL's
8724 /// extensions. For the GCC extension, the ?: operator is evaluated as
8725 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8726 /// For the OpenCL extensions, the ?: operator is evaluated as
8727 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8728 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8730 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8731 ExprObjectKind &OK, SourceLocation questionLoc);
8732
8733 /// Find a merged pointer type and convert the two expressions to it.
8734 ///
8735 /// This finds the composite pointer type for \p E1 and \p E2 according to
8736 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8737 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8738 /// ConvertArgs is \c true).
8739 ///
8740 /// \param Loc The location of the operator requiring these two expressions to
8741 /// be converted to the composite pointer type.
8742 ///
8743 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8744 /// type.
8746 bool ConvertArgs = true);
8748 ExprResult &E2, bool ConvertArgs = true) {
8749 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8750 QualType Composite =
8751 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8752 E1 = E1Tmp;
8753 E2 = E2Tmp;
8754 return Composite;
8755 }
8756
8757 /// MaybeBindToTemporary - If the passed in expression has a record type with
8758 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8759 /// it simply returns the passed in expression.
8761
8762 /// IgnoredValueConversions - Given that an expression's result is
8763 /// syntactically ignored, perform any conversions that are
8764 /// required.
8766
8768
8771 const DeclarationNameInfo &TargetNameInfo);
8772
8774 SourceLocation KeywordLoc,
8775 bool IsIfExists, CXXScopeSpec &SS,
8776 UnqualifiedId &Name);
8777
8780 ArrayRef<ParmVarDecl *> LocalParameters,
8781 Scope *BodyScope);
8785 CXXScopeSpec &SS,
8786 SourceLocation NameLoc,
8787 const IdentifierInfo *TypeName,
8788 TemplateIdAnnotation *TemplateId);
8790 SourceLocation NoexceptLoc);
8792 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8793 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8796 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8800 bool IsSatisfied, SourceLocation NoexceptLoc,
8807 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8808 const ASTConstraintSatisfaction &Satisfaction);
8811 SourceLocation LParenLoc,
8812 ArrayRef<ParmVarDecl *> LocalParameters,
8813 SourceLocation RParenLoc,
8815 SourceLocation ClosingBraceLoc);
8816
8817private:
8818 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8819 bool IsDelete);
8820
8821 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8822 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8823 bool DeleteWasArrayForm);
8824
8825 ///@}
8826
8827 //
8828 //
8829 // -------------------------------------------------------------------------
8830 //
8831 //
8832
8833 /// \name Member Access Expressions
8834 /// Implementations are in SemaExprMember.cpp
8835 ///@{
8836
8837public:
8838 /// Check whether an expression might be an implicit class member access.
8840 bool IsAddressOfOperand);
8841
8842 /// Builds an expression which might be an implicit member expression.
8844 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8845 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8846
8847 /// Builds an implicit member access expression. The current context
8848 /// is known to be an instance method, and the given unqualified lookup
8849 /// set is known to contain only instance members, at least one of which
8850 /// is from an appropriate type.
8852 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8853 LookupResult &R,
8854 const TemplateArgumentListInfo *TemplateArgs,
8855 bool IsDefiniteInstance, const Scope *S);
8856
8858 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8859 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8860 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8861 const TemplateArgumentListInfo *TemplateArgs);
8862
8863 /// The main callback when the parser finds something like
8864 /// expression . [nested-name-specifier] identifier
8865 /// expression -> [nested-name-specifier] identifier
8866 /// where 'identifier' encompasses a fairly broad spectrum of
8867 /// possibilities, including destructor and operator references.
8868 ///
8869 /// \param OpKind either tok::arrow or tok::period
8870 /// \param ObjCImpDecl the current Objective-C \@implementation
8871 /// decl; this is an ugly hack around the fact that Objective-C
8872 /// \@implementations aren't properly put in the context chain
8874 tok::TokenKind OpKind, CXXScopeSpec &SS,
8875 SourceLocation TemplateKWLoc,
8876 UnqualifiedId &Member, Decl *ObjCImpDecl);
8877
8878 MemberExpr *
8879 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
8880 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
8881 ValueDecl *Member, DeclAccessPair FoundDecl,
8882 bool HadMultipleCandidates,
8883 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
8885 const TemplateArgumentListInfo *TemplateArgs = nullptr);
8886
8887 // Check whether the declarations we found through a nested-name
8888 // specifier in a member expression are actually members of the base
8889 // type. The restriction here is:
8890 //
8891 // C++ [expr.ref]p2:
8892 // ... In these cases, the id-expression shall name a
8893 // member of the class or of one of its base classes.
8894 //
8895 // So it's perfectly legitimate for the nested-name specifier to name
8896 // an unrelated class, and for us to find an overload set including
8897 // decls from classes which are not superclasses, as long as the decl
8898 // we actually pick through overload resolution is from a superclass.
8899 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
8900 const CXXScopeSpec &SS,
8901 const LookupResult &R);
8902
8903 // This struct is for use by ActOnMemberAccess to allow
8904 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
8905 // changing the access operator from a '.' to a '->' (to see if that is the
8906 // change needed to fix an error about an unknown member, e.g. when the class
8907 // defines a custom operator->).
8912 };
8913
8915 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
8916 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8917 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8918 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
8919 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8920
8923 bool IsArrow, const CXXScopeSpec &SS,
8924 SourceLocation TemplateKWLoc,
8925 NamedDecl *FirstQualifierInScope, LookupResult &R,
8926 const TemplateArgumentListInfo *TemplateArgs,
8927 const Scope *S, bool SuppressQualifierCheck = false,
8928 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8929
8930 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
8931 SourceLocation OpLoc,
8932 const CXXScopeSpec &SS, FieldDecl *Field,
8933 DeclAccessPair FoundDecl,
8934 const DeclarationNameInfo &MemberNameInfo);
8935
8936 /// Perform conversions on the LHS of a member access expression.
8938
8940 const CXXScopeSpec &SS, SourceLocation nameLoc,
8941 IndirectFieldDecl *indirectField,
8942 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
8943 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
8944
8945private:
8946 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
8947
8948 ///@}
8949
8950 //
8951 //
8952 // -------------------------------------------------------------------------
8953 //
8954 //
8955
8956 /// \name Initializers
8957 /// Implementations are in SemaInit.cpp
8958 ///@{
8959
8960public:
8961 /// Stack of types that correspond to the parameter entities that are
8962 /// currently being copy-initialized. Can be empty.
8964
8965 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
8967
8968 bool IsStringInit(Expr *Init, const ArrayType *AT);
8969
8970 /// Determine whether we can perform aggregate initialization for the purposes
8971 /// of overload resolution.
8973 const InitializedEntity &Entity, InitListExpr *From);
8974
8976 SourceLocation EqualOrColonLoc,
8977 bool GNUSyntax, ExprResult Init);
8978
8979 /// Check that the lifetime of the initializer (and its subobjects) is
8980 /// sufficient for initializing the entity, and perform lifetime extension
8981 /// (when permitted) if not.
8983
8986 bool BoundToLvalueReference);
8987
8988 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
8989 /// it as an xvalue. In C++98, the result will still be a prvalue, because
8990 /// we don't have xvalues there.
8992
8996
9000 SourceLocation EqualLoc, ExprResult Init,
9001 bool TopLevelOfInitList = false,
9002 bool AllowExplicit = false);
9003
9005 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
9007
9008 ///@}
9009
9010 //
9011 //
9012 // -------------------------------------------------------------------------
9013 //
9014 //
9015
9016 /// \name C++ Lambda Expressions
9017 /// Implementations are in SemaLambda.cpp
9018 ///@{
9019
9020public:
9021 /// Create a new lambda closure type.
9023 TypeSourceInfo *Info,
9024 unsigned LambdaDependencyKind,
9025 LambdaCaptureDefault CaptureDefault);
9026
9027 /// Number lambda for linkage purposes if necessary.
9029 std::optional<CXXRecordDecl::LambdaNumbering>
9030 NumberingOverride = std::nullopt);
9031
9032 /// Endow the lambda scope info with the relevant properties.
9033 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
9034 SourceRange IntroducerRange,
9035 LambdaCaptureDefault CaptureDefault,
9036 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
9037 bool Mutable);
9038
9041
9043 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
9044 TemplateParameterList *TemplateParams);
9045
9046 void
9048 SourceLocation CallOperatorLoc,
9049 const AssociatedConstraint &TrailingRequiresClause,
9050 TypeSourceInfo *MethodTyInfo,
9051 ConstexprSpecKind ConstexprKind, StorageClass SC,
9053 bool HasExplicitResultType);
9054
9055 /// Returns true if the explicit object parameter was invalid.
9057 SourceLocation CallLoc);
9058
9059 /// Perform initialization analysis of the init-capture and perform
9060 /// any implicit conversions such as an lvalue-to-rvalue conversion if
9061 /// not being used to initialize a reference.
9063 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
9066 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
9068 }
9070 SourceLocation EllipsisLoc,
9071 UnsignedOrNone NumExpansions,
9073 bool DirectInit, Expr *&Init);
9074
9075 /// Create a dummy variable within the declcontext of the lambda's
9076 /// call operator, for name lookup purposes for a lambda init capture.
9077 ///
9078 /// CodeGen handles emission of lambda captures, ignoring these dummy
9079 /// variables appropriately.
9081 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
9082 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
9083
9084 /// Add an init-capture to a lambda scope.
9085 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
9086
9087 /// Note that we have finished the explicit captures for the
9088 /// given lambda.
9090
9091 /// Deduce a block or lambda's return type based on the return
9092 /// statements present in the body.
9094
9095 /// Once the Lambdas capture are known, we can start to create the closure,
9096 /// call operator method, and keep track of the captures.
9097 /// We do the capture lookup here, but they are not actually captured until
9098 /// after we know what the qualifiers of the call operator are.
9100 Scope *CurContext);
9101
9102 /// This is called after parsing the explicit template parameter list
9103 /// on a lambda (if it exists) in C++2a.
9105 SourceLocation LAngleLoc,
9106 ArrayRef<NamedDecl *> TParams,
9107 SourceLocation RAngleLoc,
9108 ExprResult RequiresClause);
9109
9111 SourceLocation MutableLoc);
9112
9114 Scope *LambdaScope,
9116
9117 /// ActOnStartOfLambdaDefinition - This is called just before we start
9118 /// parsing the body of a lambda; it analyzes the explicit captures and
9119 /// arguments, and sets up various data-structures for the body of the
9120 /// lambda.
9122 Declarator &ParamInfo, const DeclSpec &DS);
9123
9124 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
9125 /// is invoked to pop the information about the lambda.
9126 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
9127 bool IsInstantiation = false);
9128
9129 /// ActOnLambdaExpr - This is called when the body of a lambda expression
9130 /// was successfully completed.
9132
9133 /// Does copying/destroying the captured variable have side effects?
9134 bool CaptureHasSideEffects(const sema::Capture &From);
9135
9136 /// Diagnose if an explicit lambda capture is unused. Returns true if a
9137 /// diagnostic is emitted.
9138 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
9139 SourceRange FixItRange,
9140 const sema::Capture &From);
9141
9142 /// Build a FieldDecl suitable to hold the given capture.
9144
9145 /// Initialize the given capture with a suitable expression.
9147 SourceLocation ImplicitCaptureLoc,
9148 bool IsOpenMPMapping = false);
9149
9150 /// Complete a lambda-expression having processed and attached the
9151 /// lambda body.
9153
9154 /// Get the return type to use for a lambda's conversion function(s) to
9155 /// function pointer type, given the type of the call operator.
9156 QualType
9158 CallingConv CC);
9159
9161 SourceLocation ConvLocation,
9162 CXXConversionDecl *Conv, Expr *Src);
9163
9165 : private FunctionScopeRAII {
9166 public:
9168 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
9170 bool ShouldAddDeclsFromParentScope = true);
9171 };
9172
9173 /// Compute the mangling number context for a lambda expression or
9174 /// block literal. Also return the extra mangling decl if any.
9175 ///
9176 /// \param DC - The DeclContext containing the lambda expression or
9177 /// block literal.
9178 std::tuple<MangleNumberingContext *, Decl *>
9180
9181 ///@}
9182
9183 //
9184 //
9185 // -------------------------------------------------------------------------
9186 //
9187 //
9188
9189 /// \name Name Lookup
9190 ///
9191 /// These routines provide name lookup that is used during semantic
9192 /// analysis to resolve the various kinds of names (identifiers,
9193 /// overloaded operator names, constructor names, etc.) into zero or
9194 /// more declarations within a particular scope. The major entry
9195 /// points are LookupName, which performs unqualified name lookup,
9196 /// and LookupQualifiedName, which performs qualified name lookup.
9197 ///
9198 /// All name lookup is performed based on some specific criteria,
9199 /// which specify what names will be visible to name lookup and how
9200 /// far name lookup should work. These criteria are important both
9201 /// for capturing language semantics (certain lookups will ignore
9202 /// certain names, for example) and for performance, since name
9203 /// lookup is often a bottleneck in the compilation of C++. Name
9204 /// lookup criteria is specified via the LookupCriteria enumeration.
9205 ///
9206 /// The results of name lookup can vary based on the kind of name
9207 /// lookup performed, the current language, and the translation
9208 /// unit. In C, for example, name lookup will either return nothing
9209 /// (no entity found) or a single declaration. In C++, name lookup
9210 /// can additionally refer to a set of overloaded functions or
9211 /// result in an ambiguity. All of the possible results of name
9212 /// lookup are captured by the LookupResult class, which provides
9213 /// the ability to distinguish among them.
9214 ///
9215 /// Implementations are in SemaLookup.cpp
9216 ///@{
9217
9218public:
9219 /// Tracks whether we are in a context where typo correction is
9220 /// disabled.
9222
9223 /// The number of typos corrected by CorrectTypo.
9225
9226 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
9227 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
9228
9229 /// A cache containing identifiers for which typo correction failed and
9230 /// their locations, so that repeated attempts to correct an identifier in a
9231 /// given location are ignored if typo correction already failed for it.
9233
9234 /// SpecialMemberOverloadResult - The overloading result for a special member
9235 /// function.
9236 ///
9237 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
9238 /// integer are used to determine whether overload resolution succeeded.
9240 public:
9241 enum Kind { NoMemberOrDeleted, Ambiguous, Success };
9242
9243 private:
9244 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
9245
9246 public:
9249 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
9250
9251 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
9252 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
9253
9254 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
9255 void setKind(Kind K) { Pair.setInt(K); }
9256 };
9257
9258 class SpecialMemberOverloadResultEntry : public llvm::FastFoldingSetNode,
9260 public:
9261 SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
9262 : FastFoldingSetNode(ID) {}
9263 };
9264
9265 /// A cache of special member function overload resolution results
9266 /// for C++ records.
9267 llvm::FoldingSet<SpecialMemberOverloadResultEntry> SpecialMemberCache;
9268
9270
9271 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
9272 // TODO: make this is a typesafe union.
9275
9276 /// Describes the kind of name lookup to perform.
9278 /// Ordinary name lookup, which finds ordinary names (functions,
9279 /// variables, typedefs, etc.) in C and most kinds of names
9280 /// (functions, variables, members, types, etc.) in C++.
9282 /// Tag name lookup, which finds the names of enums, classes,
9283 /// structs, and unions.
9285 /// Label name lookup.
9287 /// Member name lookup, which finds the names of
9288 /// class/struct/union members.
9290 /// Look up of an operator name (e.g., operator+) for use with
9291 /// operator overloading. This lookup is similar to ordinary name
9292 /// lookup, but will ignore any declarations that are class members.
9294 /// Look up a name following ~ in a destructor name. This is an ordinary
9295 /// lookup, but prefers tags to typedefs.
9297 /// Look up of a name that precedes the '::' scope resolution
9298 /// operator in C++. This lookup completely ignores operator, object,
9299 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9301 /// Look up a namespace name within a C++ using directive or
9302 /// namespace alias definition, ignoring non-namespace names (C++
9303 /// [basic.lookup.udir]p1).
9305 /// Look up all declarations in a scope with the given name,
9306 /// including resolved using declarations. This is appropriate
9307 /// for checking redeclarations for a using declaration.
9309 /// Look up an ordinary name that is going to be redeclared as a
9310 /// name with linkage. This lookup ignores any declarations that
9311 /// are outside of the current scope unless they have linkage. See
9312 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9314 /// Look up a friend of a local class. This lookup does not look
9315 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9317 /// Look up the name of an Objective-C protocol.
9319 /// Look up implicit 'self' parameter of an objective-c method.
9321 /// Look up the name of an OpenMP user-defined reduction operation.
9323 /// Look up the name of an OpenMP user-defined mapper.
9325 /// Look up any declaration with any name.
9328
9329 /// The possible outcomes of name lookup for a literal operator.
9331 /// The lookup resulted in an error.
9333 /// The lookup found no match but no diagnostic was issued.
9335 /// The lookup found a single 'cooked' literal operator, which
9336 /// expects a normal literal to be built and passed to it.
9338 /// The lookup found a single 'raw' literal operator, which expects
9339 /// a string literal containing the spelling of the literal token.
9341 /// The lookup found an overload set of literal operator templates,
9342 /// which expect the characters of the spelling of the literal token to be
9343 /// passed as a non-type template argument pack.
9345 /// The lookup found an overload set of literal operator templates,
9346 /// which expect the character type and characters of the spelling of the
9347 /// string literal token to be passed as template arguments.
9349 };
9350
9351 SpecialMemberOverloadResult
9353 bool VolatileArg, bool RValueThis, bool ConstThis,
9354 bool VolatileThis);
9355
9357
9358 /// Look up a name, looking for a single declaration. Return
9359 /// null if the results were absent, ambiguous, or overloaded.
9360 ///
9361 /// It is preferable to use the elaborated form and explicitly handle
9362 /// ambiguity and overloaded.
9365 LookupNameKind NameKind,
9366 RedeclarationKind Redecl = RedeclarationKind::NotForRedeclaration);
9367
9368 /// Lookup a builtin function, when name lookup would otherwise
9369 /// fail.
9370 bool LookupBuiltin(LookupResult &R);
9371 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9372
9373 /// Perform unqualified name lookup starting from a given
9374 /// scope.
9375 ///
9376 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9377 /// used to find names within the current scope. For example, 'x' in
9378 /// @code
9379 /// int x;
9380 /// int f() {
9381 /// return x; // unqualified name look finds 'x' in the global scope
9382 /// }
9383 /// @endcode
9384 ///
9385 /// Different lookup criteria can find different names. For example, a
9386 /// particular scope can have both a struct and a function of the same
9387 /// name, and each can be found by certain lookup criteria. For more
9388 /// information about lookup criteria, see the documentation for the
9389 /// class LookupCriteria.
9390 ///
9391 /// @param S The scope from which unqualified name lookup will
9392 /// begin. If the lookup criteria permits, name lookup may also search
9393 /// in the parent scopes.
9394 ///
9395 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9396 /// look up and the lookup kind), and is updated with the results of lookup
9397 /// including zero or more declarations and possibly additional information
9398 /// used to diagnose ambiguities.
9399 ///
9400 /// @returns \c true if lookup succeeded and false otherwise.
9401 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9402 bool ForceNoCPlusPlus = false);
9403
9404 /// Perform qualified name lookup into a given context.
9405 ///
9406 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9407 /// names when the context of those names is explicit specified, e.g.,
9408 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9409 ///
9410 /// Different lookup criteria can find different names. For example, a
9411 /// particular scope can have both a struct and a function of the same
9412 /// name, and each can be found by certain lookup criteria. For more
9413 /// information about lookup criteria, see the documentation for the
9414 /// class LookupCriteria.
9415 ///
9416 /// \param R captures both the lookup criteria and any lookup results found.
9417 ///
9418 /// \param LookupCtx The context in which qualified name lookup will
9419 /// search. If the lookup criteria permits, name lookup may also search
9420 /// in the parent contexts or (for C++ classes) base classes.
9421 ///
9422 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9423 /// occurs as part of unqualified name lookup.
9424 ///
9425 /// \returns true if lookup succeeded, false if it failed.
9426 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9427 bool InUnqualifiedLookup = false);
9428
9429 /// Performs qualified name lookup or special type of lookup for
9430 /// "__super::" scope specifier.
9431 ///
9432 /// This routine is a convenience overload meant to be called from contexts
9433 /// that need to perform a qualified name lookup with an optional C++ scope
9434 /// specifier that might require special kind of lookup.
9435 ///
9436 /// \param R captures both the lookup criteria and any lookup results found.
9437 ///
9438 /// \param LookupCtx The context in which qualified name lookup will
9439 /// search.
9440 ///
9441 /// \param SS An optional C++ scope-specifier.
9442 ///
9443 /// \returns true if lookup succeeded, false if it failed.
9444 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9445 CXXScopeSpec &SS);
9446
9447 /// Performs name lookup for a name that was parsed in the
9448 /// source code, and may contain a C++ scope specifier.
9449 ///
9450 /// This routine is a convenience routine meant to be called from
9451 /// contexts that receive a name and an optional C++ scope specifier
9452 /// (e.g., "N::M::x"). It will then perform either qualified or
9453 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9454 /// respectively) on the given name and return those results. It will
9455 /// perform a special type of lookup for "__super::" scope specifier.
9456 ///
9457 /// @param S The scope from which unqualified name lookup will
9458 /// begin.
9459 ///
9460 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9461 ///
9462 /// @param EnteringContext Indicates whether we are going to enter the
9463 /// context of the scope-specifier SS (if present).
9464 ///
9465 /// @returns True if any decls were found (but possibly ambiguous)
9467 QualType ObjectType, bool AllowBuiltinCreation = false,
9468 bool EnteringContext = false);
9469
9470 /// Perform qualified name lookup into all base classes of the given
9471 /// class.
9472 ///
9473 /// \param R captures both the lookup criteria and any lookup results found.
9474 ///
9475 /// \param Class The context in which qualified name lookup will
9476 /// search. Name lookup will search in all base classes merging the results.
9477 ///
9478 /// @returns True if any decls were found (but possibly ambiguous)
9480
9482 UnresolvedSetImpl &Functions);
9483
9484 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9485 /// If GnuLabelLoc is a valid source location, then this is a definition
9486 /// of an __label__ label name, otherwise it is a normal label definition
9487 /// or use.
9489 SourceLocation GnuLabelLoc = SourceLocation());
9490
9491 /// Perform a name lookup for a label with the specified name; this does not
9492 /// create a new label if the lookup fails.
9494
9495 /// Look up the constructors for the given class.
9497
9498 /// Look up the default constructor for the given class.
9500
9501 /// Look up the copying constructor for the given class.
9503 unsigned Quals);
9504
9505 /// Look up the copying assignment operator for the given class.
9507 bool RValueThis, unsigned ThisQuals);
9508
9509 /// Look up the moving constructor for the given class.
9511 unsigned Quals);
9512
9513 /// Look up the moving assignment operator for the given class.
9515 bool RValueThis, unsigned ThisQuals);
9516
9517 /// Look for the destructor of the given class.
9518 ///
9519 /// During semantic analysis, this routine should be used in lieu of
9520 /// CXXRecordDecl::getDestructor().
9521 ///
9522 /// \returns The destructor for this class.
9524
9525 /// Force the declaration of any implicitly-declared members of this
9526 /// class.
9528
9529 /// Make a merged definition of an existing hidden definition \p ND
9530 /// visible at the specified location.
9532
9533 /// Check ODR hashes for C/ObjC when merging types from modules.
9534 /// Differently from C++, actually parse the body and reject in case
9535 /// of a mismatch.
9536 template <typename T,
9537 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9539 if (Duplicate->getODRHash() != Previous->getODRHash())
9540 return false;
9541
9542 // Make the previous decl visible.
9544 return true;
9545 }
9546
9547 /// Get the set of additional modules that should be checked during
9548 /// name lookup. A module and its imports become visible when instanting a
9549 /// template defined within it.
9550 llvm::DenseSet<Module *> &getLookupModules();
9551
9552 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9554
9555 /// Determine if the template parameter \p D has a visible default argument.
9556 bool
9558 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9559 /// Determine if the template parameter \p D has a reachable default argument.
9561 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9562 /// Determine if the template parameter \p D has a reachable default argument.
9566
9567 /// Determine if there is a visible declaration of \p D that is an explicit
9568 /// specialization declaration for a specialization of a template. (For a
9569 /// member specialization, use hasVisibleMemberSpecialization.)
9571 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9572 /// Determine if there is a reachable declaration of \p D that is an explicit
9573 /// specialization declaration for a specialization of a template. (For a
9574 /// member specialization, use hasReachableMemberSpecialization.)
9576 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9577
9578 /// Determine if there is a visible declaration of \p D that is a member
9579 /// specialization declaration (as opposed to an instantiated declaration).
9581 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9582 /// Determine if there is a reachable declaration of \p D that is a member
9583 /// specialization declaration (as opposed to an instantiated declaration).
9585 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9586
9587 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9588
9589 /// Determine whether any declaration of an entity is visible.
9590 bool
9592 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9593 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9594 }
9595
9598 /// Determine whether any declaration of an entity is reachable.
9599 bool
9601 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9602 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9603 }
9605 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9606
9607 void diagnoseTypo(const TypoCorrection &Correction,
9608 const PartialDiagnostic &TypoDiag,
9609 bool ErrorRecovery = true);
9610
9611 /// Diagnose a successfully-corrected typo. Separated from the correction
9612 /// itself to allow external validation of the result, etc.
9613 ///
9614 /// \param Correction The result of performing typo correction.
9615 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9616 /// string added to it (and usually also a fixit).
9617 /// \param PrevNote A note to use when indicating the location of the entity
9618 /// to which we are correcting. Will have the correction string added
9619 /// to it.
9620 /// \param ErrorRecovery If \c true (the default), the caller is going to
9621 /// recover from the typo as if the corrected string had been typed.
9622 /// In this case, \c PDiag must be an error, and we will attach a fixit
9623 /// to it.
9624 void diagnoseTypo(const TypoCorrection &Correction,
9625 const PartialDiagnostic &TypoDiag,
9626 const PartialDiagnostic &PrevNote,
9627 bool ErrorRecovery = true);
9628
9629 /// Find the associated classes and namespaces for
9630 /// argument-dependent lookup for a call with the given set of
9631 /// arguments.
9632 ///
9633 /// This routine computes the sets of associated classes and associated
9634 /// namespaces searched by argument-dependent lookup
9635 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9637 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9638 AssociatedNamespaceSet &AssociatedNamespaces,
9639 AssociatedClassSet &AssociatedClasses);
9640
9641 /// Produce a diagnostic describing the ambiguity that resulted
9642 /// from name lookup.
9643 ///
9644 /// \param Result The result of the ambiguous lookup to be diagnosed.
9646
9647 /// LookupLiteralOperator - Determine which literal operator should be used
9648 /// for a user-defined literal, per C++11 [lex.ext].
9649 ///
9650 /// Normal overload resolution is not used to select which literal operator to
9651 /// call for a user-defined literal. Look up the provided literal operator
9652 /// name, and filter the results to the appropriate set for the given argument
9653 /// types.
9656 bool AllowRaw, bool AllowTemplate,
9657 bool AllowStringTemplate, bool DiagnoseMissing,
9658 StringLiteral *StringLit = nullptr);
9659
9661 ArrayRef<Expr *> Args, ADLResult &Functions);
9662
9665 bool IncludeGlobalScope = true,
9666 bool LoadExternal = true);
9669 bool IncludeGlobalScope = true,
9670 bool IncludeDependentBases = false,
9671 bool LoadExternal = true);
9672
9673 /// Try to "correct" a typo in the source code by finding
9674 /// visible declarations whose names are similar to the name that was
9675 /// present in the source code.
9676 ///
9677 /// \param TypoName the \c DeclarationNameInfo structure that contains
9678 /// the name that was present in the source code along with its location.
9679 ///
9680 /// \param LookupKind the name-lookup criteria used to search for the name.
9681 ///
9682 /// \param S the scope in which name lookup occurs.
9683 ///
9684 /// \param SS the nested-name-specifier that precedes the name we're
9685 /// looking for, if present.
9686 ///
9687 /// \param CCC A CorrectionCandidateCallback object that provides further
9688 /// validation of typo correction candidates. It also provides flags for
9689 /// determining the set of keywords permitted.
9690 ///
9691 /// \param MemberContext if non-NULL, the context in which to look for
9692 /// a member access expression.
9693 ///
9694 /// \param EnteringContext whether we're entering the context described by
9695 /// the nested-name-specifier SS.
9696 ///
9697 /// \param OPT when non-NULL, the search for visible declarations will
9698 /// also walk the protocols in the qualified interfaces of \p OPT.
9699 ///
9700 /// \returns a \c TypoCorrection containing the corrected name if the typo
9701 /// along with information such as the \c NamedDecl where the corrected name
9702 /// was declared, and any additional \c NestedNameSpecifier needed to access
9703 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9705 Sema::LookupNameKind LookupKind, Scope *S,
9707 CorrectTypoKind Mode,
9708 DeclContext *MemberContext = nullptr,
9709 bool EnteringContext = false,
9710 const ObjCObjectPointerType *OPT = nullptr,
9711 bool RecordFailure = true);
9712
9713 /// Kinds of missing import. Note, the values of these enumerators correspond
9714 /// to %select values in diagnostics.
9717 Definition,
9721 };
9722
9723 /// Diagnose that the specified declaration needs to be visible but
9724 /// isn't, and suggest a module import that would resolve the problem.
9726 MissingImportKind MIK, bool Recover = true);
9728 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9729 MissingImportKind MIK, bool Recover);
9730
9731 /// Called on #pragma clang __debug dump II
9733
9734 /// Called on #pragma clang __debug dump E
9735 void ActOnPragmaDump(Expr *E);
9736
9737private:
9738 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9739 //
9740 // The boolean value will be true to indicate that the namespace was loaded
9741 // from an AST/PCH file, or false otherwise.
9742 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9743
9744 /// Whether we have already loaded known namespaces from an extenal
9745 /// source.
9746 bool LoadedExternalKnownNamespaces;
9747
9748 bool CppLookupName(LookupResult &R, Scope *S);
9749
9750 /// Determine if we could use all the declarations in the module.
9751 bool isUsableModule(const Module *M);
9752
9753 /// Helper for CorrectTypo used to create and populate a new
9754 /// TypoCorrectionConsumer. Returns nullptr if typo correction should be
9755 /// skipped entirely.
9756 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9757 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9759 DeclContext *MemberContext, bool EnteringContext,
9760 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9761
9762 /// Cache for module units which is usable for current module.
9763 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9764
9765 /// Record the typo correction failure and return an empty correction.
9766 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9767 bool RecordFailure = true) {
9768 if (RecordFailure)
9769 TypoCorrectionFailures[Typo].insert(TypoLoc);
9770 return TypoCorrection();
9771 }
9772
9773 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9774
9775 /// Determine whether two declarations should be linked together, given that
9776 /// the old declaration might not be visible and the new declaration might
9777 /// not have external linkage.
9778 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9779 const NamedDecl *New) {
9780 if (isVisible(Old))
9781 return true;
9782 // See comment in below overload for why it's safe to compute the linkage
9783 // of the new declaration here.
9784 if (New->isExternallyDeclarable()) {
9785 assert(Old->isExternallyDeclarable() &&
9786 "should not have found a non-externally-declarable previous decl");
9787 return true;
9788 }
9789 return false;
9790 }
9791 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9792
9793 ///@}
9794
9795 //
9796 //
9797 // -------------------------------------------------------------------------
9798 //
9799 //
9800
9801 /// \name Modules
9802 /// Implementations are in SemaModule.cpp
9803 ///@{
9804
9805public:
9806 /// Get the module unit whose scope we are currently within.
9808 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9809 }
9810
9811 /// Is the module scope we are an implementation unit?
9813 return ModuleScopes.empty()
9814 ? false
9815 : ModuleScopes.back().Module->isModuleImplementation();
9816 }
9817
9818 // When loading a non-modular PCH files, this is used to restore module
9819 // visibility.
9821 VisibleModules.setVisible(Mod, ImportLoc);
9822 }
9823
9824 enum class ModuleDeclKind {
9825 Interface, ///< 'export module X;'
9826 Implementation, ///< 'module X;'
9827 PartitionInterface, ///< 'export module X:Y;'
9828 PartitionImplementation, ///< 'module X:Y;'
9829 };
9830
9831 /// An enumeration to represent the transition of states in parsing module
9832 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9833 /// an error in state transition, the state is set to NotACXX20Module.
9835 FirstDecl, ///< Parsing the first decl in a TU.
9836 GlobalFragment, ///< after 'module;' but before 'module X;'
9837 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9838 ImportFinished, ///< after any non-import decl.
9839 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9840 ///< non-import decl.
9841 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9842 ///< non-import decl has already been seen.
9843 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9844 };
9845
9846 /// The parser has processed a module-declaration that begins the definition
9847 /// of a module interface or implementation.
9849 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9850 ModuleIdPath Path, ModuleIdPath Partition,
9851 ModuleImportState &ImportState,
9852 bool SeenNoTrivialPPDirective);
9853
9854 /// The parser has processed a global-module-fragment declaration that begins
9855 /// the definition of the global module fragment of the current module unit.
9856 /// \param ModuleLoc The location of the 'module' keyword.
9858
9859 /// The parser has processed a private-module-fragment declaration that begins
9860 /// the definition of the private module fragment of the current module unit.
9861 /// \param ModuleLoc The location of the 'module' keyword.
9862 /// \param PrivateLoc The location of the 'private' keyword.
9864 SourceLocation PrivateLoc);
9865
9866 /// The parser has processed a module import declaration.
9867 ///
9868 /// \param StartLoc The location of the first token in the declaration. This
9869 /// could be the location of an '@', 'export', or 'import'.
9870 /// \param ExportLoc The location of the 'export' keyword, if any.
9871 /// \param ImportLoc The location of the 'import' keyword.
9872 /// \param Path The module toplevel name as an access path.
9873 /// \param IsPartition If the name is for a partition.
9875 SourceLocation ExportLoc,
9876 SourceLocation ImportLoc, ModuleIdPath Path,
9877 bool IsPartition = false);
9879 SourceLocation ExportLoc,
9880 SourceLocation ImportLoc, Module *M,
9881 ModuleIdPath Path = {});
9882
9883 /// The parser has processed a module import translated from a
9884 /// #include or similar preprocessing directive.
9885 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9886 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9887
9888 /// The parsed has entered a submodule.
9889 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
9890 /// The parser has left a submodule.
9891 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
9892
9893 /// Create an implicit import of the given module at the given
9894 /// source location, for error recovery, if possible.
9895 ///
9896 /// This routine is typically used when an entity found by name lookup
9897 /// is actually hidden within a module that we know about but the user
9898 /// has forgotten to import.
9900 Module *Mod);
9901
9902 /// We have parsed the start of an export declaration, including the '{'
9903 /// (if present).
9904 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
9905 SourceLocation LBraceLoc);
9906
9907 /// Complete the definition of an export declaration.
9908 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
9909 SourceLocation RBraceLoc);
9910
9911private:
9912 /// The parser has begun a translation unit to be compiled as a C++20
9913 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
9914 void HandleStartOfHeaderUnit();
9915
9916 struct ModuleScope {
9917 SourceLocation BeginLoc;
9918 clang::Module *Module = nullptr;
9919 VisibleModuleSet OuterVisibleModules;
9920 };
9921 /// The modules we're currently parsing.
9923
9924 /// For an interface unit, this is the implicitly imported interface unit.
9925 clang::Module *ThePrimaryInterface = nullptr;
9926
9927 /// The explicit global module fragment of the current translation unit.
9928 /// The explicit Global Module Fragment, as specified in C++
9929 /// [module.global.frag].
9930 clang::Module *TheGlobalModuleFragment = nullptr;
9931
9932 /// The implicit global module fragments of the current translation unit.
9933 ///
9934 /// The contents in the implicit global module fragment can't be discarded.
9935 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
9936
9937 /// Namespace definitions that we will export when they finish.
9938 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
9939
9940 /// In a C++ standard module, inline declarations require a definition to be
9941 /// present at the end of a definition domain. This set holds the decls to
9942 /// be checked at the end of the TU.
9943 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
9944
9945 /// Helper function to judge if we are in module purview.
9946 /// Return false if we are not in a module.
9947 bool isCurrentModulePurview() const;
9948
9949 /// Enter the scope of the explicit global module fragment.
9950 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
9951 /// Leave the scope of the explicit global module fragment.
9952 void PopGlobalModuleFragment();
9953
9954 /// Enter the scope of an implicit global module fragment.
9955 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
9956 /// Leave the scope of an implicit global module fragment.
9957 void PopImplicitGlobalModuleFragment();
9958
9959 VisibleModuleSet VisibleModules;
9960
9961 /// Whether we had imported any named modules.
9962 bool HadImportedNamedModules = false;
9963 /// The set of instantiations we need to check if they references TU-local
9964 /// entity from TUs. This only makes sense if we imported any named modules.
9966 PendingCheckReferenceForTULocal;
9967 /// Implement [basic.link]p18, which requires that we can't use TU-local
9968 /// entities from other TUs (ignoring header units).
9969 void checkReferenceToTULocalFromOtherTU(FunctionDecl *FD,
9970 SourceLocation PointOfInstantiation);
9971 /// Implement [basic.link]p17, which diagnose for non TU local exposure in
9972 /// module interface or module partition.
9973 void checkExposure(const TranslationUnitDecl *TU);
9974
9975 ///@}
9976
9977 //
9978 //
9979 // -------------------------------------------------------------------------
9980 //
9981 //
9982
9983 /// \name C++ Overloading
9984 /// Implementations are in SemaOverload.cpp
9985 ///@{
9986
9987public:
9988 /// Whether deferrable diagnostics should be deferred.
9989 bool DeferDiags = false;
9990
9991 /// RAII class to control scope of DeferDiags.
9993 Sema &S;
9994 bool SavedDeferDiags = false;
9995
9996 public:
9997 DeferDiagsRAII(Sema &S, bool DeferDiags)
9998 : S(S), SavedDeferDiags(S.DeferDiags) {
9999 S.DeferDiags = DeferDiags;
10000 }
10001 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
10002 };
10003
10004 /// Flag indicating if Sema is building a recovery call expression.
10005 ///
10006 /// This flag is used to avoid building recovery call expressions
10007 /// if Sema is already doing so, which would cause infinite recursions.
10009
10010 /// Determine whether the given New declaration is an overload of the
10011 /// declarations in Old. This routine returns OverloadKind::Match or
10012 /// OverloadKind::NonFunction if New and Old cannot be overloaded, e.g., if
10013 /// New has the same signature as some function in Old (C++ 1.3.10) or if the
10014 /// Old declarations aren't functions (or function templates) at all. When it
10015 /// does return OverloadKind::Match or OverloadKind::NonFunction, MatchedDecl
10016 /// will point to the decl that New cannot be overloaded with. This decl may
10017 /// be a UsingShadowDecl on top of the underlying declaration.
10018 ///
10019 /// Example: Given the following input:
10020 ///
10021 /// void f(int, float); // #1
10022 /// void f(int, int); // #2
10023 /// int f(int, int); // #3
10024 ///
10025 /// When we process #1, there is no previous declaration of "f", so IsOverload
10026 /// will not be used.
10027 ///
10028 /// When we process #2, Old contains only the FunctionDecl for #1. By
10029 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
10030 /// they have different signatures), so this routine returns
10031 /// OverloadKind::Overload; MatchedDecl is unchanged.
10032 ///
10033 /// When we process #3, Old is an overload set containing #1 and #2. We
10034 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
10035 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
10036 /// types of functions are not part of the signature), IsOverload returns
10037 /// OverloadKind::Match and MatchedDecl will be set to point to the
10038 /// FunctionDecl for #2.
10039 ///
10040 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
10041 /// class by a using declaration. The rules for whether to hide shadow
10042 /// declarations ignore some properties which otherwise figure into a function
10043 /// template's signature.
10045 const LookupResult &OldDecls, NamedDecl *&OldDecl,
10046 bool UseMemberUsingDeclRules);
10048 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10049
10050 // Checks whether MD constitutes an override the base class method BaseMD.
10051 // When checking for overrides, the object object members are ignored.
10052 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
10053 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
10054
10055 enum class AllowedExplicit {
10056 /// Allow no explicit functions to be used.
10057 None,
10058 /// Allow explicit conversion functions but not explicit constructors.
10060 /// Allow both explicit conversion functions and explicit constructors.
10061 All
10062 };
10063
10065 Expr *From, QualType ToType, bool SuppressUserConversions,
10066 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
10067 bool AllowObjCWritebackConversion);
10068
10069 /// PerformImplicitConversion - Perform an implicit conversion of the
10070 /// expression From to the type ToType. Returns the
10071 /// converted expression. Flavor is the kind of conversion we're
10072 /// performing, used in the error message. If @p AllowExplicit,
10073 /// explicit user-defined conversions are permitted.
10075 AssignmentAction Action,
10076 bool AllowExplicit = false);
10077
10078 /// IsIntegralPromotion - Determines whether the conversion from the
10079 /// expression From (whose potentially-adjusted type is FromType) to
10080 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
10081 /// sets PromotedType to the promoted type.
10082 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
10083
10084 /// IsFloatingPointPromotion - Determines whether the conversion from
10085 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
10086 /// returns true and sets PromotedType to the promoted type.
10087 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
10088
10089 /// Determine if a conversion is a complex promotion.
10090 ///
10091 /// A complex promotion is defined as a complex -> complex conversion
10092 /// where the conversion between the underlying real types is a
10093 /// floating-point or integral promotion.
10094 bool IsComplexPromotion(QualType FromType, QualType ToType);
10095
10096 /// IsPointerConversion - Determines whether the conversion of the
10097 /// expression From, which has the (possibly adjusted) type FromType,
10098 /// can be converted to the type ToType via a pointer conversion (C++
10099 /// 4.10). If so, returns true and places the converted type (that
10100 /// might differ from ToType in its cv-qualifiers at some level) into
10101 /// ConvertedType.
10102 ///
10103 /// This routine also supports conversions to and from block pointers
10104 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
10105 /// pointers to interfaces. FIXME: Once we've determined the
10106 /// appropriate overloading rules for Objective-C, we may want to
10107 /// split the Objective-C checks into a different routine; however,
10108 /// GCC seems to consider all of these conversions to be pointer
10109 /// conversions, so for now they live here. IncompatibleObjC will be
10110 /// set if the conversion is an allowed Objective-C conversion that
10111 /// should result in a warning.
10112 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
10113 bool InOverloadResolution, QualType &ConvertedType,
10114 bool &IncompatibleObjC);
10115
10116 /// isObjCPointerConversion - Determines whether this is an
10117 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
10118 /// with the same arguments and return values.
10119 bool isObjCPointerConversion(QualType FromType, QualType ToType,
10120 QualType &ConvertedType, bool &IncompatibleObjC);
10121 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
10122 QualType &ConvertedType);
10123
10124 /// FunctionParamTypesAreEqual - This routine checks two function proto types
10125 /// for equality of their parameter types. Caller has already checked that
10126 /// they have same number of parameters. If the parameters are different,
10127 /// ArgPos will have the parameter index of the first different parameter.
10128 /// If `Reversed` is true, the parameters of `NewType` will be compared in
10129 /// reverse order. That's useful if one of the functions is being used as a
10130 /// C++20 synthesized operator overload with a reversed parameter order.
10133 unsigned *ArgPos = nullptr,
10134 bool Reversed = false);
10135
10137 const FunctionProtoType *NewType,
10138 unsigned *ArgPos = nullptr,
10139 bool Reversed = false);
10140
10141 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
10142 const FunctionDecl *NewFunction,
10143 unsigned *ArgPos = nullptr,
10144 bool Reversed = false);
10145
10146 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
10147 /// function types. Catches different number of parameter, mismatch in
10148 /// parameter types, and different return types.
10150 QualType ToType);
10151
10152 /// CheckPointerConversion - Check the pointer conversion from the
10153 /// expression From to the type ToType. This routine checks for
10154 /// ambiguous or inaccessible derived-to-base pointer
10155 /// conversions for which IsPointerConversion has already returned
10156 /// true. It returns true and produces a diagnostic if there was an
10157 /// error, or returns false otherwise.
10158 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
10159 CXXCastPath &BasePath, bool IgnoreBaseAccess,
10160 bool Diagnose = true);
10161
10162 /// IsMemberPointerConversion - Determines whether the conversion of the
10163 /// expression From, which has the (possibly adjusted) type FromType, can be
10164 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
10165 /// If so, returns true and places the converted type (that might differ from
10166 /// ToType in its cv-qualifiers at some level) into ConvertedType.
10167 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
10168 bool InOverloadResolution,
10169 QualType &ConvertedType);
10170
10172 Success,
10174 NotDerived,
10175 Ambiguous,
10176 Virtual,
10178 };
10180 /// CheckMemberPointerConversion - Check the member pointer conversion from
10181 /// the expression From to the type ToType. This routine checks for ambiguous
10182 /// or virtual or inaccessible base-to-derived member pointer conversions for
10183 /// which IsMemberPointerConversion has already returned true. It produces a
10184 // diagnostic if there was an error.
10186 QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
10187 CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
10188 bool IgnoreBaseAccess, MemberPointerConversionDirection Direction);
10189
10190 /// IsQualificationConversion - Determines whether the conversion from
10191 /// an rvalue of type FromType to ToType is a qualification conversion
10192 /// (C++ 4.4).
10193 ///
10194 /// \param ObjCLifetimeConversion Output parameter that will be set to
10195 /// indicate when the qualification conversion involves a change in the
10196 /// Objective-C object lifetime.
10197 bool IsQualificationConversion(QualType FromType, QualType ToType,
10198 bool CStyle, bool &ObjCLifetimeConversion);
10199
10200 /// Determine whether the conversion from FromType to ToType is a valid
10201 /// conversion that strips "noexcept" or "noreturn" or "cfi_unchecked_callee"
10202 /// off the nested function type. This also checks if "cfi_unchecked_callee"
10203 /// was added to the function type. If "cfi_unchecked_callee" is added and
10204 /// `AddingCFIUncheckedCallee` is provided, it will be set to true. The same
10205 /// thing applies for `DiscardingCFIUncheckedCallee` if the attribute is
10206 /// discarded.
10207 bool IsFunctionConversion(QualType FromType, QualType ToType,
10208 bool *DiscardingCFIUncheckedCallee = nullptr,
10209 bool *AddingCFIUncheckedCallee = nullptr) const;
10210
10211 /// Same as `IsFunctionConversion`, but if this would return true, it sets
10212 /// `ResultTy` to `ToType`.
10213 bool TryFunctionConversion(QualType FromType, QualType ToType,
10214 QualType &ResultTy) const;
10215
10218 DeclarationName Name,
10219 OverloadCandidateSet &CandidateSet,
10220 FunctionDecl *Fn, MultiExprArg Args,
10221 bool IsMember = false);
10222
10224 FunctionDecl *Fun);
10226 Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl,
10228
10229 /// PerformContextuallyConvertToBool - Perform a contextual conversion
10230 /// of the expression From to bool (C++0x [conv]p3).
10232
10233 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
10234 /// conversion of the expression From to an Objective-C pointer type.
10235 /// Returns a valid but null ExprResult if no conversion sequence exists.
10237
10239 CCEKind CCE,
10240 NamedDecl *Dest = nullptr);
10241
10243 llvm::APSInt &Value, CCEKind CCE);
10245 APValue &Value, CCEKind CCE,
10246 NamedDecl *Dest = nullptr);
10247
10248 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10249 /// That is a converted constant expression
10250 /// (which was built with BuildConvertedConstantExpression)
10253 CCEKind CCE, bool RequireInt,
10254 const APValue &PreNarrowingValue);
10255
10256 /// Abstract base class used to perform a contextual implicit
10257 /// conversion from an expression to any type passing a filter.
10259 public:
10262
10263 ContextualImplicitConverter(bool Suppress = false,
10264 bool SuppressConversion = false)
10265 : Suppress(Suppress), SuppressConversion(SuppressConversion) {}
10266
10267 /// Determine whether the specified type is a valid destination type
10268 /// for this conversion.
10269 virtual bool match(QualType T) = 0;
10270
10271 /// Emits a diagnostic complaining that the expression does not have
10272 /// integral or enumeration type.
10274 QualType T) = 0;
10275
10276 /// Emits a diagnostic when the expression has incomplete class type.
10277 virtual SemaDiagnosticBuilder
10279
10280 /// Emits a diagnostic when the only matching conversion function
10281 /// is explicit.
10284 QualType T,
10285 QualType ConvTy) = 0;
10286
10287 /// Emits a note for the explicit conversion function.
10288 virtual SemaDiagnosticBuilder
10290
10291 /// Emits a diagnostic when there are multiple possible conversion
10292 /// functions.
10294 QualType T) = 0;
10295
10296 /// Emits a note for one of the candidate conversions.
10297 virtual SemaDiagnosticBuilder
10299
10300 /// Emits a diagnostic when we picked a conversion function
10301 /// (for cases when we are not allowed to pick a conversion function).
10304 QualType T,
10305 QualType ConvTy) = 0;
10306
10308 };
10309
10311 bool AllowScopedEnumerations;
10312
10313 public:
10314 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10315 bool SuppressConversion)
10316 : ContextualImplicitConverter(Suppress, SuppressConversion),
10317 AllowScopedEnumerations(AllowScopedEnumerations) {}
10318
10319 /// Match an integral or (possibly scoped) enumeration type.
10320 bool match(QualType T) override;
10321
10323 QualType T) override {
10324 return diagnoseNotInt(S, Loc, T);
10325 }
10326
10327 /// Emits a diagnostic complaining that the expression does not have
10328 /// integral or enumeration type.
10330 QualType T) = 0;
10331 };
10332
10333 /// Perform a contextual implicit conversion.
10336 ContextualImplicitConverter &Converter);
10337
10338 /// ReferenceCompareResult - Expresses the result of comparing two
10339 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10340 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10342 /// Ref_Incompatible - The two types are incompatible, so direct
10343 /// reference binding is not possible.
10345 /// Ref_Related - The two types are reference-related, which means
10346 /// that their unqualified forms (T1 and T2) are either the same
10347 /// or T1 is a base class of T2.
10349 /// Ref_Compatible - The two types are reference-compatible.
10352
10353 // Fake up a scoped enumeration that still contextually converts to bool.
10355 /// The conversions that would be performed on an lvalue of type T2 when
10356 /// binding a reference of type T1 to it, as determined when evaluating
10357 /// whether T1 is reference-compatible with T2.
10359 Qualification = 0x1,
10360 NestedQualification = 0x2,
10362 DerivedToBase = 0x8,
10363 ObjC = 0x10,
10364 ObjCLifetime = 0x20,
10365
10366 LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/ObjCLifetime)
10367 };
10368 };
10370
10371 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10372 /// determine whether they are reference-compatible,
10373 /// reference-related, or incompatible, for use in C++ initialization by
10374 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10375 /// type, and the first type (T1) is the pointee type of the reference
10376 /// type being initialized.
10379 ReferenceConversions *Conv = nullptr);
10380
10381 /// AddOverloadCandidate - Adds the given function to the set of
10382 /// candidate functions, using the given function call arguments. If
10383 /// @p SuppressUserConversions, then don't allow user-defined
10384 /// conversions via constructors or conversion operators.
10385 ///
10386 /// \param PartialOverloading true if we are performing "partial" overloading
10387 /// based on an incomplete set of function arguments. This feature is used by
10388 /// code completion.
10391 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10392 bool PartialOverloading = false, bool AllowExplicit = true,
10393 bool AllowExplicitConversion = false,
10394 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10395 ConversionSequenceList EarlyConversions = {},
10397 bool AggregateCandidateDeduction = false, bool StrictPackMatch = false);
10398
10399 /// Add all of the function declarations in the given function set to
10400 /// the overload candidate set.
10402 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10403 OverloadCandidateSet &CandidateSet,
10404 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10405 bool SuppressUserConversions = false, bool PartialOverloading = false,
10406 bool FirstArgumentIsBase = false);
10407
10408 /// AddMethodCandidate - Adds a named decl (which is some kind of
10409 /// method) as a method candidate to the given overload set.
10410 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10411 Expr::Classification ObjectClassification,
10412 ArrayRef<Expr *> Args,
10413 OverloadCandidateSet &CandidateSet,
10414 bool SuppressUserConversion = false,
10416
10417 /// AddMethodCandidate - Adds the given C++ member function to the set
10418 /// of candidate functions, using the given function call arguments
10419 /// and the object argument (@c Object). For example, in a call
10420 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10421 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10422 /// allow user-defined conversions via constructors or conversion
10423 /// operators.
10424 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10425 CXXRecordDecl *ActingContext, QualType ObjectType,
10426 Expr::Classification ObjectClassification,
10427 ArrayRef<Expr *> Args,
10428 OverloadCandidateSet &CandidateSet,
10429 bool SuppressUserConversions = false,
10430 bool PartialOverloading = false,
10431 ConversionSequenceList EarlyConversions = {},
10433 bool StrictPackMatch = false);
10434
10435 /// Add a C++ member function template as a candidate to the candidate
10436 /// set, using template argument deduction to produce an appropriate member
10437 /// function template specialization.
10439 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10440 CXXRecordDecl *ActingContext,
10441 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10442 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10443 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10444 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10445
10446 /// Add a C++ function template specialization as a candidate
10447 /// in the candidate set, using template argument deduction to produce
10448 /// an appropriate function template specialization.
10450 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10451 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10452 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10453 bool PartialOverloading = false, bool AllowExplicit = true,
10454 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10456 bool AggregateCandidateDeduction = false);
10457
10459 /// Do not consider any user-defined conversions when constructing the
10460 /// initializing sequence.
10462
10463 /// Before constructing the initializing sequence, we check whether the
10464 /// parameter type and argument type contain any user defined conversions.
10465 /// If so, do not initialize them. This effectively bypasses some undesired
10466 /// instantiation before checking constaints, which might otherwise result
10467 /// in non-SFINAE errors e.g. recursive constraints.
10469
10471 bool SuppressUserConversions,
10472 bool OnlyInitializeNonUserDefinedConversions)
10473 : SuppressUserConversions(SuppressUserConversions),
10474 OnlyInitializeNonUserDefinedConversions(
10475 OnlyInitializeNonUserDefinedConversions) {}
10476 };
10477
10478 /// Check that implicit conversion sequences can be formed for each argument
10479 /// whose corresponding parameter has a non-dependent type, per DR1391's
10480 /// [temp.deduct.call]p10.
10483 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10485 CheckNonDependentConversionsFlag UserConversionFlag,
10486 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10487 Expr::Classification ObjectClassification = {},
10489
10490 /// AddConversionCandidate - Add a C++ conversion function as a
10491 /// candidate in the candidate set (C++ [over.match.conv],
10492 /// C++ [over.match.copy]). From is the expression we're converting from,
10493 /// and ToType is the type that we're eventually trying to convert to
10494 /// (which may or may not be the same type as the type that the
10495 /// conversion function produces).
10497 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10498 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10499 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10500 bool AllowExplicit, bool AllowResultConversion = true,
10501 bool StrictPackMatch = false);
10502
10503 /// Adds a conversion function template specialization
10504 /// candidate to the overload set, using template argument deduction
10505 /// to deduce the template arguments of the conversion function
10506 /// template from the type that we are converting to (C++
10507 /// [temp.deduct.conv]).
10509 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10510 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10511 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10512 bool AllowExplicit, bool AllowResultConversion = true);
10513
10514 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10515 /// converts the given @c Object to a function pointer via the
10516 /// conversion function @c Conversion, and then attempts to call it
10517 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10518 /// the type of function that we'll eventually be calling.
10519 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10520 DeclAccessPair FoundDecl,
10521 CXXRecordDecl *ActingContext,
10522 const FunctionProtoType *Proto, Expr *Object,
10523 ArrayRef<Expr *> Args,
10524 OverloadCandidateSet &CandidateSet);
10525
10526 /// Add all of the non-member operator function declarations in the given
10527 /// function set to the overload candidate set.
10529 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10530 OverloadCandidateSet &CandidateSet,
10531 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10532
10533 /// Add overload candidates for overloaded operators that are
10534 /// member functions.
10535 ///
10536 /// Add the overloaded operator candidates that are member functions
10537 /// for the operator Op that was used in an operator expression such
10538 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10539 /// CandidateSet will store the added overload candidates. (C++
10540 /// [over.match.oper]).
10542 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10543 OverloadCandidateSet &CandidateSet,
10545
10546 /// AddBuiltinCandidate - Add a candidate for a built-in
10547 /// operator. ResultTy and ParamTys are the result and parameter types
10548 /// of the built-in candidate, respectively. Args and NumArgs are the
10549 /// arguments being passed to the candidate. IsAssignmentOperator
10550 /// should be true when this built-in candidate is an assignment
10551 /// operator. NumContextualBoolArguments is the number of arguments
10552 /// (at the beginning of the argument list) that will be contextually
10553 /// converted to bool.
10554 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10555 OverloadCandidateSet &CandidateSet,
10556 bool IsAssignmentOperator = false,
10557 unsigned NumContextualBoolArguments = 0);
10558
10559 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10560 /// operator overloads to the candidate set (C++ [over.built]), based
10561 /// on the operator @p Op and the arguments given. For example, if the
10562 /// operator is a binary '+', this routine might add "int
10563 /// operator+(int, int)" to cover integer addition.
10565 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10566 OverloadCandidateSet &CandidateSet);
10567
10568 /// Add function candidates found via argument-dependent lookup
10569 /// to the set of overloading candidates.
10570 ///
10571 /// This routine performs argument-dependent name lookup based on the
10572 /// given function name (which may also be an operator name) and adds
10573 /// all of the overload candidates found by ADL to the overload
10574 /// candidate set (C++ [basic.lookup.argdep]).
10576 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10577 TemplateArgumentListInfo *ExplicitTemplateArgs,
10578 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10579
10580 /// Check the enable_if expressions on the given function. Returns the first
10581 /// failing attribute, or NULL if they were all successful.
10582 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10583 ArrayRef<Expr *> Args,
10584 bool MissingImplicitThis = false);
10585
10586 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10587 /// non-ArgDependent DiagnoseIfAttrs.
10588 ///
10589 /// Argument-dependent diagnose_if attributes should be checked each time a
10590 /// function is used as a direct callee of a function call.
10591 ///
10592 /// Returns true if any errors were emitted.
10593 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10594 const Expr *ThisArg,
10595 ArrayRef<const Expr *> Args,
10596 SourceLocation Loc);
10597
10598 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10599 /// ArgDependent DiagnoseIfAttrs.
10600 ///
10601 /// Argument-independent diagnose_if attributes should be checked on every use
10602 /// of a function.
10603 ///
10604 /// Returns true if any errors were emitted.
10605 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10606 SourceLocation Loc);
10607
10608 /// Determine if \p A and \p B are equivalent internal linkage declarations
10609 /// from different modules, and thus an ambiguity error can be downgraded to
10610 /// an extension warning.
10611 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10612 const NamedDecl *B);
10614 SourceLocation Loc, const NamedDecl *D,
10615 ArrayRef<const NamedDecl *> Equiv);
10616
10617 // Emit as a 'note' the specific overload candidate
10619 const NamedDecl *Found, const FunctionDecl *Fn,
10621 QualType DestType = QualType(), bool TakingAddress = false);
10622
10623 // Emit as a series of 'note's all template and non-templates identified by
10624 // the expression Expr
10625 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10626 bool TakingAddress = false);
10627
10628 /// Returns whether the given function's address can be taken or not,
10629 /// optionally emitting a diagnostic if the address can't be taken.
10630 ///
10631 /// Returns false if taking the address of the function is illegal.
10632 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10633 bool Complain = false,
10634 SourceLocation Loc = SourceLocation());
10635
10636 // [PossiblyAFunctionType] --> [Return]
10637 // NonFunctionType --> NonFunctionType
10638 // R (A) --> R(A)
10639 // R (*)(A) --> R (A)
10640 // R (&)(A) --> R (A)
10641 // R (S::*)(A) --> R (A)
10642 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10643
10644 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10645 /// an overloaded function (C++ [over.over]), where @p From is an
10646 /// expression with overloaded function type and @p ToType is the type
10647 /// we're trying to resolve to. For example:
10648 ///
10649 /// @code
10650 /// int f(double);
10651 /// int f(int);
10652 ///
10653 /// int (*pfd)(double) = f; // selects f(double)
10654 /// @endcode
10655 ///
10656 /// This routine returns the resulting FunctionDecl if it could be
10657 /// resolved, and NULL otherwise. When @p Complain is true, this
10658 /// routine will emit diagnostics if there is an error.
10659 FunctionDecl *
10660 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10661 bool Complain, DeclAccessPair &Found,
10662 bool *pHadMultipleCandidates = nullptr);
10663
10664 /// Given an expression that refers to an overloaded function, try to
10665 /// resolve that function to a single function that can have its address
10666 /// taken. This will modify `Pair` iff it returns non-null.
10667 ///
10668 /// This routine can only succeed if from all of the candidates in the
10669 /// overload set for SrcExpr that can have their addresses taken, there is one
10670 /// candidate that is more constrained than the rest.
10671 FunctionDecl *
10672 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10673
10674 /// Given an overloaded function, tries to turn it into a non-overloaded
10675 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10676 /// will perform access checks, diagnose the use of the resultant decl, and,
10677 /// if requested, potentially perform a function-to-pointer decay.
10678 ///
10679 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10680 /// Otherwise, returns true. This may emit diagnostics and return true.
10682 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10683
10684 /// Given an expression that refers to an overloaded function, try to
10685 /// resolve that overloaded function expression down to a single function.
10686 ///
10687 /// This routine can only resolve template-ids that refer to a single function
10688 /// template, where that template-id refers to a single template whose
10689 /// template arguments are either provided by the template-id or have
10690 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10691 ///
10692 /// If no template-ids are found, no diagnostics are emitted and NULL is
10693 /// returned.
10695 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10696 TemplateSpecCandidateSet *FailedTSC = nullptr,
10697 bool ForTypeDeduction = false);
10698
10699 // Resolve and fix an overloaded expression that can be resolved
10700 // because it identifies a single function template specialization.
10701 //
10702 // Last three arguments should only be supplied if Complain = true
10703 //
10704 // Return true if it was logically possible to so resolve the
10705 // expression, regardless of whether or not it succeeded. Always
10706 // returns true if 'complain' is set.
10708 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10709 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10710 QualType DestTypeForComplaining = QualType(),
10711 unsigned DiagIDForComplaining = 0);
10712
10713 /// Add the overload candidates named by callee and/or found by argument
10714 /// dependent lookup to the given overload set.
10715 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10716 ArrayRef<Expr *> Args,
10717 OverloadCandidateSet &CandidateSet,
10718 bool PartialOverloading = false);
10719
10720 /// Add the call candidates from the given set of lookup results to the given
10721 /// overload set. Non-function lookup results are ignored.
10723 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10724 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10725
10726 // An enum used to represent the different possible results of building a
10727 // range-based for loop.
10733
10734 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10735 /// given LookupResult is non-empty, it is assumed to describe a member which
10736 /// will be invoked. Otherwise, the function will be found via argument
10737 /// dependent lookup.
10738 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10739 /// otherwise CallExpr is set to ExprError() and some non-success value
10740 /// is returned.
10742 SourceLocation RangeLoc,
10743 const DeclarationNameInfo &NameInfo,
10744 LookupResult &MemberLookup,
10745 OverloadCandidateSet *CandidateSet,
10747
10748 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10749 /// (which eventually refers to the declaration Func) and the call
10750 /// arguments Args/NumArgs, attempt to resolve the function call down
10751 /// to a specific function. If overload resolution succeeds, returns
10752 /// the call expression produced by overload resolution.
10753 /// Otherwise, emits diagnostics and returns ExprError.
10755 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10756 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10757 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10758
10759 /// Constructs and populates an OverloadedCandidateSet from
10760 /// the given function.
10761 /// \returns true when an the ExprResult output parameter has been set.
10763 MultiExprArg Args, SourceLocation RParenLoc,
10764 OverloadCandidateSet *CandidateSet,
10766
10770 const UnresolvedSetImpl &Fns,
10771 bool PerformADL = true);
10772
10773 /// Create a unary operation that may resolve to an overloaded
10774 /// operator.
10775 ///
10776 /// \param OpLoc The location of the operator itself (e.g., '*').
10777 ///
10778 /// \param Opc The UnaryOperatorKind that describes this operator.
10779 ///
10780 /// \param Fns The set of non-member functions that will be
10781 /// considered by overload resolution. The caller needs to build this
10782 /// set based on the context using, e.g.,
10783 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10784 /// set should not contain any member functions; those will be added
10785 /// by CreateOverloadedUnaryOp().
10786 ///
10787 /// \param Input The input argument.
10790 const UnresolvedSetImpl &Fns, Expr *input,
10791 bool RequiresADL = true);
10792
10793 /// Perform lookup for an overloaded binary operator.
10796 const UnresolvedSetImpl &Fns,
10797 ArrayRef<Expr *> Args, bool RequiresADL = true);
10798
10799 /// Create a binary operation that may resolve to an overloaded
10800 /// operator.
10801 ///
10802 /// \param OpLoc The location of the operator itself (e.g., '+').
10803 ///
10804 /// \param Opc The BinaryOperatorKind that describes this operator.
10805 ///
10806 /// \param Fns The set of non-member functions that will be
10807 /// considered by overload resolution. The caller needs to build this
10808 /// set based on the context using, e.g.,
10809 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10810 /// set should not contain any member functions; those will be added
10811 /// by CreateOverloadedBinOp().
10812 ///
10813 /// \param LHS Left-hand argument.
10814 /// \param RHS Right-hand argument.
10815 /// \param PerformADL Whether to consider operator candidates found by ADL.
10816 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10817 /// C++20 operator rewrites.
10818 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10819 /// the function in question. Such a function is never a candidate in
10820 /// our overload resolution. This also enables synthesizing a three-way
10821 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10823 const UnresolvedSetImpl &Fns, Expr *LHS,
10824 Expr *RHS, bool RequiresADL = true,
10825 bool AllowRewrittenCandidates = true,
10826 FunctionDecl *DefaultedFn = nullptr);
10828 const UnresolvedSetImpl &Fns,
10829 Expr *LHS, Expr *RHS,
10830 FunctionDecl *DefaultedFn);
10831
10833 SourceLocation RLoc, Expr *Base,
10834 MultiExprArg Args);
10835
10836 /// BuildCallToMemberFunction - Build a call to a member
10837 /// function. MemExpr is the expression that refers to the member
10838 /// function (and includes the object parameter), Args/NumArgs are the
10839 /// arguments to the function call (not including the object
10840 /// parameter). The caller needs to validate that the member
10841 /// expression refers to a non-static member function or an overloaded
10842 /// member function.
10844 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10845 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10846 bool IsExecConfig = false, bool AllowRecovery = false);
10847
10848 /// BuildCallToObjectOfClassType - Build a call to an object of class
10849 /// type (C++ [over.call.object]), which can end up invoking an
10850 /// overloaded function call operator (@c operator()) or performing a
10851 /// user-defined conversion on the object argument.
10853 SourceLocation LParenLoc,
10854 MultiExprArg Args,
10855 SourceLocation RParenLoc);
10856
10857 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
10858 /// (if one exists), where @c Base is an expression of class type and
10859 /// @c Member is the name of the member we're trying to find.
10861 SourceLocation OpLoc,
10862 bool *NoArrowOperatorFound = nullptr);
10863
10866 bool HadMultipleCandidates);
10867
10868 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
10869 /// to a literal operator described by the provided lookup results.
10872 SourceLocation LitEndLoc,
10873 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10874
10875 /// FixOverloadedFunctionReference - E is an expression that refers to
10876 /// a C++ overloaded function (possibly with some parentheses and
10877 /// perhaps a '&' around it). We have resolved the overloaded function
10878 /// to the function declaration Fn, so patch up the expression E to
10879 /// refer (possibly indirectly) to Fn. Returns the new expr.
10881 FunctionDecl *Fn);
10883 DeclAccessPair FoundDecl,
10884 FunctionDecl *Fn);
10885
10886 /// - Returns a selector which best matches given argument list or
10887 /// nullptr if none could be found
10889 bool IsInstance,
10891
10892 ///@}
10893
10894 //
10895 //
10896 // -------------------------------------------------------------------------
10897 //
10898 //
10899
10900 /// \name Statements
10901 /// Implementations are in SemaStmt.cpp
10902 ///@{
10903
10904public:
10905 /// Stack of active SEH __finally scopes. Can be empty.
10907
10908 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
10910
10912 bool HasLeadingEmptyMacro = false);
10913
10915 SourceLocation EndLoc);
10917
10918 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
10919 /// whose result is unused, warn.
10920 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
10921
10922 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
10926 ArrayRef<Stmt *> Elts, bool isStmtExpr);
10927
10929
10932 SourceLocation DotDotDotLoc, ExprResult RHS,
10933 SourceLocation ColonLoc);
10934
10935 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
10936 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
10937
10939 SourceLocation ColonLoc, Stmt *SubStmt,
10940 Scope *CurScope);
10942 SourceLocation ColonLoc, Stmt *SubStmt);
10943
10945 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
10947 Stmt *SubStmt);
10948
10949 /// Check whether the given statement can have musttail applied to it,
10950 /// issuing a diagnostic and returning false if not. In the success case,
10951 /// the statement is rewritten to remove implicit nodes from the return
10952 /// value.
10953 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
10954
10956 SourceLocation LParenLoc, Stmt *InitStmt,
10957 ConditionResult Cond, SourceLocation RParenLoc,
10958 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
10960 SourceLocation LParenLoc, Stmt *InitStmt,
10961 ConditionResult Cond, SourceLocation RParenLoc,
10962 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
10963
10965
10967 SourceLocation LParenLoc, Stmt *InitStmt,
10968 ConditionResult Cond,
10969 SourceLocation RParenLoc);
10971 Stmt *Body);
10972
10973 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
10974 /// integer not in the range of enum values.
10975 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
10976 Expr *SrcExpr);
10977
10979 ConditionResult Cond, SourceLocation RParenLoc,
10980 Stmt *Body);
10982 SourceLocation WhileLoc, SourceLocation CondLParen,
10983 Expr *Cond, SourceLocation CondRParen);
10984
10986 Stmt *First, ConditionResult Second,
10987 FullExprArg Third, SourceLocation RParenLoc,
10988 Stmt *Body);
10989
10990 /// In an Objective C collection iteration statement:
10991 /// for (x in y)
10992 /// x can be an arbitrary l-value expression. Bind it up as a
10993 /// full-expression.
10995
10997 /// Initial building of a for-range statement.
10999 /// Instantiation or recovery rebuild of a for-range statement. Don't
11000 /// attempt any typo-correction.
11002 /// Determining whether a for-range statement could be built. Avoid any
11003 /// unnecessary or irreversible actions.
11006
11007 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
11008 ///
11009 /// C++11 [stmt.ranged]:
11010 /// A range-based for statement is equivalent to
11011 ///
11012 /// {
11013 /// auto && __range = range-init;
11014 /// for ( auto __begin = begin-expr,
11015 /// __end = end-expr;
11016 /// __begin != __end;
11017 /// ++__begin ) {
11018 /// for-range-declaration = *__begin;
11019 /// statement
11020 /// }
11021 /// }
11022 ///
11023 /// The body of the loop is not available yet, since it cannot be analysed
11024 /// until we have determined the type of the for-range-declaration.
11026 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
11027 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
11029 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11030
11031 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
11033 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
11034 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
11035 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
11037 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
11038
11039 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
11040 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
11041 /// body cannot be performed until after the type of the range variable is
11042 /// determined.
11043 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
11044
11045 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
11046 LabelDecl *TheDecl);
11047 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
11048 SourceLocation StarLoc, Expr *DestExp);
11049 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope,
11050 LabelDecl *Label, SourceLocation LabelLoc);
11051 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope,
11052 LabelDecl *Label, SourceLocation LabelLoc);
11053
11056
11057 enum Status : uint8_t { None, MoveEligible, MoveEligibleAndCopyElidable };
11059
11060 bool isMoveEligible() const { return S != None; };
11061 bool isCopyElidable() const { return S == MoveEligibleAndCopyElidable; }
11062 };
11064
11065 /// Determine whether the given expression might be move-eligible or
11066 /// copy-elidable in either a (co_)return statement or throw expression,
11067 /// without considering function return type, if applicable.
11068 ///
11069 /// \param E The expression being returned from the function or block,
11070 /// being thrown, or being co_returned from a coroutine. This expression
11071 /// might be modified by the implementation.
11072 ///
11073 /// \param Mode Overrides detection of current language mode
11074 /// and uses the rules for C++23.
11075 ///
11076 /// \returns An aggregate which contains the Candidate and isMoveEligible
11077 /// and isCopyElidable methods. If Candidate is non-null, it means
11078 /// isMoveEligible() would be true under the most permissive language
11079 /// standard.
11080 NamedReturnInfo getNamedReturnInfo(
11082
11083 /// Determine whether the given NRVO candidate variable is move-eligible or
11084 /// copy-elidable, without considering function return type.
11085 ///
11086 /// \param VD The NRVO candidate variable.
11087 ///
11088 /// \returns An aggregate which contains the Candidate and isMoveEligible
11089 /// and isCopyElidable methods. If Candidate is non-null, it means
11090 /// isMoveEligible() would be true under the most permissive language
11091 /// standard.
11092 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
11093
11094 /// Updates given NamedReturnInfo's move-eligible and
11095 /// copy-elidable statuses, considering the function
11096 /// return type criteria as applicable to return statements.
11097 ///
11098 /// \param Info The NamedReturnInfo object to update.
11099 ///
11100 /// \param ReturnType This is the return type of the function.
11101 /// \returns The copy elision candidate, in case the initial return expression
11102 /// was copy elidable, or nullptr otherwise.
11103 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
11104 QualType ReturnType);
11105
11106 /// Perform the initialization of a potentially-movable value, which
11107 /// is the result of return value.
11108 ///
11109 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
11110 /// treat returned lvalues as rvalues in certain cases (to prefer move
11111 /// construction), then falls back to treating them as lvalues if that failed.
11114 const NamedReturnInfo &NRInfo, Expr *Value,
11115 bool SupressSimplerImplicitMoves = false);
11116
11118
11119 /// Deduce the return type for a function from a returned expression, per
11120 /// C++1y [dcl.spec.auto]p6.
11122 SourceLocation ReturnLoc, Expr *RetExpr,
11123 const AutoType *AT);
11124
11125 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11126 Scope *CurScope);
11127 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
11128 bool AllowRecovery = false);
11129
11130 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
11131 /// for capturing scopes.
11133 NamedReturnInfo &NRInfo,
11134 bool SupressSimplerImplicitMoves);
11135
11136 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
11137 /// and creates a proper catch handler from them.
11139 Stmt *HandlerBlock);
11140
11141 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
11142 /// handlers and creates a try statement from them.
11144 ArrayRef<Stmt *> Handlers);
11145
11146 void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry);
11147
11148 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
11149 SourceLocation TryLoc, Stmt *TryBlock,
11150 Stmt *Handler);
11152 Stmt *Block);
11157
11159 bool IsIfExists,
11160 NestedNameSpecifierLoc QualifierLoc,
11161 DeclarationNameInfo NameInfo,
11162 Stmt *Nested);
11164 bool IsIfExists, CXXScopeSpec &SS,
11165 UnqualifiedId &Name, Stmt *Nested);
11166
11168 CapturedRegionKind Kind, unsigned NumParams);
11169 typedef std::pair<StringRef, QualType> CapturedParamNameType;
11173 unsigned OpenMPCaptureLevel = 0);
11178 unsigned NumParams);
11179
11180private:
11181 /// Check whether the given statement can have musttail applied to it,
11182 /// issuing a diagnostic and returning false if not.
11183 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
11184
11185 /// Check if the given expression contains 'break' or 'continue'
11186 /// statement that produces control flow different from GCC.
11187 void CheckBreakContinueBinding(Expr *E);
11188
11189 ///@}
11190
11191 //
11192 //
11193 // -------------------------------------------------------------------------
11194 //
11195 //
11196
11197 /// \name `inline asm` Statement
11198 /// Implementations are in SemaStmtAsm.cpp
11199 ///@{
11200
11201public:
11202 ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel);
11203 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
11204 bool IsVolatile, unsigned NumOutputs,
11205 unsigned NumInputs, IdentifierInfo **Names,
11206 MultiExprArg Constraints, MultiExprArg Exprs,
11207 Expr *AsmString, MultiExprArg Clobbers,
11208 unsigned NumLabels, SourceLocation RParenLoc);
11209
11211 llvm::InlineAsmIdentifierInfo &Info);
11213 SourceLocation TemplateKWLoc,
11215 bool IsUnevaluatedContext);
11216 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
11217 SourceLocation AsmLoc);
11219 SourceLocation AsmLoc);
11221 ArrayRef<Token> AsmToks, StringRef AsmString,
11222 unsigned NumOutputs, unsigned NumInputs,
11223 ArrayRef<StringRef> Constraints,
11224 ArrayRef<StringRef> Clobbers,
11225 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
11226 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
11227 SourceLocation Location, bool AlwaysCreate);
11228
11229 ///@}
11230
11231 //
11232 //
11233 // -------------------------------------------------------------------------
11234 //
11235 //
11236
11237 /// \name Statement Attribute Handling
11238 /// Implementations are in SemaStmtAttr.cpp
11239 ///@{
11240
11241public:
11242 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11243 const AttributeCommonInfo &A);
11244 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
11245 const AttributeCommonInfo &A);
11246
11247 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11249
11250 /// Process the attributes before creating an attributed statement. Returns
11251 /// the semantic attributes that have been processed.
11252 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11254
11258 const IdentifierInfo *AttrName,
11260
11261 ///@}
11262
11263 //
11264 //
11265 // -------------------------------------------------------------------------
11266 //
11267 //
11268
11269 /// \name C++ Templates
11270 /// Implementations are in SemaTemplate.cpp
11271 ///@{
11272
11273public:
11274 // Saves the current floating-point pragma stack and clear it in this Sema.
11276 public:
11278 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11279 S.FpPragmaStack.Stack.clear();
11280 }
11281 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11282
11283 private:
11284 Sema &S;
11286 };
11287
11289 CurFPFeatures = FPO;
11290 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11291 }
11292
11294 return llvm::ArrayRef(InventedParameterInfos.begin() +
11297 }
11298
11299 /// The number of SFINAE diagnostics that have been trapped.
11301
11304 FunctionScopes.end());
11305 }
11306
11307 typedef llvm::MapVector<const FunctionDecl *,
11308 std::unique_ptr<LateParsedTemplate>>
11311
11312 /// Determine the number of levels of enclosing template parameters. This is
11313 /// only usable while parsing. Note that this does not include dependent
11314 /// contexts in which no template parameters have yet been declared, such as
11315 /// in a terse function template or generic lambda before the first 'auto' is
11316 /// encountered.
11317 unsigned getTemplateDepth(Scope *S) const;
11318
11320 bool AllowFunctionTemplates = true,
11321 bool AllowDependent = true);
11323 bool AllowFunctionTemplates = true,
11324 bool AllowDependent = true,
11325 bool AllowNonTemplateFunctions = false);
11326 /// Try to interpret the lookup result D as a template-name.
11327 ///
11328 /// \param D A declaration found by name lookup.
11329 /// \param AllowFunctionTemplates Whether function templates should be
11330 /// considered valid results.
11331 /// \param AllowDependent Whether unresolved using declarations (that might
11332 /// name templates) should be considered valid results.
11334 bool AllowFunctionTemplates = true,
11335 bool AllowDependent = true);
11336
11338 /// Whether and why a template name is required in this lookup.
11340 public:
11341 /// Template name is required if TemplateKWLoc is valid.
11343 : TemplateKW(TemplateKWLoc) {}
11344 /// Template name is unconditionally required.
11346
11348 return TemplateKW.value_or(SourceLocation());
11349 }
11350 bool hasTemplateKeyword() const {
11351 return getTemplateKeywordLoc().isValid();
11352 }
11353 bool isRequired() const { return TemplateKW != SourceLocation(); }
11354 explicit operator bool() const { return isRequired(); }
11355
11356 private:
11357 std::optional<SourceLocation> TemplateKW;
11358 };
11359
11361 /// This is not assumed to be a template name.
11362 None,
11363 /// This is assumed to be a template name because lookup found nothing.
11365 /// This is assumed to be a template name because lookup found one or more
11366 /// functions (but no function templates).
11368 };
11369
11370 bool
11372 QualType ObjectType, bool EnteringContext,
11373 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11374 AssumedTemplateKind *ATK = nullptr,
11375 bool AllowTypoCorrection = true);
11376
11378 bool hasTemplateKeyword,
11379 const UnqualifiedId &Name,
11380 ParsedType ObjectType, bool EnteringContext,
11382 bool &MemberOfUnknownSpecialization,
11383 bool Disambiguation = false);
11384
11385 /// Try to resolve an undeclared template name as a type template.
11386 ///
11387 /// Sets II to the identifier corresponding to the template name, and updates
11388 /// Name to a corresponding (typo-corrected) type template name and TNK to
11389 /// the corresponding kind, if possible.
11391 TemplateNameKind &TNK,
11392 SourceLocation NameLoc,
11393 IdentifierInfo *&II);
11394
11396 SourceLocation NameLoc,
11397 bool Diagnose = true);
11398
11399 /// Determine whether a particular identifier might be the name in a C++1z
11400 /// deduction-guide declaration.
11401 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11402 SourceLocation NameLoc, CXXScopeSpec &SS,
11403 ParsedTemplateTy *Template = nullptr);
11404
11406 SourceLocation IILoc, Scope *S,
11407 const CXXScopeSpec *SS,
11408 TemplateTy &SuggestedTemplate,
11409 TemplateNameKind &SuggestedKind);
11410
11411 /// Determine whether we would be unable to instantiate this template (because
11412 /// it either has no definition, or is in the process of being instantiated).
11414 SourceLocation PointOfInstantiation, NamedDecl *Instantiation,
11415 bool InstantiatedFromMember, const NamedDecl *Pattern,
11416 const NamedDecl *PatternDef, TemplateSpecializationKind TSK,
11417 bool Complain = true, bool *Unreachable = nullptr);
11418
11419 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11420 /// that the template parameter 'PrevDecl' is being shadowed by a new
11421 /// declaration at location Loc. Returns true to indicate that this is
11422 /// an error, and false otherwise.
11423 ///
11424 /// \param Loc The location of the declaration that shadows a template
11425 /// parameter.
11426 ///
11427 /// \param PrevDecl The template parameter that the declaration shadows.
11428 ///
11429 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11430 /// a warning for compatibility with older versions of clang.
11431 /// Ignored when MSVC compatibility is enabled.
11433 bool SupportedForCompatibility = false);
11434
11435 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11436 /// the parameter D to reference the templated declaration and return a
11437 /// pointer to the template declaration. Otherwise, do nothing to D and return
11438 /// null.
11440
11441 /// ActOnTypeParameter - Called when a C++ template type parameter
11442 /// (e.g., "typename T") has been parsed. Typename specifies whether
11443 /// the keyword "typename" was used to declare the type parameter
11444 /// (otherwise, "class" was used), and KeyLoc is the location of the
11445 /// "class" or "typename" keyword. ParamName is the name of the
11446 /// parameter (NULL indicates an unnamed template parameter) and
11447 /// ParamNameLoc is the location of the parameter name (if any).
11448 /// If the type parameter has a default argument, it will be added
11449 /// later via ActOnTypeParameterDefault.
11451 SourceLocation EllipsisLoc,
11452 SourceLocation KeyLoc,
11453 IdentifierInfo *ParamName,
11454 SourceLocation ParamNameLoc, unsigned Depth,
11455 unsigned Position, SourceLocation EqualLoc,
11456 ParsedType DefaultArg, bool HasTypeConstraint);
11457
11459
11460 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11462 TemplateTypeParmDecl *ConstrainedParameter,
11463 SourceLocation EllipsisLoc);
11464 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11466 TemplateTypeParmDecl *ConstrainedParameter,
11467 SourceLocation EllipsisLoc,
11468 bool AllowUnexpandedPack);
11469
11470 /// Attach a type-constraint to a template parameter.
11471 /// \returns true if an error occurred. This can happen if the
11472 /// immediately-declared constraint could not be formed (e.g. incorrect number
11473 /// of arguments for the named concept).
11475 DeclarationNameInfo NameInfo,
11476 TemplateDecl *NamedConcept, NamedDecl *FoundDecl,
11477 const TemplateArgumentListInfo *TemplateArgs,
11478 TemplateTypeParmDecl *ConstrainedParameter,
11479 SourceLocation EllipsisLoc);
11480
11482 NonTypeTemplateParmDecl *NewConstrainedParm,
11483 NonTypeTemplateParmDecl *OrigConstrainedParm,
11484 SourceLocation EllipsisLoc);
11485
11486 /// Require the given type to be a structural type, and diagnose if it is not.
11487 ///
11488 /// \return \c true if an error was produced.
11490
11491 /// Check that the type of a non-type template parameter is
11492 /// well-formed.
11493 ///
11494 /// \returns the (possibly-promoted) parameter type if valid;
11495 /// otherwise, produces a diagnostic and returns a NULL type.
11499
11501 unsigned Depth, unsigned Position,
11502 SourceLocation EqualLoc,
11503 Expr *DefaultArg);
11504
11505 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11506 /// parameter (e.g. T in template <template <typename> class T> class array)
11507 /// has been parsed. S is the current scope.
11510 bool TypenameKeyword, TemplateParameterList *Params,
11511 SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11512 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11513 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11514
11515 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11516 /// constrained by RequiresClause, that contains the template parameters in
11517 /// Params.
11519 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11520 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11521 SourceLocation RAngleLoc, Expr *RequiresClause);
11522
11523 /// The context in which we are checking a template parameter list.
11525 // For this context, Class, Variable, TypeAlias, and non-pack Template
11526 // Template Parameters are treated uniformly.
11528
11535 };
11536
11537 /// Checks the validity of a template parameter list, possibly
11538 /// considering the template parameter list from a previous
11539 /// declaration.
11540 ///
11541 /// If an "old" template parameter list is provided, it must be
11542 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11543 /// template parameter list.
11544 ///
11545 /// \param NewParams Template parameter list for a new template
11546 /// declaration. This template parameter list will be updated with any
11547 /// default arguments that are carried through from the previous
11548 /// template parameter list.
11549 ///
11550 /// \param OldParams If provided, template parameter list from a
11551 /// previous declaration of the same template. Default template
11552 /// arguments will be merged from the old template parameter list to
11553 /// the new template parameter list.
11554 ///
11555 /// \param TPC Describes the context in which we are checking the given
11556 /// template parameter list.
11557 ///
11558 /// \param SkipBody If we might have already made a prior merged definition
11559 /// of this template visible, the corresponding body-skipping information.
11560 /// Default argument redefinition is not an error when skipping such a body,
11561 /// because (under the ODR) we can assume the default arguments are the same
11562 /// as the prior merged definition.
11563 ///
11564 /// \returns true if an error occurred, false otherwise.
11566 TemplateParameterList *OldParams,
11568 SkipBodyInfo *SkipBody = nullptr);
11569
11570 /// Match the given template parameter lists to the given scope
11571 /// specifier, returning the template parameter list that applies to the
11572 /// name.
11573 ///
11574 /// \param DeclStartLoc the start of the declaration that has a scope
11575 /// specifier or a template parameter list.
11576 ///
11577 /// \param DeclLoc The location of the declaration itself.
11578 ///
11579 /// \param SS the scope specifier that will be matched to the given template
11580 /// parameter lists. This scope specifier precedes a qualified name that is
11581 /// being declared.
11582 ///
11583 /// \param TemplateId The template-id following the scope specifier, if there
11584 /// is one. Used to check for a missing 'template<>'.
11585 ///
11586 /// \param ParamLists the template parameter lists, from the outermost to the
11587 /// innermost template parameter lists.
11588 ///
11589 /// \param IsFriend Whether to apply the slightly different rules for
11590 /// matching template parameters to scope specifiers in friend
11591 /// declarations.
11592 ///
11593 /// \param IsMemberSpecialization will be set true if the scope specifier
11594 /// denotes a fully-specialized type, and therefore this is a declaration of
11595 /// a member specialization.
11596 ///
11597 /// \returns the template parameter list, if any, that corresponds to the
11598 /// name that is preceded by the scope specifier @p SS. This template
11599 /// parameter list may have template parameters (if we're declaring a
11600 /// template) or may have no template parameters (if we're declaring a
11601 /// template specialization), or may be NULL (if what we're declaring isn't
11602 /// itself a template).
11604 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11605 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11606 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11607 bool &IsMemberSpecialization, bool &Invalid,
11608 bool SuppressDiagnostic = false);
11609
11610 /// Returns the template parameter list with all default template argument
11611 /// information.
11613
11615 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11616 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11617 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11618 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11619 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11620 TemplateParameterList **OuterTemplateParamLists,
11621 SkipBodyInfo *SkipBody = nullptr);
11622
11623 /// Translates template arguments as provided by the parser
11624 /// into template arguments used by semantic analysis.
11627
11628 /// Convert a parsed type into a parsed template argument. This is mostly
11629 /// trivial, except that we may have parsed a C++17 deduced class template
11630 /// specialization type, in which case we should form a template template
11631 /// argument instead of a type template argument.
11633
11635
11638 SourceLocation TemplateLoc,
11639 TemplateArgumentListInfo &TemplateArgs);
11640
11642 ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword,
11643 SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS,
11644 SourceLocation TemplateKWLoc, TemplateTy Template,
11645 const IdentifierInfo *TemplateII,
11646 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11647 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11648 bool IsCtorOrDtorName = false, bool IsClassName = false,
11649 ImplicitTypenameContext AllowImplicitTypename =
11651
11652 /// Parsed an elaborated-type-specifier that refers to a template-id,
11653 /// such as \c class T::template apply<U>.
11655 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11656 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11657 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11658 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11659
11662 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11664
11665 /// Get the specialization of the given variable template corresponding to
11666 /// the specified argument list, or a null-but-valid result if the arguments
11667 /// are dependent.
11669 SourceLocation TemplateLoc,
11670 SourceLocation TemplateNameLoc,
11671 const TemplateArgumentListInfo &TemplateArgs);
11672
11673 /// Form a reference to the specialization of the given variable template
11674 /// corresponding to the specified argument list, or a null-but-valid result
11675 /// if the arguments are dependent.
11677 const DeclarationNameInfo &NameInfo,
11679 SourceLocation TemplateLoc,
11680 const TemplateArgumentListInfo *TemplateArgs);
11681
11683 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
11685 const TemplateArgumentListInfo *TemplateArgs);
11686
11688 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11689 const DeclarationNameInfo &ConceptNameInfo,
11690 NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
11691 const TemplateArgumentListInfo *TemplateArgs);
11692
11695 bool TemplateKeyword, TemplateDecl *TD,
11697
11699 SourceLocation TemplateKWLoc, LookupResult &R,
11700 bool RequiresADL,
11701 const TemplateArgumentListInfo *TemplateArgs);
11702
11703 // We actually only call this from template instantiation.
11706 const DeclarationNameInfo &NameInfo,
11707 const TemplateArgumentListInfo *TemplateArgs,
11708 bool IsAddressOfOperand);
11709
11710 /// Form a template name from a name that is syntactically required to name a
11711 /// template, either due to use of the 'template' keyword or because a name in
11712 /// this syntactic context is assumed to name a template (C++
11713 /// [temp.names]p2-4).
11714 ///
11715 /// This action forms a template name given the name of the template and its
11716 /// optional scope specifier. This is used when the 'template' keyword is used
11717 /// or when the parsing context unambiguously treats a following '<' as
11718 /// introducing a template argument list. Note that this may produce a
11719 /// non-dependent template name if we can perform the lookup now and identify
11720 /// the named template.
11721 ///
11722 /// For example, given "x.MetaFun::template apply", the scope specifier
11723 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11724 /// of the "template" keyword, and "apply" is the \p Name.
11726 SourceLocation TemplateKWLoc,
11727 const UnqualifiedId &Name,
11728 ParsedType ObjectType,
11729 bool EnteringContext, TemplateTy &Template,
11730 bool AllowInjectedClassName = false);
11731
11733 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11734 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11736 MultiTemplateParamsArg TemplateParameterLists,
11737 SkipBodyInfo *SkipBody = nullptr);
11738
11739 /// Check the non-type template arguments of a class template
11740 /// partial specialization according to C++ [temp.class.spec]p9.
11741 ///
11742 /// \param TemplateNameLoc the location of the template name.
11743 /// \param PrimaryTemplate the template parameters of the primary class
11744 /// template.
11745 /// \param NumExplicit the number of explicitly-specified template arguments.
11746 /// \param TemplateArgs the template arguments of the class template
11747 /// partial specialization.
11748 ///
11749 /// \returns \c true if there was an error, \c false otherwise.
11751 TemplateDecl *PrimaryTemplate,
11752 unsigned NumExplicitArgs,
11758
11760 MultiTemplateParamsArg TemplateParameterLists,
11761 Declarator &D);
11762
11763 /// Diagnose cases where we have an explicit template specialization
11764 /// before/after an explicit template instantiation, producing diagnostics
11765 /// for those cases where they are required and determining whether the
11766 /// new specialization/instantiation will have any effect.
11767 ///
11768 /// \param NewLoc the location of the new explicit specialization or
11769 /// instantiation.
11770 ///
11771 /// \param NewTSK the kind of the new explicit specialization or
11772 /// instantiation.
11773 ///
11774 /// \param PrevDecl the previous declaration of the entity.
11775 ///
11776 /// \param PrevTSK the kind of the old explicit specialization or
11777 /// instantiatin.
11778 ///
11779 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11780 /// declaration was instantiated (either implicitly or explicitly).
11781 ///
11782 /// \param HasNoEffect will be set to true to indicate that the new
11783 /// specialization or instantiation has no effect and should be ignored.
11784 ///
11785 /// \returns true if there was an error that should prevent the introduction
11786 /// of the new declaration into the AST, false otherwise.
11788 SourceLocation NewLoc,
11789 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11790 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11791 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11792
11793 /// Perform semantic analysis for the given dependent function
11794 /// template specialization.
11795 ///
11796 /// The only possible way to get a dependent function template specialization
11797 /// is with a friend declaration, like so:
11798 ///
11799 /// \code
11800 /// template <class T> void foo(T);
11801 /// template <class T> class A {
11802 /// friend void foo<>(T);
11803 /// };
11804 /// \endcode
11805 ///
11806 /// There really isn't any useful analysis we can do here, so we
11807 /// just store the information.
11809 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
11811
11812 /// Perform semantic analysis for the given function template
11813 /// specialization.
11814 ///
11815 /// This routine performs all of the semantic analysis required for an
11816 /// explicit function template specialization. On successful completion,
11817 /// the function declaration \p FD will become a function template
11818 /// specialization.
11819 ///
11820 /// \param FD the function declaration, which will be updated to become a
11821 /// function template specialization.
11822 ///
11823 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
11824 /// if any. Note that this may be valid info even when 0 arguments are
11825 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
11826 /// as it anyway contains info on the angle brackets locations.
11827 ///
11828 /// \param Previous the set of declarations that may be specialized by
11829 /// this function specialization.
11830 ///
11831 /// \param QualifiedFriend whether this is a lookup for a qualified friend
11832 /// declaration with no explicit template argument list that might be
11833 /// befriending a function template specialization.
11835 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
11836 LookupResult &Previous, bool QualifiedFriend = false);
11837
11838 /// Perform semantic analysis for the given non-template member
11839 /// specialization.
11840 ///
11841 /// This routine performs all of the semantic analysis required for an
11842 /// explicit member function specialization. On successful completion,
11843 /// the function declaration \p FD will become a member function
11844 /// specialization.
11845 ///
11846 /// \param Member the member declaration, which will be updated to become a
11847 /// specialization.
11848 ///
11849 /// \param Previous the set of declarations, one of which may be specialized
11850 /// by this function specialization; the set will be modified to contain the
11851 /// redeclared member.
11854
11855 // Explicit instantiation of a class template specialization
11857 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
11858 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
11859 TemplateTy Template, SourceLocation TemplateNameLoc,
11860 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
11861 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
11862
11863 // Explicit instantiation of a member class of a class template.
11865 SourceLocation TemplateLoc,
11866 unsigned TagSpec, SourceLocation KWLoc,
11867 CXXScopeSpec &SS, IdentifierInfo *Name,
11868 SourceLocation NameLoc,
11869 const ParsedAttributesView &Attr);
11870
11872 SourceLocation TemplateLoc,
11873 Declarator &D);
11874
11875 /// If the given template parameter has a default template
11876 /// argument, substitute into that default template argument and
11877 /// return the corresponding template argument.
11879 TemplateDecl *Template, SourceLocation TemplateKWLoc,
11880 SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param,
11881 ArrayRef<TemplateArgument> SugaredConverted,
11882 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
11883
11884 /// Returns the top most location responsible for the definition of \p N.
11885 /// If \p N is a a template specialization, this is the location
11886 /// of the top of the instantiation stack.
11887 /// Otherwise, the location of \p N is returned.
11889
11890 /// Specifies the context in which a particular template
11891 /// argument is being checked.
11893 /// The template argument was specified in the code or was
11894 /// instantiated with some deduced template arguments.
11896
11897 /// The template argument was deduced via template argument
11898 /// deduction.
11900
11901 /// The template argument was deduced from an array bound
11902 /// via template argument deduction.
11905
11907 explicit CheckTemplateArgumentInfo(bool PartialOrdering = false,
11908 bool MatchingTTP = false)
11909 : PartialOrdering(PartialOrdering), MatchingTTP(MatchingTTP) {}
11913
11914 /// The checked, converted argument will be added to the
11915 /// end of these vectors.
11917
11918 /// The check is being performed in the context of partial ordering.
11920
11921 /// If true, assume these template arguments are
11922 /// the injected template arguments for a template template parameter.
11923 /// This will relax the requirement that all its possible uses are valid:
11924 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
11925 /// during instantiation.
11927
11928 /// Is set to true when, in the context of TTP matching, a pack parameter
11929 /// matches non-pack arguments.
11930 bool StrictPackMatch = false;
11931 };
11932
11933 /// Check that the given template argument corresponds to the given
11934 /// template parameter.
11935 ///
11936 /// \param Param The template parameter against which the argument will be
11937 /// checked.
11938 ///
11939 /// \param Arg The template argument, which may be updated due to conversions.
11940 ///
11941 /// \param Template The template in which the template argument resides.
11942 ///
11943 /// \param TemplateLoc The location of the template name for the template
11944 /// whose argument list we're matching.
11945 ///
11946 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
11947 /// the template argument list.
11948 ///
11949 /// \param ArgumentPackIndex The index into the argument pack where this
11950 /// argument will be placed. Only valid if the parameter is a parameter pack.
11951 ///
11952 /// \param CTAK Describes how we arrived at this particular template argument:
11953 /// explicitly written, deduced, etc.
11954 ///
11955 /// \returns true on error, false otherwise.
11957 NamedDecl *Template, SourceLocation TemplateLoc,
11958 SourceLocation RAngleLoc,
11959 unsigned ArgumentPackIndex,
11962
11963 /// Check that the given template arguments can be provided to
11964 /// the given template, converting the arguments along the way.
11965 ///
11966 /// \param Template The template to which the template arguments are being
11967 /// provided.
11968 ///
11969 /// \param TemplateLoc The location of the template name in the source.
11970 ///
11971 /// \param TemplateArgs The list of template arguments. If the template is
11972 /// a template template parameter, this function may extend the set of
11973 /// template arguments to also include substituted, defaulted template
11974 /// arguments.
11975 ///
11976 /// \param PartialTemplateArgs True if the list of template arguments is
11977 /// intentionally partial, e.g., because we're checking just the initial
11978 /// set of template arguments.
11979 ///
11980 /// \param Converted Will receive the converted, canonicalized template
11981 /// arguments.
11982 ///
11983 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
11984 /// contain the converted forms of the template arguments as written.
11985 /// Otherwise, \p TemplateArgs will not be modified.
11986 ///
11987 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
11988 /// receive true if the cause for the error is the associated constraints of
11989 /// the template not being satisfied by the template arguments.
11990 ///
11991 /// \param DefaultArgs any default arguments from template specialization
11992 /// deduction.
11993 ///
11994 /// \returns true if an error occurred, false otherwise.
11996 SourceLocation TemplateLoc,
11997 TemplateArgumentListInfo &TemplateArgs,
11998 const DefaultArguments &DefaultArgs,
11999 bool PartialTemplateArgs,
12001 bool UpdateArgsWithConversions = true,
12002 bool *ConstraintsNotSatisfied = nullptr);
12003
12006 SmallVectorImpl<TemplateArgument> &SugaredConverted,
12007 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
12008
12009 /// Check a template argument against its corresponding
12010 /// template type parameter.
12011 ///
12012 /// This routine implements the semantics of C++ [temp.arg.type]. It
12013 /// returns true if an error occurred, and false otherwise.
12015
12016 /// Check a template argument against its corresponding
12017 /// non-type template parameter.
12018 ///
12019 /// This routine implements the semantics of C++ [temp.arg.nontype].
12020 /// If an error occurred, it returns ExprError(); otherwise, it
12021 /// returns the converted template argument. \p ParamType is the
12022 /// type of the non-type template parameter after it has been instantiated.
12024 QualType InstantiatedParamType, Expr *Arg,
12025 TemplateArgument &SugaredConverted,
12026 TemplateArgument &CanonicalConverted,
12027 bool StrictCheck,
12029
12030 /// Check a template argument against its corresponding
12031 /// template template parameter.
12032 ///
12033 /// This routine implements the semantics of C++ [temp.arg.template].
12034 /// It returns true if an error occurred, and false otherwise.
12036 TemplateParameterList *Params,
12038 bool PartialOrdering,
12039 bool *StrictPackMatch);
12040
12043 const TemplateArgumentLoc &Arg);
12044
12046 std::optional<SourceRange> ParamRange = {});
12048
12049 /// Given a non-type template argument that refers to a
12050 /// declaration and the type of its corresponding non-type template
12051 /// parameter, produce an expression that properly refers to that
12052 /// declaration.
12053 /// FIXME: This is used in some contexts where the resulting expression
12054 /// doesn't need to live too long. It would be useful if this function
12055 /// could return a temporary expression.
12057 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc,
12058 NamedDecl *TemplateParam = nullptr);
12062
12063 /// Enumeration describing how template parameter lists are compared
12064 /// for equality.
12066 /// We are matching the template parameter lists of two templates
12067 /// that might be redeclarations.
12068 ///
12069 /// \code
12070 /// template<typename T> struct X;
12071 /// template<typename T> struct X;
12072 /// \endcode
12074
12075 /// We are matching the template parameter lists of two template
12076 /// template parameters as part of matching the template parameter lists
12077 /// of two templates that might be redeclarations.
12078 ///
12079 /// \code
12080 /// template<template<int I> class TT> struct X;
12081 /// template<template<int Value> class Other> struct X;
12082 /// \endcode
12084
12085 /// We are determining whether the template-parameters are equivalent
12086 /// according to C++ [temp.over.link]/6. This comparison does not consider
12087 /// constraints.
12088 ///
12089 /// \code
12090 /// template<C1 T> void f(T);
12091 /// template<C2 T> void f(T);
12092 /// \endcode
12094 };
12095
12096 // A struct to represent the 'new' declaration, which is either itself just
12097 // the named decl, or the important information we need about it in order to
12098 // do constraint comparisons.
12100 const NamedDecl *ND = nullptr;
12101 const DeclContext *DC = nullptr;
12102 const DeclContext *LexicalDC = nullptr;
12104
12105 public:
12108 const DeclContext *LexicalDeclCtx,
12110
12111 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
12112 assert(DC && LexicalDC &&
12113 "Constructor only for cases where we have the information to put "
12114 "in here");
12115 }
12116
12117 // If this was constructed with no information, we cannot do substitution
12118 // for constraint comparison, so make sure we can check that.
12119 bool isInvalid() const { return !ND && !DC; }
12120
12121 const NamedDecl *getDecl() const { return ND; }
12122
12123 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
12124
12126 return ND ? ND->getLexicalDeclContext() : LexicalDC;
12127 }
12128
12130 return ND ? ND->getDeclContext() : DC;
12131 }
12132
12133 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
12134 };
12135
12136 /// Determine whether the given template parameter lists are
12137 /// equivalent.
12138 ///
12139 /// \param New The new template parameter list, typically written in the
12140 /// source code as part of a new template declaration.
12141 ///
12142 /// \param Old The old template parameter list, typically found via
12143 /// name lookup of the template declared with this template parameter
12144 /// list.
12145 ///
12146 /// \param Complain If true, this routine will produce a diagnostic if
12147 /// the template parameter lists are not equivalent.
12148 ///
12149 /// \param Kind describes how we are to match the template parameter lists.
12150 ///
12151 /// \param TemplateArgLoc If this source location is valid, then we
12152 /// are actually checking the template parameter list of a template
12153 /// argument (New) against the template parameter list of its
12154 /// corresponding template template parameter (Old). We produce
12155 /// slightly different diagnostics in this scenario.
12156 ///
12157 /// \returns True if the template parameter lists are equal, false
12158 /// otherwise.
12160 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
12161 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
12163 SourceLocation TemplateArgLoc = SourceLocation());
12164
12166 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
12168 SourceLocation TemplateArgLoc = SourceLocation()) {
12169 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
12170 Kind, TemplateArgLoc);
12171 }
12172
12173 /// Check whether a template can be declared within this scope.
12174 ///
12175 /// If the template declaration is valid in this scope, returns
12176 /// false. Otherwise, issues a diagnostic and returns true.
12177 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
12178
12179 /// Called when the parser has parsed a C++ typename
12180 /// specifier, e.g., "typename T::type".
12181 ///
12182 /// \param S The scope in which this typename type occurs.
12183 /// \param TypenameLoc the location of the 'typename' keyword
12184 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12185 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
12186 /// \param IdLoc the location of the identifier.
12187 /// \param IsImplicitTypename context where T::type refers to a type.
12189 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
12190 const IdentifierInfo &II, SourceLocation IdLoc,
12192
12193 /// Called when the parser has parsed a C++ typename
12194 /// specifier that ends in a template-id, e.g.,
12195 /// "typename MetaFun::template apply<T1, T2>".
12196 ///
12197 /// \param S The scope in which this typename type occurs.
12198 /// \param TypenameLoc the location of the 'typename' keyword
12199 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
12200 /// \param TemplateLoc the location of the 'template' keyword, if any.
12201 /// \param TemplateName The template name.
12202 /// \param TemplateII The identifier used to name the template.
12203 /// \param TemplateIILoc The location of the template name.
12204 /// \param LAngleLoc The location of the opening angle bracket ('<').
12205 /// \param TemplateArgs The template arguments.
12206 /// \param RAngleLoc The location of the closing angle bracket ('>').
12208 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
12209 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
12210 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
12211 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
12212 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
12213
12215 SourceLocation KeywordLoc,
12216 NestedNameSpecifierLoc QualifierLoc,
12217 const IdentifierInfo &II, SourceLocation IILoc,
12218 TypeSourceInfo **TSI, bool DeducedTSTContext);
12219
12221 SourceLocation KeywordLoc,
12222 NestedNameSpecifierLoc QualifierLoc,
12223 const IdentifierInfo &II, SourceLocation IILoc,
12224 bool DeducedTSTContext = true);
12225
12226 /// Rebuilds a type within the context of the current instantiation.
12227 ///
12228 /// The type \p T is part of the type of an out-of-line member definition of
12229 /// a class template (or class template partial specialization) that was
12230 /// parsed and constructed before we entered the scope of the class template
12231 /// (or partial specialization thereof). This routine will rebuild that type
12232 /// now that we have entered the declarator's scope, which may produce
12233 /// different canonical types, e.g.,
12234 ///
12235 /// \code
12236 /// template<typename T>
12237 /// struct X {
12238 /// typedef T* pointer;
12239 /// pointer data();
12240 /// };
12241 ///
12242 /// template<typename T>
12243 /// typename X<T>::pointer X<T>::data() { ... }
12244 /// \endcode
12245 ///
12246 /// Here, the type "typename X<T>::pointer" will be created as a
12247 /// DependentNameType, since we do not know that we can look into X<T> when we
12248 /// parsed the type. This function will rebuild the type, performing the
12249 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
12250 /// canonical type is the same as the canonical type of T*, allowing the
12251 /// return types of the out-of-line definition and the declaration to match.
12254 DeclarationName Name);
12256
12258
12259 /// Rebuild the template parameters now that we know we're in a current
12260 /// instantiation.
12261 bool
12263
12264 /// Produces a formatted string that describes the binding of
12265 /// template parameters to template arguments.
12266 std::string
12268 const TemplateArgumentList &Args);
12269
12270 std::string
12272 const TemplateArgument *Args,
12273 unsigned NumArgs);
12274
12278
12279 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12280 /// was just parsed. This is only possible with an explicit scope
12281 /// specifier naming a dependent type.
12283 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12284 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12285 const TemplateArgumentListInfo *TemplateArgs);
12286
12289 SourceLocation TemplateKWLoc,
12290 const DeclarationNameInfo &NameInfo,
12291 const TemplateArgumentListInfo *TemplateArgs);
12292
12293 // Calculates whether the expression Constraint depends on an enclosing
12294 // template, for the purposes of [temp.friend] p9.
12295 // TemplateDepth is the 'depth' of the friend function, which is used to
12296 // compare whether a declaration reference is referring to a containing
12297 // template, or just the current friend function. A 'lower' TemplateDepth in
12298 // the AST refers to a 'containing' template. As the constraint is
12299 // uninstantiated, this is relative to the 'top' of the TU.
12300 bool
12302 unsigned TemplateDepth,
12303 const Expr *Constraint);
12304
12305 /// Find the failed Boolean condition within a given Boolean
12306 /// constant expression, and describe it with a string.
12307 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12308
12310
12312 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12313 const IdentifierInfo *Name, SourceLocation NameLoc);
12314
12316 Expr *ConstraintExpr,
12317 const ParsedAttributesView &Attrs);
12318
12320 bool &AddToScope);
12322
12323 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12324 const CXXScopeSpec &SS,
12325 const IdentifierInfo *Name,
12326 SourceLocation TagLoc, SourceLocation NameLoc);
12327
12329 CachedTokens &Toks);
12332
12333 /// We've found a use of a templated declaration that would trigger an
12334 /// implicit instantiation. Check that any relevant explicit specializations
12335 /// and partial specializations are visible/reachable, and diagnose if not.
12338
12339 ///@}
12340
12341 //
12342 //
12343 // -------------------------------------------------------------------------
12344 //
12345 //
12346
12347 /// \name C++ Template Argument Deduction
12348 /// Implementations are in SemaTemplateDeduction.cpp
12349 ///@{
12350
12351public:
12352 /// When true, access checking violations are treated as SFINAE
12353 /// failures rather than hard errors.
12355
12356 /// RAII class used to determine whether SFINAE has
12357 /// trapped any errors that occur during template argument
12358 /// deduction.
12360 Sema &SemaRef;
12361 unsigned PrevSFINAEErrors;
12362 bool PrevInNonInstantiationSFINAEContext;
12363 bool PrevAccessCheckingSFINAE;
12364 bool PrevLastDiagnosticIgnored;
12365
12366 public:
12367 /// \param ForValidityCheck If true, discard all diagnostics (from the
12368 /// immediate context) instead of adding them to the currently active
12369 /// \ref TemplateDeductionInfo (as returned by \ref isSFINAEContext).
12370 explicit SFINAETrap(Sema &SemaRef, bool ForValidityCheck = false)
12371 : SemaRef(SemaRef), PrevSFINAEErrors(SemaRef.NumSFINAEErrors),
12372 PrevInNonInstantiationSFINAEContext(
12373 SemaRef.InNonInstantiationSFINAEContext),
12374 PrevAccessCheckingSFINAE(SemaRef.AccessCheckingSFINAE),
12375 PrevLastDiagnosticIgnored(
12376 SemaRef.getDiagnostics().isLastDiagnosticIgnored()) {
12377 if (ForValidityCheck || !SemaRef.isSFINAEContext())
12378 SemaRef.InNonInstantiationSFINAEContext = true;
12379 SemaRef.AccessCheckingSFINAE = ForValidityCheck;
12380 }
12381
12383 SemaRef.NumSFINAEErrors = PrevSFINAEErrors;
12385 PrevInNonInstantiationSFINAEContext;
12386 SemaRef.AccessCheckingSFINAE = PrevAccessCheckingSFINAE;
12388 PrevLastDiagnosticIgnored);
12389 }
12390
12391 /// Determine whether any SFINAE errors have been trapped.
12392 bool hasErrorOccurred() const {
12393 return SemaRef.NumSFINAEErrors > PrevSFINAEErrors;
12394 }
12395 };
12396
12397 /// RAII class used to indicate that we are performing provisional
12398 /// semantic analysis to determine the validity of a construct, so
12399 /// typo-correction and diagnostics in the immediate context (not within
12400 /// implicitly-instantiated templates) should be suppressed.
12402 Sema &SemaRef;
12403 // FIXME: Using a SFINAETrap for this is a hack.
12404 SFINAETrap Trap;
12405 bool PrevDisableTypoCorrection;
12406
12407 public:
12408 explicit TentativeAnalysisScope(Sema &SemaRef)
12409 : SemaRef(SemaRef), Trap(SemaRef, /*ForValidityCheck=*/true),
12410 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12411 SemaRef.DisableTypoCorrection = true;
12412 }
12414 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12415 }
12416 };
12417
12418 /// For each declaration that involved template argument deduction, the
12419 /// set of diagnostics that were suppressed during that template argument
12420 /// deduction.
12421 ///
12422 /// FIXME: Serialize this structure to the AST file.
12423 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12426
12427 /// Compare types for equality with respect to possibly compatible
12428 /// function types (noreturn adjustment, implicit calling conventions). If any
12429 /// of parameter and argument is not a function, just perform type comparison.
12430 ///
12431 /// \param P the template parameter type.
12432 ///
12433 /// \param A the argument type.
12435
12436 /// Allocate a TemplateArgumentLoc where all locations have
12437 /// been initialized to the given location.
12438 ///
12439 /// \param Arg The template argument we are producing template argument
12440 /// location information for.
12441 ///
12442 /// \param NTTPType For a declaration template argument, the type of
12443 /// the non-type template parameter that corresponds to this template
12444 /// argument. Can be null if no type sugar is available to add to the
12445 /// type from the template argument.
12446 ///
12447 /// \param Loc The source location to use for the resulting template
12448 /// argument.
12452 NamedDecl *TemplateParam = nullptr);
12453
12454 /// Get a template argument mapping the given template parameter to itself,
12455 /// e.g. for X in \c template<int X>, this would return an expression template
12456 /// argument referencing X.
12458 SourceLocation Location);
12459
12460 /// Adjust the type \p ArgFunctionType to match the calling convention,
12461 /// noreturn, and optionally the exception specification of \p FunctionType.
12462 /// Deduction often wants to ignore these properties when matching function
12463 /// types.
12465 bool AdjustExceptionSpec = false);
12466
12469 ArrayRef<TemplateArgument> TemplateArgs,
12471
12474 ArrayRef<TemplateArgument> TemplateArgs,
12476
12477 /// Deduce the template arguments of the given template from \p FromType.
12478 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12479 /// [over.match.class.deduct]p4.
12480 ///
12481 /// It only supports class or type alias templates.
12485
12490 bool NumberOfArgumentsMustMatch);
12491
12492 /// Substitute the explicitly-provided template arguments into the
12493 /// given function template according to C++ [temp.arg.explicit].
12494 ///
12495 /// \param FunctionTemplate the function template into which the explicit
12496 /// template arguments will be substituted.
12497 ///
12498 /// \param ExplicitTemplateArgs the explicitly-specified template
12499 /// arguments.
12500 ///
12501 /// \param Deduced the deduced template arguments, which will be populated
12502 /// with the converted and checked explicit template arguments.
12503 ///
12504 /// \param ParamTypes will be populated with the instantiated function
12505 /// parameters.
12506 ///
12507 /// \param FunctionType if non-NULL, the result type of the function template
12508 /// will also be instantiated and the pointed-to value will be updated with
12509 /// the instantiated function type.
12510 ///
12511 /// \param Info if substitution fails for any reason, this object will be
12512 /// populated with more information about the failure.
12513 ///
12514 /// \returns TemplateDeductionResult::Success if substitution was successful,
12515 /// or some failure condition.
12518 TemplateArgumentListInfo &ExplicitTemplateArgs,
12522
12523 /// brief A function argument from which we performed template argument
12524 // deduction for a call.
12526 OriginalCallArg(QualType OriginalParamType, bool DecomposedParam,
12527 unsigned ArgIdx, QualType OriginalArgType)
12528 : OriginalParamType(OriginalParamType),
12529 DecomposedParam(DecomposedParam), ArgIdx(ArgIdx),
12530 OriginalArgType(OriginalArgType) {}
12531
12534 unsigned ArgIdx;
12536 };
12537
12538 /// Finish template argument deduction for a function template,
12539 /// checking the deduced template arguments for completeness and forming
12540 /// the function template specialization.
12541 ///
12542 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12543 /// which the deduced argument types should be compared.
12544 /// \param CheckNonDependent Callback before substituting into the declaration
12545 /// with the deduced template arguments.
12546 /// \param OnlyInitializeNonUserDefinedConversions is used as a workaround for
12547 /// some breakages introduced by CWG2369, where non-user-defined conversions
12548 /// are checked first before the constraints.
12552 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12554 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
12555 bool PartialOverloading, bool PartialOrdering,
12556 bool ForOverloadSetAddressResolution,
12557 llvm::function_ref<bool(bool)> CheckNonDependent =
12558 [](bool /*OnlyInitializeNonUserDefinedConversions*/) {
12559 return false;
12560 });
12561
12562 /// Perform template argument deduction from a function call
12563 /// (C++ [temp.deduct.call]).
12564 ///
12565 /// \param FunctionTemplate the function template for which we are performing
12566 /// template argument deduction.
12567 ///
12568 /// \param ExplicitTemplateArgs the explicit template arguments provided
12569 /// for this call.
12570 ///
12571 /// \param Args the function call arguments
12572 ///
12573 /// \param Specialization if template argument deduction was successful,
12574 /// this will be set to the function template specialization produced by
12575 /// template argument deduction.
12576 ///
12577 /// \param Info the argument will be updated to provide additional information
12578 /// about template argument deduction.
12579 ///
12580 /// \param CheckNonDependent A callback to invoke to check conversions for
12581 /// non-dependent parameters, between deduction and substitution, per DR1391.
12582 /// If this returns true, substitution will be skipped and we return
12583 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12584 /// passed the parameter types (after substituting explicit template
12585 /// arguments).
12586 ///
12587 /// \returns the result of template argument deduction.
12590 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12592 bool PartialOverloading, bool AggregateDeductionCandidate,
12593 bool PartialOrdering, QualType ObjectType,
12594 Expr::Classification ObjectClassification,
12595 bool ForOverloadSetAddressResolution,
12596 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent);
12597
12598 /// Deduce template arguments when taking the address of a function
12599 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12600 /// a template.
12601 ///
12602 /// \param FunctionTemplate the function template for which we are performing
12603 /// template argument deduction.
12604 ///
12605 /// \param ExplicitTemplateArgs the explicitly-specified template
12606 /// arguments.
12607 ///
12608 /// \param ArgFunctionType the function type that will be used as the
12609 /// "argument" type (A) when performing template argument deduction from the
12610 /// function template's function type. This type may be NULL, if there is no
12611 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12612 ///
12613 /// \param Specialization if template argument deduction was successful,
12614 /// this will be set to the function template specialization produced by
12615 /// template argument deduction.
12616 ///
12617 /// \param Info the argument will be updated to provide additional information
12618 /// about template argument deduction.
12619 ///
12620 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12621 /// the address of a function template per [temp.deduct.funcaddr] and
12622 /// [over.over]. If \c false, we are looking up a function template
12623 /// specialization based on its signature, per [temp.deduct.decl].
12624 ///
12625 /// \returns the result of template argument deduction.
12628 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12630 bool IsAddressOfFunction = false);
12631
12632 /// Deduce template arguments for a templated conversion
12633 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12634 /// conversion function template specialization.
12637 Expr::Classification ObjectClassification, QualType ToType,
12639
12640 /// Deduce template arguments for a function template when there is
12641 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12642 ///
12643 /// \param FunctionTemplate the function template for which we are performing
12644 /// template argument deduction.
12645 ///
12646 /// \param ExplicitTemplateArgs the explicitly-specified template
12647 /// arguments.
12648 ///
12649 /// \param Specialization if template argument deduction was successful,
12650 /// this will be set to the function template specialization produced by
12651 /// template argument deduction.
12652 ///
12653 /// \param Info the argument will be updated to provide additional information
12654 /// about template argument deduction.
12655 ///
12656 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12657 /// the address of a function template in a context where we do not have a
12658 /// target type, per [over.over]. If \c false, we are looking up a function
12659 /// template specialization based on its signature, which only happens when
12660 /// deducing a function parameter type from an argument that is a template-id
12661 /// naming a function template specialization.
12662 ///
12663 /// \returns the result of template argument deduction.
12666 TemplateArgumentListInfo *ExplicitTemplateArgs,
12669 bool IsAddressOfFunction = false);
12670
12671 /// Substitute Replacement for \p auto in \p TypeWithAuto
12672 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12673 /// Substitute Replacement for auto in TypeWithAuto
12675 QualType Replacement);
12676
12677 // Substitute auto in TypeWithAuto for a Dependent auto type
12679
12680 // Substitute auto in TypeWithAuto for a Dependent auto type
12683
12684 /// Completely replace the \c auto in \p TypeWithAuto by
12685 /// \p Replacement. This does not retain any \c auto type sugar.
12686 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12688 QualType Replacement);
12689
12690 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12691 ///
12692 /// Note that this is done even if the initializer is dependent. (This is
12693 /// necessary to support partial ordering of templates using 'auto'.)
12694 /// A dependent type will be produced when deducing from a dependent type.
12695 ///
12696 /// \param Type the type pattern using the auto type-specifier.
12697 /// \param Init the initializer for the variable whose type is to be deduced.
12698 /// \param Result if type deduction was successful, this will be set to the
12699 /// deduced type.
12700 /// \param Info the argument will be updated to provide additional information
12701 /// about template argument deduction.
12702 /// \param DependentDeduction Set if we should permit deduction in
12703 /// dependent cases. This is necessary for template partial ordering
12704 /// with 'auto' template parameters. The template parameter depth to be
12705 /// used should be specified in the 'Info' parameter.
12706 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12707 /// does not satisfy the type-constraint in the auto
12708 /// type.
12712 bool DependentDeduction = false,
12713 bool IgnoreConstraints = false,
12714 TemplateSpecCandidateSet *FailedTSC = nullptr);
12715 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12717 bool Diagnose = true);
12718
12721
12722 /// Returns the more specialized class template partial specialization
12723 /// according to the rules of partial ordering of class template partial
12724 /// specializations (C++ [temp.class.order]).
12725 ///
12726 /// \param PS1 the first class template partial specialization
12727 ///
12728 /// \param PS2 the second class template partial specialization
12729 ///
12730 /// \returns the more specialized class template partial specialization. If
12731 /// neither partial specialization is more specialized, returns NULL.
12736
12739
12743
12746
12748 TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg,
12749 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
12750 bool PartialOrdering, bool *StrictPackMatch);
12751
12752 /// Mark which template parameters are used in a given expression.
12753 ///
12754 /// \param E the expression from which template parameters will be deduced.
12755 ///
12756 /// \param Used a bit vector whose elements will be set to \c true
12757 /// to indicate when the corresponding template parameter will be
12758 /// deduced.
12759 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12760 unsigned Depth, llvm::SmallBitVector &Used);
12761
12762 /// Mark which template parameters can be deduced from a given
12763 /// template argument list.
12764 ///
12765 /// \param TemplateArgs the template argument list from which template
12766 /// parameters will be deduced.
12767 ///
12768 /// \param Used a bit vector whose elements will be set to \c true
12769 /// to indicate when the corresponding template parameter will be
12770 /// deduced.
12771 void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
12772 bool OnlyDeduced, unsigned Depth,
12773 llvm::SmallBitVector &Used);
12774
12776 unsigned Depth, llvm::SmallBitVector &Used);
12777
12778 void
12780 llvm::SmallBitVector &Deduced) {
12782 }
12783
12784 /// Marks all of the template parameters that will be deduced by a
12785 /// call to the given function template.
12786 static void
12789 llvm::SmallBitVector &Deduced);
12790
12791 /// Returns the more specialized function template according
12792 /// to the rules of function template partial ordering (C++
12793 /// [temp.func.order]).
12794 ///
12795 /// \param FT1 the first function template
12796 ///
12797 /// \param FT2 the second function template
12798 ///
12799 /// \param TPOC the context in which we are performing partial ordering of
12800 /// function templates.
12801 ///
12802 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
12803 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
12804 /// when calling a member function.
12805 ///
12806 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
12807 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
12808 /// template from a member function
12809 ///
12810 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
12811 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
12812 /// template from a member function
12813 ///
12814 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
12815 /// candidate with a reversed parameter order. In this case, the corresponding
12816 /// P/A pairs between FT1 and FT2 are reversed.
12817 ///
12818 /// \returns the more specialized function template. If neither
12819 /// template is more specialized, returns NULL.
12822 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
12823 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false,
12824 bool PartialOverloading = false);
12825
12826 /// Retrieve the most specialized of the given function template
12827 /// specializations.
12828 ///
12829 /// \param SpecBegin the start iterator of the function template
12830 /// specializations that we will be comparing.
12831 ///
12832 /// \param SpecEnd the end iterator of the function template
12833 /// specializations, paired with \p SpecBegin.
12834 ///
12835 /// \param Loc the location where the ambiguity or no-specializations
12836 /// diagnostic should occur.
12837 ///
12838 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
12839 /// no matching candidates.
12840 ///
12841 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
12842 /// occurs.
12843 ///
12844 /// \param CandidateDiag partial diagnostic used for each function template
12845 /// specialization that is a candidate in the ambiguous ordering. One
12846 /// parameter in this diagnostic should be unbound, which will correspond to
12847 /// the string describing the template arguments for the function template
12848 /// specialization.
12849 ///
12850 /// \returns the most specialized function template specialization, if
12851 /// found. Otherwise, returns SpecEnd.
12852 UnresolvedSetIterator
12853 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
12854 TemplateSpecCandidateSet &FailedCandidates,
12855 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
12856 const PartialDiagnostic &AmbigDiag,
12857 const PartialDiagnostic &CandidateDiag,
12858 bool Complain = true, QualType TargetType = QualType());
12859
12860 /// Returns the more constrained function according to the rules of
12861 /// partial ordering by constraints (C++ [temp.constr.order]).
12862 ///
12863 /// \param FD1 the first function
12864 ///
12865 /// \param FD2 the second function
12866 ///
12867 /// \returns the more constrained function. If neither function is
12868 /// more constrained, returns NULL.
12869 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
12870 FunctionDecl *FD2);
12871
12872 ///@}
12873
12874 //
12875 //
12876 // -------------------------------------------------------------------------
12877 //
12878 //
12879
12880 /// \name C++ Template Deduction Guide
12881 /// Implementations are in SemaTemplateDeductionGuide.cpp
12882 ///@{
12883
12884 /// Declare implicit deduction guides for a class template if we've
12885 /// not already done so.
12886 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
12887 SourceLocation Loc);
12888
12889 FunctionTemplateDecl *DeclareAggregateDeductionGuideFromInitList(
12890 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
12891 SourceLocation Loc);
12892
12893 ///@}
12894
12895 //
12896 //
12897 // -------------------------------------------------------------------------
12898 //
12899 //
12900
12901 /// \name C++ Template Instantiation
12902 /// Implementations are in SemaTemplateInstantiate.cpp
12903 ///@{
12904
12905public:
12906 /// A helper class for building up ExtParameterInfos.
12909 bool HasInteresting = false;
12910
12911 public:
12912 /// Set the ExtParameterInfo for the parameter at the given index,
12913 ///
12914 void set(unsigned index, FunctionProtoType::ExtParameterInfo info) {
12915 assert(Infos.size() <= index);
12916 Infos.resize(index);
12917 Infos.push_back(info);
12918
12919 if (!HasInteresting)
12920 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
12921 }
12922
12923 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
12924 /// ExtParameterInfo array we've built up.
12926 getPointerOrNull(unsigned numParams) {
12927 if (!HasInteresting)
12928 return nullptr;
12929 Infos.resize(numParams);
12930 return Infos.data();
12931 }
12932 };
12933
12934 /// The current instantiation scope used to store local
12935 /// variables.
12937
12938 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
12940
12941 /// A mapping from parameters with unparsed default arguments to the
12942 /// set of instantiations of each parameter.
12943 ///
12944 /// This mapping is a temporary data structure used when parsing
12945 /// nested class templates or nested classes of class templates,
12946 /// where we might end up instantiating an inner class before the
12947 /// default arguments of its methods have been parsed.
12949
12950 /// A context in which code is being synthesized (where a source location
12951 /// alone is not sufficient to identify the context). This covers template
12952 /// instantiation and various forms of implicitly-generated functions.
12954 /// The kind of template instantiation we are performing
12956 /// We are instantiating a template declaration. The entity is
12957 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
12959
12960 /// We are instantiating a default argument for a template
12961 /// parameter. The Entity is the template parameter whose argument is
12962 /// being instantiated, the Template is the template, and the
12963 /// TemplateArgs/NumTemplateArguments provide the template arguments as
12964 /// specified.
12966
12967 /// We are instantiating a default argument for a function.
12968 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
12969 /// provides the template arguments as specified.
12971
12972 /// We are substituting explicit template arguments provided for
12973 /// a function template. The entity is a FunctionTemplateDecl.
12975
12976 /// We are substituting template argument determined as part of
12977 /// template argument deduction for either a class template
12978 /// partial specialization or a function template. The
12979 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
12980 /// a TemplateDecl.
12982
12983 /// We are substituting into a lambda expression.
12985
12986 /// We are substituting prior template arguments into a new
12987 /// template parameter. The template parameter itself is either a
12988 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
12990
12991 /// We are checking the validity of a default template argument that
12992 /// has been used when naming a template-id.
12994
12995 /// We are computing the exception specification for a defaulted special
12996 /// member function.
12998
12999 /// We are instantiating the exception specification for a function
13000 /// template which was deferred until it was needed.
13002
13003 /// We are instantiating a requirement of a requires expression.
13005
13006 /// We are checking the satisfaction of a nested requirement of a requires
13007 /// expression.
13009
13010 /// We are declaring an implicit special member function.
13012
13013 /// We are declaring an implicit 'operator==' for a defaulted
13014 /// 'operator<=>'.
13016
13017 /// We are defining a synthesized function (such as a defaulted special
13018 /// member).
13020
13021 // We are checking the constraints associated with a constrained entity or
13022 // the constraint expression of a concept. This includes the checks that
13023 // atomic constraints have the type 'bool' and that they can be constant
13024 // evaluated.
13026
13027 // We are substituting template arguments into a constraint expression.
13029
13030 // We are normalizing a constraint expression.
13032
13033 // Instantiating a Requires Expression parameter clause.
13035
13036 // We are substituting into the parameter mapping of an atomic constraint
13037 // during normalization.
13039
13040 /// We are rewriting a comparison operator in terms of an operator<=>.
13042
13043 /// We are initializing a structured binding.
13045
13046 /// We are marking a class as __dllexport.
13048
13049 /// We are building an implied call from __builtin_dump_struct. The
13050 /// arguments are in CallArgs.
13052
13053 /// Added for Template instantiation observation.
13054 /// Memoization means we are _not_ instantiating a template because
13055 /// it is already instantiated (but we entered a context where we
13056 /// would have had to if it was not already instantiated).
13058
13059 /// We are building deduction guides for a class.
13061
13062 /// We are instantiating a type alias template declaration.
13064
13065 /// We are performing partial ordering for template template parameters.
13068
13069 /// Was the enclosing context a non-instantiation SFINAE context?
13071
13072 /// Whether we're substituting into constraints.
13074
13075 /// The point of instantiation or synthesis within the source code.
13077
13078 /// The entity that is being synthesized.
13080
13081 /// The template (or partial specialization) in which we are
13082 /// performing the instantiation, for substitutions of prior template
13083 /// arguments.
13085
13086 union {
13087 /// The list of template arguments we are substituting, if they
13088 /// are not part of the entity.
13090
13091 /// The list of argument expressions in a synthesized call.
13092 const Expr *const *CallArgs;
13093 };
13094
13095 // FIXME: Wrap this union around more members, or perhaps store the
13096 // kind-specific members in the RAII object owning the context.
13097 union {
13098 /// The number of template arguments in TemplateArgs.
13100
13101 /// The number of expressions in CallArgs.
13102 unsigned NumCallArgs;
13103
13104 /// The special member being declared or defined.
13106 };
13107
13109 assert(Kind != DeclaringSpecialMember);
13110 return {TemplateArgs, NumTemplateArgs};
13111 }
13112
13113 /// The template deduction info object associated with the
13114 /// substitution or checking of explicit or deduced template arguments.
13116
13117 /// The source range that covers the construct that cause
13118 /// the instantiation, e.g., the template-id that causes a class
13119 /// template instantiation.
13121
13123 : Kind(TemplateInstantiation),
13124 SavedInNonInstantiationSFINAEContext(false),
13125 InConstraintSubstitution(false), Entity(nullptr), Template(nullptr),
13126 TemplateArgs(nullptr), NumTemplateArgs(0), DeductionInfo(nullptr) {}
13127
13128 /// Determines whether this template is an actual instantiation
13129 /// that should be counted toward the maximum instantiation depth.
13130 bool isInstantiationRecord() const;
13131 };
13132
13133 /// A stack object to be created when performing template
13134 /// instantiation.
13135 ///
13136 /// Construction of an object of type \c InstantiatingTemplate
13137 /// pushes the current instantiation onto the stack of active
13138 /// instantiations. If the size of this stack exceeds the maximum
13139 /// number of recursive template instantiations, construction
13140 /// produces an error and evaluates true.
13141 ///
13142 /// Destruction of this object will pop the named instantiation off
13143 /// the stack.
13145 /// Note that we are instantiating a class template,
13146 /// function template, variable template, alias template,
13147 /// or a member thereof.
13148 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13149 Decl *Entity,
13150 SourceRange InstantiationRange = SourceRange());
13151
13153 /// Note that we are instantiating an exception specification
13154 /// of a function template.
13155 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13157 SourceRange InstantiationRange = SourceRange());
13158
13159 /// Note that we are instantiating a type alias template declaration.
13160 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13161 TypeAliasTemplateDecl *Entity,
13162 ArrayRef<TemplateArgument> TemplateArgs,
13163 SourceRange InstantiationRange = SourceRange());
13164
13165 /// Note that we are instantiating a default argument in a
13166 /// template-id.
13167 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13168 TemplateParameter Param, TemplateDecl *Template,
13169 ArrayRef<TemplateArgument> TemplateArgs,
13170 SourceRange InstantiationRange = SourceRange());
13171
13172 /// Note that we are substituting either explicitly-specified or
13173 /// deduced template arguments during function template argument deduction.
13174 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13175 FunctionTemplateDecl *FunctionTemplate,
13176 ArrayRef<TemplateArgument> TemplateArgs,
13178 sema::TemplateDeductionInfo &DeductionInfo,
13179 SourceRange InstantiationRange = SourceRange());
13180
13181 /// Note that we are instantiating as part of template
13182 /// argument deduction for a class template declaration.
13183 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13184 TemplateDecl *Template,
13185 ArrayRef<TemplateArgument> TemplateArgs,
13186 sema::TemplateDeductionInfo &DeductionInfo,
13187 SourceRange InstantiationRange = SourceRange());
13188
13189 /// Note that we are instantiating as part of template
13190 /// argument deduction for a class template partial
13191 /// specialization.
13192 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13194 ArrayRef<TemplateArgument> TemplateArgs,
13195 sema::TemplateDeductionInfo &DeductionInfo,
13196 SourceRange InstantiationRange = SourceRange());
13197
13198 /// Note that we are instantiating as part of template
13199 /// argument deduction for a variable template partial
13200 /// specialization.
13201 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13203 ArrayRef<TemplateArgument> TemplateArgs,
13204 sema::TemplateDeductionInfo &DeductionInfo,
13205 SourceRange InstantiationRange = SourceRange());
13206
13207 /// Note that we are instantiating a default argument for a function
13208 /// parameter.
13209 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13210 ParmVarDecl *Param,
13211 ArrayRef<TemplateArgument> TemplateArgs,
13212 SourceRange InstantiationRange = SourceRange());
13213
13214 /// Note that we are substituting prior template arguments into a
13215 /// non-type parameter.
13216 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13217 NamedDecl *Template, NonTypeTemplateParmDecl *Param,
13218 ArrayRef<TemplateArgument> TemplateArgs,
13219 SourceRange InstantiationRange);
13220
13221 /// Note that we are substituting prior template arguments into a
13222 /// template template parameter.
13223 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13224 NamedDecl *Template, TemplateTemplateParmDecl *Param,
13225 ArrayRef<TemplateArgument> TemplateArgs,
13226 SourceRange InstantiationRange);
13227
13228 /// Note that we are checking the default template argument
13229 /// against the template parameter for a given template-id.
13230 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13231 TemplateDecl *Template, NamedDecl *Param,
13232 ArrayRef<TemplateArgument> TemplateArgs,
13233 SourceRange InstantiationRange);
13234
13236 /// \brief Note that we are checking the constraints associated with some
13237 /// constrained entity (a concept declaration or a template with associated
13238 /// constraints).
13239 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13240 ConstraintsCheck, NamedDecl *Template,
13241 ArrayRef<TemplateArgument> TemplateArgs,
13242 SourceRange InstantiationRange);
13243
13245 /// \brief Note that we are checking a constraint expression associated
13246 /// with a template declaration or as part of the satisfaction check of a
13247 /// concept.
13248 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13250 sema::TemplateDeductionInfo &DeductionInfo,
13251 SourceRange InstantiationRange);
13252
13254 /// \brief Note that we are normalizing a constraint expression.
13255 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13257 SourceRange InstantiationRange);
13258
13260 /// \brief Note that we are subtituting into the parameter mapping of an
13261 /// atomic constraint during constraint normalization.
13262 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13264 SourceRange InstantiationRange);
13265
13266 /// \brief Note that we are substituting template arguments into a part of
13267 /// a requirement of a requires expression.
13268 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13270 sema::TemplateDeductionInfo &DeductionInfo,
13271 SourceRange InstantiationRange = SourceRange());
13272
13273 /// \brief Note that we are checking the satisfaction of the constraint
13274 /// expression inside of a nested requirement.
13275 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13277 SourceRange InstantiationRange = SourceRange());
13278
13279 /// \brief Note that we are checking a requires clause.
13280 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13281 const RequiresExpr *E,
13282 sema::TemplateDeductionInfo &DeductionInfo,
13283 SourceRange InstantiationRange);
13284
13286 /// \brief Note that we are building deduction guides.
13287 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
13289 SourceRange InstantiationRange = SourceRange());
13290
13292 /// \brief Note that we are partial ordering template template parameters.
13293 InstantiatingTemplate(Sema &SemaRef, SourceLocation ArgLoc,
13295 SourceRange InstantiationRange = SourceRange());
13296
13297 /// Note that we have finished instantiating this template.
13298 void Clear();
13299
13301
13302 /// Determines whether we have exceeded the maximum
13303 /// recursive template instantiations.
13304 bool isInvalid() const { return Invalid; }
13305
13306 /// Determine whether we are already instantiating this
13307 /// specialization in some surrounding active instantiation.
13308 bool isAlreadyInstantiating() const { return AlreadyInstantiating; }
13309
13310 private:
13311 Sema &SemaRef;
13312 bool Invalid;
13313 bool AlreadyInstantiating;
13314 bool CheckInstantiationDepth(SourceLocation PointOfInstantiation,
13315 SourceRange InstantiationRange);
13316
13317 InstantiatingTemplate(Sema &SemaRef,
13319 SourceLocation PointOfInstantiation,
13320 SourceRange InstantiationRange, Decl *Entity,
13321 NamedDecl *Template = nullptr,
13322 ArrayRef<TemplateArgument> TemplateArgs = {},
13323 sema::TemplateDeductionInfo *DeductionInfo = nullptr);
13324
13325 InstantiatingTemplate(const InstantiatingTemplate &) = delete;
13326
13327 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13328 };
13329
13330 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13331 const MultiLevelTemplateArgumentList &TemplateArgs,
13332 TemplateArgumentLoc &Output,
13333 SourceLocation Loc = {},
13334 const DeclarationName &Entity = {});
13335 bool
13336 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13337 const MultiLevelTemplateArgumentList &TemplateArgs,
13338 TemplateArgumentListInfo &Outputs);
13339
13340 /// Retrieve the template argument list(s) that should be used to
13341 /// instantiate the definition of the given declaration.
13342 ///
13343 /// \param ND the declaration for which we are computing template
13344 /// instantiation arguments.
13345 ///
13346 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13347 /// the decl context where it will be created. In this case, the `Innermost`
13348 /// should likely be provided. If ND is non-null, this is ignored.
13349 ///
13350 /// \param Innermost if non-NULL, specifies a template argument list for the
13351 /// template declaration passed as ND.
13352 ///
13353 /// \param RelativeToPrimary true if we should get the template
13354 /// arguments relative to the primary template, even when we're
13355 /// dealing with a specialization. This is only relevant for function
13356 /// template specializations.
13357 ///
13358 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13359 /// instantiating the definition of the given declaration, \p ND. This is
13360 /// used to determine the proper set of template instantiation arguments for
13361 /// friend function template specializations.
13362 ///
13363 /// \param ForConstraintInstantiation when collecting arguments,
13364 /// ForConstraintInstantiation indicates we should continue looking when
13365 /// encountering a lambda generic call operator, and continue looking for
13366 /// arguments on an enclosing class template.
13367 ///
13368 /// \param SkipForSpecialization when specified, any template specializations
13369 /// in a traversal would be ignored.
13370 ///
13371 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13372 /// when encountering a specialized member function template, rather than
13373 /// returning immediately.
13374 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13375 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13376 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13377 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13378 bool ForConstraintInstantiation = false,
13379 bool SkipForSpecialization = false,
13380 bool ForDefaultArgumentSubstitution = false);
13381
13382 /// RAII object to handle the state changes required to synthesize
13383 /// a function body.
13385 Sema &S;
13386 Sema::ContextRAII SavedContext;
13387 bool PushedCodeSynthesisContext = false;
13388
13389 public:
13391 : S(S), SavedContext(S, DC) {
13392 auto *FD = dyn_cast<FunctionDecl>(DC);
13393 S.PushFunctionScope();
13394 S.PushExpressionEvaluationContextForFunction(
13395 ExpressionEvaluationContext::PotentiallyEvaluated, FD);
13396 if (FD)
13397 FD->setWillHaveBody(true);
13398 else
13399 assert(isa<ObjCMethodDecl>(DC));
13400 }
13401
13403 assert(!PushedCodeSynthesisContext);
13404
13406 Ctx.Kind = Sema::CodeSynthesisContext::DefiningSynthesizedFunction;
13407 Ctx.PointOfInstantiation = UseLoc;
13408 Ctx.Entity = cast<Decl>(S.CurContext);
13409 S.pushCodeSynthesisContext(Ctx);
13410
13411 PushedCodeSynthesisContext = true;
13412 }
13413
13415 if (PushedCodeSynthesisContext)
13416 S.popCodeSynthesisContext();
13417 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13418 FD->setWillHaveBody(false);
13419 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13420 }
13421 S.PopExpressionEvaluationContext();
13422 S.PopFunctionScopeInfo();
13423 }
13424 };
13425
13426 /// List of active code synthesis contexts.
13427 ///
13428 /// This vector is treated as a stack. As synthesis of one entity requires
13429 /// synthesis of another, additional contexts are pushed onto the stack.
13431
13432 /// Specializations whose definitions are currently being instantiated.
13433 llvm::DenseSet<std::pair<Decl *, unsigned>> InstantiatingSpecializations;
13434
13435 /// Non-dependent types used in templates that have already been instantiated
13436 /// by some template instantiation.
13437 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13438
13439 /// Extra modules inspected when performing a lookup during a template
13440 /// instantiation. Computed lazily.
13442
13443 /// Cache of additional modules that should be used for name lookup
13444 /// within the current template instantiation. Computed lazily; use
13445 /// getLookupModules() to get a complete set.
13446 llvm::DenseSet<Module *> LookupModulesCache;
13447
13448 /// Map from the most recent declaration of a namespace to the most
13449 /// recent visible declaration of that namespace.
13450 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13451
13452 /// Whether we are in a SFINAE context that is not associated with
13453 /// template instantiation.
13454 ///
13455 /// This is used when setting up a SFINAE trap (\c see SFINAETrap) outside
13456 /// of a template instantiation or template argument deduction.
13458
13459 /// The number of \p CodeSynthesisContexts that are not template
13460 /// instantiations and, therefore, should not be counted as part of the
13461 /// instantiation depth.
13462 ///
13463 /// When the instantiation depth reaches the user-configurable limit
13464 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13465 // FIXME: Should we have a similar limit for other forms of synthesis?
13467
13468 /// The depth of the context stack at the point when the most recent
13469 /// error or warning was produced.
13470 ///
13471 /// This value is used to suppress printing of redundant context stacks
13472 /// when there are multiple errors or warnings in the same instantiation.
13473 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13475
13476 /// The template instantiation callbacks to trace or track
13477 /// instantiations (objects can be chained).
13478 ///
13479 /// This callbacks is used to print, trace or track template
13480 /// instantiations as they are being constructed.
13481 std::vector<std::unique_ptr<TemplateInstantiationCallback>>
13483
13484 /// The current index into pack expansion arguments that will be
13485 /// used for substitution of parameter packs.
13486 ///
13487 /// The pack expansion index will be none to indicate that parameter packs
13488 /// should be instantiated as themselves. Otherwise, the index specifies
13489 /// which argument within the parameter pack will be used for substitution.
13491
13492 /// RAII object used to change the argument pack substitution index
13493 /// within a \c Sema object.
13494 ///
13495 /// See \c ArgPackSubstIndex for more information.
13497 Sema &Self;
13498 UnsignedOrNone OldSubstIndex;
13499
13500 public:
13502 : Self(Self),
13503 OldSubstIndex(std::exchange(Self.ArgPackSubstIndex, NewSubstIndex)) {}
13504
13505 ~ArgPackSubstIndexRAII() { Self.ArgPackSubstIndex = OldSubstIndex; }
13506 };
13507
13508 void pushCodeSynthesisContext(CodeSynthesisContext Ctx);
13510
13512 if (!CodeSynthesisContexts.empty() &&
13514 PrintInstantiationStack(DiagFunc);
13516 }
13519 }
13521 /// Prints the current instantiation stack through a series of
13522 /// notes.
13526 }
13527
13528 /// Determines whether we are currently in a context where
13529 /// template argument substitution failures are not considered
13530 /// errors.
13531 ///
13532 /// \returns An empty \c Optional if we're not in a SFINAE context.
13533 /// Otherwise, contains a pointer that, if non-NULL, contains the nearest
13534 /// template-deduction context object, which can be used to capture
13535 /// diagnostics that will be suppressed.
13536 std::optional<sema::TemplateDeductionInfo *> isSFINAEContext() const;
13537
13538 /// Perform substitution on the type T with a given set of template
13539 /// arguments.
13540 ///
13541 /// This routine substitutes the given template arguments into the
13542 /// type T and produces the instantiated type.
13543 ///
13544 /// \param T the type into which the template arguments will be
13545 /// substituted. If this type is not dependent, it will be returned
13546 /// immediately.
13547 ///
13548 /// \param Args the template arguments that will be
13549 /// substituted for the top-level template parameters within T.
13550 ///
13551 /// \param Loc the location in the source code where this substitution
13552 /// is being performed. It will typically be the location of the
13553 /// declarator (if we're instantiating the type of some declaration)
13554 /// or the location of the type in the source code (if, e.g., we're
13555 /// instantiating the type of a cast expression).
13556 ///
13557 /// \param Entity the name of the entity associated with a declaration
13558 /// being instantiated (if any). May be empty to indicate that there
13559 /// is no such entity (if, e.g., this is a type that occurs as part of
13560 /// a cast expression) or that the entity has no name (e.g., an
13561 /// unnamed function parameter).
13562 ///
13563 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13564 /// acceptable as the top level type of the result.
13565 ///
13566 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13567 /// whenever substitution would perform a replacement with a null or
13568 /// non-existent template argument.
13569 ///
13570 /// \returns If the instantiation succeeds, the instantiated
13571 /// type. Otherwise, produces diagnostics and returns a NULL type.
13573 const MultiLevelTemplateArgumentList &TemplateArgs,
13575 bool AllowDeducedTST = false);
13576
13578 const MultiLevelTemplateArgumentList &TemplateArgs,
13580 bool *IsIncompleteSubstitution = nullptr);
13581
13583 const MultiLevelTemplateArgumentList &TemplateArgs,
13585
13586 /// A form of SubstType intended specifically for instantiating the
13587 /// type of a FunctionDecl. Its purpose is solely to force the
13588 /// instantiation of default-argument expressions and to avoid
13589 /// instantiating an exception-specification.
13591 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13592 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13593 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13595 const MultiLevelTemplateArgumentList &Args);
13598 SmallVectorImpl<QualType> &ExceptionStorage,
13599 const MultiLevelTemplateArgumentList &Args);
13600 ParmVarDecl *
13602 const MultiLevelTemplateArgumentList &TemplateArgs,
13603 int indexAdjustment, UnsignedOrNone NumExpansions,
13604 bool ExpectParameterPack, bool EvaluateConstraints = true);
13605
13606 /// Substitute the given template arguments into the given set of
13607 /// parameters, producing the set of parameter types that would be generated
13608 /// from such a substitution.
13610 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13611 const MultiLevelTemplateArgumentList &TemplateArgs,
13612 SmallVectorImpl<QualType> &ParamTypes,
13614 ExtParameterInfoBuilder &ParamInfos);
13615
13616 /// Substitute the given template arguments into the default argument.
13618 const MultiLevelTemplateArgumentList &TemplateArgs,
13619 bool ForCallExpr = false);
13621 const MultiLevelTemplateArgumentList &TemplateArgs);
13622 /// Substitute an expression as if it is a address-of-operand, which makes it
13623 /// act like a CXXIdExpression rather than an attempt to call.
13625 const MultiLevelTemplateArgumentList &TemplateArgs);
13626
13627 // A RAII type used by the TemplateDeclInstantiator and TemplateInstantiator
13628 // to disable constraint evaluation, then restore the state.
13629 template <typename InstTy> struct ConstraintEvalRAII {
13630 InstTy &TI;
13632
13634 : TI(TI), OldValue(TI.getEvaluateConstraints()) {
13635 TI.setEvaluateConstraints(false);
13636 }
13637 ~ConstraintEvalRAII() { TI.setEvaluateConstraints(OldValue); }
13638 };
13639
13640 // Must be used instead of SubstExpr at 'constraint checking' time.
13643 const MultiLevelTemplateArgumentList &TemplateArgs);
13644 // Unlike the above, this does not evaluate constraints.
13646 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13647
13648 /// Substitute the given template arguments into a list of
13649 /// expressions, expanding pack expansions if required.
13650 ///
13651 /// \param Exprs The list of expressions to substitute into.
13652 ///
13653 /// \param IsCall Whether this is some form of call, in which case
13654 /// default arguments will be dropped.
13655 ///
13656 /// \param TemplateArgs The set of template arguments to substitute.
13657 ///
13658 /// \param Outputs Will receive all of the substituted arguments.
13659 ///
13660 /// \returns true if an error occurred, false otherwise.
13661 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13662 const MultiLevelTemplateArgumentList &TemplateArgs,
13663 SmallVectorImpl<Expr *> &Outputs);
13664
13666 const MultiLevelTemplateArgumentList &TemplateArgs);
13667
13670 bool CXXDirectInit);
13671
13672 /// Perform substitution on the base class specifiers of the
13673 /// given class template specialization.
13674 ///
13675 /// Produces a diagnostic and returns true on error, returns false and
13676 /// attaches the instantiated base classes to the class template
13677 /// specialization if successful.
13678 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13679 const MultiLevelTemplateArgumentList &TemplateArgs);
13680
13681 /// Instantiate the definition of a class from a given pattern.
13682 ///
13683 /// \param PointOfInstantiation The point of instantiation within the
13684 /// source code.
13685 ///
13686 /// \param Instantiation is the declaration whose definition is being
13687 /// instantiated. This will be either a class template specialization
13688 /// or a member class of a class template specialization.
13689 ///
13690 /// \param Pattern is the pattern from which the instantiation
13691 /// occurs. This will be either the declaration of a class template or
13692 /// the declaration of a member class of a class template.
13693 ///
13694 /// \param TemplateArgs The template arguments to be substituted into
13695 /// the pattern.
13696 ///
13697 /// \param TSK the kind of implicit or explicit instantiation to perform.
13698 ///
13699 /// \param Complain whether to complain if the class cannot be instantiated
13700 /// due to the lack of a definition.
13701 ///
13702 /// \returns true if an error occurred, false otherwise.
13703 bool InstantiateClass(SourceLocation PointOfInstantiation,
13704 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13705 const MultiLevelTemplateArgumentList &TemplateArgs,
13706 TemplateSpecializationKind TSK, bool Complain = true);
13707
13708 /// Instantiate the definition of an enum from a given pattern.
13709 ///
13710 /// \param PointOfInstantiation The point of instantiation within the
13711 /// source code.
13712 /// \param Instantiation is the declaration whose definition is being
13713 /// instantiated. This will be a member enumeration of a class
13714 /// temploid specialization, or a local enumeration within a
13715 /// function temploid specialization.
13716 /// \param Pattern The templated declaration from which the instantiation
13717 /// occurs.
13718 /// \param TemplateArgs The template arguments to be substituted into
13719 /// the pattern.
13720 /// \param TSK The kind of implicit or explicit instantiation to perform.
13721 ///
13722 /// \return \c true if an error occurred, \c false otherwise.
13723 bool InstantiateEnum(SourceLocation PointOfInstantiation,
13724 EnumDecl *Instantiation, EnumDecl *Pattern,
13725 const MultiLevelTemplateArgumentList &TemplateArgs,
13727
13728 /// Instantiate the definition of a field from the given pattern.
13729 ///
13730 /// \param PointOfInstantiation The point of instantiation within the
13731 /// source code.
13732 /// \param Instantiation is the declaration whose definition is being
13733 /// instantiated. This will be a class of a class temploid
13734 /// specialization, or a local enumeration within a function temploid
13735 /// specialization.
13736 /// \param Pattern The templated declaration from which the instantiation
13737 /// occurs.
13738 /// \param TemplateArgs The template arguments to be substituted into
13739 /// the pattern.
13740 ///
13741 /// \return \c true if an error occurred, \c false otherwise.
13743 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
13744 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
13745
13748
13750 SourceLocation PointOfInstantiation,
13751 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13752 TemplateSpecializationKind TSK, bool Complain,
13753 bool PrimaryStrictPackMatch);
13754
13755 /// Instantiates the definitions of all of the member
13756 /// of the given class, which is an instantiation of a class template
13757 /// or a member class of a template.
13758 void
13759 InstantiateClassMembers(SourceLocation PointOfInstantiation,
13760 CXXRecordDecl *Instantiation,
13761 const MultiLevelTemplateArgumentList &TemplateArgs,
13763
13764 /// Instantiate the definitions of all of the members of the
13765 /// given class template specialization, which was named as part of an
13766 /// explicit instantiation.
13768 SourceLocation PointOfInstantiation,
13769 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13771
13774 const MultiLevelTemplateArgumentList &TemplateArgs);
13775
13776 /// Do template substitution on declaration name info.
13779 const MultiLevelTemplateArgumentList &TemplateArgs);
13781 SubstTemplateName(SourceLocation TemplateKWLoc,
13782 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
13783 SourceLocation NameLoc,
13784 const MultiLevelTemplateArgumentList &TemplateArgs);
13785
13787 const MultiLevelTemplateArgumentList &TemplateArgs,
13788 bool EvaluateConstraint);
13789
13790 /// Determine whether we are currently performing template instantiation.
13793 }
13794
13795 /// Determine whether we are currently performing constraint substitution.
13797 return !CodeSynthesisContexts.empty() &&
13798 CodeSynthesisContexts.back().InConstraintSubstitution;
13799 }
13800
13801 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
13802
13803 /// \brief create a Requirement::SubstitutionDiagnostic with only a
13804 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
13807
13808 ///@}
13809
13810 //
13811 //
13812 // -------------------------------------------------------------------------
13813 //
13814 //
13815
13816 /// \name C++ Template Declaration Instantiation
13817 /// Implementations are in SemaTemplateInstantiateDecl.cpp
13818 ///@{
13819
13820public:
13821 /// An entity for which implicit template instantiation is required.
13822 ///
13823 /// The source location associated with the declaration is the first place in
13824 /// the source code where the declaration was "used". It is not necessarily
13825 /// the point of instantiation (which will be either before or after the
13826 /// namespace-scope declaration that triggered this implicit instantiation),
13827 /// However, it is the location that diagnostics should generally refer to,
13828 /// because users will need to know what code triggered the instantiation.
13829 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
13830
13831 /// The queue of implicit template instantiations that are required
13832 /// but have not yet been performed.
13833 std::deque<PendingImplicitInstantiation> PendingInstantiations;
13834
13835 /// Queue of implicit template instantiations that cannot be performed
13836 /// eagerly.
13838
13842
13843 /// The queue of implicit template instantiations that are required
13844 /// and must be performed within the current local scope.
13845 ///
13846 /// This queue is only used for member functions of local classes in
13847 /// templates, which must be instantiated in the same scope as their
13848 /// enclosing function, so that they can reference function-local
13849 /// types, static variables, enumerators, etc.
13850 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
13851
13853 public:
13855 : S(S), AtEndOfTU(AtEndOfTU) {
13856 SavedPendingLocalImplicitInstantiations.swap(
13857 S.PendingLocalImplicitInstantiations);
13858 }
13859
13860 void perform() {
13861 S.PerformPendingInstantiations(/*LocalOnly=*/true,
13862 /*AtEndOfTU=*/AtEndOfTU);
13863 }
13864
13866 assert(S.PendingLocalImplicitInstantiations.empty() &&
13867 "there shouldn't be any pending local implicit instantiations");
13868 SavedPendingLocalImplicitInstantiations.swap(
13869 S.PendingLocalImplicitInstantiations);
13870 }
13871
13872 private:
13873 Sema &S;
13874 bool AtEndOfTU;
13875 std::deque<PendingImplicitInstantiation>
13876 SavedPendingLocalImplicitInstantiations;
13877 };
13878
13879 /// Records and restores the CurFPFeatures state on entry/exit of compound
13880 /// statements.
13882 public:
13885 FPOptionsOverride getOverrides() { return OldOverrides; }
13886
13887 private:
13888 Sema &S;
13889 FPOptions OldFPFeaturesState;
13890 FPOptionsOverride OldOverrides;
13891 LangOptions::FPEvalMethodKind OldEvalMethod;
13892 SourceLocation OldFPPragmaLocation;
13893 };
13894
13896 public:
13897 GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
13898 : S(S), Enabled(Enabled), AtEndOfTU(AtEndOfTU) {
13899 if (!Enabled)
13900 return;
13901
13902 S.SavedPendingInstantiations.emplace_back();
13903 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
13904
13905 S.SavedVTableUses.emplace_back();
13906 S.SavedVTableUses.back().swap(S.VTableUses);
13907 }
13908
13909 void perform() {
13910 if (Enabled) {
13911 S.DefineUsedVTables();
13912 S.PerformPendingInstantiations(/*LocalOnly=*/false,
13913 /*AtEndOfTU=*/AtEndOfTU);
13914 }
13915 }
13916
13918 if (!Enabled)
13919 return;
13920
13921 // Restore the set of pending vtables.
13922 assert(S.VTableUses.empty() &&
13923 "VTableUses should be empty before it is discarded.");
13924 S.VTableUses.swap(S.SavedVTableUses.back());
13925 S.SavedVTableUses.pop_back();
13926
13927 // Restore the set of pending implicit instantiations.
13928 if ((S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) &&
13929 AtEndOfTU) {
13930 assert(S.PendingInstantiations.empty() &&
13931 "PendingInstantiations should be empty before it is discarded.");
13932 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
13933 S.SavedPendingInstantiations.pop_back();
13934 } else {
13935 // Template instantiations in the PCH may be delayed until the TU.
13936 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
13937 S.PendingInstantiations.insert(
13938 S.PendingInstantiations.end(),
13939 S.SavedPendingInstantiations.back().begin(),
13940 S.SavedPendingInstantiations.back().end());
13941 S.SavedPendingInstantiations.pop_back();
13942 }
13943 }
13944
13945 private:
13946 Sema &S;
13947 bool Enabled;
13948 bool AtEndOfTU;
13949 };
13950
13952 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
13953
13958
13960 Decl *D)
13961 : TmplAttr(A), Scope(S), NewDecl(D) {}
13962 };
13964
13965 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
13966 const Decl *Pattern, Decl *Inst,
13967 LateInstantiatedAttrVec *LateAttrs = nullptr,
13968 LocalInstantiationScope *OuterMostScope = nullptr);
13969
13970 /// Update instantiation attributes after template was late parsed.
13971 ///
13972 /// Some attributes are evaluated based on the body of template. If it is
13973 /// late parsed, such attributes cannot be evaluated when declaration is
13974 /// instantiated. This function is used to update instantiation attributes
13975 /// when template definition is ready.
13976 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
13977
13978 void
13980 const Decl *Pattern, Decl *Inst,
13981 LateInstantiatedAttrVec *LateAttrs = nullptr,
13982 LocalInstantiationScope *OuterMostScope = nullptr);
13983
13984 /// In the MS ABI, we need to instantiate default arguments of dllexported
13985 /// default constructors along with the constructor definition. This allows IR
13986 /// gen to emit a constructor closure which calls the default constructor with
13987 /// its default arguments.
13989
13991 ParmVarDecl *Param);
13992 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
13994
13995 /// Instantiate (or find existing instantiation of) a function template with a
13996 /// given set of template arguments.
13997 ///
13998 /// Usually this should not be used, and template argument deduction should be
13999 /// used in its place.
14005
14006 /// Instantiate the definition of the given function from its
14007 /// template.
14008 ///
14009 /// \param PointOfInstantiation the point at which the instantiation was
14010 /// required. Note that this is not precisely a "point of instantiation"
14011 /// for the function, but it's close.
14012 ///
14013 /// \param Function the already-instantiated declaration of a
14014 /// function template specialization or member function of a class template
14015 /// specialization.
14016 ///
14017 /// \param Recursive if true, recursively instantiates any functions that
14018 /// are required by this instantiation.
14019 ///
14020 /// \param DefinitionRequired if true, then we are performing an explicit
14021 /// instantiation where the body of the function is required. Complain if
14022 /// there is no such body.
14023 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
14025 bool Recursive = false,
14026 bool DefinitionRequired = false,
14027 bool AtEndOfTU = false);
14030 const TemplateArgumentList *PartialSpecArgs,
14031 const TemplateArgumentListInfo &TemplateArgsInfo,
14033 SourceLocation PointOfInstantiation,
14034 LateInstantiatedAttrVec *LateAttrs = nullptr,
14035 LocalInstantiationScope *StartingScope = nullptr);
14036
14037 /// Instantiates a variable template specialization by completing it
14038 /// with appropriate type information and initializer.
14040 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
14041 const MultiLevelTemplateArgumentList &TemplateArgs);
14042
14043 /// BuildVariableInstantiation - Used after a new variable has been created.
14044 /// Sets basic variable data and decides whether to postpone the
14045 /// variable instantiation.
14046 void
14048 const MultiLevelTemplateArgumentList &TemplateArgs,
14049 LateInstantiatedAttrVec *LateAttrs,
14050 DeclContext *Owner,
14051 LocalInstantiationScope *StartingScope,
14052 bool InstantiatingVarTemplate = false,
14053 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
14054
14055 /// Instantiate the initializer of a variable.
14057 VarDecl *Var, VarDecl *OldVar,
14058 const MultiLevelTemplateArgumentList &TemplateArgs);
14059
14060 /// Instantiate the definition of the given variable from its
14061 /// template.
14062 ///
14063 /// \param PointOfInstantiation the point at which the instantiation was
14064 /// required. Note that this is not precisely a "point of instantiation"
14065 /// for the variable, but it's close.
14066 ///
14067 /// \param Var the already-instantiated declaration of a templated variable.
14068 ///
14069 /// \param Recursive if true, recursively instantiates any functions that
14070 /// are required by this instantiation.
14071 ///
14072 /// \param DefinitionRequired if true, then we are performing an explicit
14073 /// instantiation where a definition of the variable is required. Complain
14074 /// if there is no such definition.
14075 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
14076 VarDecl *Var, bool Recursive = false,
14077 bool DefinitionRequired = false,
14078 bool AtEndOfTU = false);
14079
14082 const MultiLevelTemplateArgumentList &TemplateArgs);
14083
14084 /// Find the instantiation of the given declaration within the
14085 /// current instantiation.
14086 ///
14087 /// This routine is intended to be used when \p D is a declaration
14088 /// referenced from within a template, that needs to mapped into the
14089 /// corresponding declaration within an instantiation. For example,
14090 /// given:
14091 ///
14092 /// \code
14093 /// template<typename T>
14094 /// struct X {
14095 /// enum Kind {
14096 /// KnownValue = sizeof(T)
14097 /// };
14098 ///
14099 /// bool getKind() const { return KnownValue; }
14100 /// };
14101 ///
14102 /// template struct X<int>;
14103 /// \endcode
14104 ///
14105 /// In the instantiation of X<int>::getKind(), we need to map the \p
14106 /// EnumConstantDecl for \p KnownValue (which refers to
14107 /// X<T>::<Kind>::KnownValue) to its instantiation
14108 /// (X<int>::<Kind>::KnownValue).
14109 /// \p FindInstantiatedDecl performs this mapping from within the
14110 /// instantiation of X<int>.
14111 NamedDecl *
14113 const MultiLevelTemplateArgumentList &TemplateArgs,
14114 bool FindingInstantiatedContext = false);
14115
14116 /// Finds the instantiation of the given declaration context
14117 /// within the current instantiation.
14118 ///
14119 /// \returns NULL if there was an error
14120 DeclContext *
14122 const MultiLevelTemplateArgumentList &TemplateArgs);
14123
14124 Decl *SubstDecl(Decl *D, DeclContext *Owner,
14125 const MultiLevelTemplateArgumentList &TemplateArgs);
14126
14127 /// Substitute the name and return type of a defaulted 'operator<=>' to form
14128 /// an implicit 'operator=='.
14130 FunctionDecl *Spaceship);
14131
14132 /// Performs template instantiation for all implicit template
14133 /// instantiations we have seen until this point.
14134 void PerformPendingInstantiations(bool LocalOnly = false,
14135 bool AtEndOfTU = true);
14136
14139 const MultiLevelTemplateArgumentList &TemplateArgs,
14140 bool EvaluateConstraints = true);
14141
14143 const DeclContext *Pattern,
14144 const MultiLevelTemplateArgumentList &TemplateArgs);
14145
14146private:
14147 /// Introduce the instantiated local variables into the local
14148 /// instantiation scope.
14149 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
14150 const FunctionDecl *PatternDecl,
14152 /// Introduce the instantiated function parameters into the local
14153 /// instantiation scope, and set the parameter names to those used
14154 /// in the template.
14155 bool addInstantiatedParametersToScope(
14156 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14158 const MultiLevelTemplateArgumentList &TemplateArgs);
14159
14160 /// Introduce the instantiated captures of the lambda into the local
14161 /// instantiation scope.
14162 bool addInstantiatedCapturesToScope(
14163 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14165 const MultiLevelTemplateArgumentList &TemplateArgs);
14166
14167 int ParsingClassDepth = 0;
14168
14169 class SavePendingParsedClassStateRAII {
14170 public:
14171 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
14172
14173 ~SavePendingParsedClassStateRAII() {
14174 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
14175 "there shouldn't be any pending delayed exception spec checks");
14176 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
14177 "there shouldn't be any pending delayed exception spec checks");
14178 swapSavedState();
14179 }
14180
14181 private:
14182 Sema &S;
14183 decltype(DelayedOverridingExceptionSpecChecks)
14184 SavedOverridingExceptionSpecChecks;
14185 decltype(DelayedEquivalentExceptionSpecChecks)
14186 SavedEquivalentExceptionSpecChecks;
14187
14188 void swapSavedState() {
14189 SavedOverridingExceptionSpecChecks.swap(
14190 S.DelayedOverridingExceptionSpecChecks);
14191 SavedEquivalentExceptionSpecChecks.swap(
14192 S.DelayedEquivalentExceptionSpecChecks);
14193 }
14194 };
14195
14196 ///@}
14197
14198 //
14199 //
14200 // -------------------------------------------------------------------------
14201 //
14202 //
14203
14204 /// \name C++ Variadic Templates
14205 /// Implementations are in SemaTemplateVariadic.cpp
14206 ///@{
14207
14208public:
14209 /// Determine whether an unexpanded parameter pack might be permitted in this
14210 /// location. Useful for error recovery.
14212
14213 /// The context in which an unexpanded parameter pack is
14214 /// being diagnosed.
14215 ///
14216 /// Note that the values of this enumeration line up with the first
14217 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
14219 /// An arbitrary expression.
14221
14222 /// The base type of a class type.
14224
14225 /// The type of an arbitrary declaration.
14227
14228 /// The type of a data member.
14230
14231 /// The size of a bit-field.
14233
14234 /// The expression in a static assertion.
14236
14237 /// The fixed underlying type of an enumeration.
14239
14240 /// The enumerator value.
14242
14243 /// A using declaration.
14245
14246 /// A friend declaration.
14248
14249 /// A declaration qualifier.
14251
14252 /// An initializer.
14254
14255 /// A default argument.
14257
14258 /// The type of a non-type template parameter.
14260
14261 /// The type of an exception.
14263
14264 /// Explicit specialization.
14266
14267 /// Partial specialization.
14269
14270 /// Microsoft __if_exists.
14272
14273 /// Microsoft __if_not_exists.
14275
14276 /// Lambda expression.
14278
14279 /// Block expression.
14281
14282 /// A type constraint.
14284
14285 // A requirement in a requires-expression.
14287
14288 // A requires-clause.
14290 };
14291
14292 /// Diagnose unexpanded parameter packs.
14293 ///
14294 /// \param Loc The location at which we should emit the diagnostic.
14295 ///
14296 /// \param UPPC The context in which we are diagnosing unexpanded
14297 /// parameter packs.
14298 ///
14299 /// \param Unexpanded the set of unexpanded parameter packs.
14300 ///
14301 /// \returns true if an error occurred, false otherwise.
14305
14306 /// If the given type contains an unexpanded parameter pack,
14307 /// diagnose the error.
14308 ///
14309 /// \param Loc The source location where a diagnostc should be emitted.
14310 ///
14311 /// \param T The type that is being checked for unexpanded parameter
14312 /// packs.
14313 ///
14314 /// \returns true if an error occurred, false otherwise.
14317
14318 /// If the given expression contains an unexpanded parameter
14319 /// pack, diagnose the error.
14320 ///
14321 /// \param E The expression that is being checked for unexpanded
14322 /// parameter packs.
14323 ///
14324 /// \returns true if an error occurred, false otherwise.
14327
14328 /// If the given requirees-expression contains an unexpanded reference to one
14329 /// of its own parameter packs, diagnose the error.
14330 ///
14331 /// \param RE The requiress-expression that is being checked for unexpanded
14332 /// parameter packs.
14333 ///
14334 /// \returns true if an error occurred, false otherwise.
14336
14337 /// If the given nested-name-specifier contains an unexpanded
14338 /// parameter pack, diagnose the error.
14339 ///
14340 /// \param SS The nested-name-specifier that is being checked for
14341 /// unexpanded parameter packs.
14342 ///
14343 /// \returns true if an error occurred, false otherwise.
14346
14347 /// If the given name contains an unexpanded parameter pack,
14348 /// diagnose the error.
14349 ///
14350 /// \param NameInfo The name (with source location information) that
14351 /// is being checked for unexpanded parameter packs.
14352 ///
14353 /// \returns true if an error occurred, false otherwise.
14356
14357 /// If the given template name contains an unexpanded parameter pack,
14358 /// diagnose the error.
14359 ///
14360 /// \param Loc The location of the template name.
14361 ///
14362 /// \param Template The template name that is being checked for unexpanded
14363 /// parameter packs.
14364 ///
14365 /// \returns true if an error occurred, false otherwise.
14369
14370 /// If the given template argument contains an unexpanded parameter
14371 /// pack, diagnose the error.
14372 ///
14373 /// \param Arg The template argument that is being checked for unexpanded
14374 /// parameter packs.
14375 ///
14376 /// \returns true if an error occurred, false otherwise.
14379
14380 /// Collect the set of unexpanded parameter packs within the given
14381 /// template argument.
14382 ///
14383 /// \param Arg The template argument that will be traversed to find
14384 /// unexpanded parameter packs.
14386 TemplateArgument Arg,
14388
14389 /// Collect the set of unexpanded parameter packs within the given
14390 /// template argument.
14391 ///
14392 /// \param Arg The template argument that will be traversed to find
14393 /// unexpanded parameter packs.
14397
14398 /// Collect the set of unexpanded parameter packs within the given
14399 /// type.
14400 ///
14401 /// \param T The type that will be traversed to find
14402 /// unexpanded parameter packs.
14405
14406 /// Collect the set of unexpanded parameter packs within the given
14407 /// type.
14408 ///
14409 /// \param TL The type that will be traversed to find
14410 /// unexpanded parameter packs.
14413
14414 /// Collect the set of unexpanded parameter packs within the given
14415 /// nested-name-specifier.
14416 ///
14417 /// \param NNS The nested-name-specifier that will be traversed to find
14418 /// unexpanded parameter packs.
14422
14423 /// Collect the set of unexpanded parameter packs within the given
14424 /// name.
14425 ///
14426 /// \param NameInfo The name that will be traversed to find
14427 /// unexpanded parameter packs.
14429 const DeclarationNameInfo &NameInfo,
14431
14432 /// Collect the set of unexpanded parameter packs within the given
14433 /// expression.
14436
14437 /// Invoked when parsing a template argument.
14438 ///
14439 /// \param Arg the template argument, which may already be invalid.
14440 ///
14441 /// If it is followed by ellipsis, this function is called before
14442 /// `ActOnPackExpansion`.
14445
14446 /// Invoked when parsing a template argument followed by an
14447 /// ellipsis, which creates a pack expansion.
14448 ///
14449 /// \param Arg The template argument preceding the ellipsis, which
14450 /// may already be invalid.
14451 ///
14452 /// \param EllipsisLoc The location of the ellipsis.
14454 SourceLocation EllipsisLoc);
14455
14456 /// Invoked when parsing a type followed by an ellipsis, which
14457 /// creates a pack expansion.
14458 ///
14459 /// \param Type The type preceding the ellipsis, which will become
14460 /// the pattern of the pack expansion.
14461 ///
14462 /// \param EllipsisLoc The location of the ellipsis.
14464
14465 /// Construct a pack expansion type from the pattern of the pack
14466 /// expansion.
14468 SourceLocation EllipsisLoc,
14469 UnsignedOrNone NumExpansions);
14470
14471 /// Construct a pack expansion type from the pattern of the pack
14472 /// expansion.
14473 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14474 SourceLocation EllipsisLoc,
14475 UnsignedOrNone NumExpansions);
14476
14477 /// Invoked when parsing an expression followed by an ellipsis, which
14478 /// creates a pack expansion.
14479 ///
14480 /// \param Pattern The expression preceding the ellipsis, which will become
14481 /// the pattern of the pack expansion.
14482 ///
14483 /// \param EllipsisLoc The location of the ellipsis.
14484 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14485
14486 /// Invoked when parsing an expression followed by an ellipsis, which
14487 /// creates a pack expansion.
14488 ///
14489 /// \param Pattern The expression preceding the ellipsis, which will become
14490 /// the pattern of the pack expansion.
14491 ///
14492 /// \param EllipsisLoc The location of the ellipsis.
14493 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14494 UnsignedOrNone NumExpansions);
14495
14496 /// Determine whether we could expand a pack expansion with the
14497 /// given set of parameter packs into separate arguments by repeatedly
14498 /// transforming the pattern.
14499 ///
14500 /// \param EllipsisLoc The location of the ellipsis that identifies the
14501 /// pack expansion.
14502 ///
14503 /// \param PatternRange The source range that covers the entire pattern of
14504 /// the pack expansion.
14505 ///
14506 /// \param Unexpanded The set of unexpanded parameter packs within the
14507 /// pattern.
14508 ///
14509 /// \param ShouldExpand Will be set to \c true if the transformer should
14510 /// expand the corresponding pack expansions into separate arguments. When
14511 /// set, \c NumExpansions must also be set.
14512 ///
14513 /// \param RetainExpansion Whether the caller should add an unexpanded
14514 /// pack expansion after all of the expanded arguments. This is used
14515 /// when extending explicitly-specified template argument packs per
14516 /// C++0x [temp.arg.explicit]p9.
14517 ///
14518 /// \param NumExpansions The number of separate arguments that will be in
14519 /// the expanded form of the corresponding pack expansion. This is both an
14520 /// input and an output parameter, which can be set by the caller if the
14521 /// number of expansions is known a priori (e.g., due to a prior substitution)
14522 /// and will be set by the callee when the number of expansions is known.
14523 /// The callee must set this value when \c ShouldExpand is \c true; it may
14524 /// set this value in other cases.
14525 ///
14526 /// \returns true if an error occurred (e.g., because the parameter packs
14527 /// are to be instantiated with arguments of different lengths), false
14528 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14529 /// must be set.
14531 SourceLocation EllipsisLoc, SourceRange PatternRange,
14533 const MultiLevelTemplateArgumentList &TemplateArgs,
14534 bool FailOnPackProducingTemplates, bool &ShouldExpand,
14535 bool &RetainExpansion, UnsignedOrNone &NumExpansions);
14536
14537 /// Determine the number of arguments in the given pack expansion
14538 /// type.
14539 ///
14540 /// This routine assumes that the number of arguments in the expansion is
14541 /// consistent across all of the unexpanded parameter packs in its pattern.
14542 ///
14543 /// Returns an empty Optional if the type can't be expanded.
14545 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14546
14549 const MultiLevelTemplateArgumentList &TemplateArgs);
14550
14551 /// Determine whether the given declarator contains any unexpanded
14552 /// parameter packs.
14553 ///
14554 /// This routine is used by the parser to disambiguate function declarators
14555 /// with an ellipsis prior to the ')', e.g.,
14556 ///
14557 /// \code
14558 /// void f(T...);
14559 /// \endcode
14560 ///
14561 /// To determine whether we have an (unnamed) function parameter pack or
14562 /// a variadic function.
14563 ///
14564 /// \returns true if the declarator contains any unexpanded parameter packs,
14565 /// false otherwise.
14567
14568 /// Returns the pattern of the pack expansion for a template argument.
14569 ///
14570 /// \param OrigLoc The template argument to expand.
14571 ///
14572 /// \param Ellipsis Will be set to the location of the ellipsis.
14573 ///
14574 /// \param NumExpansions Will be set to the number of expansions that will
14575 /// be generated from this pack expansion, if known a priori.
14578 SourceLocation &Ellipsis,
14579 UnsignedOrNone &NumExpansions) const;
14580
14581 /// Given a template argument that contains an unexpanded parameter pack, but
14582 /// which has already been substituted, attempt to determine the number of
14583 /// elements that will be produced once this argument is fully-expanded.
14584 ///
14585 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14586 /// avoid actually expanding the pack where possible.
14588
14589 /// Called when an expression computing the size of a parameter pack
14590 /// is parsed.
14591 ///
14592 /// \code
14593 /// template<typename ...Types> struct count {
14594 /// static const unsigned value = sizeof...(Types);
14595 /// };
14596 /// \endcode
14597 ///
14598 //
14599 /// \param OpLoc The location of the "sizeof" keyword.
14600 /// \param Name The name of the parameter pack whose size will be determined.
14601 /// \param NameLoc The source location of the name of the parameter pack.
14602 /// \param RParenLoc The location of the closing parentheses.
14604 IdentifierInfo &Name,
14605 SourceLocation NameLoc,
14606 SourceLocation RParenLoc);
14607
14608 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14609 SourceLocation EllipsisLoc,
14610 SourceLocation LSquareLoc, Expr *IndexExpr,
14611 SourceLocation RSquareLoc);
14612
14613 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14614 SourceLocation EllipsisLoc, Expr *IndexExpr,
14615 SourceLocation RSquareLoc,
14616 ArrayRef<Expr *> ExpandedExprs = {},
14617 bool FullySubstituted = false);
14618
14619 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14620 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14621 tok::TokenKind Operator,
14622 SourceLocation EllipsisLoc, Expr *RHS,
14623 SourceLocation RParenLoc);
14624 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14625 SourceLocation LParenLoc, Expr *LHS,
14626 BinaryOperatorKind Operator,
14627 SourceLocation EllipsisLoc, Expr *RHS,
14628 SourceLocation RParenLoc,
14629 UnsignedOrNone NumExpansions);
14630 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14631 BinaryOperatorKind Operator);
14632
14633 ///@}
14634
14635 //
14636 //
14637 // -------------------------------------------------------------------------
14638 //
14639 //
14640
14641 /// \name Constraints and Concepts
14642 /// Implementations are in SemaConcept.cpp
14643 ///@{
14644
14645public:
14647 const llvm::FoldingSetNodeID &ID) {
14648 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14649 SatisfactionStack.emplace_back(Can, ID);
14650 }
14651
14652 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14653
14655 const llvm::FoldingSetNodeID &ID) const {
14656 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14657 return llvm::is_contained(SatisfactionStack,
14659 }
14660
14662 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
14663
14664 // Resets the current SatisfactionStack for cases where we are instantiating
14665 // constraints as a 'side effect' of normal instantiation in a way that is not
14666 // indicative of recursive definition.
14669 Sema &SemaRef;
14670
14671 public:
14673 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14674 }
14675
14677 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14678 }
14679 };
14680
14683 SatisfactionStack.swap(NewSS);
14684 }
14685
14686 /// Check whether the given expression is a valid constraint expression.
14687 /// A diagnostic is emitted if it is not, false is returned, and
14688 /// PossibleNonPrimary will be set to true if the failure might be due to a
14689 /// non-primary expression being used as an atomic constraint.
14690 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
14691 bool *PossibleNonPrimary = nullptr,
14692 bool IsTrailingRequiresClause = false);
14693
14694 /// \brief Check whether the given list of constraint expressions are
14695 /// satisfied (as if in a 'conjunction') given template arguments.
14696 /// \param Template the template-like entity that triggered the constraints
14697 /// check (either a concept or a constrained entity).
14698 /// \param ConstraintExprs a list of constraint expressions, treated as if
14699 /// they were 'AND'ed together.
14700 /// \param TemplateArgLists the list of template arguments to substitute into
14701 /// the constraint expression.
14702 /// \param TemplateIDRange The source range of the template id that
14703 /// caused the constraints check.
14704 /// \param Satisfaction if true is returned, will contain details of the
14705 /// satisfaction, with enough information to diagnose an unsatisfied
14706 /// expression.
14707 /// \returns true if an error occurred and satisfaction could not be checked,
14708 /// false otherwise.
14710 const NamedDecl *Template,
14711 ArrayRef<AssociatedConstraint> AssociatedConstraints,
14712 const MultiLevelTemplateArgumentList &TemplateArgLists,
14713 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction) {
14715 return CheckConstraintSatisfaction(Template, AssociatedConstraints,
14716 Converted, TemplateArgLists,
14717 TemplateIDRange, Satisfaction);
14718 }
14719
14720 /// \brief Check whether the given list of constraint expressions are
14721 /// satisfied (as if in a 'conjunction') given template arguments.
14722 /// Additionally, takes an empty list of Expressions which is populated with
14723 /// the instantiated versions of the ConstraintExprs.
14724 /// \param Template the template-like entity that triggered the constraints
14725 /// check (either a concept or a constrained entity).
14726 /// \param ConstraintExprs a list of constraint expressions, treated as if
14727 /// they were 'AND'ed together.
14728 /// \param ConvertedConstraints a out parameter that will get populated with
14729 /// the instantiated version of the ConstraintExprs if we successfully checked
14730 /// satisfaction.
14731 /// \param TemplateArgList the multi-level list of template arguments to
14732 /// substitute into the constraint expression. This should be relative to the
14733 /// top-level (hence multi-level), since we need to instantiate fully at the
14734 /// time of checking.
14735 /// \param TemplateIDRange The source range of the template id that
14736 /// caused the constraints check.
14737 /// \param Satisfaction if true is returned, will contain details of the
14738 /// satisfaction, with enough information to diagnose an unsatisfied
14739 /// expression.
14740 /// \returns true if an error occurred and satisfaction could not be checked,
14741 /// false otherwise.
14743 const NamedDecl *Template,
14744 ArrayRef<AssociatedConstraint> AssociatedConstraints,
14745 llvm::SmallVectorImpl<Expr *> &ConvertedConstraints,
14746 const MultiLevelTemplateArgumentList &TemplateArgList,
14747 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction);
14748
14749 /// \brief Check whether the given non-dependent constraint expression is
14750 /// satisfied. Returns false and updates Satisfaction with the satisfaction
14751 /// verdict if successful, emits a diagnostic and returns true if an error
14752 /// occurred and satisfaction could not be determined.
14753 ///
14754 /// \returns true if an error occurred, false otherwise.
14755 bool
14757 ConstraintSatisfaction &Satisfaction);
14758
14759 /// Check whether the given function decl's trailing requires clause is
14760 /// satisfied, if any. Returns false and updates Satisfaction with the
14761 /// satisfaction verdict if successful, emits a diagnostic and returns true if
14762 /// an error occurred and satisfaction could not be determined.
14763 ///
14764 /// \returns true if an error occurred, false otherwise.
14766 ConstraintSatisfaction &Satisfaction,
14767 SourceLocation UsageLoc = SourceLocation(),
14768 bool ForOverloadResolution = false);
14769
14770 // Calculates whether two constraint expressions are equal irrespective of a
14771 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
14772 // 'New', which are the "source" of the constraint, since this is necessary
14773 // for figuring out the relative 'depth' of the constraint. The depth of the
14774 // 'primary template' and the 'instantiated from' templates aren't necessarily
14775 // the same, such as a case when one is a 'friend' defined in a class.
14777 const Expr *OldConstr,
14778 const TemplateCompareNewDeclInfo &New,
14779 const Expr *NewConstr);
14780
14781 // Calculates whether the friend function depends on an enclosing template for
14782 // the purposes of [temp.friend] p9.
14784
14785 /// \brief Ensure that the given template arguments satisfy the constraints
14786 /// associated with the given template, emitting a diagnostic if they do not.
14787 ///
14788 /// \param Template The template to which the template arguments are being
14789 /// provided.
14790 ///
14791 /// \param TemplateArgs The converted, canonicalized template arguments.
14792 ///
14793 /// \param TemplateIDRange The source range of the template id that
14794 /// caused the constraints check.
14795 ///
14796 /// \returns true if the constrains are not satisfied or could not be checked
14797 /// for satisfaction, false if the constraints are satisfied.
14800 const MultiLevelTemplateArgumentList &TemplateArgs,
14801 SourceRange TemplateIDRange);
14802
14803 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
14805 ArrayRef<TemplateArgument> TemplateArgs,
14806 ConstraintSatisfaction &Satisfaction);
14807
14808 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14809 /// unsatisfied.
14810 /// \param First whether this is the first time an unsatisfied constraint is
14811 /// diagnosed for this error.
14813 bool First = true);
14814
14815 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14816 /// unsatisfied.
14817 void
14819 bool First = true);
14820
14822 const NamedDecl *ConstrainedDecl,
14823 ArrayRef<AssociatedConstraint> AssociatedConstraints);
14824
14825 /// \brief Check whether the given declaration's associated constraints are
14826 /// at least as constrained than another declaration's according to the
14827 /// partial ordering of constraints.
14828 ///
14829 /// \param Result If no error occurred, receives the result of true if D1 is
14830 /// at least constrained than D2, and false otherwise.
14831 ///
14832 /// \returns true if an error occurred, false otherwise.
14833 bool IsAtLeastAsConstrained(const NamedDecl *D1,
14835 const NamedDecl *D2,
14837 bool &Result);
14838
14839 /// If D1 was not at least as constrained as D2, but would've been if a pair
14840 /// of atomic constraints involved had been declared in a concept and not
14841 /// repeated in two separate places in code.
14842 /// \returns true if such a diagnostic was emitted, false otherwise.
14846
14847private:
14848 /// Caches pairs of template-like decls whose associated constraints were
14849 /// checked for subsumption and whether or not the first's constraints did in
14850 /// fact subsume the second's.
14851 llvm::DenseMap<std::pair<const NamedDecl *, const NamedDecl *>, bool>
14852 SubsumptionCache;
14853 /// Caches the normalized associated constraints of declarations (concepts or
14854 /// constrained declarations). If an error occurred while normalizing the
14855 /// associated constraints of the template or concept, nullptr will be cached
14856 /// here.
14857 llvm::DenseMap<const NamedDecl *, NormalizedConstraint *> NormalizationCache;
14858
14859 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
14860 SatisfactionCache;
14861
14862 // The current stack of constraint satisfactions, so we can exit-early.
14864
14865 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to set up the
14866 /// LocalInstantiationScope of the current non-lambda function. For lambdas,
14867 /// use LambdaScopeForCallOperatorInstantiationRAII.
14868 bool
14869 SetupConstraintScope(FunctionDecl *FD,
14870 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
14871 const MultiLevelTemplateArgumentList &MLTAL,
14873
14874 /// Used during constraint checking, sets up the constraint template argument
14875 /// lists, and calls SetupConstraintScope to set up the
14876 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
14877 std::optional<MultiLevelTemplateArgumentList>
14878 SetupConstraintCheckingTemplateArgumentsAndScope(
14879 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
14881
14882 ///@}
14883
14884 //
14885 //
14886 // -------------------------------------------------------------------------
14887 //
14888 //
14889
14890 /// \name Types
14891 /// Implementations are in SemaType.cpp
14892 ///@{
14893
14894public:
14895 /// A mapping that describes the nullability we've seen in each header file.
14897
14898 static int getPrintable(int I) { return I; }
14899 static unsigned getPrintable(unsigned I) { return I; }
14900 static bool getPrintable(bool B) { return B; }
14901 static const char *getPrintable(const char *S) { return S; }
14902 static StringRef getPrintable(StringRef S) { return S; }
14903 static const std::string &getPrintable(const std::string &S) { return S; }
14904 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
14905 return II;
14906 }
14908 static QualType getPrintable(QualType T) { return T; }
14909 static SourceRange getPrintable(SourceRange R) { return R; }
14911 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
14913
14914 enum class CompleteTypeKind {
14915 /// Apply the normal rules for complete types. In particular,
14916 /// treat all sizeless types as incomplete.
14917 Normal,
14918
14919 /// Relax the normal rules for complete types so that they include
14920 /// sizeless built-in types.
14922
14923 // FIXME: Eventually we should flip the default to Normal and opt in
14924 // to AcceptSizeless rather than opt out of it.
14926 };
14927
14929 const DeclSpec *DS = nullptr);
14931 const DeclSpec *DS = nullptr);
14932
14933 /// Build a pointer type.
14934 ///
14935 /// \param T The type to which we'll be building a pointer.
14936 ///
14937 /// \param Loc The location of the entity whose type involves this
14938 /// pointer type or, if there is no such entity, the location of the
14939 /// type that will have pointer type.
14940 ///
14941 /// \param Entity The name of the entity that involves the pointer
14942 /// type, if known.
14943 ///
14944 /// \returns A suitable pointer type, if there are no
14945 /// errors. Otherwise, returns a NULL type.
14947 DeclarationName Entity);
14948
14949 /// Build a reference type.
14950 ///
14951 /// \param T The type to which we'll be building a reference.
14952 ///
14953 /// \param Loc The location of the entity whose type involves this
14954 /// reference type or, if there is no such entity, the location of the
14955 /// type that will have reference type.
14956 ///
14957 /// \param Entity The name of the entity that involves the reference
14958 /// type, if known.
14959 ///
14960 /// \returns A suitable reference type, if there are no
14961 /// errors. Otherwise, returns a NULL type.
14963 DeclarationName Entity);
14964
14965 /// Build an array type.
14966 ///
14967 /// \param T The type of each element in the array.
14968 ///
14969 /// \param ASM C99 array size modifier (e.g., '*', 'static').
14970 ///
14971 /// \param ArraySize Expression describing the size of the array.
14972 ///
14973 /// \param Brackets The range from the opening '[' to the closing ']'.
14974 ///
14975 /// \param Entity The name of the entity that involves the array
14976 /// type, if known.
14977 ///
14978 /// \returns A suitable array type, if there are no errors. Otherwise,
14979 /// returns a NULL type.
14981 unsigned Quals, SourceRange Brackets,
14982 DeclarationName Entity);
14984
14985 /// Build an ext-vector type.
14986 ///
14987 /// Run the required checks for the extended vector type.
14989 SourceLocation AttrLoc);
14990 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
14991 SourceLocation AttrLoc);
14992
14994 Expr *CountExpr,
14995 bool CountInBytes,
14996 bool OrNull);
14997
14998 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
14999 /// expression is uninstantiated. If instantiated it will apply the
15000 /// appropriate address space to the type. This function allows dependent
15001 /// template variables to be used in conjunction with the address_space
15002 /// attribute
15003 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
15004 SourceLocation AttrLoc);
15005
15006 /// Same as above, but constructs the AddressSpace index if not provided.
15008 SourceLocation AttrLoc);
15009
15011
15013
15014 /// Build a function type.
15015 ///
15016 /// This routine checks the function type according to C++ rules and
15017 /// under the assumption that the result type and parameter types have
15018 /// just been instantiated from a template. It therefore duplicates
15019 /// some of the behavior of GetTypeForDeclarator, but in a much
15020 /// simpler form that is only suitable for this narrow use case.
15021 ///
15022 /// \param T The return type of the function.
15023 ///
15024 /// \param ParamTypes The parameter types of the function. This array
15025 /// will be modified to account for adjustments to the types of the
15026 /// function parameters.
15027 ///
15028 /// \param Loc The location of the entity whose type involves this
15029 /// function type or, if there is no such entity, the location of the
15030 /// type that will have function type.
15031 ///
15032 /// \param Entity The name of the entity that involves the function
15033 /// type, if known.
15034 ///
15035 /// \param EPI Extra information about the function type. Usually this will
15036 /// be taken from an existing function with the same prototype.
15037 ///
15038 /// \returns A suitable function type, if there are no errors. The
15039 /// unqualified type will always be a FunctionProtoType.
15040 /// Otherwise, returns a NULL type.
15044
15045 /// Build a member pointer type \c T Class::*.
15046 ///
15047 /// \param T the type to which the member pointer refers.
15048 /// \param Class the class type into which the member pointer points.
15049 /// \param Loc the location where this type begins
15050 /// \param Entity the name of the entity that will have this member pointer
15051 /// type
15052 ///
15053 /// \returns a member pointer type, if successful, or a NULL type if there was
15054 /// an error.
15057 DeclarationName Entity);
15058
15059 /// Build a block pointer type.
15060 ///
15061 /// \param T The type to which we'll be building a block pointer.
15062 ///
15063 /// \param Loc The source location, used for diagnostics.
15064 ///
15065 /// \param Entity The name of the entity that involves the block pointer
15066 /// type, if known.
15067 ///
15068 /// \returns A suitable block pointer type, if there are no
15069 /// errors. Otherwise, returns a NULL type.
15071 DeclarationName Entity);
15072
15073 /// Build a paren type including \p T.
15076
15077 /// Build a Read-only Pipe type.
15078 ///
15079 /// \param T The type to which we'll be building a Pipe.
15080 ///
15081 /// \param Loc We do not use it for now.
15082 ///
15083 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15084 /// a NULL type.
15086
15087 /// Build a Write-only Pipe type.
15088 ///
15089 /// \param T The type to which we'll be building a Pipe.
15090 ///
15091 /// \param Loc We do not use it for now.
15092 ///
15093 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
15094 /// a NULL type.
15096
15097 /// Build a bit-precise integer type.
15098 ///
15099 /// \param IsUnsigned Boolean representing the signedness of the type.
15100 ///
15101 /// \param BitWidth Size of this int type in bits, or an expression
15102 /// representing that.
15103 ///
15104 /// \param Loc Location of the keyword.
15105 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
15106
15107 /// GetTypeForDeclarator - Convert the type for the specified
15108 /// declarator to Type instances.
15109 ///
15110 /// The result of this call will never be null, but the associated
15111 /// type may be a null type if there's an unrecoverable error.
15114
15115 /// Package the given type and TSI into a ParsedType.
15118 TypeSourceInfo **TInfo = nullptr);
15119
15121
15122 // Check whether the size of array element of type \p EltTy is a multiple of
15123 // its alignment and return false if it isn't.
15125
15126 void
15127 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
15128 SourceLocation FallbackLoc,
15129 SourceLocation ConstQualLoc = SourceLocation(),
15130 SourceLocation VolatileQualLoc = SourceLocation(),
15131 SourceLocation RestrictQualLoc = SourceLocation(),
15132 SourceLocation AtomicQualLoc = SourceLocation(),
15133 SourceLocation UnalignedQualLoc = SourceLocation());
15134
15135 /// Retrieve the keyword associated
15137
15138 /// Adjust the calling convention of a method to be the ABI default if it
15139 /// wasn't specified explicitly. This handles method types formed from
15140 /// function type typedefs and typename template arguments.
15141 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
15142 bool IsCtorOrDtor, SourceLocation Loc);
15143
15144 // Check if there is an explicit attribute, but only look through parens.
15145 // The intent is to look for an attribute on the current declarator, but not
15146 // one that came from a typedef.
15148
15149 /// Check whether a nullability type specifier can be added to the given
15150 /// type through some means not written in source (e.g. API notes).
15151 ///
15152 /// \param Type The type to which the nullability specifier will be
15153 /// added. On success, this type will be updated appropriately.
15154 ///
15155 /// \param Nullability The nullability specifier to add.
15156 ///
15157 /// \param DiagLoc The location to use for diagnostics.
15158 ///
15159 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
15160 /// array type (e.g., because it will decay to a pointer).
15161 ///
15162 /// \param OverrideExisting Whether to override an existing, locally-specified
15163 /// nullability specifier rather than complaining about the conflict.
15164 ///
15165 /// \returns true if nullability cannot be applied, false otherwise.
15167 NullabilityKind Nullability,
15168 SourceLocation DiagLoc,
15169 bool AllowArrayTypes,
15170 bool OverrideExisting);
15171
15172 /// Get the type of expression E, triggering instantiation to complete the
15173 /// type if necessary -- that is, if the expression refers to a templated
15174 /// static data member of incomplete array type.
15175 ///
15176 /// May still return an incomplete type if instantiation was not possible or
15177 /// if the type is incomplete for a different reason. Use
15178 /// RequireCompleteExprType instead if a diagnostic is expected for an
15179 /// incomplete expression type.
15181
15183
15184 /// Ensure that the type of the given expression is complete.
15185 ///
15186 /// This routine checks whether the expression \p E has a complete type. If
15187 /// the expression refers to an instantiable construct, that instantiation is
15188 /// performed as needed to complete its type. Furthermore
15189 /// Sema::RequireCompleteType is called for the expression's type (or in the
15190 /// case of a reference type, the referred-to type).
15191 ///
15192 /// \param E The expression whose type is required to be complete.
15193 /// \param Kind Selects which completeness rules should be applied.
15194 /// \param Diagnoser The object that will emit a diagnostic if the type is
15195 /// incomplete.
15196 ///
15197 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
15198 /// otherwise.
15200 TypeDiagnoser &Diagnoser);
15201 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
15202
15203 template <typename... Ts>
15204 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
15205 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15207 }
15208
15209 // Returns the underlying type of a decltype with the given expression.
15211
15213 /// If AsUnevaluated is false, E is treated as though it were an evaluated
15214 /// context, such as when building a type for decltype(auto).
15215 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
15216
15217 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
15219 SourceLocation EllipsisLoc);
15220 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
15221 SourceLocation Loc, SourceLocation EllipsisLoc,
15222 bool FullySubstituted = false,
15223 ArrayRef<QualType> Expansions = {});
15224
15238
15240 return BuiltinRemoveReference(BaseType, UTTKind::RemoveCVRef, Loc);
15241 }
15242
15247
15248 bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
15249
15250 /// Ensure that the type T is a literal type.
15251 ///
15252 /// This routine checks whether the type @p T is a literal type. If @p T is an
15253 /// incomplete type, an attempt is made to complete it. If @p T is a literal
15254 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
15255 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
15256 /// it the type @p T), along with notes explaining why the type is not a
15257 /// literal type, and returns true.
15258 ///
15259 /// @param Loc The location in the source that the non-literal type
15260 /// diagnostic should refer to.
15261 ///
15262 /// @param T The type that this routine is examining for literalness.
15263 ///
15264 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
15265 ///
15266 /// @returns @c true if @p T is not a literal type and a diagnostic was
15267 /// emitted, @c false otherwise.
15269 TypeDiagnoser &Diagnoser);
15270 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
15271
15272 template <typename... Ts>
15274 const Ts &...Args) {
15275 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15276 return RequireLiteralType(Loc, T, Diagnoser);
15277 }
15278
15281 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
15282 }
15283
15284 /// Ensure that the type T is a complete type.
15285 ///
15286 /// This routine checks whether the type @p T is complete in any
15287 /// context where a complete type is required. If @p T is a complete
15288 /// type, returns false. If @p T is a class template specialization,
15289 /// this routine then attempts to perform class template
15290 /// instantiation. If instantiation fails, or if @p T is incomplete
15291 /// and cannot be completed, issues the diagnostic @p diag (giving it
15292 /// the type @p T) and returns true.
15293 ///
15294 /// @param Loc The location in the source that the incomplete type
15295 /// diagnostic should refer to.
15296 ///
15297 /// @param T The type that this routine is examining for completeness.
15298 ///
15299 /// @param Kind Selects which completeness rules should be applied.
15300 ///
15301 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
15302 /// @c false otherwise.
15304 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
15306 CompleteTypeKind Kind, unsigned DiagID);
15307
15309 TypeDiagnoser &Diagnoser) {
15311 }
15314 }
15315
15316 template <typename... Ts>
15318 const Ts &...Args) {
15319 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
15320 return RequireCompleteType(Loc, T, Diagnoser);
15321 }
15322
15323 /// Determine whether a declaration is visible to name lookup.
15324 bool isVisible(const NamedDecl *D) {
15325 return D->isUnconditionallyVisible() ||
15326 isAcceptableSlow(D, AcceptableKind::Visible);
15327 }
15328
15329 /// Determine whether a declaration is reachable.
15330 bool isReachable(const NamedDecl *D) {
15331 // All visible declarations are reachable.
15332 return D->isUnconditionallyVisible() ||
15333 isAcceptableSlow(D, AcceptableKind::Reachable);
15334 }
15335
15336 /// Determine whether a declaration is acceptable (visible/reachable).
15339 }
15340
15341 /// Determine if \p D and \p Suggested have a structurally compatible
15342 /// layout as described in C11 6.2.7/1.
15343 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15344
15345 /// Determine if \p D has a visible definition. If not, suggest a declaration
15346 /// that should be made visible to expose the definition.
15347 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15348 bool OnlyNeedComplete = false);
15350 NamedDecl *Hidden;
15351 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15352 }
15353 /// Determine if \p D has a definition which allows we redefine it in current
15354 /// TU. \p Suggested is the definition that should be made visible to expose
15355 /// the definition.
15356 bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested,
15357 bool &Visible);
15359 NamedDecl *Hidden;
15360 return isRedefinitionAllowedFor(const_cast<NamedDecl *>(D), &Hidden,
15361 Visible);
15362 }
15363
15364 /// Determine if \p D has a reachable definition. If not, suggest a
15365 /// declaration that should be made reachable to expose the definition.
15366 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15367 bool OnlyNeedComplete = false);
15369 NamedDecl *Hidden;
15370 return hasReachableDefinition(D, &Hidden);
15371 }
15372
15373 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15375 bool OnlyNeedComplete = false);
15377 NamedDecl *Hidden;
15378 return hasAcceptableDefinition(D, &Hidden, Kind);
15379 }
15380
15381 /// Try to parse the conditional expression attached to an effect attribute
15382 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15383 /// optional on error.
15384 std::optional<FunctionEffectMode>
15385 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15386
15387private:
15388 /// The implementation of RequireCompleteType
15389 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15390 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15391
15392 /// Nullability type specifiers.
15393 IdentifierInfo *Ident__Nonnull = nullptr;
15394 IdentifierInfo *Ident__Nullable = nullptr;
15395 IdentifierInfo *Ident__Nullable_result = nullptr;
15396 IdentifierInfo *Ident__Null_unspecified = nullptr;
15397
15398 ///@}
15399
15400 //
15401 //
15402 // -------------------------------------------------------------------------
15403 //
15404 //
15405
15406 /// \name FixIt Helpers
15407 /// Implementations are in SemaFixItUtils.cpp
15408 ///@{
15409
15410public:
15411 /// Get a string to suggest for zero-initialization of a type.
15413 SourceLocation Loc) const;
15415
15416 ///@}
15417
15418 //
15419 //
15420 // -------------------------------------------------------------------------
15421 //
15422 //
15423
15424 /// \name Function Effects
15425 /// Implementations are in SemaFunctionEffects.cpp
15426 ///@{
15427public:
15429 enum class Kind { Added, Removed, ConditionMismatch };
15430
15433 std::optional<FunctionEffectWithCondition>
15434 Old; // Invalid when 'Kind' is 'Added'.
15435 std::optional<FunctionEffectWithCondition>
15436 New; // Invalid when 'Kind' is 'Removed'.
15437
15438 StringRef effectName() const {
15439 if (Old)
15440 return Old.value().Effect.name();
15441 return New.value().Effect.name();
15442 }
15443
15444 /// Describes the result of effects differing between a base class's virtual
15445 /// method and an overriding method in a subclass.
15446 enum class OverrideResult {
15447 NoAction,
15448 Warn,
15449 Merge // Merge missing effect from base to derived.
15450 };
15451
15452 /// Return true if adding or removing the effect as part of a type
15453 /// conversion should generate a diagnostic.
15454 bool shouldDiagnoseConversion(QualType SrcType,
15455 const FunctionEffectsRef &SrcFX,
15456 QualType DstType,
15457 const FunctionEffectsRef &DstFX) const;
15458
15459 /// Return true if adding or removing the effect in a redeclaration should
15460 /// generate a diagnostic.
15461 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15462 const FunctionEffectsRef &OldFX,
15463 const FunctionDecl &NewFunction,
15464 const FunctionEffectsRef &NewFX) const;
15465
15466 /// Return true if adding or removing the effect in a C++ virtual method
15467 /// override should generate a diagnostic.
15468 OverrideResult shouldDiagnoseMethodOverride(
15469 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15470 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15471 };
15472
15473 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15474 /// Caller should short-circuit by checking for equality first.
15476 const FunctionEffectsRef &New);
15477 };
15478
15479 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15480 /// FunctionEffectsRef to be verified.
15482
15483 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15484 /// are all null.
15486
15487public:
15488 /// Warn and return true if adding a function effect to a set would create a
15489 /// conflict.
15492 SourceLocation NewAttrLoc);
15493
15494 // Report a failure to merge function effects between declarations due to a
15495 // conflict.
15496 void
15498 SourceLocation NewLoc,
15499 SourceLocation OldLoc);
15500
15501 /// Inline checks from the start of maybeAddDeclWithEffects, to
15502 /// minimize performance impact on code not using effects.
15503 template <class FuncOrBlockDecl>
15504 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15506 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15508 }
15509
15510 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15511 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15512
15513 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15514 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15515
15517
15518 ///@}
15519};
15520
15521DeductionFailureInfo
15523 sema::TemplateDeductionInfo &Info);
15524
15525/// Contains a late templated function.
15526/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15529 /// The template function declaration to be late parsed.
15531 /// Floating-point options in the point of definition.
15533};
15534
15535template <>
15537 PragmaMsStackAction Action,
15538 llvm::StringRef StackSlotLabel,
15540
15541} // end namespace clang
15542
15543#endif
#define V(N, I)
Definition: ASTContext.h:3597
Forward declaration of all AST node types.
This file provides some common utility functions for processing Lambda related AST Constructs.
MatchType Type
StringRef P
static char ID
Definition: Arena.cpp:183
Defines enum values for all the target-independent builtin functions.
static void emit(Program &P, llvm::SmallVectorImpl< std::byte > &Code, const T &Val, bool &Success)
Helper to write bytecode and bail out if 32-bit offsets become invalid.
const Decl * D
IndirectLocalPath & Path
const LambdaCapture * Capture
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Expr * E
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
Defines enumerations for expression traits intrinsics.
int Priority
Definition: Format.cpp:3181
StringRef Identifier
Definition: Format.cpp:3185
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::Target Target
Definition: MachO.h:51
llvm::MachO::Record Record
Definition: MachO.h:31
Defines the clang::Module class, which describes a module in the source code.
#define SM(sm)
Definition: OffloadArch.cpp:16
Defines the clang::OpenCLOptions class.
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
Definition: Redeclaration.h:18
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
uint32_t Id
Definition: SemaARM.cpp:1179
AccessResult
A copy of Sema's enum without AR_delayed.
Definition: SemaAccess.cpp:29
CastType
Definition: SemaCast.cpp:49
@ None
SourceRange Range
Definition: SemaObjC.cpp:753
SourceLocation Loc
Definition: SemaObjC.cpp:754
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.
Defines enumerations for the type traits support.
TypePropertyCache< Private > Cache
Definition: Type.cpp:4836
C Language Family Type Representation.
SourceLocation Begin
StateNode * Previous
std::string Label
__device__ int
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:34
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:188
CanQualType BoolTy
Definition: ASTContext.h:1223
bool hasAnyFunctionEffects() const
Definition: ASTContext.h:3155
CanQualType IntTy
Definition: ASTContext.h:1231
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:429
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
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition: Expr.h:2723
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: TypeBase.h:3738
Attr - This represents one attribute.
Definition: Attr.h:44
An attributed type is a type to which a type attribute has been applied.
Definition: TypeBase.h:6585
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Definition: TypeBase.h:7180
Represents a C++ declaration that introduces decls from somewhere else.
Definition: DeclCXX.h:3490
A binding in a decomposition declaration.
Definition: DeclCXX.h:4179
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4634
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
Definition: DeclCXX.h:146
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2604
Represents a C++ conversion function within a class.
Definition: DeclCXX.h:2937
Represents a C++ base or member initializer.
Definition: DeclCXX.h:2369
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition: ExprCXX.h:2620
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2869
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2129
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
Represents a C++ nested-name-specifier or a global scope specifier.
Definition: DeclSpec.h:73
Represents the this expression in C++.
Definition: ExprCXX.h:1155
CXXTryStmt - A C++ try block, including all handlers.
Definition: StmtCXX.h:69
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2879
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition: Decl.h:4906
CaseStmt - Represent a case statement.
Definition: Stmt.h:1920
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition: Expr.h:3612
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.
Represents the specialization of a concept - evaluates to a prvalue of type bool.
Definition: ExprConcepts.h:42
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition: ASTConcept.h:37
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition: DeclCXX.h:3671
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Definition: Expr.h:4655
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.
Definition: DarwinSDKInfo.h:29
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
Definition: DeclBase.h:1382
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1449
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1272
Captures information about "declaration specifiers".
Definition: DeclSpec.h:217
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition: DeclBase.h:842
SourceLocation getLocation() const
Definition: DeclBase.h:439
DeclContext * getDeclContext()
Definition: DeclBase.h:448
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:918
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition: Decl.h:779
Information about one declarator, including the parsed type information and the identifier.
Definition: DeclSpec.h:1874
A decomposition declaration.
Definition: DeclCXX.h:4243
A dependently-generated diagnostic.
Designation - Represent a full designation, which is a sequence of designators.
Definition: Designator.h:208
A little helper class used to produce diagnostics.
Definition: Diagnostic.h:1233
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:231
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1529
void setLastDiagnosticIgnored(bool IsIgnored)
Pretend that the last diagnostic issued was ignored, so any subsequent notes will be suppressed,...
Definition: Diagnostic.h:791
An instance of this object exists for each enum constant that is defined.
Definition: Decl.h:3420
Represents an enum.
Definition: Decl.h:4004
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Definition: TypeBase.h:6522
Store information needed for an explicit specifier.
Definition: DeclCXX.h:1924
The return type of classify().
Definition: Expr.h:337
This represents one expression.
Definition: Expr.h:112
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition: Expr.h:194
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
Definition: Expr.h:804
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:273
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.
Definition: LangOptions.h:919
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
Definition: LangOptions.h:1026
Represents a member of a struct/union/class.
Definition: Decl.h:3157
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:257
FileNullability & operator[](FileID file)
Definition: Sema.h:268
FileNullability Nullability
Definition: Sema.h:264
Represents a function declaration or definition.
Definition: Decl.h:1999
A mutable set of FunctionEffect::Kind.
Definition: TypeBase.h:5136
Kind
Identifies the particular effect.
Definition: TypeBase.h:4898
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition: TypeBase.h:5082
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
Definition: ExprCXX.h:4835
Represents a prototype with parameter type info, e.g.
Definition: TypeBase.h:5282
Declaration of a template function.
Definition: DeclTemplate.h:952
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition: TypeBase.h:4504
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: TypeBase.h:4478
One of these records is kept for each identifier that is lexed.
A simple pair of identifier info and location.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Definition: Overload.h:615
Represents a field injected from an anonymous union/struct into the parent scope.
Definition: Decl.h:3464
Describes an C or C++ initializer list.
Definition: Expr.h:5235
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:523
FPEvalMethodKind
Possible float expression evaluation method choices.
Definition: LangOptions.h:239
ComplexRangeKind
Controls the various implementations for complex multiplication and.
Definition: LangOptions.h:375
FPExceptionModeKind
Possible floating point exception behavior.
Definition: LangOptions.h:227
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:434
Represents a lazily-loaded vector of data.
A stack-allocated class that identifies which local variable declaration instantiations are present i...
Definition: Template.h:365
Represents the results of name lookup.
Definition: Lookup.h:147
A global _GUID constant.
Definition: DeclCXX.h:4392
An instance of this class represents the declaration of a property member.
Definition: DeclCXX.h:4338
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4914
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition: Expr.h:3300
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition: TypeBase.h:3669
Abstract interface for a module loader.
Definition: ModuleLoader.h:83
Describes a module or submodule.
Definition: Module.h:144
Module(ModuleConstructorTag, StringRef Name, SourceLocation DefinitionLoc, Module *Parent, bool IsFramework, bool IsExplicit, unsigned VisibilityID)
Construct a new module or submodule.
Definition: Module.cpp:36
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:273
Represent a C++ namespace.
Definition: Decl.h:591
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Definition: DeclObjC.h:1154
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition: TypeBase.h:7961
Wrapper for void* pointer.
Definition: Ownership.h:51
static OpaquePtr make(QualType P)
Definition: Ownership.h:61
OpenCL supported extensions and optional core features.
Definition: OpenCLOptions.h:69
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition: Overload.h:1153
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition: Attr.h:256
ParenExpr - This represents a parenthesized expression, e.g.
Definition: Expr.h:2184
Represents a parameter to a function.
Definition: Decl.h:1789
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.
Parser - This implements a parser for the C family of languages.
Definition: Parser.h:171
void Emit(const DiagnosticBuilder &DB) const
Tracks expected type during expression parsing, for use in code completion.
Definition: Sema.h:289
PreferredTypeBuilder(ASTContext *Ctx, bool Enabled)
Definition: Sema.h:291
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:327
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:145
Stores the type being destroyed by a pseudo-destructor expression.
Definition: ExprCXX.h:2688
A (possibly-)qualified type.
Definition: TypeBase.h:937
The collection of all-type qualifiers we support.
Definition: TypeBase.h:331
Represents a struct/union/class.
Definition: Decl.h:4309
Represents the body of a requires-expression.
Definition: DeclCXX.h:2098
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Definition: ExprConcepts.h:505
Scope - A scope is a transient data structure that is used while parsing the program.
Definition: Scope.h:41
void incrementMSManglingNumber()
Definition: Scope.h:372
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
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
Definition: SemaBase.cpp:61
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition: SemaBase.cpp:33
AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
Definition: Sema.h:1838
bool operator==(const AlignPackInfo &Info) const
Definition: Sema.h:1898
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition: Sema.h:1870
unsigned getPackNumber() const
Definition: Sema.h:1888
bool IsXLStack() const
Definition: Sema.h:1896
bool IsPackSet() const
Definition: Sema.h:1890
AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
Definition: Sema.h:1844
bool IsAlignAttr() const
Definition: Sema.h:1884
bool IsPackAttr() const
Definition: Sema.h:1882
bool operator!=(const AlignPackInfo &Info) const
Definition: Sema.h:1904
AlignPackInfo(bool IsXL)
Definition: Sema.h:1848
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Definition: Sema.h:1855
Mode getAlignMode() const
Definition: Sema.h:1886
RAII object used to change the argument pack substitution index within a Sema object.
Definition: Sema.h:13496
ArgPackSubstIndexRAII(Sema &Self, UnsignedOrNone NewSubstIndex)
Definition: Sema.h:13501
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition: Sema.h:8224
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition: Sema.h:8229
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition: Sema.h:8216
std::tuple< const Ts &... > Args
Definition: Sema.h:8213
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
Definition: Sema.h:8393
A RAII object to enter scope of a compound statement.
Definition: Sema.h:1283
CompoundScopeRAII(Sema &S, bool IsStmtExpr=false)
Definition: Sema.h:1285
std::pair< VarDecl *, Expr * > get() const
Definition: Sema.h:7769
bool isInvalid() const
Definition: Sema.h:7768
std::optional< bool > getKnownValue() const
Definition: Sema.h:7773
A RAII object to temporarily push a declaration context.
Definition: Sema.h:3468
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition: Sema.h:3478
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
Definition: Sema.h:10258
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:10263
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.
For a defaulted function, the kind of defaulted function that it is.
Definition: Sema.h:6313
DefaultedComparisonKind asComparison() const
Definition: Sema.h:6345
DefaultedFunctionKind(CXXSpecialMemberKind CSM)
Definition: Sema.h:6322
unsigned getDiagnosticIndex() const
Get the index of this function kind for use in diagnostics.
Definition: Sema.h:6350
DefaultedFunctionKind(DefaultedComparisonKind Comp)
Definition: Sema.h:6325
CXXSpecialMemberKind asSpecialMember() const
Definition: Sema.h:6342
RAII class to control scope of DeferDiags.
Definition: Sema.h:9992
DeferDiagsRAII(Sema &S, bool DeferDiags)
Definition: Sema.h:9997
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
Definition: Sema.h:1352
DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool)
Enter a new scope.
Definition: Sema.h:1371
void popUndelayed(DelayedDiagnosticsState state)
Undo a previous pushUndelayed().
Definition: Sema.h:1395
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
Definition: Sema.h:1364
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition: Sema.h:1367
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:1381
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
Definition: Sema.h:1387
A helper class for building up ExtParameterInfos.
Definition: Sema.h:12907
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:12926
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition: Sema.h:12914
Records and restores the CurFPFeatures state on entry/exit of compound statements.
Definition: Sema.h:13881
FPOptionsOverride getOverrides()
Definition: Sema.h:13885
FullExprArg(Sema &actions)
Definition: Sema.h:7713
ExprResult release()
Definition: Sema.h:7715
Expr * get() const
Definition: Sema.h:7717
GlobalEagerInstantiationScope(Sema &S, bool Enabled, bool AtEndOfTU)
Definition: Sema.h:13897
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:10322
virtual SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress, bool SuppressConversion)
Definition: Sema.h:10314
Helper class that collects exception specifications for implicitly-declared special member functions.
Definition: Sema.h:5411
unsigned size() const
The number of exceptions in the exception specification.
Definition: Sema.h:5444
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition: Sema.h:5437
const QualType * data() const
The set of exceptions in the exception specification.
Definition: Sema.h:5447
void CalledExpr(Expr *E)
Integrate an invoked expression into the collected data.
Definition: Sema.h:5453
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition: Sema.h:5460
LocalEagerInstantiationScope(Sema &S, bool AtEndOfTU)
Definition: Sema.h:13854
static NameClassification DependentNonType()
Definition: Sema.h:3682
static NameClassification VarTemplate(TemplateName Name)
Definition: Sema.h:3692
ExprResult getExpression() const
Definition: Sema.h:3718
NameClassification(const IdentifierInfo *Keyword)
Definition: Sema.h:3655
static NameClassification Unknown()
Definition: Sema.h:3662
static NameClassification OverloadSet(ExprResult E)
Definition: Sema.h:3666
NameClassificationKind getKind() const
Definition: Sema.h:3716
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition: Sema.h:3710
static NameClassification FunctionTemplate(TemplateName Name)
Definition: Sema.h:3698
NamedDecl * getNonTypeDecl() const
Definition: Sema.h:3728
NameClassification(ParsedType Type)
Definition: Sema.h:3652
TemplateName getTemplateName() const
Definition: Sema.h:3733
ParsedType getType() const
Definition: Sema.h:3723
TemplateNameKind getTemplateNameKind() const
Definition: Sema.h:3742
static NameClassification NonType(NamedDecl *D)
Definition: Sema.h:3672
static NameClassification Concept(TemplateName Name)
Definition: Sema.h:3704
static NameClassification UndeclaredNonType()
Definition: Sema.h:3678
static NameClassification TypeTemplate(TemplateName Name)
Definition: Sema.h:3686
static NameClassification Error()
Definition: Sema.h:3658
Custom deleter to allow FunctionScopeInfos to be kept alive for a short time after they've been poppe...
Definition: Sema.h:1044
void operator()(sema::FunctionScopeInfo *Scope) const
Definition: Sema.cpp:2466
Whether and why a template name is required in this lookup.
Definition: Sema.h:11339
RequiredTemplateKind(TemplateNameIsRequiredTag)
Template name is unconditionally required.
Definition: Sema.h:11345
SourceLocation getTemplateKeywordLoc() const
Definition: Sema.h:11347
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition: Sema.h:11342
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition: Sema.h:12359
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition: Sema.h:12392
SFINAETrap(Sema &SemaRef, bool ForValidityCheck=false)
Definition: Sema.h:12370
A derivative of BoundTypeDiagnoser for which the diagnostic's type parameter is preceded by a 0/1 enu...
Definition: Sema.h:8241
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition: Sema.h:8246
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition: Sema.h:8243
SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
Definition: Sema.h:9261
SpecialMemberOverloadResult - The overloading result for a special member function.
Definition: Sema.h:9239
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition: Sema.h:9248
CXXMethodDecl * getMethod() const
Definition: Sema.h:9251
void setMethod(CXXMethodDecl *MD)
Definition: Sema.h:9252
RAII object to handle the state changes required to synthesize a function body.
Definition: Sema.h:13384
void addContextNote(SourceLocation UseLoc)
Definition: Sema.h:13402
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition: Sema.h:13390
SourceLocation getLocation() const
Definition: Sema.h:12133
bool ContainsDecl(const NamedDecl *ND) const
Definition: Sema.h:12123
const DeclContext * getDeclContext() const
Definition: Sema.h:12129
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition: Sema.h:12107
const NamedDecl * getDecl() const
Definition: Sema.h:12121
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition: Sema.h:12106
const DeclContext * getLexicalDeclContext() const
Definition: Sema.h:12125
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Definition: Sema.h:12401
TentativeAnalysisScope(Sema &SemaRef)
Definition: Sema.h:12408
Abstract base class used for diagnosing integer constant expression violations.
Definition: Sema.h:7668
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition: Sema.h:7672
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:850
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...
Definition: SemaExpr.cpp:14890
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)
Definition: SemaDecl.cpp:14587
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)
QualType CheckSizelessVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a reachable definition.
Definition: SemaType.cpp:9378
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.
Definition: SemaDecl.cpp:11188
QualType BuildParenType(QualType T)
Build a paren type including T.
Definition: SemaType.cpp:1676
SemaAMDGPU & AMDGPU()
Definition: Sema.h:1413
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
Definition: SemaType.cpp:6383
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
Definition: Sema.h:3560
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
Definition: SemaDecl.cpp:6857
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:13446
ExprResult ActOnCXXParenListInitExpr(ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Definition: SemaExpr.cpp:8036
void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn)
#pragma optimize("[optimization-list]", on | off).
Definition: SemaAttr.cpp:1258
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, const TemplateArgumentListInfo &TemplateArgsInfo, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
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 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:8146
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition: SemaAttr.cpp:503
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition: Sema.h:13430
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...
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:10906
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition: Sema.h:12936
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition: Sema.cpp:2539
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition: Sema.h:1113
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...
Definition: SemaDecl.cpp:2526
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....
Definition: SemaType.cpp:9253
void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S)
Register the given locally-scoped extern "C" declaration so that it can be found later for redeclarat...
Definition: SemaDecl.cpp:6774
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
Definition: SemaStmt.cpp:3351
SmallVector< SmallVector< VTableUse, 16 >, 8 > SavedVTableUses
Definition: Sema.h:13839
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
Definition: SemaDecl.cpp:9951
void PopParsingClass(ParsingClassState state)
Definition: Sema.h:6513
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:10008
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition: Sema.cpp:1061
bool containsUnexpandedParameterPacks(Declarator &D)
Determine whether the given declarator contains any unexpanded parameter packs.
std::optional< QualType > BuiltinVectorMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::None)
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
llvm::SmallPtrSet< SpecialMemberDecl, 4 > SpecialMembersBeingDeclared
The C++ special members which we are currently in the process of declaring.
Definition: Sema.h:6502
void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc, SourceLocation ArgLoc)
ActOnParamUnparsedDefaultArgument - We've seen a default argument for a function parameter,...
QualType CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc)
Definition: SemaType.cpp:2033
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.
Definition: SemaExpr.cpp:16082
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:8196
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',...
Definition: SemaDecl.cpp:1617
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
Definition: SemaExpr.cpp:15759
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:8114
bool isExternalWithNoLinkageType(const ValueDecl *VD) const
Determine if VD, which must be a variable or function, is an external symbol that nonetheless can't b...
Definition: Sema.cpp:935
bool isAttrContext() const
Definition: Sema.h:6904
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
Definition: SemaDecl.cpp:15533
StmtResult BuildMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, NestedNameSpecifierLoc QualifierLoc, DeclarationNameInfo NameInfo, Stmt *Nested)
Definition: SemaStmt.cpp:4554
void ActOnPragmaAttributeEmptyPush(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
Definition: SemaAttr.cpp:1151
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:8189
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition: Sema.cpp:2639
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition: Sema.h:6264
LookupNameKind
Describes the kind of name lookup to perform.
Definition: Sema.h:9277
@ LookupLabel
Label name lookup.
Definition: Sema.h:9286
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition: Sema.h:9281
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition: Sema.h:9308
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition: Sema.h:9300
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition: Sema.h:9322
@ LookupLocalFriendName
Look up a friend of a local class.
Definition: Sema.h:9316
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition: Sema.h:9318
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition: Sema.h:9313
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition: Sema.h:9293
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition: Sema.h:9320
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition: Sema.h:9304
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition: Sema.h:9289
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition: Sema.h:9296
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition: Sema.h:9284
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition: Sema.h:9324
@ LookupAnyName
Look up any declaration with any name.
Definition: Sema.h:9326
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:405
llvm::DenseMap< IdentifierInfo *, SrcLocSet > IdentifierSourceLocations
Definition: Sema.h:9227
LazyVector< TypedefNameDecl *, ExternalSemaSource, &ExternalSemaSource::ReadExtVectorDecls, 2, 2 > ExtVectorDeclsType
Definition: Sema.h:4863
UnaryTransformType::UTTKind UTTKind
Definition: Sema.h:15225
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.
Definition: SemaDecl.cpp:6790
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
Definition: SemaType.cpp:6486
void ActOnPragmaAttributePop(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
Called on well-formed '#pragma clang attribute pop'.
Definition: SemaAttr.cpp:1158
void ActOnPopScope(SourceLocation Loc, Scope *S)
Definition: SemaDecl.cpp:2237
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
Definition: SemaDecl.cpp:5461
QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement)
Completely replace the auto in TypeWithAuto by Replacement.
ExprResult ActOnConstantExpression(ExprResult Res)
Definition: SemaExpr.cpp:19987
void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name, StringRef Value)
ActOnPragmaDetectMismatch - Call on well-formed #pragma detect_mismatch.
Definition: SemaAttr.cpp:628
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:13467
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, Expr *Operand, SourceLocation RParen)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
Definition: SemaDecl.cpp:16227
bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:6201
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, CXXScopeSpec *SS=nullptr)
SemaM68k & M68k()
Definition: Sema.h:1463
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
Definition: SemaDecl.cpp:13099
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.
Definition: SemaModule.cpp:779
bool checkPointerAuthDiscriminatorArg(Expr *Arg, PointerAuthDiscArgKind Kind, unsigned &IntVal)
void PrintContextStack(InstantiationContextDiagFuncRef DiagFunc)
Definition: Sema.h:13511
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)
Definition: SemaExpr.cpp:7112
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...
Definition: SemaLambda.cpp:869
bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc, RecordDecl *ClassDecl, const IdentifierInfo *Name)
bool BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum)
BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a constant expression representing ...
void ActOnFinishCXXNonNestedClass()
ExprResult ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body)
ActOnLambdaExpr - This is called when the body of a lambda expression was successfully completed.
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:1347
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
Definition: SemaAccess.cpp:35
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
bool BuildTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc, bool AllowUnexpandedPack)
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
const Decl * PragmaAttributeCurrentTargetDecl
The declaration that is currently receiving an attribute from the #pragma attribute stack.
Definition: Sema.h:2103
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...
Definition: SemaDecl.cpp:3654
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...
Definition: SemaDecl.cpp:17346
bool hasReachableDeclarationSlow(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
MissingImportKind
Kinds of missing import.
Definition: Sema.h:9715
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)
Definition: SemaExpr.cpp:7634
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.
Definition: SemaDecl.cpp:6251
Decl * ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant, SourceLocation IdLoc, IdentifierInfo *Id, const ParsedAttributesView &Attrs, SourceLocation EqualLoc, Expr *Val, SkipBodyInfo *SkipBody=nullptr)
Definition: SemaDecl.cpp:20255
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:4808
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 directiv...
Definition: SemaModule.cpp:740
bool BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum, unsigned Multiple)
BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr TheCall is a constant expr...
RetainOwnershipKind
Definition: Sema.h:5005
OpaquePtr< QualType > TypeTy
Definition: Sema.h:1269
void ActOnTagDefinitionError(Scope *S, Decl *TagDecl)
ActOnTagDefinitionError - Invoked when there was an unrecoverable error parsing the definition of a t...
Definition: SemaDecl.cpp:18758
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:167
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
Definition: SemaExpr.cpp:5786
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.
Definition: SemaExpr.cpp:15069
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:367
void PrintContextStack()
Definition: Sema.h:13520
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...
Definition: SemaExpr.cpp:2432
bool ActOnCoroutineBodyStart(Scope *S, SourceLocation KwLoc, StringRef Keyword)
QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc)
Definition: SemaType.cpp:2329
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
StmtResult BuildAttributedStmt(SourceLocation AttrsLoc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Definition: SemaStmt.cpp:631
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
Definition: SemaDecl.cpp:7611
SemaOpenMP & OpenMP()
Definition: Sema.h:1498
void CheckDelegatingCtorCycles()
llvm::SmallSet< SourceLocation, 2 > SrcLocSet
Definition: Sema.h:9226
void ActOnStartStmtExpr()
Definition: SemaExpr.cpp:16101
bool ActOnTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition: Sema.h:6239
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition: Sema.h:9591
bool FormatStringHasSArg(const StringLiteral *FExpr)
void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec)
Emit a warning for all pending noderef expressions that we recorded.
Definition: SemaExpr.cpp:17768
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void ActOnStmtExprError()
Definition: SemaExpr.cpp:16107
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt={})
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
Definition: SemaExpr.cpp:20514
bool IsLastErrorImmediate
Is the last error level diagnostic immediate.
Definition: Sema.h:1339
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope)
Definition: SemaStmt.cpp:4543
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.
Definition: SemaAttr.cpp:1436
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,...
Definition: SemaDecl.cpp:6236
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....
Definition: SemaExpr.cpp:1642
static const IdentifierInfo * getPrintable(const IdentifierInfo *II)
Definition: Sema.h:14904
StmtResult ActOnForEachLValueExpr(Expr *E)
In an Objective C collection iteration statement: for (x in y) x can be an arbitrary l-value expressi...
Definition: SemaStmt.cpp:2318
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:1234
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
Definition: SemaDecl.cpp:18690
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
Definition: Sema.h:4721
void CheckFloatComparison(SourceLocation Loc, const Expr *LHS, const Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Definition: Sema.h:3542
PragmaClangSection PragmaClangRodataSection
Definition: Sema.h:1810
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.
Definition: SemaType.cpp:7625
void CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE)
Definition: SemaExpr.cpp:12465
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.
Definition: SemaLambda.cpp:248
bool hasVisibleDefinition(const NamedDecl *D)
Definition: Sema.h:15349
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:6475
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:5099
void emitAndClearUnusedLocalTypedefWarnings()
Definition: Sema.cpp:1152
bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc, SourceLocation ColonLoc, const ParsedAttributesView &Attrs)
ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
Definition: SemaDecl.cpp:16811
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition: Sema.h:6456
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl)
Definition: SemaStmt.cpp:85
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
Definition: SemaDecl.cpp:15397
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:1223
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
Definition: SemaAttr.cpp:1193
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:1438
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)
Definition: SemaExpr.cpp:17664
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 ...
Definition: SemaAttr.cpp:1570
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...
Definition: SemaExpr.cpp:20730
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:373
ConditionKind
Definition: Sema.h:7788
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
@ Switch
An integral condition for a 'switch' statement.
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
void LateTemplateParserCB(void *P, LateParsedTemplate &LPT)
Callback to the parser to parse templated functions when needed.
Definition: Sema.h:1316
void AddOptnoneAttributeIfNoConflicts(FunctionDecl *FD, SourceLocation Loc)
Adds the 'optnone' attribute to the function declaration if there are no conflicts; Loc represents th...
Definition: SemaAttr.cpp:1307
bool RequireCompleteType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Definition: Sema.h:15308
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition: Sema.h:14910
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
Definition: SemaExpr.cpp:2720
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:8134
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.
Definition: SemaExpr.cpp:6030
ModuleDeclKind
Definition: Sema.h:9824
@ PartitionImplementation
'module X:Y;'
@ Interface
'export module X;'
@ PartitionInterface
'export module X:Y;'
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition: Sema.h:8276
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition: Sema.h:1216
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()
Definition: SemaDecl.cpp:1513
bool ActOnDuplicateODRHashDefinition(T *Duplicate, T *Previous)
Check ODR hashes for C/ObjC when merging types from modules.
Definition: Sema.h:9538
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition: Sema.h:10341
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition: Sema.h:10344
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition: Sema.h:10350
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition: Sema.h:10348
bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum, unsigned ArgBits)
BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is a constant expression represen...
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
Definition: SemaAttr.cpp:277
void RefersToMemberWithReducedAlignment(Expr *E, llvm::function_ref< void(Expr *, RecordDecl *, FieldDecl *, CharUnits)> Action)
This function calls Action when it determines that E designates a misaligned member due to the packed...
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType)
Definition: Sema.h:1768
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
AccessResult
Definition: Sema.h:1650
@ AR_dependent
Definition: Sema.h:1653
@ AR_accessible
Definition: Sema.h:1651
@ AR_inaccessible
Definition: Sema.h:1652
@ AR_delayed
Definition: Sema.h:1654
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition: Sema.cpp:2442
ClassTemplatePartialSpecializationDecl * getMoreSpecializedPartialSpecialization(ClassTemplatePartialSpecializationDecl *PS1, ClassTemplatePartialSpecializationDecl *PS2, SourceLocation Loc)
Returns the more specialized class template partial specialization according to the rules of partial ...
CompleteTypeKind
Definition: Sema.h:14914
@ Normal
Apply the normal rules for complete types.
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA)
Check whether the given statement can have musttail applied to it, issuing a diagnostic and returning...
Definition: SemaStmt.cpp:660
ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type, SourceLocation LParenLoc, Expr *CastExpr, SourceLocation RParenLoc)
Definition: SemaCast.cpp:3469
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists)
Handle a friend tag declaration where the scope specifier was templated.
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
Preprocessor & getPreprocessor() const
Definition: Sema.h:917
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition: Sema.h:6882
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition: Sema.cpp:2311
StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
Definition: SemaStmt.cpp:3314
QualType GetSignedSizelessVectorType(QualType V)
Definition: SemaExpr.cpp:13032
llvm::DenseSet< std::pair< Decl *, unsigned > > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
Definition: Sema.h:13433
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
void ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurContext)
Once the Lambdas capture are known, we can start to create the closure, call operator method,...
FunctionTemplateDecl * DeclareAggregateDeductionGuideFromInitList(TemplateDecl *Template, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc)
ExprResult BuildBuiltinBitCastExpr(SourceLocation KWLoc, TypeSourceInfo *TSI, Expr *Operand, SourceLocation RParenLoc)
Definition: SemaCast.cpp:438
void AddTemplateParametersToLambdaCallOperator(CXXMethodDecl *CallOperator, CXXRecordDecl *Class, TemplateParameterList *TemplateParams)
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
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:8265
void deduceOpenCLAddressSpace(ValueDecl *decl)
Definition: SemaDecl.cpp:7008
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
Definition: SemaExpr.cpp:3575
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
Definition: SemaStmt.cpp:3223
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition: Sema.h:2041
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
DefaultedComparisonKind getDefaultedComparisonKind(const FunctionDecl *FD)
Definition: Sema.h:8177
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
static SourceRange getPrintable(const Expr *E)
Definition: Sema.h:14911
PragmaStack< StringLiteral * > CodeSegStack
Definition: Sema.h:2035
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)
Definition: SemaStmt.cpp:3893
void AddRangeBasedOptnone(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based o...
Definition: SemaAttr.cpp:1277
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)
Definition: SemaExpr.cpp:18752
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:15485
void setFunctionHasBranchIntoScope()
Definition: Sema.cpp:2492
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:4868
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
Definition: SemaStmt.cpp:485
SourceLocation getOptimizeOffPragmaLocation() const
Get the location for the currently active "\#pragma clang optimize off". If this location is invalid,...
Definition: Sema.h:2112
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
Definition: SemaDecl.cpp:6393
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
void ActOnPragmaMSComment(SourceLocation CommentLoc, PragmaMSCommentKind Kind, StringRef Arg)
ActOnPragmaMSComment - Called on well formed #pragma comment(kind, "arg").
Definition: SemaAttr.cpp:620
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
QualType BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc)
Build an ext-vector type.
Definition: SemaType.cpp:2395
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
Definition: SemaDecl.cpp:4967
SmallVector< AlignPackIncludeState, 8 > AlignPackIncludeStack
Definition: Sema.h:2030
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:11063
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
Definition: SemaExpr.cpp:6788
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)
Definition: SemaDecl.cpp:12484
void AddKnownFunctionAttributes(FunctionDecl *FD)
Adds any function attributes that we know a priori based on the declaration of this function.
Definition: SemaDecl.cpp:17012
void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver)
If VD is set but not otherwise used, diagnose, for a parameter or a variable.
Definition: SemaDecl.cpp:2157
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.
Definition: SemaExpr.cpp:10312
void ActOnComment(SourceRange Comment)
Definition: Sema.cpp:2591
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)
Definition: SemaInit.cpp:3549
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
@ Delete
deleted-function-body
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,...
Definition: SemaDecl.cpp:18777
concepts::Requirement * ActOnSimpleRequirement(Expr *E)
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
Definition: Sema.h:13801
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
Definition: SemaStmt.cpp:48
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
Definition: SemaDecl.cpp:18875
TemplateDeductionResult FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned NumExplicitlySpecified, FunctionDecl *&Specialization, sema::TemplateDeductionInfo &Info, SmallVectorImpl< OriginalCallArg > const *OriginalCallArgs, bool PartialOverloading, bool PartialOrdering, bool ForOverloadSetAddressResolution, llvm::function_ref< bool(bool)> CheckNonDependent=[](bool) { return false;})
Finish template argument deduction for a function template, checking the deduced template arguments f...
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
Definition: Sema.cpp:1231
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:2042
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:1453
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
Definition: SemaDecl.cpp:16307
bool isValidSveBitcast(QualType srcType, QualType destType)
Are the two types SVE-bitcast-compatible types? I.e.
Definition: SemaExpr.cpp:7608
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.
Definition: SemaLambda.cpp:895
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture)
Build a FieldDecl suitable to hold the given capture.
concepts::Requirement * ActOnCompoundRequirement(Expr *E, SourceLocation NoexceptLoc)
void ActOnPragmaMSSeg(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, StringLiteral *SegmentName, llvm::StringRef PragmaName)
Called on well formed #pragma bss_seg/data_seg/const_seg/code_seg.
Definition: SemaAttr.cpp:847
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
void CheckThreadLocalForLargeAlignment(VarDecl *VD)
Definition: SemaDecl.cpp:14984
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
Definition: SemaExpr.cpp:16120
bool ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc)
bool hasVisibleExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is an explicit specialization declaration for a...
bool IsInsideALocalClassWithinATemplateFunction()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition: Sema.cpp:172
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
Definition: SemaExpr.cpp:9764
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.
Definition: SemaDecl.cpp:1489
ExprResult BuildResolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, Expr *Awaiter, bool IsImplicit=false)
SemaSYCL & SYCL()
Definition: Sema.h:1523
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)
Definition: SemaDecl.cpp:15876
ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16763
IdentifierInfo * getSuperIdentifier() const
Definition: Sema.cpp:2866
StmtResult BuildIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition: SemaStmt.cpp:1032
ExpressionEvaluationContextRecord & parentEvaluationContext()
Definition: Sema.h:6894
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:1647
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action, PragmaFloatControlKind Value)
ActOnPragmaFloatControl - Call on well-formed #pragma float_control.
Definition: SemaAttr.cpp:663
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition: SemaExpr.cpp:827
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition: Sema.h:11310
void UnmarkAsLateParsedTemplate(FunctionDecl *FD)
const AttributedType * getCallingConvAttributedType(QualType T) const
Get the outermost AttributedType node that sets a calling convention.
Definition: SemaDecl.cpp:3532
bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT)
CheckTemplateArgumentKind
Specifies the context in which a particular template argument is being checked.
Definition: Sema.h:11892
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition: Sema.h:11903
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition: Sema.h:11895
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition: Sema.h:11899
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:671
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnPragmaMSPointersToMembers(LangOptions::PragmaMSPointersToMembersKind Kind, SourceLocation PragmaLoc)
ActOnPragmaMSPointersToMembers - called on well formed #pragma pointers_to_members(representation met...
Definition: SemaAttr.cpp:717
bool CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old)
[module.interface]p6: A redeclaration of an entity X is implicitly exported if X was introduced by an...
Definition: SemaDecl.cpp:1715
void DiagnosePrecisionLossInComplexDivision()
Definition: SemaAttr.cpp:1235
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:9221
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
SemaX86 & X86()
Definition: Sema.h:1543
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
Definition: SemaExpr.cpp:1052
void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc)
Look for instances where it is likely the comma operator is confused with another operator.
Definition: SemaExpr.cpp:14216
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)
llvm::DenseMap< NamedDecl *, NamedDecl * > VisibleNamespaceCache
Map from the most recent declaration of a namespace to the most recent visible declaration of that na...
Definition: Sema.h:13450
ExprResult tryConvertExprToType(Expr *E, QualType Ty)
Try to convert an expression E to type Ty.
Definition: SemaExpr.cpp:5075
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)
Decl * ActOnFileScopeAsmDecl(Expr *expr, SourceLocation AsmLoc, SourceLocation RParenLoc)
Definition: SemaDecl.cpp:20668
bool hasMergedDefinitionInCurrentModule(const NamedDecl *Def)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
std::vector< Token > ExpandFunctionLocalPredefinedMacros(ArrayRef< Token > Toks)
Definition: SemaExpr.cpp:2095
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy, CastKind &Kind)
Definition: SemaExpr.cpp:7718
QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc)
CheckAddressOfOperand - The operand of & must be either a function designator or an lvalue designatin...
Definition: SemaExpr.cpp:14496
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.
Definition: SemaDecl.cpp:15520
void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry)
Definition: SemaStmt.cpp:4461
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
Definition: SemaStmt.cpp:1108
bool DiagnoseUnknownTemplateName(const IdentifierInfo &II, SourceLocation IILoc, Scope *S, const CXXScopeSpec *SS, TemplateTy &SuggestedTemplate, TemplateNameKind &SuggestedKind)
ASTContext & Context
Definition: Sema.h:1276
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:8101
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
Definition: Sema.cpp:680
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
Definition: SemaCast.cpp:2721
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:13268
QualType InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS)
the following "Check" methods will return a valid/converted QualType or a null QualType (indicating a...
Definition: SemaExpr.cpp:10002
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
Definition: SemaExpr.cpp:20525
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
Definition: SemaDecl.cpp:15004
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()
Definition: SemaStmt.cpp:4759
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.
IdentifierSourceLocations TypoCorrectionFailures
A cache containing identifiers for which typo correction failed and their locations,...
Definition: Sema.h:9232
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition: Sema.h:7734
QualType BuildFunctionType(QualType T, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI)
Build a function type.
Definition: SemaType.cpp:2642
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
Definition: SemaExpr.cpp:11800
void ActOnPragmaUnused(const Token &Identifier, Scope *curScope, SourceLocation PragmaLoc)
ActOnPragmaUnused - Called on well-formed '#pragma unused'.
Definition: SemaAttr.cpp:935
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
Definition: SemaDecl.cpp:5943
ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow)
Perform conversions on the LHS of a member access expression.
bool InNonInstantiationSFINAEContext
Whether we are in a SFINAE context that is not associated with template instantiation.
Definition: Sema.h:13457
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
Definition: Sema.h:915
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...
Definition: SemaExpr.cpp:8014
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)
Definition: SemaDecl.cpp:20686
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod)
The parser has left a submodule.
Definition: SemaModule.cpp:803
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:4350
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:15273
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool CheckCaseExpression(Expr *E)
Definition: SemaExpr.cpp:21520
void resetFPOptions(FPOptions FPO)
Definition: Sema.h:11288
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition: Sema.h:15376
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:9812
DeclResult ActOnModuleImport(SourceLocation StartLoc, SourceLocation ExportLoc, SourceLocation ImportLoc, ModuleIdPath Path, bool IsPartition=false)
The parser has processed a module import declaration.
Definition: SemaModule.cpp:579
static bool getPrintable(bool B)
Definition: Sema.h:14900
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
Definition: SemaLookup.cpp:921
SemaObjC & ObjC()
Definition: Sema.h:1483
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.
Definition: SemaDecl.cpp:5466
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
Definition: SemaDecl.cpp:5077
QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Type checking for matrix binary operators.
Definition: SemaExpr.cpp:13303
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:2821
bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
Definition: SemaDecl.cpp:20860
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:1408
void CheckDelayedMemberExceptionSpecs()
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition: SemaDecl.cpp:75
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.
Definition: SemaDecl.cpp:1555
ParsedType getDestructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
void ActOnPragmaMSAllocText(SourceLocation PragmaLocation, StringRef Section, const SmallVector< std::tuple< IdentifierInfo *, SourceLocation > > &Functions)
Called on well-formed #pragma alloc_text().
Definition: SemaAttr.cpp:899
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition: Sema.h:3141
bool captureSwiftVersionIndependentAPINotes()
Whether APINotes should be gathered for all applicable Swift language versions, without being applied...
Definition: Sema.h:1634
PragmaStack< bool > StrictGuardStackCheckStack
Definition: Sema.h:2038
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
void PrintInstantiationStack()
Definition: Sema.h:13524
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:3550
bool hasVisibleDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if the template parameter D has a visible default argument.
void CleanupVarDeclMarking()
Definition: SemaExpr.cpp:19998
bool CheckConstraintExpression(const Expr *CE, Token NextToken=Token(), bool *PossibleNonPrimary=nullptr, bool IsTrailingRequiresClause=false)
Check whether the given expression is a valid constraint expression.
Definition: SemaConcept.cpp:90
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:748
bool isImmediateFunctionContext() const
Definition: Sema.h:8126
NamedDecl * LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S, bool ForRedeclaration, SourceLocation Loc)
LazilyCreateBuiltin - The specified Builtin-ID was first used at file scope.
Definition: SemaDecl.cpp:2388
ASTContext & getASTContext() const
Definition: Sema.h:918
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition: Sema.cpp:657
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
Definition: SemaExpr.cpp:758
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)
Definition: SemaDecl.cpp:16296
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:6482
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)
Definition: SemaExpr.cpp:16038
ASTContext::CXXRecordDeclRelocationInfo CheckCXX2CRelocatableAndReplaceable(const clang::CXXRecordDecl *D)
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
ParsingDeclState PushParsingDeclaration(sema::DelayedDiagnosticPool &pool)
Definition: Sema.h:1401
void ActOnPragmaAttributeAttribute(ParsedAttr &Attribute, SourceLocation PragmaLoc, attr::ParsedSubjectMatchRuleSet Rules)
Definition: SemaAttr.cpp:1018
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.
Definition: SemaExpr.cpp:19252
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
Definition: SemaExpr.cpp:20253
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
Definition: SemaDecl.cpp:1771
Decl * ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc, SourceLocation LBraceLoc)
We have parsed the start of an export declaration, including the '{' (if present).
Definition: SemaModule.cpp:862
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:6566
void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, UnresolvedSetImpl &Functions)
Definition: SemaExpr.cpp:15559
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()
Definition: SemaExpr.cpp:18155
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:2034
StmtResult ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
Definition: SemaStmt.cpp:4478
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition: Sema.cpp:756
void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, SourceLocation PragmaLoc)
ActOnPragmaOptionsAlign - Called on well formed #pragma options align.
Definition: SemaAttr.cpp:334
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
ExprResult DefaultArgumentPromotion(Expr *E)
DefaultArgumentPromotion (C99 6.5.2.2p6).
Definition: SemaExpr.cpp:877
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK)
Definition: SemaExpr.cpp:3523
void ActOnStartFunctionDeclarationDeclarator(Declarator &D, unsigned TemplateParameterDepth)
Called before parsing a function declarator belonging to a function declaration.
ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc, SourceLocation TildeLoc, UnqualifiedId &SecondTypeName)
bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S)
isMicrosoftMissingTypename - In Microsoft mode, within class scope, if a CXXScopeSpec's type is equal...
Definition: SemaDecl.cpp:695
bool isConstantEvaluatedOverride
Used to change context to isConstantEvaluated without pushing a heavy ExpressionEvaluationContextReco...
Definition: Sema.h:2582
ParsingClassState PushParsingClass()
Definition: Sema.h:6509
ForRangeStatus
Definition: Sema.h:10728
@ FRS_Success
Definition: Sema.h:10729
@ FRS_DiagnosticIssued
Definition: Sema.h:10731
@ FRS_NoViableFunction
Definition: Sema.h:10730
bool CheckArgsForPlaceholders(MultiExprArg args)
Check an argument list for placeholders that we won't try to handle later.
Definition: SemaExpr.cpp:6276
void ActOnPragmaCXLimitedRange(SourceLocation Loc, LangOptions::ComplexRangeKind Range)
ActOnPragmaCXLimitedRange - Called on well formed #pragma STDC CX_LIMITED_RANGE.
Definition: SemaAttr.cpp:1467
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
Definition: SemaExpr.cpp:3142
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'.
Definition: SemaAttr.cpp:1475
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:13963
ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr)
Definition: SemaExpr.cpp:7126
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
Definition: SemaExpr.cpp:16088
void MarkAsLateParsedTemplate(FunctionDecl *FD, Decl *FnD, CachedTokens &Toks)
llvm::SmallVector< DeleteExprLoc, 4 > DeleteLocs
Definition: Sema.h:960
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
Definition: Sema.h:9274
QualType CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
Definition: SemaExpr.cpp:11350
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:9224
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.
Definition: SemaDecl.cpp:4923
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
Definition: Sema.h:6034
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
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)
Definition: SemaExpr.cpp:8030
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:8963
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.
Definition: SemaType.cpp:9606
SmallVector< const Decl * > DeclsWithEffectsToVerify
All functions/lambdas/blocks which have bodies and which have a non-empty FunctionEffectsRef to be ve...
Definition: Sema.h:15481
AllowedExplicit
Definition: Sema.h:10055
@ Conversions
Allow explicit conversion functions but not explicit constructors.
@ All
Allow both explicit conversion functions and explicit constructors.
void ActOnFinishRequiresExpr()
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
Definition: SemaType.cpp:9723
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
Definition: Sema.h:1206
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition: Sema.h:6497
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Definition: SemaExpr.cpp:13349
ExprResult BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional< Expr * > ArraySize, SourceRange DirectInitRange, Expr *Initializer)
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
void * SaveNestedNameSpecifierAnnotation(CXXScopeSpec &SS)
Given a C++ nested-name-specifier, produce an annotation value that the parser can use later to recon...
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
void ProcessPragmaWeak(Scope *S, Decl *D)
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
bool shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee)
Definition: SemaDecl.cpp:20848
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.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition: Sema.h:1184
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.
Decl * BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy)
BuildAnonymousStructOrUnion - Handle the declaration of an anonymous structure or union.
Definition: SemaDecl.cpp:5625
bool CheckDeclCompatibleWithTemplateTemplate(TemplateDecl *Template, TemplateTemplateParmDecl *Param, const TemplateArgumentLoc &Arg)
void ActOnPragmaFPEvalMethod(SourceLocation Loc, LangOptions::FPEvalMethodKind Value)
Definition: SemaAttr.cpp:636
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
Definition: Sema.h:3573
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:1652
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...
Definition: SemaDecl.cpp:17371
ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr)
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Definition: Sema.cpp:2582
unsigned InventedParameterInfosStart
The index of the first InventedParameterInfo that refers to the current context.
Definition: Sema.h:3465
void MarkTypoCorrectedFunctionDefinition(const NamedDecl *F)
Definition: SemaDecl.cpp:9217
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
Definition: SemaExpr.cpp:2298
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
void handleLambdaNumbering(CXXRecordDecl *Class, CXXMethodDecl *Method, std::optional< CXXRecordDecl::LambdaNumbering > NumberingOverride=std::nullopt)
Number lambda for linkage purposes if necessary.
Definition: SemaLambda.cpp:476
ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, UnsignedOrNone NumExpansions)
unsigned NumSFINAEErrors
The number of SFINAE diagnostics that have been trapped.
Definition: Sema.h:11300
void setFunctionHasIndirectGoto()
Definition: Sema.cpp:2502
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...
QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc)
Build a bit-precise integer type.
Definition: SemaType.cpp:1942
TemplateParameterListEqualKind
Enumeration describing how template parameter lists are compared for equality.
Definition: Sema.h:12065
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition: Sema.h:12083
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition: Sema.h:12073
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition: Sema.h:12093
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16375
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:4859
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
bool AddingCFIUncheckedCallee(QualType From, QualType To) const
Returns true if From is a function or pointer to a function without the cfi_unchecked_callee attribut...
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition: Sema.cpp:1666
QualType BuiltinRemoveReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9967
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 *.
Definition: SemaExpr.cpp:1759
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:8307
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
Definition: SemaAttr.cpp:389
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
AssumedTemplateKind
Definition: Sema.h:11360
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
bool CheckParamExceptionSpec(const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const FunctionProtoType *Target, bool SkipTargetFirstParameter, SourceLocation TargetLoc, const FunctionProtoType *Source, bool SkipSourceFirstParameter, SourceLocation SourceLoc)
CheckParamExceptionSpec - Check if the parameter and return types of the two functions have equivalen...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
Definition: SemaAttr.cpp:795
bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, CheckTemplateArgumentInfo &CTAI, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld)
MergeVarDeclTypes - We parsed a variable 'New' which has the same name and scope as a previous declar...
Definition: SemaDecl.cpp:4501
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
Definition: SemaExpr.cpp:2065
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
Definition: SemaType.cpp:1579
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)
Definition: SemaStmt.cpp:1296
AtomicArgumentOrder
Definition: Sema.h:2694
void PushFunctionScope()
Enter a new function scope.
Definition: Sema.cpp:2330
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.
Definition: SemaDecl.cpp:1305
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl, ExprResult Operand, SourceLocation RParenLoc)
Definition: SemaCast.cpp:426
SourceRange getExprRange(Expr *E) const
Definition: SemaExpr.cpp:500
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...
Definition: SemaStmt.cpp:3392
void setExceptionMode(SourceLocation Loc, LangOptions::FPExceptionModeKind)
Called to set exception behavior for floating point operations.
Definition: SemaAttr.cpp:1443
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)
Definition: SemaType.cpp:2530
ArrayRef< InventedTemplateParameterInfo > getInventedParameterInfos() const
Definition: Sema.h:11293
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
Definition: SemaAttr.cpp:168
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition: Sema.h:1053
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
LazyVector< const DeclaratorDecl *, ExternalSemaSource, &ExternalSemaSource::ReadUnusedFileScopedDecls, 2, 2 > UnusedFileScopedDeclsType
Definition: Sema.h:3546
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
Definition: Sema.h:8161
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:14907
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition: Sema.h:4559
bool CheckEnumUnderlyingType(TypeSourceInfo *TI)
Check that this is a valid underlying type for an enum declaration.
Definition: SemaDecl.cpp:17246
bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id, bool IsUDSuffix)
bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD)
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
Definition: SemaStmt.cpp:405
FPOptions & getCurFPFeatures()
Definition: Sema.h:913
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition: Sema.h:8259
void SetLateTemplateParser(LateTemplateParserCB *LTP, LateTemplateParserCleanupCB *LTPCleanup, void *P)
Definition: Sema.h:1322
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
Definition: SemaExpr.cpp:20761
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition: Sema.cpp:83
sema::LambdaScopeInfo * PushLambdaScope()
Definition: Sema.cpp:2348
StmtResult ActOnCoreturnStmt(Scope *S, SourceLocation KwLoc, Expr *E)
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
void PopCompoundScope()
Definition: Sema.cpp:2481
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:15317
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.
Definition: SemaDecl.cpp:20229
UnexpandedParameterPackContext
The context in which an unexpanded parameter pack is being diagnosed.
Definition: Sema.h:14218
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition: Sema.h:14238
@ UPPC_RequiresClause
Definition: Sema.h:14289
@ UPPC_UsingDeclaration
A using declaration.
Definition: Sema.h:14244
@ UPPC_IfExists
Microsoft __if_exists.
Definition: Sema.h:14271
@ UPPC_Requirement
Definition: Sema.h:14286
@ UPPC_ExceptionType
The type of an exception.
Definition: Sema.h:14262
@ UPPC_EnumeratorValue
The enumerator value.
Definition: Sema.h:14241
@ UPPC_Lambda
Lambda expression.
Definition: Sema.h:14277
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition: Sema.h:14274
@ UPPC_PartialSpecialization
Partial specialization.
Definition: Sema.h:14268
@ UPPC_Initializer
An initializer.
Definition: Sema.h:14253
@ UPPC_BaseType
The base type of a class type.
Definition: Sema.h:14223
@ UPPC_FriendDeclaration
A friend declaration.
Definition: Sema.h:14247
@ UPPC_DefaultArgument
A default argument.
Definition: Sema.h:14256
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition: Sema.h:14226
@ UPPC_Expression
An arbitrary expression.
Definition: Sema.h:14220
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition: Sema.h:14265
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition: Sema.h:14250
@ UPPC_DataMemberType
The type of a data member.
Definition: Sema.h:14229
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition: Sema.h:14235
@ UPPC_Block
Block expression.
Definition: Sema.h:14280
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition: Sema.h:14232
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition: Sema.h:14259
@ UPPC_TypeConstraint
A type constraint.
Definition: Sema.h:14283
api_notes::APINotesManager APINotes
Definition: Sema.h:1280
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:12424
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.
Definition: SemaLambda.cpp:543
const LangOptions & getLangOpts() const
Definition: Sema.h:911
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.
Definition: SemaType.cpp:9230
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?
bool CheckConstraintSatisfaction(const NamedDecl *Template, ArrayRef< AssociatedConstraint > AssociatedConstraints, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
Definition: Sema.h:14709
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:5813
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
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)
Definition: SemaStmt.cpp:1790
QualType CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:12492
SourceLocation CurInitSegLoc
Definition: Sema.h:2074
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
Definition: SemaExpr.cpp:7382
void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action, SourceLocation PragmaLoc, MSVtorDispMode Value)
Called on well formed #pragma vtordisp().
Definition: SemaAttr.cpp:724
SemaCodeCompletion & CodeCompletion()
Definition: Sema.h:1433
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:::lifetimebound]] attr for std:: functions and methods.
Definition: SemaAttr.cpp:220
bool currentModuleIsHeaderUnit() const
Is the module scope we are in a C++ Header Unit?
Definition: Sema.h:3567
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:1488
void SwapSatisfactionStack(llvm::SmallVectorImpl< SatisfactionStackEntryTy > &NewSS)
Definition: Sema.h:14681
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
Definition: SemaDecl.cpp:1446
ReuseLambdaContextDecl_t
Definition: Sema.h:6970
@ ReuseLambdaContextDecl
Definition: Sema.h:6970
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.
Definition: SemaDecl.cpp:6750
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)
Definition: SemaExpr.cpp:17799
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.
Definition: SemaDecl.cpp:6784
bool CheckRedeclarationModuleOwnership(NamedDecl *New, NamedDecl *Old)
We've determined that New is a redeclaration of Old.
Definition: SemaDecl.cpp:1656
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:919
NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D)
If D cannot be odr-used in the current expression evaluation context, return a reason explaining why.
Definition: SemaExpr.cpp:2346
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:1428
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.
Definition: SemaExpr.cpp:20399
void * OpaqueParser
Definition: Sema.h:1320
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
Definition: SemaExpr.cpp:2513
Preprocessor & PP
Definition: Sema.h:1275
QualType CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
Definition: SemaExpr.cpp:11224
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.
Definition: SemaExpr.cpp:6572
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
QualType BuiltinEnumUnderlyingType(QualType BaseType, SourceLocation Loc)
Definition: SemaType.cpp:9893
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)
Definition: SemaExpr.cpp:14468
bool MSPragmaOptimizeIsOn
The "on" or "off" argument passed by #pragma optimize, that denotes whether the optimizations in the ...
Definition: Sema.h:2121
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, SourceLocation BuiltinLoc, SourceLocation RPLoc, DeclContext *ParentContext)
Definition: SemaExpr.cpp:17044
bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty, SourceLocation OpLoc, SourceRange R)
ActOnAlignasTypeArgument - Handle alignas(type-id) and _Alignas(type-name) .
Definition: SemaExpr.cpp:4787
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:1313
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
Definition: Sema.h:2099
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, CXXRecordDecl *Base, CXXRecordDecl *Derived, const CXXBasePath &Path, unsigned DiagID, llvm::function_ref< void(PartialDiagnostic &PD)> SetupPDiag, bool ForceCheck=false, bool ForceUnprivileged=false)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
Definition: SemaDecl.cpp:8417
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:2113
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.
Definition: SemaExpr.cpp:7623
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
LazyVector< VarDecl *, ExternalSemaSource, &ExternalSemaSource::ReadTentativeDefinitions, 2, 2 > TentativeDefinitionsType
Definition: Sema.h:3554
SemaDirectX & DirectX()
Definition: Sema.h:1443
llvm::SmallSetVector< const NamedDecl *, 16 > NamedDeclSetType
Definition: Sema.h:6458
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:1473
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
bool hasCStrMethod(const Expr *E)
Check to see if a given expression could have '.c_str()' called on it.
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
Definition: SemaExpr.cpp:9286
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:1274
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.
Definition: SemaDecl.cpp:18632
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)
Definition: SemaInit.cpp:7720
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)
Definition: SemaExpr.cpp:17700
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
Definition: SemaExpr.cpp:16190
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition: Sema.h:1212
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition: Sema.cpp:2557
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.
Definition: SemaExpr.cpp:6838
static const uint64_t MaximumAlignment
Definition: Sema.h:1207
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
llvm::DenseMap< unsigned, CXXDeductionGuideDecl * > AggregateDeductionCandidates
Definition: Sema.h:8966
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.
Definition: SemaExpr.cpp:17820
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
Definition: SemaInit.cpp:7699
bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
VarArgKind isValidVarArgType(const QualType &Ty)
Determine the degree of POD-ness for an expression.
Definition: SemaExpr.cpp:946
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition: SemaStmt.cpp:416
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition: Sema.h:15330
Decl * ActOnStartOfFunctionDef(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists, SkipBodyInfo *SkipBody=nullptr, FnBodyKind BodyKind=FnBodyKind::Other)
Definition: SemaDecl.cpp:15715
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition: Sema.h:6460
SemaHLSL & HLSL()
Definition: Sema.h:1448
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:11309
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition: Sema.h:1210
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition: Sema.h:9273
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
Definition: Sema.cpp:1171
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
Definition: SemaDecl.cpp:1888
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
Definition: SemaDecl.cpp:12098
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.
Definition: SemaDecl.cpp:18970
ExpressionEvaluationContextRecord & currentEvaluationContext()
Definition: Sema.h:6888
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
Definition: SemaExpr.cpp:17784
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:1811
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
static StringRef GetFormatStringTypeName(FormatStringType FST)
SemaMIPS & MIPS()
Definition: Sema.h:1468
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
Definition: Sema.cpp:139
void InstantiateVariableInitializer(VarDecl *Var, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the initializer of a variable.
void CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc, SourceLocation CallOperatorLoc, const AssociatedConstraint &TrailingRequiresClause, TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind, StorageClass SC, ArrayRef< ParmVarDecl * > Params, bool HasExplicitResultType)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
SemaRISCV & RISCV()
Definition: Sema.h:1513
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:15504
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
Definition: Sema.h:1800
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:5819
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....
Definition: SemaStmt.cpp:3782
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
Definition: SemaExpr.cpp:207
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:5193
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
MemberPointerConversionDirection
Definition: Sema.h:10179
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition: Sema.h:13837
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition: Sema.h:6453
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
Definition: SemaExpr.cpp:75
ConditionResult ActOnConditionVariable(Decl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS)
checkUnsafeAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained type.
void performFunctionEffectAnalysis(TranslationUnitDecl *TU)
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
Definition: SemaExpr.cpp:20409
EltwiseBuiltinArgTyRestriction
Definition: Sema.h:2760
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.
Definition: SemaExpr.cpp:10026
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:14902
SemaSwift & Swift()
Definition: Sema.h:1528
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...
Definition: SemaAttr.cpp:1321
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
Definition: SemaStmt.cpp:3775
PragmaStack< AlignPackInfo > AlignPackStack
Definition: Sema.h:2023
bool canDelayFunctionBody(const Declarator &D)
Determine whether we can delay parsing the body of a function or function template until it is used,...
Definition: SemaDecl.cpp:16185
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:6558
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition: Sema.h:6915
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
Definition: Sema.h:13482
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition: Sema.h:6490
StmtResult ActOnExprStmtError()
Definition: SemaStmt.cpp:65
AcceptableKind
Definition: Sema.h:9269
PragmaStack< StringLiteral * > BSSSegStack
Definition: Sema.h:2033
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...
Definition: SemaStmt.cpp:3470
CXXRecordDecl * getCurrentInstantiationOf(NestedNameSpecifier NNS)
If the given nested name specifier refers to the current instantiation, return the declaration that c...
void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD)
Mark the exception specifications of all virtual member functions in the given class as needed.
bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)
void completeExprArrayBound(Expr *E)
Definition: SemaType.cpp:9158
DeclContext * getCurLexicalContext() const
Definition: Sema.h:1117
std::function< TypeResult(StringRef, StringRef, SourceLocation)> ParseTypeFromStringCallback
Callback to the parser to parse a type expressed as a string.
Definition: Sema.h:1331
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:2077
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:1659
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)
Definition: SemaType.cpp:8217
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:894
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:10832
StmtResult ActOnNullStmt(SourceLocation SemiLoc, bool HasLeadingEmptyMacro=false)
Definition: SemaStmt.cpp:70
const NormalizedConstraint * getNormalizedAssociatedConstraints(const NamedDecl *ConstrainedDecl, ArrayRef< AssociatedConstraint > AssociatedConstraints)
OpenCLOptions OpenCLFeatures
Definition: Sema.h:1271
QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2, bool ConvertArgs=true)
Find a merged pointer type and convert the two expressions to it.
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
SmallVector< std::deque< PendingImplicitInstantiation >, 8 > SavedPendingInstantiations
Definition: Sema.h:13841
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:2124
ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
void ExitDeclaratorContext(Scope *S)
Definition: SemaDecl.cpp:1433
bool isQualifiedMemberAccess(Expr *E)
Determine whether the given expression is a qualified member access expression, of a form that could ...
Definition: SemaExpr.cpp:16001
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...
Definition: SemaDecl.cpp:8564
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Definition: Sema.cpp:849
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
RecordDecl * CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc, unsigned NumParams)
Definition: SemaStmt.cpp:4578
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)
Definition: SemaCast.cpp:3441
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
Definition: Sema.h:4736
DeclGroupPtrTy ActOnGlobalModuleFragmentDecl(SourceLocation ModuleLoc)
The parser has processed a global-module-fragment declaration that begins the definition of the globa...
Definition: SemaModule.cpp:169
bool CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, TemplateArgumentLoc &Arg, SmallVectorImpl< TemplateArgument > &SugaredConverted, SmallVectorImpl< TemplateArgument > &CanonicalConverted)
void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope, CapturedRegionKind Kind, unsigned NumParams)
Definition: SemaStmt.cpp:4661
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
void CheckMSVCRTEntryPoint(FunctionDecl *FD)
Definition: SemaDecl.cpp:12684
UnsignedOrNone getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition: Sema.h:14896
ProcessingContextState ParsingClassState
Definition: Sema.h:6508
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:1307
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:2476
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...
Definition: SemaDecl.cpp:15237
FunctionDecl * CreateBuiltin(IdentifierInfo *II, QualType Type, unsigned ID, SourceLocation Loc)
Definition: SemaDecl.cpp:2344
ExprResult ActOnEmbedExpr(SourceLocation EmbedKeywordLoc, StringLiteral *BinaryData, StringRef FileName)
Definition: SemaExpr.cpp:17052
Scope * getNonFieldDeclScope(Scope *S)
getNonFieldDeclScope - Retrieves the innermost scope, starting from S, where a non-field would be dec...
Definition: SemaDecl.cpp:2319
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
void pushCodeSynthesisContext(CodeSynthesisContext Ctx)
bool isDeclaratorFunctionLike(Declarator &D)
Determine whether.
Definition: Sema.cpp:2910
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
Definition: SemaExpr.cpp:3675
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
Definition: SemaType.cpp:1859
bool mightBeIntendedToBeTemplateName(ExprResult E, bool &Dependent)
Determine whether it's plausible that E was intended to be a template-name.
Definition: Sema.h:3819
std::pair< const IdentifierInfo *, uint64_t > TypeTagMagicValue
A pair of ArgumentKind identifier and magic value.
Definition: Sema.h:2662
void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc)
ActOnPragmaWeakID - Called on well formed #pragma weak ident.
Definition: SemaDecl.cpp:20721
QualType BuiltinRemoveCVRef(QualType BaseType, SourceLocation Loc)
Definition: Sema.h:15239
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
Definition: SemaExpr.cpp:10580
bool CheckNontrivialField(FieldDecl *FD)
Definition: SemaDecl.cpp:19170
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType, Expr *SrcExpr)
DiagnoseAssignmentEnum - Warn if assignment to enum is a constant integer not in the range of enum va...
Definition: SemaStmt.cpp:1728
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
Definition: Sema.h:6912
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
Definition: SemaAttr.cpp:1333
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
bool CheckExceptionSpecSubset(const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID, const FunctionProtoType *Superset, bool SkipSupersetFirstParameter, SourceLocation SuperLoc, const FunctionProtoType *Subset, bool SkipSubsetFirstParameter, SourceLocation SubLoc)
CheckExceptionSpecSubset - Check whether the second function type's exception specification is a subs...
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
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)
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
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:2294
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody=nullptr)
QualType BuildMemberPointerType(QualType T, const CXXScopeSpec &SS, CXXRecordDecl *Cls, SourceLocation Loc, DeclarationName Entity)
Build a member pointer type T Class::*.
Definition: SemaType.cpp:2695
llvm::function_ref< void(SourceLocation, PartialDiagnostic)> InstantiationContextDiagFuncRef
Definition: Sema.h:2279
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:12948
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
Definition: SemaInit.cpp:9944
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:4819
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.
Definition: SemaDecl.cpp:9093
void LateTemplateParserCleanupCB(void *P)
Definition: Sema.h:1317
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:5809
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...
Definition: SemaModule.cpp:265
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:633
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)
Definition: SemaExpr.cpp:3230
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:15324
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition: Sema.h:8130
StringLiteral * CurInitSeg
Last section used with #pragma init_seg.
Definition: Sema.h:2073
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Definition: SemaDecl.cpp:20751
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition: Sema.h:9807
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
Definition: SemaExpr.cpp:9710
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,...
Definition: SemaDecl.cpp:9113
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.
Definition: SemaExpr.cpp:7369
static bool isCast(CheckedConversionKind CCK)
Definition: Sema.h:2517
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 *.
Definition: SemaExpr.cpp:1727
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...
Definition: SemaExpr.cpp:16551
ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr)
Prepare SplattedExpr for a vector splat operation, adding implicit casts if necessary.
Definition: SemaExpr.cpp:7759
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)
Definition: SemaDecl.cpp:15821
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
Definition: Sema.h:7997
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:2512
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:6927
void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, ADLResult &Functions)
void DiagnoseUniqueObjectDuplication(const VarDecl *Dcl)
Definition: SemaDecl.cpp:13664
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
Definition: Sema.h:6467
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)
Definition: SemaDecl.cpp:15745
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:1411
auto getDefaultDiagFunc()
Definition: Sema.h:2280
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
Definition: SemaInit.cpp:7682
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount)
Checks that a call expression's argument count is at least the desired number.
bool FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope, QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP, MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew, FunctionDecl *&OperatorDelete, bool Diagnose=true)
Finds the overloads of operator new and delete that are appropriate for the allocation.
ExprResult checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path)
Check a cast of an unknown-any type.
Definition: SemaExpr.cpp:21226
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
ExprResult ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, SourceLocation LAngleBracketLoc, Declarator &D, SourceLocation RAngleBracketLoc, SourceLocation LParenLoc, Expr *E, SourceLocation RParenLoc)
ActOnCXXNamedCast - Parse {dynamic,static,reinterpret,const,addrspace}_cast's.
Definition: SemaCast.cpp:314
DeclGroupPtrTy ActOnPrivateModuleFragmentDecl(SourceLocation ModuleLoc, SourceLocation PrivateLoc)
The parser has processed a private-module-fragment declaration that begins the definition of the priv...
Definition: SemaModule.cpp:517
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
Definition: SemaDecl.cpp:15277
SuppressedDiagnosticsMap SuppressedDiagnostics
Definition: Sema.h:12425
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition: Sema.h:6486
SemaOpenCL & OpenCL()
Definition: Sema.h:1493
void ActOnPragmaMSFunction(SourceLocation Loc, const llvm::SmallVectorImpl< StringRef > &NoBuiltins)
Call on well formed #pragma function.
Definition: SemaAttr.cpp:1267
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Definition: SemaDecl.cpp:5948
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
Definition: Sema.h:13850
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
QualType BuiltinDecay(QualType BaseType, SourceLocation Loc)
Definition: SemaType.cpp:9928
void ActOnPragmaMSStruct(PragmaMSStructKind Kind)
ActOnPragmaMSStruct - Called on well formed #pragma ms_struct [on|off].
Definition: SemaAttr.cpp:616
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
Definition: SemaExpr.cpp:16926
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
Definition: Sema.h:2204
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
Definition: SemaDecl.cpp:15575
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the keyword associated.
Definition: SemaType.cpp:3802
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression, SourceLocation EllipsisLoc, SourceLocation LSquareLoc, Expr *IndexExpr, SourceLocation RSquareLoc)
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation, StringLiteral *SegmentName)
Called on well-formed #pragma init_seg().
Definition: SemaAttr.cpp:890
AccessResult CheckConstructorAccess(SourceLocation Loc, CXXConstructorDecl *D, DeclAccessPair FoundDecl, const InitializedEntity &Entity, bool IsCopyBindingRefToTemp=false)
Checks access to a constructor.
static SourceRange getPrintable(TypeLoc TL)
Definition: Sema.h:14912
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...
Definition: SemaExpr.cpp:8045
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:2592
@ FAPK_Elsewhere
Definition: Sema.h:2596
@ FAPK_Fixed
Definition: Sema.h:2593
@ FAPK_Variadic
Definition: Sema.h:2594
@ FAPK_VAList
Definition: Sema.h:2595
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.
Definition: SemaExpr.cpp:20460
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:8122
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition: Sema.h:12939
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition: Sema.cpp:1627
StmtResult ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, NamedReturnInfo &NRInfo, bool SupressSimplerImplicitMoves)
ActOnCapScopeReturnStmt - Utility routine to type-check return statements for capturing scopes.
Definition: SemaStmt.cpp:3567
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
Stmt * MaybeCreateStmtWithCleanups(Stmt *SubStmt)
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
CXXMethodDecl * DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit copy assignment operator for the given class.
ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, Declarator &D, Expr *Initializer)
Parsed a C++ 'new' expression (C++ 5.3.4).
CXXConstructorDecl * LookupMovingConstructor(CXXRecordDecl *Class, unsigned Quals)
Look up the moving constructor for the given class.
void checkIllFormedTrivialABIStruct(CXXRecordDecl &RD)
Check that the C++ class annoated with "trivial_abi" satisfies all the conditions that are needed for...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
Definition: SemaDecl.cpp:8605
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
Definition: SemaDecl.cpp:1347
StmtResult ActOnCapturedRegionEnd(Stmt *S)
Definition: SemaStmt.cpp:4774
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
Definition: SemaDecl.cpp:4868
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
Definition: SemaExpr.cpp:20356
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
Definition: SemaDecl.cpp:16157
bool IsCXXReplaceableType(QualType T)
Determines if a type is replaceable according to the C++26 rules.
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:15337
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...
Definition: SemaType.cpp:9740
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...
Definition: SemaExpr.cpp:2918
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)
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
Definition: SemaStmt.cpp:2253
bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result)
BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr TheCall is a constant expression.
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
Definition: SemaDecl.cpp:2688
StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc, Expr *DestExp)
Definition: SemaStmt.cpp:3238
bool GlobalNewDeleteDeclared
A flag to remember whether the implicit forms of operator new and delete have been declared.
Definition: Sema.h:8318
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)
Definition: SemaExpr.cpp:4154
ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind, SourceLocation BuiltinLoc, SourceLocation RPLoc)
Definition: SemaExpr.cpp:17011
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
Definition: Sema.h:3564
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition: Sema.h:6719
bool MSStructPragmaOn
Definition: Sema.h:1797
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
Definition: SemaExpr.cpp:21316
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
Definition: SemaType.cpp:9361
ExprResult TransformToPotentiallyEvaluated(Expr *E)
Definition: SemaExpr.cpp:17644
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:13466
bool canSkipFunctionBody(Decl *D)
Determine whether we can skip parsing the body of a function definition, assuming we don't care about...
Definition: SemaDecl.cpp:16209
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.
Definition: SemaDecl.cpp:11200
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:13791
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition: Sema.h:15312
SourceManager & getSourceManager() const
Definition: Sema.h:916
void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
Definition: SemaModule.cpp:745
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9944
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose=true)
QualType CXXThisTypeOverride
When non-NULL, the C++ 'this' expression is allowed despite the current context not being a non-stati...
Definition: Sema.h:8389
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:4797
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.
Definition: SemaExpr.cpp:6816
bool CheckVecStepExpr(Expr *E)
Definition: SemaExpr.cpp:4450
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
Definition: Sema.cpp:632
bool isModuleVisible(const Module *M, bool ModulePrivate=false)
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_bits attribute.
Definition: Sema.h:3517
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.
Definition: SemaDecl.cpp:4424
bool hasVisibleMergedDefinition(const NamedDecl *Def)
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
Definition: Sema.cpp:946
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
Definition: SemaDecl.cpp:20512
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 ...
Definition: SemaDecl.cpp:1398
void diagnoseFunctionEffectConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn when implicitly changing function effects.
Definition: Sema.cpp:696
ClassTemplateDecl * lookupCoroutineTraits(SourceLocation KwLoc, SourceLocation FuncLoc)
Lookup 'coroutine_traits' in std namespace and std::experimental namespace.
bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
bool TemplateParameterListsAreEqual(TemplateParameterList *New, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Definition: Sema.h:12165
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.
Definition: SemaDecl.cpp:11376
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.
Definition: SemaStmt.cpp:3527
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 ?: operation.
Definition: SemaExpr.cpp:8916
bool IsFunctionConversion(QualType FromType, QualType ToType, bool *DiscardingCFIUncheckedCallee=nullptr, bool *AddingCFIUncheckedCallee=nullptr) const
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
CheckVectorCompareOperands - vector comparisons are a clang extension that operates on extended vecto...
Definition: SemaExpr.cpp:13044
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...
Definition: SemaLambda.cpp:565
void PrintPragmaAttributeInstantiationPoint()
Definition: Sema.h:2292
ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr=false)
CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
DeclResult CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation TemplateNameLoc, const TemplateArgumentListInfo &TemplateArgs)
Get the specialization of the given variable template corresponding to the specified argument list,...
llvm::FoldingSet< SpecialMemberOverloadResultEntry > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
Definition: Sema.h:9267
ExprResult CheckLValueToRValueConversionOperand(Expr *E)
Definition: SemaExpr.cpp:19964
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
Definition: SemaType.cpp:9845
QualType CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:14037
void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, SourceLocation IncludeLoc)
Definition: SemaAttr.cpp:550
Decl * ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc, Expr *LangStr, SourceLocation LBraceLoc)
ActOnStartLinkageSpecification - Parsed the beginning of a C++ linkage specification,...
bool ActOnCXXNestedNameSpecifierIndexedPack(CXXScopeSpec &SS, const DeclSpec &DS, SourceLocation ColonColonLoc, QualType Type)
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
Definition: SemaDecl.cpp:18618
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:13796
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,...
bool AccessCheckingSFINAE
When true, access checking violations are treated as SFINAE failures rather than hard errors.
Definition: Sema.h:12354
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:5929
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset, SourceLocation AsmLoc)
PragmaClangSection PragmaClangTextSection
Definition: Sema.h:1812
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:7422
bool BoundsSafetyCheckInitialization(const InitializedEntity &Entity, const InitializationKind &Kind, AssignmentAction Action, QualType LHSType, Expr *RHSExpr)
Perform Bounds Safety Semantic checks for initializing a Bounds Safety pointer.
LabelDecl * LookupOrCreateLabel(IdentifierInfo *II, SourceLocation IdentLoc, SourceLocation GnuLabelLoc=SourceLocation())
LookupOrCreateLabel - Do a name lookup of a label with the specified name.
NonTrivialCUnionKind
Definition: Sema.h:4063
@ NTCUK_Destruct
Definition: Sema.h:4065
@ NTCUK_Init
Definition: Sema.h:4064
@ NTCUK_Copy
Definition: Sema.h:4066
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:1348
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.
Definition: SemaAttr.cpp:1400
QualType BuildAtomicType(QualType T, SourceLocation Loc)
Definition: SemaType.cpp:10131
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
Definition: Sema.h:8275
PragmaClangSection PragmaClangDataSection
Definition: Sema.h:1809
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
Definition: SemaExpr.cpp:20595
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
Definition: SemaExpr.cpp:5564
llvm::Error isValidSectionSpecifier(StringRef Str)
Used to implement to perform semantic checking on attribute((section("foo"))) specifiers.
void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)
Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
ParsedType actOnLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, IdentifierInfo *Id, LambdaCaptureInitKind InitKind, Expr *&Init)
Perform initialization analysis of the init-capture and perform any implicit conversions such as an l...
Definition: Sema.h:9062
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...
Definition: SemaDecl.cpp:14172
bool anyAltivecTypes(QualType srcType, QualType destType)
Definition: SemaExpr.cpp:7653
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?
Definition: SemaExpr.cpp:7690
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
Definition: SemaAttr.cpp:1480
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.
Definition: SemaDecl.cpp:1286
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.
Definition: SemaStmt.cpp:2431
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
Definition: Sema.cpp:2342
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.
Definition: SemaDecl.cpp:20694
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:2022
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 ?: under C++ semantics.
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)
Definition: SemaType.cpp:6402
TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)
MaybeODRUseExprSet MaybeODRUseExprs
Definition: Sema.h:6717
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
ExternalSemaSource * getExternalSource() const
Definition: Sema.h:921
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:1220
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition: Sema.h:2080
SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const
Returns the top most location responsible for the definition of N.
bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum, unsigned ArgBits)
BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of TheCall is a constant expression re...
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition: Sema.h:8747
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, bool IsInstantiation=false)
ActOnLambdaError - If there is an error parsing a lambda, this callback is invoked to pop the informa...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition: SemaExpr.cpp:218
static SourceRange getPrintable(SourceRange R)
Definition: Sema.h:14909
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)
Definition: SemaDecl.cpp:20677
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.
Definition: SemaDecl.cpp:8440
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
Definition: Sema.h:13490
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.
Definition: SemaExprCXX.cpp:57
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....
Definition: SemaExpr.cpp:2144
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:14646
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)
Definition: SemaStmt.cpp:3946
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition: Sema.h:15279
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, const PartialDiagnostic &PD, const FunctionDecl *FD=nullptr)
Definition: Sema.h:1123
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
Definition: SemaExpr.cpp:15539
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition: Sema.cpp:2872
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void emitDeferredDiags()
Definition: Sema.cpp:2006
void setFunctionHasMustTail()
Definition: Sema.cpp:2507
ExprResult BuildPseudoDestructorExpr(Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc, SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
bool hasReachableMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is a member specialization declaration (as op...
ExprResult CheckExtVectorCast(SourceRange R, QualType DestTy, Expr *CastExpr, CastKind &Kind)
Definition: SemaExpr.cpp:7792
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition: Sema.h:8314
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange, SourceRange FixItRange, const sema::Capture &From)
Diagnose if an explicit lambda capture is unused.
void CheckCompleteVariableDeclaration(VarDecl *VD)
Definition: SemaDecl.cpp:14616
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
Definition: SemaInit.cpp:3515
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
void PopSatisfactionStackEntry()
Definition: Sema.h:14652
void checkClassLevelCodeSegAttribute(CXXRecordDecl *Class)
QualType BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a pointer type.
Definition: SemaType.cpp:1806
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)
Definition: SemaDecl.cpp:15162
void setFunctionHasBranchProtectedScope()
Definition: Sema.cpp:2497
RedeclarationKind forRedeclarationInCurContext() const
bool hasReachableDefinition(NamedDecl *D)
Definition: Sema.h:15368
void MergeVarDecl(VarDecl *New, LookupResult &Previous)
MergeVarDecl - We just parsed a variable 'New' which has the same name and scope as a previous declar...
Definition: SemaDecl.cpp:4617
bool isConstantEvaluatedContext() const
Definition: Sema.h:2584
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition: Sema.h:6478
QualType buildLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions, IdentifierInfo *Id, bool DirectInit, Expr *&Init)
Definition: SemaLambda.cpp:803
StmtResult ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block)
Definition: SemaStmt.cpp:4536
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:623
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.
std::pair< const NamedDecl *, llvm::FoldingSetNodeID > SatisfactionStackEntryTy
Definition: Sema.h:14662
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)
Definition: SemaType.cpp:9912
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
bool BuiltinElementwiseTernaryMath(CallExpr *TheCall, EltwiseBuiltinArgTyRestriction ArgTyRestr=EltwiseBuiltinArgTyRestriction::FloatTy)
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
Definition: Sema.cpp:1165
StmtResult BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End, Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc, BuildForRangeKind Kind, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
Definition: SemaStmt.cpp:2689
ExprResult ActOnCXXAssumeAttr(Stmt *St, const ParsedAttr &A, SourceRange Range)
StmtResult ActOnDoStmt(SourceLocation DoLoc, Stmt *Body, SourceLocation WhileLoc, SourceLocation CondLParen, Expr *Cond, SourceLocation CondRParen)
Definition: SemaStmt.cpp:1820
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.
Definition: SemaDecl.cpp:19229
void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
std::pair< StringRef, QualType > CapturedParamNameType
Definition: Sema.h:11169
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)
Definition: SemaStmt.cpp:1172
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.
Definition: SemaDecl.cpp:1951
llvm::DenseMap< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
Definition: Sema.h:3538
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 ...
Definition: SemaExpr.cpp:17422
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:270
ExprResult SubstConstraintExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
Definition: SemaDecl.cpp:20042
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition: Sema.h:1549
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
Definition: SemaDecl.cpp:12719
ASTConsumer & Consumer
Definition: Sema.h:1277
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:4622
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
PragmaAlignPackDiagnoseKind
Definition: Sema.h:2182
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:6919
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition: SemaExpr.cpp:123
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
Definition: SemaDecl.cpp:2108
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition: Sema.h:1312
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:1772
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition: Sema.h:13833
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
Definition: SemaExpr.cpp:5197
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...
Definition: SemaType.cpp:7394
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:9834
@ PrivateFragmentImportFinished
after 'module :private;' but a non-import decl has already been seen.
@ ImportFinished
after any non-import decl.
@ PrivateFragmentImportAllowed
after 'module :private;' but before any non-import decl.
@ FirstDecl
Parsing the first decl in a TU.
@ GlobalFragment
after 'module;' but before 'module X;'
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
@ ImportAllowed
after 'module X;' but before any non-import decl.
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:14908
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
Definition: SemaExpr.cpp:3571
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
Definition: SemaExpr.cpp:12989
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
Definition: Sema.cpp:109
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
Definition: SemaStmt.cpp:4566
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void incrementMSManglingNumber() const
Definition: Sema.h:1241
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.
Definition: SemaExpr.cpp:8547
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
Definition: SemaDecl.cpp:16943
ExpressionEvaluationContext
Describes how the expressions currently being parsed are evaluated at run-time, if at all.
Definition: Sema.h:6661
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ DiscardedStatement
The current expression occurs within a discarded statement.
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType, bool IsDereference, SourceRange Range)
Definition: SemaCast.cpp:2067
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...
Definition: SemaType.cpp:9813
unsigned LastEmittedCodeSynthesisContextDepth
The depth of the context stack at the point when the most recent error or warning was produced.
Definition: Sema.h:13474
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, int FirstArg)
ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
QualType BuildUnaryTransformType(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:10075
AvailabilityPriority
Describes the kind of priority given to an availability attribute.
Definition: Sema.h:4782
@ AP_PragmaClangAttribute
The availability attribute was applied using '#pragma clang attribute'.
Definition: Sema.h:4788
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition: Sema.h:4792
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition: Sema.h:4785
void ActOnDocumentableDecls(ArrayRef< Decl * > Group)
Definition: SemaDecl.cpp:15281
ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Parse a __builtin_astype expression.
Definition: SemaExpr.cpp:6809
StmtResult ActOnSEHExceptBlock(SourceLocation Loc, Expr *FilterExpr, Stmt *Block)
Definition: SemaStmt.cpp:4516
ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, SourceRange R)
Build a sizeof or alignof expression given a type operand.
Definition: SemaExpr.cpp:4687
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
Definition: SemaType.cpp:5693
void CheckStaticLocalForDllExport(VarDecl *VD)
Check if VD needs to be dllexport/dllimport due to being in a dllexport/import function.
Definition: SemaDecl.cpp:14947
ExprResult BuildOperatorCoawaitLookupExpr(Scope *S, SourceLocation Loc)
std::pair< SourceLocation, bool > DeleteExprLoc
Definition: Sema.h:959
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.
Definition: SemaExpr.cpp:20602
bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind)
Check the constraints on expression operands to unary type expression and type traits.
Definition: SemaExpr.cpp:4272
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 {'.
Definition: SemaDecl.cpp:17555
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....
Definition: SemaDecl.cpp:4947
SemaPPC & PPC()
Definition: Sema.h:1503
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:2355
ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16756
MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, Expr *Init, SourceLocation EllipsisLoc)
Handle a C++ member initializer.
void ActOnAfterCompoundStatementLeadingPragmas()
Definition: SemaStmt.cpp:420
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
Definition: SemaType.cpp:5805
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
Definition: SemaStmt.cpp:75
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
Definition: Sema.h:4856
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Definition: SemaType.cpp:9241
void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls)
Definition: SemaDecl.cpp:15667
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:1239
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)
Definition: SemaDecl.cpp:1394
void DiagnoseUnterminatedPragmaAttribute()
Definition: SemaAttr.cpp:1245
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
Definition: SemaAttr.cpp:1352
bool SatisfactionStackContains(const NamedDecl *D, const llvm::FoldingSetNodeID &ID) const
Definition: Sema.h:14654
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
Definition: SemaExpr.cpp:21246
UnsignedOrNone getFullyPackExpandedSize(TemplateArgument Arg)
Given a template argument that contains an unexpanded parameter pack, but which has already been subs...
LateTemplateParserCB * LateTemplateParser
Definition: Sema.h:1318
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)
Definition: SemaDecl.cpp:19507
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.
Definition: SemaExpr.cpp:19578
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
Definition: SemaExpr.cpp:7862
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC #pragma optimize in scope,...
Definition: SemaAttr.cpp:1300
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
Definition: SemaAttr.cpp:1489
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
Definition: SemaExpr.cpp:3003
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
Delete-expressions to be analyzed at the end of translation unit.
Definition: Sema.h:8325
bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl)
Checks if the new declaration declared in dependent context must be put in the same redeclaration cha...
Definition: SemaDecl.cpp:11224
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Definition: Sema.h:3557
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 FomatStringIn...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
bool DeferDiags
Whether deferrable diagnostics should be deferred.
Definition: Sema.h:9989
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
Definition: SemaInit.cpp:7555
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:8112
SemaSystemZ & SystemZ()
Definition: Sema.h:1533
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition: Sema.cpp:123
bool isRedefinitionAllowedFor(const NamedDecl *D, bool &Visible)
Definition: Sema.h:15358
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:2894
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
Definition: SemaExpr.cpp:18228
QualType BuiltinRemoveExtent(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9956
bool NeedToCaptureVariable(ValueDecl *Var, SourceLocation Loc)
Checks if the variable must be captured.
Definition: SemaExpr.cpp:19570
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition: Sema.h:8262
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
Definition: SemaDecl.cpp:1366
void warnOnCTypeHiddenInCPlusPlus(const NamedDecl *D)
Definition: SemaDecl.cpp:15349
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
MemberPointerConversionResult
Definition: Sema.h:10171
bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty, CastKind &Kind)
Definition: SemaExpr.cpp:7739
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:9820
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
Definition: SemaType.cpp:9216
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
Definition: SemaDecl.cpp:3184
StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList, Stmt *SubStmt)
Definition: SemaStmt.cpp:648
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
QualType BuiltinChangeCVRQualifiers(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9982
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
Definition: Sema.h:1279
TemplateNameIsRequiredTag
Definition: Sema.h:11337
@ TemplateNameIsRequired
Definition: Sema.h:11337
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
Definition: SemaExpr.cpp:4779
ExprResult BuildVectorLiteral(SourceLocation LParenLoc, SourceLocation RParenLoc, Expr *E, TypeSourceInfo *TInfo)
Build an altivec or OpenCL literal.
Definition: SemaExpr.cpp:7931
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:777
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.
Definition: SemaDecl.cpp:5901
bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, SourceLocation NameLoc, CXXScopeSpec &SS, ParsedTemplateTy *Template=nullptr)
Determine whether a particular identifier might be the name in a C++1z deduction-guide declaration.
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, StringRef SlotLabel, Expr *Alignment)
ActOnPragmaPack - Called on well formed #pragma pack(...).
Definition: SemaAttr.cpp:438
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
Definition: SemaDecl.cpp:16291
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnStartDelayedCXXMethodDeclaration - We have completed parsing a top-level (non-nested) C++ class,...
LazyVector< CXXConstructorDecl *, ExternalSemaSource, &ExternalSemaSource::ReadDelegatingConstructors, 2, 2 > DelegatingCtorDeclsType
Definition: Sema.h:6471
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.
Definition: SemaExpr.cpp:2454
DiagnosticsEngine & Diags
Definition: Sema.h:1278
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
Definition: SemaLambda.cpp:992
void DiagnoseUnterminatedPragmaAlignPack()
Definition: SemaAttr.cpp:589
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition: Sema.h:7738
OpenCLOptions & getOpenCLOptions()
Definition: Sema.h:912
FPOptions CurFPFeatures
Definition: Sema.h:1272
void ActOnStartSEHFinallyBlock()
Definition: SemaStmt.cpp:4528
TypeAwareAllocationMode ShouldUseTypeAwareOperatorNewOrDelete() const
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
static bool CanBeGetReturnObject(const FunctionDecl *FD)
Definition: SemaDecl.cpp:16287
NamespaceDecl * getStdNamespace() const
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
Definition: SemaType.cpp:9921
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition: Sema.h:6462
ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, BinaryOperatorKind Operator)
void DeclareImplicitEqualityComparison(CXXRecordDecl *RD, FunctionDecl *Spaceship)
ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex, bool IsThrownVarInScope)
bool IsAtLeastAsConstrained(const NamedDecl *D1, MutableArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, MutableArrayRef< AssociatedConstraint > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an initializer for the declaratio...
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
Definition: SemaDecl.cpp:6807
QualType BuildArrayType(QualType T, ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity)
Build an array type.
Definition: SemaType.cpp:2050
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
Definition: SemaExpr.cpp:509
PragmaStack< StringLiteral * > DataSegStack
Definition: Sema.h:2032
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
Definition: SemaLambda.cpp:710
LateTemplateParserCleanupCB * LateTemplateParserCleanup
Definition: Sema.h:1319
bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType)
Are the two types lax-compatible vector types? That is, given that one of them is a vector,...
Definition: SemaExpr.cpp:7676
DiagCtorKind
Definition: Sema.h:3579
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)
Definition: SemaExpr.cpp:15609
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Definition: SemaInit.cpp:9874
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
Definition: SemaDecl.cpp:7434
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:2933
void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D)
Common checks for a parameter-declaration that should apply to both function parameters and non-type ...
Definition: SemaDecl.cpp:15312
ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< ParsedType > Args, SourceLocation RParenLoc)
Parsed one of the type trait support pseudo-functions.
TemplateParamListContext
The context in which we are checking a template parameter list.
Definition: Sema.h:11524
@ TPC_TemplateTemplateParameterPack
Definition: Sema.h:11534
@ TPC_FriendFunctionTemplate
Definition: Sema.h:11532
@ TPC_ClassTemplateMember
Definition: Sema.h:11530
@ TPC_FunctionTemplate
Definition: Sema.h:11529
@ TPC_FriendClassTemplate
Definition: Sema.h:11531
@ TPC_Other
Definition: Sema.h:11527
@ TPC_FriendFunctionTemplateDefinition
Definition: Sema.h:11533
void ActOnPragmaVisibility(const IdentifierInfo *VisType, SourceLocation PragmaLoc)
ActOnPragmaVisibility - Called on well formed #pragma GCC visibility... .
Definition: SemaAttr.cpp:1366
void ActOnAbortSEHFinallyBlock()
Definition: SemaStmt.cpp:4532
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,...
Definition: SemaDecl.cpp:6894
void ActOnFinishDelayedAttribute(Scope *S, Decl *D, ParsedAttributes &Attrs)
ActOnFinishDelayedAttribute - Invoked when we have finished parsing an attribute for which parsing is...
Definition: SemaDecl.cpp:16798
bool CheckQualifiedFunctionForTypeId(QualType T, SourceLocation Loc)
Definition: SemaType.cpp:1785
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
Definition: SemaExpr.cpp:3635
SemaAVR & AVR()
Definition: Sema.h:1423
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
Definition: SemaExpr.cpp:5658
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
bool GloballyUniqueObjectMightBeAccidentallyDuplicated(const VarDecl *Dcl)
Certain globally-unique variables might be accidentally duplicated if built into multiple shared libr...
Definition: SemaDecl.cpp:13565
void DiagnoseAssignmentAsCondition(Expr *E)
DiagnoseAssignmentAsCondition - Given that an expression is being used as a boolean condition,...
Definition: SemaExpr.cpp:20645
SourceLocation OptimizeOffPragmaLocation
This represents the last location of a "#pragma clang optimize off" directive if such a directive has...
Definition: Sema.h:2108
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)
Definition: SemaDecl.cpp:2126
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.
Definition: SemaType.cpp:1934
void PopDeclContext()
Definition: SemaDecl.cpp:1373
ExprResult VerifyIntegerConstantExpression(Expr *E, AllowFoldKind CanFold=AllowFoldKind::No)
Definition: Sema.h:7697
void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init)
bool ActOnCXXEnterDeclaratorScope(Scope *S, CXXScopeSpec &SS)
ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global scope or nested-name-specifi...
TemplateArgumentLoc getIdentityTemplateArgumentLoc(NamedDecl *Param, SourceLocation Location)
Get a template argument mapping the given template parameter to itself, e.g.
bool CheckIfFunctionSpecializationIsImmediate(FunctionDecl *FD, SourceLocation Loc)
ExprResult BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc)
Complete a lambda-expression having processed and attached the lambda body.
void diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, SourceLocation FallbackLoc, SourceLocation ConstQualLoc=SourceLocation(), SourceLocation VolatileQualLoc=SourceLocation(), SourceLocation RestrictQualLoc=SourceLocation(), SourceLocation AtomicQualLoc=SourceLocation(), SourceLocation UnalignedQualLoc=SourceLocation())
Definition: SemaType.cpp:2893
AccessResult CheckMemberAccess(SourceLocation UseLoc, CXXRecordDecl *NamingClass, DeclAccessPair Found)
Checks access to a member.
QualType CheckBitwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:13400
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:6494
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition: Sema.h:13441
void PrintStats() const
Print out statistics about the semantic analysis.
Definition: Sema.cpp:672
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16115
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:14899
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...
Definition: SemaExpr.cpp:1007
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,...
Definition: SemaExpr.cpp:6151
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
Definition: Sema.h:1795
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.
Definition: SemaDecl.cpp:1637
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)
Definition: SemaExpr.cpp:13105
llvm::BumpPtrAllocator BumpAlloc
Definition: Sema.h:1225
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.
Definition: SemaType.cpp:1938
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
Definition: Sema.cpp:88
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
BuildForRangeKind
Definition: Sema.h:10996
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition: Sema.h:11004
@ BFRK_Build
Initial building of a for-range statement.
Definition: Sema.h:10998
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition: Sema.h:11001
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
Definition: SemaExpr.cpp:8995
SemaNVPTX & NVPTX()
Definition: Sema.h:1478
bool resolveAssumedTemplateNameAsType(Scope *S, TemplateName &Name, SourceLocation NameLoc, bool Diagnose=true)
void checkIncorrectVTablePointerAuthenticationAttribute(CXXRecordDecl &RD)
Check that VTable Pointer authentication is only being set on the first first instantiation of the vt...
StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl, Stmt *HandlerBlock)
ActOnCXXCatchBlock - Takes an exception declaration and a handler block and creates a proper catch ha...
Definition: SemaStmt.cpp:4233
void ActOnPragmaMSStrictGuardStackCheck(SourceLocation PragmaLocation, PragmaMsStackAction Action, bool Value)
ActOnPragmaMSStrictGuardStackCheck - Called on well formed #pragma strict_gs_check.
Definition: SemaAttr.cpp:874
void ActOnUninitializedDecl(Decl *dcl)
Definition: SemaDecl.cpp:14214
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
Definition: SemaDecl.cpp:13284
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.
Definition: SemaDecl.cpp:1622
bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation, FunctionDecl *Decl, ArrayRef< TemplateArgument > TemplateArgs, ConstraintSatisfaction &Satisfaction)
TypedefDecl * ParseTypedefDecl(Scope *S, Declarator &D, QualType T, TypeSourceInfo *TInfo)
Subroutines of ActOnDeclarator().
Definition: SemaDecl.cpp:17190
ExprResult CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const TemplateArgumentListInfo *TemplateArgs)
QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc)
Definition: SemaType.cpp:9827
void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction, const Expr *ThisArg, ArrayRef< const Expr * > Args)
void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt)
ActOnCaseStmtBody - This installs a statement as the body of a case.
Definition: SemaStmt.cpp:563
ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope)
ActOnBlockStmtExpr - This is called when the body of a block statement literal was successfully compl...
Definition: SemaExpr.cpp:16561
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
Definition: SemaDecl.cpp:13696
QualType BuildTypeofExprType(Expr *E, TypeOfKind Kind)
Definition: SemaType.cpp:9700
bool isUsualDeallocationFunction(const CXXMethodDecl *FD)
PragmaSectionKind
Definition: Sema.h:2052
@ PSK_ConstSeg
Definition: Sema.h:2055
@ PSK_DataSeg
Definition: Sema.h:2053
@ PSK_CodeSeg
Definition: Sema.h:2056
@ PSK_BSSSeg
Definition: Sema.h:2054
void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous, bool &AddToScope)
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
ExprResult BuildArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, TypeSourceInfo *TSInfo, Expr *DimExpr, SourceLocation RParen)
TypeResult ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword, SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, const IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false, bool IsClassName=false, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition: Sema.cpp:627
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
Definition: SemaExpr.cpp:20380
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
Definition: SemaCast.cpp:337
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
Definition: SemaExpr.cpp:17081
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:6238
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...
Definition: SemaDecl.cpp:18867
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,...
Definition: SemaExpr.cpp:18401
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
CodeAlignAttr * BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E)
ExprResult ActOnStmtExprResult(ExprResult E)
Definition: SemaExpr.cpp:16159
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, IdentifierInfo *IIEnvironment)
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)
Definition: SemaExpr.cpp:4832
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
Definition: SemaDecl.cpp:4460
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
void ActOnCXXForRangeDecl(Decl *D)
Definition: SemaDecl.cpp:14533
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.
Definition: SemaLambda.cpp:279
QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns, SourceLocation AttrLoc)
Definition: SemaType.cpp:2449
void DiagnoseEqualityWithExtraParens(ParenExpr *ParenE)
Redundant parentheses over an equality comparison can indicate that the user intended an assignment u...
Definition: SemaExpr.cpp:20701
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:3532
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition: Sema.cpp:2096
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
Definition: SemaExpr.cpp:21528
bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested, AcceptableKind Kind, bool OnlyNeedComplete=false)
Definition: SemaType.cpp:9268
UnsignedOrNone GetDecompositionElementCount(QualType DecompType, SourceLocation Loc)
PragmaClangSection PragmaClangBSSSection
Definition: Sema.h:1808
Decl * ActOnDeclarator(Scope *S, Declarator &D)
Definition: SemaDecl.cpp:6210
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
Definition: SemaExpr.cpp:3709
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
Definition: Sema.h:1335
ExprResult ActOnGCCAsmStmtString(Expr *Stm, bool ForAsmLabel)
AbstractDiagSelID
Definition: Sema.h:6184
@ AbstractSynthesizedIvarType
Definition: Sema.h:6191
@ AbstractVariableType
Definition: Sema.h:6188
@ AbstractReturnType
Definition: Sema.h:6186
@ AbstractNone
Definition: Sema.h:6185
@ AbstractFieldType
Definition: Sema.h:6189
@ AbstractArrayType
Definition: Sema.h:6192
@ AbstractParamType
Definition: Sema.h:6187
@ AbstractIvarType
Definition: Sema.h:6190
StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition: SemaStmt.cpp:950
MSPropertyDecl * HandleMSProperty(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS, const ParsedAttr &MSPropertyAttr)
HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
bool BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, int High, bool RangeIsError=true)
BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr TheCall is a constant express...
bool InstantiateEnum(SourceLocation PointOfInstantiation, EnumDecl *Instantiation, EnumDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiate the definition of an enum from a given pattern.
ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
Definition: SemaExpr.cpp:7344
ExprResult CheckVarOrConceptTemplateTemplateId(const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, TemplateTemplateParmDecl *Template, SourceLocation TemplateLoc, const TemplateArgumentListInfo *TemplateArgs)
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
Definition: SemaExpr.cpp:16413
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 ...
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:1518
ParsedType getConstructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, bool EnteringContext)
Definition: SemaExprCXX.cpp:71
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
Definition: SemaExpr.cpp:4905
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.
Definition: SemaDecl.cpp:1761
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
Definition: Sema.h:8311
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.
Definition: SemaDecl.cpp:1295
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(const NamedDecl *D1, ArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, ArrayRef< AssociatedConstraint > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
ExprResult BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange, SourceLocation RParenLoc, MultiExprArg Args, AtomicExpr::AtomicOp Op, AtomicArgumentOrder ArgOrder=AtomicArgumentOrder::API)
Decl * ActOnFinishExportDecl(Scope *S, Decl *ExportDecl, SourceLocation RBraceLoc)
Complete the definition of an export declaration.
void finishLambdaExplicitCaptures(sema::LambdaScopeInfo *LSI)
Note that we have finished the explicit captures for the given lambda.
Definition: SemaLambda.cpp:561
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)
Definition: SemaType.cpp:10049
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
void ActOnPragmaFPContract(SourceLocation Loc, LangOptions::FPModeKind FPC)
ActOnPragmaFPContract - Called on well formed #pragma {STDC,OPENCL} FP_CONTRACT and #pragma clang fp ...
Definition: SemaAttr.cpp:1381
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.
Definition: SemaType.cpp:8231
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc)
Called on well formed #pragma clang optimize.
Definition: SemaAttr.cpp:1251
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.
Definition: SemaExpr.cpp:6520
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...
Definition: SemaExpr.cpp:4762
QualType PreferredConditionType(ConditionKind K) const
Definition: Sema.h:7920
CUDALaunchBoundsAttr * CreateLaunchBoundsAttr(const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
Create an CUDALaunchBoundsAttr attribute.
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
LiteralOperatorLookupResult
The possible outcomes of name lookup for a literal operator.
Definition: Sema.h:9330
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition: Sema.h:9334
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition: Sema.h:9340
@ LOLR_Error
The lookup resulted in an error.
Definition: Sema.h:9332
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition: Sema.h:9337
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition: Sema.h:9348
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition: Sema.h:9344
void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaWeakAlias - Called on well formed #pragma weak ident = ident.
Definition: SemaDecl.cpp:20733
sema::FunctionScopeInfo * getEnclosingFunction() const
Definition: Sema.cpp:2527
const ExpressionEvaluationContextRecord & parentEvaluationContext() const
Definition: Sema.h:6900
SemaLoongArch & LoongArch()
Definition: Sema.h:1458
void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, Scope *CurScope)
ActOnBlockArguments - This callback allows processing of block arguments.
Definition: SemaExpr.cpp:16442
QualType CheckRemainderOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign=false)
Definition: SemaExpr.cpp:10878
CheckConstexprKind
Definition: Sema.h:6373
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
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:13829
void CheckVariableDeclarationType(VarDecl *NewVD)
Definition: SemaDecl.cpp:8777
sema::CompoundScopeInfo & getCurCompoundScope() const
Definition: SemaStmt.cpp:432
DeclContext * FindInstantiatedContext(SourceLocation Loc, DeclContext *DC, const MultiLevelTemplateArgumentList &TemplateArgs)
Finds the instantiation of the given declaration context within the current instantiation.
sema::CapturedRegionScopeInfo * getCurCapturedRegion()
Retrieve the current captured region, if any.
Definition: Sema.cpp:2886
OpaquePtr< TemplateName > TemplateTy
Definition: Sema.h:1268
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
Definition: SemaInit.cpp:9859
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
Definition: SemaLambda.cpp:413
SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD)
Invoked when we enter a tag definition that we're skipping.
Definition: SemaDecl.cpp:1380
void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E)
Warn when implicitly casting 0 to nullptr.
Definition: Sema.cpp:708
bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E)
CheckCXXThrowOperand - Validate the operand of a throw.
bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit, Expr *Init)
Definition: SemaDecl.cpp:13247
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.
Definition: SemaAttr.cpp:1451
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
Definition: SemaDecl.cpp:2492
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...
Definition: SemaExpr.cpp:1502
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)
Definition: SemaType.cpp:2773
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:3513
void ActOnFinishOfCompoundStmt()
Definition: SemaStmt.cpp:428
concepts::Requirement * ActOnNestedRequirement(Expr *Constraint)
void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB)
Cause the built diagnostic to be emitted on the DiagosticsEngine.
Definition: Sema.cpp:1672
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...
Definition: SemaAttr.cpp:1284
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
Definition: SemaDecl.cpp:16171
bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:15204
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...
Definition: SemaDecl.cpp:13544
static ConditionResult ConditionError()
Definition: Sema.h:7775
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
Definition: SemaStmt.cpp:436
void NoteTemplateParameterLocation(const NamedDecl &Decl)
SemaWasm & Wasm()
Definition: Sema.h:1538
ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ActOnConvertVectorExpr - create a new convert-vector expression from the provided arguments.
Definition: SemaExpr.cpp:6830
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D)
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:3461
FunctionDecl * FindUsualDeallocationFunction(SourceLocation StartLoc, ImplicitDeallocationParameters, DeclarationName Name)
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:13437
ExprResult checkUnknownAnyArg(SourceLocation callLoc, Expr *result, QualType &paramType)
Type-check an expression that's being passed to an __unknown_anytype parameter.
Definition: SemaExpr.cpp:21250
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.
Definition: SemaDecl.cpp:20483
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 ...
Definition: SemaExpr.cpp:5890
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
Definition: SemaExpr.cpp:16356
SemaPseudoObject & PseudoObject()
Definition: Sema.h:1508
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:2488
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition: SemaStmt.cpp:588
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
Definition: Sema.h:11302
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...
Definition: SemaStmt.cpp:4353
FullExprArg MakeFullExpr(Expr *Arg)
Definition: Sema.h:7731
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:714
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...
Definition: SemaDecl.cpp:15549
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:143
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:8270
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition: Sema.h:1267
static int getPrintable(int I)
Definition: Sema.h:14898
TypeResult ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc)
Parsed an elaborated-type-specifier that refers to a template-id, such as class T::template apply.
void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags, StringLiteral *SegmentName)
Called on well formed #pragma section().
Definition: SemaAttr.cpp:885
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
Definition: Sema.h:9600
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition: Sema.h:12779
StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, Stmt *SubStmt, Scope *CurScope)
Definition: SemaStmt.cpp:568
ExprResult ActOnCXXThis(SourceLocation Loc)
bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef< UnexpandedParameterPack > Unexpanded)
Diagnose unexpanded parameter packs.
TemplateNameKindForDiagnostics
Describes the detailed kind of a template name. Used in diagnostics.
Definition: Sema.h:3805
bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy, QualType SrcTy)
Definition: SemaCast.cpp:2734
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)
Definition: SemaExpr.cpp:18236
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:14903
ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
Definition: SemaExpr.cpp:7276
void warnOnReservedIdentifier(const NamedDecl *D)
Definition: SemaDecl.cpp:6197
StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprResult LHS, SourceLocation DotDotDotLoc, ExprResult RHS, SourceLocation ColonLoc)
Definition: SemaStmt.cpp:532
TemplateArgumentLoc getTemplateArgumentPackExpansionPattern(TemplateArgumentLoc OrigLoc, SourceLocation &Ellipsis, UnsignedOrNone &NumExpansions) const
Returns the pattern of the pack expansion for a template argument.
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
bool isCheckingDefaultArgumentOrInitializer() const
Definition: Sema.h:8138
bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, QualType EnumUnderlyingTy, bool IsFixed, const EnumDecl *Prev)
Check whether this is a valid redeclaration of a previous enumeration.
Definition: SemaDecl.cpp:17287
SemaARM & ARM()
Definition: Sema.h:1418
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.
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
Definition: SemaAttr.cpp:322
bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, const LookupResult &R)
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation TriviallyRelocatable, SourceLocation Replaceable, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
Definition: SemaDecl.cpp:18643
static const char * getPrintable(const char *S)
Definition: Sema.h:14901
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.
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.
Definition: SemaExpr.cpp:5409
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
Definition: Sema.cpp:653
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
Definition: SemaType.cpp:2756
PragmaMsStackAction
Definition: Sema.h:1814
@ PSK_Push_Set
Definition: Sema.h:1820
@ PSK_Reset
Definition: Sema.h:1815
@ PSK_Pop_Set
Definition: Sema.h:1821
@ PSK_Show
Definition: Sema.h:1819
@ PSK_Pop
Definition: Sema.h:1818
@ PSK_Set
Definition: Sema.h:1816
@ PSK_Push
Definition: Sema.h:1817
StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body)
FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
Definition: SemaStmt.cpp:3205
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:8599
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)
Definition: SemaExpr.cpp:5083
ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet)
Act on the result of classifying a name as an overload set.
Definition: SemaDecl.cpp:1322
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,...
Definition: SemaModule.cpp:843
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.
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:292
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:334
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1801
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3714
Exposes information about the current target.
Definition: TargetInfo.h:226
A convenient class for passing around template argument information.
Definition: TemplateBase.h:634
A template argument list.
Definition: DeclTemplate.h:250
Location wrapper for a TemplateArgument.
Definition: TemplateBase.h:528
Represents a template argument.
Definition: TemplateBase.h:61
The base class of all kinds of template declarations (e.g., class, function, etc.).
Definition: DeclTemplate.h:396
Represents a C++ template name within the type system.
Definition: TemplateName.h:222
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:74
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:4597
The top declaration context.
Definition: Decl.h:104
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition: ASTConcept.h:223
Represents a declaration of a type.
Definition: Decl.h:3510
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:8314
The base class of the type hierarchy.
Definition: TypeBase.h:1833
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
Definition: Type.cpp:2572
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3664
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3559
Simple class containing the result of Sema::CorrectTypo.
Represents a C++ unqualified-id that has been parsed.
Definition: DeclSpec.h:998
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition: ExprCXX.h:3384
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition: ExprCXX.h:4120
A set of unresolved declarations.
Definition: UnresolvedSet.h:62
Represents a C++ using-declaration.
Definition: DeclCXX.h:3585
Represents C++ using-directive.
Definition: DeclCXX.h:3090
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition: DeclCXX.h:3393
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:711
Represents a variable declaration or definition.
Definition: Decl.h:925
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:4191
Represents a C++11 virt-specifier-seq.
Definition: DeclSpec.h:2754
Consumes visible declarations found when searching for all visible names within a given scope or cont...
Definition: Lookup.h:838
Captures information about a #pragma weak directive.
Definition: Weak.h:25
The API notes manager helps find API notes associated with declarations.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
Definition: ExprConcepts.h:282
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
Definition: ExprConcepts.h:432
A static requirement that can be used in a requires-expression to check properties of types and expre...
Definition: ExprConcepts.h:170
A requires-expression requirement which queries the existence of a type name or type template special...
Definition: ExprConcepts.h:227
Retains information about a block that is currently being parsed.
Definition: ScopeInfo.h:790
Retains information about a captured region.
Definition: ScopeInfo.h:816
Contains information about the compound statement currently being parsed.
Definition: ScopeInfo.h:67
A collection of diagnostics which were delayed.
A diagnostic message which has been conditionally emitted pending the complete parsing of the current...
Retains information about a function, method, or block that is currently being parsed.
Definition: ScopeInfo.h:104
Provides information about an attempted template argument deduction, whose success or failure was des...
#define bool
Definition: gpuintrin.h:32
#define UINT_MAX
Definition: limits.h:64
Definition: SPIR.cpp:47
SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)
Returns the results of matching Matcher on Node.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
llvm::DenseMap< int, SourceRange > ParsedSubjectMatchRuleSet
void threadSafetyCleanup(BeforeSet *Cache)
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition: TokenKinds.h:25
The JSON file list parser is used to communicate input to InstallAPI.
PragmaClangSectionAction
Definition: Sema.h:473
TypeSpecifierType
Specifies the kind of type.
Definition: Specifiers.h:55
ImplicitTypenameContext
Definition: DeclSpec.h:1857
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
Definition: OperatorKinds.h:21
PragmaFPKind
Definition: PragmaKinds.h:38
OverloadKind
Definition: Sema.h:809
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
ArrayTypeTrait
Names for the array type traits.
Definition: TypeTraits.h:42
@ CPlusPlus
Definition: LangStandard.h:55
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
Definition: Overload.h:923
VariadicCallType
Definition: Sema.h:511
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
Definition: Sema.h:456
CUDAFunctionTarget
Definition: Cuda.h:60
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...
AllocationFunctionScope
The scope in which to find allocation functions.
Definition: Sema.h:777
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
PragmaMSCommentKind
Definition: PragmaKinds.h:14
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition: Specifiers.h:35
TryCaptureKind
Definition: Sema.h:651
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
Definition: Specifiers.h:39
bool isInstanceMethod(const Decl *D)
Definition: Attr.h:120
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
Definition: Sema.h:659
@ BitwiseOp
A bitwise operation.
@ Arithmetic
An arithmetic operation.
@ Conditional
A conditional (?:) operator.
@ CompAssign
A compound assignment expression.
@ Comparison
A comparison.
NullabilityKind
Describes the nullability of a particular type.
Definition: Specifiers.h:348
InClassInitStyle
In-class initialization styles for non-static data members.
Definition: Specifiers.h:271
@ Success
Annotation was successful.
CXXConstructionKind
Definition: ExprCXX.h:1541
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition: Specifiers.h:149
PointerAuthDiscArgKind
Definition: Sema.h:592
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
Definition: Sema.h:602
BinaryOperatorKind
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
Definition: Overload.h:84
NonTrivialCUnionContext
Definition: Sema.h:530
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
Definition: Sema.h:626
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
Definition: Sema.h:235
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
void inferNoReturnAttr(Sema &S, const Decl *D)
TypeOfKind
The kind of 'typeof' expression we're after.
Definition: TypeBase.h:918
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
Definition: CallGraph.h:204
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition: Specifiers.h:123
@ AS_none
Definition: Specifiers.h:127
CapturedRegionKind
The different kinds of captured statement.
Definition: CapturedStmt.h:16
StorageClass
Storage classes.
Definition: Specifiers.h:248
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
Definition: TypeTraits.h:51
bool isFunctionOrMethodOrBlockForAttrSubject(const Decl *D)
Return true if the given decl has function type (function or function-typed variable) or an Objective...
Definition: Attr.h:40
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
Definition: Overload.h:89
LambdaCaptureInitKind
Definition: DeclSpec.h:2798
@ CopyInit
[a = b], [a = {b}]
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ AANT_ArgumentIntegerConstant
Definition: ParsedAttr.h:1065
PragmaOptionsAlignKind
Definition: Sema.h:475
@ Result
The result type of a method or function.
OffsetOfKind
Definition: Sema.h:614
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition: TypeBase.h:3735
CorrectTypoKind
Definition: Sema.h:804
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
bool isFunctionOrMethodVariadic(const Decl *D)
Definition: Attr.h:112
@ Template
We are parsing a template declaration.
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
Definition: Sema.h:687
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
@ CompatibleVoidPtrToNonVoidPtr
CompatibleVoidPtrToNonVoidPtr - The types are compatible in C because a void * can implicitly convert...
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
TagUseKind
Definition: Sema.h:448
MSVtorDispMode
In the Microsoft ABI, this controls the placement of virtual displacement members used to implement v...
Definition: LangOptions.h:37
UnaryOperatorKind
PragmaClangSectionKind
pragma clang section kind
Definition: Sema.h:464
ActionResult< Expr * > ExprResult
Definition: Ownership.h:249
TagTypeKind
The kind of a tag type.
Definition: TypeBase.h:5906
TUFragmentKind
Definition: Sema.h:484
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
Definition: Ownership.h:263
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
NameClassificationKind
Describes the result of the name lookup and resolution performed by Sema::ClassifyName().
Definition: Sema.h:553
@ FunctionTemplate
The name was classified as a function template name.
@ Keyword
The name has been typo-corrected to a keyword.
@ DependentNonType
The name denotes a member of a dependent type that could not be resolved.
@ UndeclaredTemplate
The name was classified as an ADL-only function template name.
@ NonType
The name was classified as a specific non-type, non-template declaration.
@ TypeTemplate
The name was classified as a template whose specializations are types.
@ Concept
The name was classified as a concept name.
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
@ UndeclaredNonType
The name was classified as an ADL-only function name.
@ VarTemplate
The name was classified as a variable template name.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
Definition: DeclTemplate.h:66
LangAS
Defines the address space values used by the address space qualifier of QualType.
Definition: AddressSpaces.h:25
FormatStringType
Definition: Sema.h:496
CastKind
CastKind - The kind of operation required for a conversion.
AllowFoldKind
Definition: Sema.h:653
TranslationUnitKind
Describes the kind of translation unit being processed.
Definition: LangOptions.h:1097
@ TU_Complete
The translation unit is a complete translation unit.
Definition: LangOptions.h:1099
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
Definition: LangOptions.h:1103
ComparisonCategoryType
An enumeration representing the different comparison categories types.
VarArgKind
Definition: Sema.h:674
PragmaMSStructKind
Definition: PragmaKinds.h:23
AssignmentAction
Definition: Sema.h:213
ActionResult< Stmt * > StmtResult
Definition: Ownership.h:250
CXXSpecialMemberKind
Kinds of C++ special members.
Definition: Sema.h:424
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
Definition: TemplateKinds.h:20
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
Definition: TemplateKinds.h:33
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
Definition: TemplateKinds.h:30
@ TNK_Function_template
The name refers to a function template or a set of overloaded functions that includes at least one fu...
Definition: TemplateKinds.h:26
@ TNK_Concept_template
The name refers to a concept.
Definition: TemplateKinds.h:52
@ TNK_Undeclared_template
Lookup for the name failed, but we're assuming it was a template name anyway.
Definition: TemplateKinds.h:50
ActionResult< ParsedType > TypeResult
Definition: Ownership.h:251
BuiltinCountedByRefKind
Definition: Sema.h:519
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
Definition: Lambda.h:22
PragmaFloatControlKind
Definition: PragmaKinds.h:28
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition: Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition: Specifiers.h:135
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition: Ownership.h:230
const FunctionProtoType * T
TypeAwareAllocationMode
Definition: ExprCXX.h:2253
IfExistsResult
Describes the result of an "if-exists" condition check.
Definition: Sema.h:789
@ Exists
The symbol exists.
@ DoesNotExist
The symbol does not exist.
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
Definition: Specifiers.h:410
bool hasFunctionProto(const Decl *D)
hasFunctionProto - Return true if the given decl has a argument information.
Definition: Attr.h:55
unsigned getFunctionOrMethodNumParams(const Decl *D)
getFunctionOrMethodNumParams - Return number of function or method parameters.
Definition: Attr.h:64
TPOC
The context in which partial ordering of function templates occurs.
Definition: Template.h:298
TrivialABIHandling
Definition: Sema.h:643
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
TemplateDeductionResult
Describes the result of template argument deduction.
Definition: Sema.h:366
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
ActionResult< Decl * > DeclResult
Definition: Ownership.h:255
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition: Specifiers.h:188
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition: Specifiers.h:278
@ None
The alignment was not explicit in code.
CCEKind
Contexts in which a converted constant expression is required.
Definition: Sema.h:824
@ CaseValue
Expression in a case label.
@ StaticAssertMessageData
Call to data() in a static assert message.
@ Enumerator
Enumerator value with fixed underlying type.
@ StaticAssertMessageSize
Call to size() in a static assert message.
@ Noexcept
Condition in a noexcept(bool) specifier.
@ ArrayBound
Array bound in array declarator or new-expression.
@ TempArgStrict
As above, but applies strict template checking rules.
@ ExplicitBool
Condition in an explicit(bool) specifier.
SourceLocIdentKind
Definition: Expr.h:4940
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition: TypeBase.h:5881
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
ArrayRef< IdentifierLoc > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
Definition: ModuleLoader.h:33
TypeTrait
Names for traits that operate specifically on types.
Definition: TypeTraits.h:21
@ Parens
New-expression has a C++98 paren-delimited initializer.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DynamicNone
throw()
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Dynamic
throw(T1, T2)
PredefinedIdentKind
Definition: Expr.h:1991
CheckedConversionKind
The kind of conversion being performed.
Definition: Sema.h:435
@ Implicit
An implicit conversion.
@ CStyleCast
A C-style cast.
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
@ OtherCast
A cast other than a C-style cast.
@ FunctionalCast
A functional-style cast.
MutableArrayRef< Expr * > MultiExprArg
Definition: Ownership.h:259
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
Definition: Specifiers.h:173
unsigned int uint32_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
int const char * function
Definition: c++config.h:31
#define true
Definition: stdbool.h:25
#define false
Definition: stdbool.h:26
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...
Describes whether we've seen any nullability information for the given file.
Definition: Sema.h:239
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
Definition: Sema.h:246
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
Definition: Sema.h:242
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
Definition: Sema.h:252
uint8_t PointerKind
Which kind of pointer declarator we saw.
Definition: Sema.h:249
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Definition: TypeBase.h:5019
Holds information about the various types of exception specification.
Definition: TypeBase.h:5339
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition: TypeBase.h:5341
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition: TypeBase.h:5344
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition: TypeBase.h:5347
Extra information about a function prototype.
Definition: TypeBase.h:5367
Represents a complete lambda introducer.
Definition: DeclSpec.h:2806
Contains a late templated function.
Definition: Sema.h:15527
CachedTokens Toks
Definition: Sema.h:15528
FPOptions FPO
Floating-point options in the point of definition.
Definition: Sema.h:15532
Decl * D
The template function declaration to be late parsed.
Definition: Sema.h:15530
A normalized constraint, as defined in C++ [temp.constr.normal], is either an atomic constraint,...
Definition: SemaConcept.h:68
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
SourceLocation CurrentPragmaLocation
Definition: Sema.h:2027
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
Definition: Sema.h:10461
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
Definition: Sema.h:10468
CheckNonDependentConversionsFlag(bool SuppressUserConversions, bool OnlyInitializeNonUserDefinedConversions)
Definition: Sema.h:10470
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition: Sema.h:11926
CheckTemplateArgumentInfo(const CheckTemplateArgumentInfo &)=delete
CheckTemplateArgumentInfo(bool PartialOrdering=false, bool MatchingTTP=false)
Definition: Sema.h:11907
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition: Sema.h:11919
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition: Sema.h:11916
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:12953
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition: Sema.h:13120
bool SavedInNonInstantiationSFINAEContext
Was the enclosing context a non-instantiation SFINAE context?
Definition: Sema.h:13070
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition: Sema.h:13089
sema::TemplateDeductionInfo * DeductionInfo
The template deduction info object associated with the substitution or checking of explicit or deduce...
Definition: Sema.h:13115
ArrayRef< TemplateArgument > template_arguments() const
Definition: Sema.h:13108
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition: Sema.h:13084
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition: Sema.h:13076
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition: Sema.h:13102
bool InConstraintSubstitution
Whether we're substituting into constraints.
Definition: Sema.h:13073
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition: Sema.h:13092
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition: Sema.h:13099
SynthesisKind
The kind of template instantiation we are performing.
Definition: Sema.h:12955
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition: Sema.h:13047
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition: Sema.h:12965
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition: Sema.h:12974
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition: Sema.h:12993
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition: Sema.h:13044
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition: Sema.h:13001
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition: Sema.h:13008
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition: Sema.h:13051
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition: Sema.h:13019
@ Memoization
Added for Template instantiation observation.
Definition: Sema.h:13057
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition: Sema.h:12984
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition: Sema.h:13063
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition: Sema.h:13060
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition: Sema.h:13066
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition: Sema.h:12981
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition: Sema.h:12989
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition: Sema.h:12997
@ TemplateInstantiation
We are instantiating a template declaration.
Definition: Sema.h:12958
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition: Sema.h:13011
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition: Sema.h:13015
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition: Sema.h:12970
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition: Sema.h:13041
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition: Sema.h:13004
Decl * Entity
The entity that is being synthesized.
Definition: Sema.h:13079
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition: Sema.h:13105
ConstraintEvalRAII(InstTy &TI)
Definition: Sema.h:13633
InitializationContext(SourceLocation Loc, ValueDecl *Decl, DeclContext *Context)
Definition: Sema.h:6817
Data structure used to record current or nested expression evaluation contexts.
Definition: Sema.h:6723
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:6751
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition: Sema.h:6753
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition: Sema.h:6804
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition: Sema.h:6743
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:6747
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition: Sema.h:6758
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:6766
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition: Sema.h:6762
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition: Sema.h:6772
SmallVector< LambdaExpr *, 2 > Lambdas
The lambdas that are present within this context, if it is indeed an unevaluated context.
Definition: Sema.h:6738
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition: Sema.h:6780
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition: Sema.h:6810
SmallVector< MisalignedMember, 4 > MisalignedMembers
Small set of gathered accesses to potentially misaligned members due to the packed attribute.
Definition: Sema.h:6776
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition: Sema.h:6728
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition: Sema.h:6827
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition: Sema.h:6829
ExpressionEvaluationContext Context
The expression evaluation context.
Definition: Sema.h:6725
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition: Sema.h:6732
FormatArgumentPassingKind ArgPassingKind
Definition: Sema.h:2604
std::optional< FunctionEffectWithCondition > Old
Definition: Sema.h:15434
StringRef effectName() const
Definition: Sema.h:15438
OverrideResult
Describes the result of effects differing between a base class's virtual method and an overriding met...
Definition: Sema.h:15446
std::optional< FunctionEffectWithCondition > New
Definition: Sema.h:15436
FunctionEffect::Kind EffectKind
Definition: Sema.h:15431
An RAII helper that pops function a function scope on exit.
Definition: Sema.h:1296
A stack object to be created when performing template instantiation.
Definition: Sema.h:13144
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition: Sema.h:13304
bool isAlreadyInstantiating() const
Determine whether we are already instantiating this specialization in some surrounding active instant...
Definition: Sema.h:13308
LocalInstantiationScope * Scope
Definition: Sema.h:13956
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition: Sema.h:13959
bool isMoveEligible() const
Definition: Sema.h:11060
bool isCopyElidable() const
Definition: Sema.h:11061
const VarDecl * Candidate
Definition: Sema.h:11055
Keeps information about an identifier in a nested-name-spec.
Definition: Sema.h:3268
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition: Sema.h:3274
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition: Sema.h:3283
SourceLocation IdentifierLoc
The location of the identifier.
Definition: Sema.h:3277
SourceLocation CCLoc
The location of the '::'.
Definition: Sema.h:3280
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition: Sema.h:3271
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition: Sema.h:3289
SourceLocation LocEnd
Definition: Sema.h:7509
IdentifierInfo * IdentInfo
Definition: Sema.h:7512
brief A function argument from which we performed template argument
Definition: Sema.h:12525
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition: Sema.h:12526
This an attribute introduced by #pragma clang attribute.
Definition: Sema.h:2083
SmallVector< attr::SubjectMatchRule, 4 > MatchRules
Definition: Sema.h:2086
A push'd group of PragmaAttributeEntries.
Definition: Sema.h:2091
SourceLocation Loc
The location of the push attribute.
Definition: Sema.h:2093
SmallVector< PragmaAttributeEntry, 2 > Entries
Definition: Sema.h:2096
const IdentifierInfo * Namespace
The namespace of this push group.
Definition: Sema.h:2095
SourceLocation PragmaLocation
Definition: Sema.h:1805
PragmaMsStackAction Action
Definition: Sema.h:1825
Slot(llvm::StringRef StackSlotLabel, ValueType Value, SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
Definition: Sema.h:1938
llvm::StringRef StackSlotLabel
Definition: Sema.h:1934
SourceLocation PragmaLocation
Definition: Sema.h:1936
SourceLocation PragmaPushLocation
Definition: Sema.h:1937
ValueType CurrentValue
Definition: Sema.h:2008
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
Definition: Sema.h:1994
bool hasValue() const
Definition: Sema.h:2004
SmallVector< Slot, 2 > Stack
Definition: Sema.h:2006
ValueType DefaultValue
Definition: Sema.h:2007
SourceLocation CurrentPragmaLocation
Definition: Sema.h:2009
PragmaStack(const ValueType &Default)
Definition: Sema.h:2001
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)
Definition: Sema.h:1945
ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val)
Definition: Sema.h:5039
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition: Sema.h:5033
ReferenceConversions
The conversions that would be performed on an lvalue of type T2 when binding a reference of type T1 t...
Definition: Sema.h:10358
Abstract class used to diagnose incomplete types.
Definition: Sema.h:8203
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
virtual ~TypeDiagnoser()
Definition: Sema.h:8207
TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull)
Definition: Sema.h:2646
unsigned LayoutCompatible
If true, Type should be compared with other expression's types for layout-compatibility.
Definition: Sema.h:2655
bool CheckSameAsPrevious
Definition: Sema.h:352
NamedDecl * Previous
Definition: Sema.h:353
SkipBodyInfo()=default
NamedDecl * New
Definition: Sema.h:354
Information about a template-id annotation token.