clang 20.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/Attr.h"
21#include "clang/AST/CharUnits.h"
22#include "clang/AST/DeclBase.h"
23#include "clang/AST/DeclCXX.h"
26#include "clang/AST/Expr.h"
27#include "clang/AST/ExprCXX.h"
32#include "clang/AST/StmtCXX.h"
33#include "clang/AST/Type.h"
34#include "clang/AST/TypeLoc.h"
38#include "clang/Basic/Cuda.h"
42#include "clang/Basic/LLVM.h"
43#include "clang/Basic/Lambda.h"
45#include "clang/Basic/Module.h"
57#include "clang/Sema/Attr.h"
59#include "clang/Sema/DeclSpec.h"
65#include "clang/Sema/Scope.h"
66#include "clang/Sema/SemaBase.h"
68#include "clang/Sema/Weak.h"
69#include "llvm/ADT/APInt.h"
70#include "llvm/ADT/ArrayRef.h"
71#include "llvm/ADT/BitmaskEnum.h"
72#include "llvm/ADT/DenseMap.h"
73#include "llvm/ADT/DenseSet.h"
74#include "llvm/ADT/FloatingPointMode.h"
75#include "llvm/ADT/FoldingSet.h"
76#include "llvm/ADT/MapVector.h"
77#include "llvm/ADT/PointerIntPair.h"
78#include "llvm/ADT/PointerUnion.h"
79#include "llvm/ADT/STLExtras.h"
80#include "llvm/ADT/STLForwardCompat.h"
81#include "llvm/ADT/STLFunctionalExtras.h"
82#include "llvm/ADT/SetVector.h"
83#include "llvm/ADT/SmallBitVector.h"
84#include "llvm/ADT/SmallPtrSet.h"
85#include "llvm/ADT/SmallSet.h"
86#include "llvm/ADT/SmallVector.h"
87#include "llvm/ADT/StringExtras.h"
88#include "llvm/ADT/StringMap.h"
89#include "llvm/ADT/TinyPtrVector.h"
90#include "llvm/Support/Allocator.h"
91#include "llvm/Support/Compiler.h"
92#include "llvm/Support/Error.h"
93#include "llvm/Support/ErrorHandling.h"
94#include <cassert>
95#include <climits>
96#include <cstddef>
97#include <cstdint>
98#include <deque>
99#include <functional>
100#include <iterator>
101#include <memory>
102#include <optional>
103#include <string>
104#include <tuple>
105#include <type_traits>
106#include <utility>
107#include <vector>
108
109namespace llvm {
110struct InlineAsmIdentifierInfo;
111} // namespace llvm
112
113namespace clang {
114class ADLResult;
115class APValue;
116struct ASTConstraintSatisfaction;
117class ASTConsumer;
118class ASTContext;
119class ASTDeclReader;
120class ASTMutationListener;
121class ASTReader;
122class ASTWriter;
123class CXXBasePath;
124class CXXBasePaths;
125class CXXFieldCollector;
126class CodeCompleteConsumer;
127enum class ComparisonCategoryType : unsigned char;
128class ConstraintSatisfaction;
129class DarwinSDKInfo;
130class DeclGroupRef;
131class DeducedTemplateArgument;
132struct DeductionFailureInfo;
133class DependentDiagnostic;
134class Designation;
135class IdentifierInfo;
136class ImplicitConversionSequence;
137typedef MutableArrayRef<ImplicitConversionSequence> ConversionSequenceList;
138class InitializationKind;
139class InitializationSequence;
140class InitializedEntity;
141enum class LangAS : unsigned int;
142class LocalInstantiationScope;
143class LookupResult;
144class MangleNumberingContext;
145typedef ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> ModuleIdPath;
146class ModuleLoader;
147class MultiLevelTemplateArgumentList;
148struct NormalizedConstraint;
149class ObjCInterfaceDecl;
150class ObjCMethodDecl;
151struct OverloadCandidate;
152enum class OverloadCandidateParamOrder : char;
154class OverloadCandidateSet;
155class Preprocessor;
156class SemaAMDGPU;
157class SemaARM;
158class SemaAVR;
159class SemaBPF;
160class SemaCodeCompletion;
161class SemaCUDA;
162class SemaHLSL;
163class SemaHexagon;
164class SemaLoongArch;
165class SemaM68k;
166class SemaMIPS;
167class SemaMSP430;
168class SemaNVPTX;
169class SemaObjC;
170class SemaOpenACC;
171class SemaOpenCL;
172class SemaOpenMP;
173class SemaPPC;
174class SemaPseudoObject;
175class SemaRISCV;
176class SemaSPIRV;
177class SemaSYCL;
178class SemaSwift;
179class SemaSystemZ;
180class SemaWasm;
181class SemaX86;
182class StandardConversionSequence;
183class TemplateArgument;
184class TemplateArgumentLoc;
185class TemplateInstantiationCallback;
186class TemplatePartialOrderingContext;
187class TemplateSpecCandidateSet;
188class Token;
189class TypeConstraint;
190class TypoCorrectionConsumer;
191class UnresolvedSetImpl;
192class UnresolvedSetIterator;
193class VisibleDeclConsumer;
194
195namespace sema {
196class BlockScopeInfo;
197class Capture;
198class CapturedRegionScopeInfo;
199class CapturingScopeInfo;
200class CompoundScopeInfo;
201class DelayedDiagnostic;
202class DelayedDiagnosticPool;
203class FunctionScopeInfo;
204class LambdaScopeInfo;
205class SemaPPCallbacks;
206class TemplateDeductionInfo;
207} // namespace sema
208
209// AssignmentAction - This is used by all the assignment diagnostic functions
210// to represent what is actually causing the operation
212 Assigning,
213 Passing,
214 Returning,
217 Sending,
218 Casting,
220};
222 const AssignmentAction &AA) {
223 DB << llvm::to_underlying(AA);
224 return DB;
225}
226
227namespace threadSafety {
228class BeforeSet;
229void threadSafetyCleanup(BeforeSet *Cache);
230} // namespace threadSafety
231
232// FIXME: No way to easily map from TemplateTypeParmTypes to
233// TemplateTypeParmDecls, so we have this horrible PointerUnion.
234typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *>,
235 SourceLocation>
237
238/// Describes whether we've seen any nullability information for the given
239/// file.
241 /// The first pointer declarator (of any pointer kind) in the file that does
242 /// not have a corresponding nullability annotation.
244
245 /// The end location for the first pointer declarator in the file. Used for
246 /// placing fix-its.
248
249 /// Which kind of pointer declarator we saw.
250 uint8_t PointerKind;
251
252 /// Whether we saw any type nullability annotations in the given file.
253 bool SawTypeNullability = false;
254};
255
256/// A mapping from file IDs to a record of whether we've seen nullability
257/// information in that file.
259 /// A mapping from file IDs to the nullability information for each file ID.
260 llvm::DenseMap<FileID, FileNullability> Map;
261
262 /// A single-element cache based on the file ID.
263 struct {
266 } Cache;
267
268public:
270 // Check the single-element cache.
271 if (file == Cache.File)
272 return Cache.Nullability;
273
274 // It's not in the single-element cache; flush the cache if we have one.
275 if (!Cache.File.isInvalid()) {
276 Map[Cache.File] = Cache.Nullability;
277 }
278
279 // Pull this entry into the cache.
280 Cache.File = file;
281 Cache.Nullability = Map[file];
282 return Cache.Nullability;
283 }
284};
285
286/// Tracks expected type during expression parsing, for use in code completion.
287/// The type is tied to a particular token, all functions that update or consume
288/// the type take a start location of the token they are looking at as a
289/// parameter. This avoids updating the type on hot paths in the parser.
291public:
292 PreferredTypeBuilder(bool Enabled) : 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 bool Enabled;
339 /// Start position of a token for which we store expected type.
340 SourceLocation ExpectedLoc;
341 /// Expected type for a token starting at ExpectedLoc.
343 /// A function to compute expected type at ExpectedLoc. It is only considered
344 /// if Type is null.
345 llvm::function_ref<QualType()> ComputeType;
346};
347
349 SkipBodyInfo() = default;
350 bool ShouldSkip = false;
352 NamedDecl *Previous = nullptr;
353 NamedDecl *New = nullptr;
354};
355
356/// Describes the result of template argument deduction.
357///
358/// The TemplateDeductionResult enumeration describes the result of
359/// template argument deduction, as returned from
360/// DeduceTemplateArguments(). The separate TemplateDeductionInfo
361/// structure provides additional information about the results of
362/// template argument deduction, e.g., the deduced template argument
363/// list (if successful) or the specific template parameters or
364/// deduced arguments that were involved in the failure.
366 /// Template argument deduction was successful.
367 Success = 0,
368 /// The declaration was invalid; do nothing.
369 Invalid,
370 /// Template argument deduction exceeded the maximum template
371 /// instantiation depth (which has already been diagnosed).
373 /// Template argument deduction did not deduce a value
374 /// for every template parameter.
376 /// Template argument deduction did not deduce a value for every
377 /// expansion of an expanded template parameter pack.
379 /// Template argument deduction produced inconsistent
380 /// deduced values for the given template parameter.
382 /// Template argument deduction failed due to inconsistent
383 /// cv-qualifiers on a template parameter type that would
384 /// otherwise be deduced, e.g., we tried to deduce T in "const T"
385 /// but were given a non-const "X".
387 /// Substitution of the deduced template argument values
388 /// resulted in an error.
390 /// After substituting deduced template arguments, a dependent
391 /// parameter type did not match the corresponding argument.
393 /// After substituting deduced template arguments, an element of
394 /// a dependent parameter type did not match the corresponding element
395 /// of the corresponding argument (when deducing from an initializer list).
397 /// A non-depnedent component of the parameter did not match the
398 /// corresponding component of the argument.
400 /// When performing template argument deduction for a function
401 /// template, there were too many call arguments.
403 /// When performing template argument deduction for a function
404 /// template, there were too few call arguments.
406 /// The explicitly-specified template arguments were not valid
407 /// template arguments for the given template.
409 /// Checking non-dependent argument conversions failed.
411 /// The deduced arguments did not satisfy the constraints associated
412 /// with the template.
414 /// Deduction failed; that's all we know.
416 /// CUDA Target attributes do not match.
418 /// Some error which was already diagnosed.
420};
421
422/// Kinds of C++ special members.
430 Invalid
431};
432
433/// The kind of conversion being performed.
435 /// An implicit conversion.
436 Implicit,
437 /// A C-style cast.
439 /// A functional-style cast.
441 /// A cast other than a C-style cast.
442 OtherCast,
443 /// A conversion for an operand of a builtin overloaded operator.
445};
446
447enum class TagUseKind {
448 Reference, // Reference to a tag: 'struct foo *X;'
449 Declaration, // Fwd decl of a tag: 'struct foo;'
450 Definition, // Definition of a tag: 'struct foo { int X; } Y;'
451 Friend // Friend declaration: 'friend struct foo;'
452};
453
454/// Used with attributes/effects with a boolean condition, e.g. `nonblocking`.
455enum class FunctionEffectMode : uint8_t {
456 None, // effect is not present.
457 False, // effect(false).
458 True, // effect(true).
459 Dependent // effect(expr) where expr is dependent.
460};
461
462/// Sema - This implements semantic analysis and AST building for C.
463/// \nosubgrouping
464class Sema final : public SemaBase {
465 // Table of Contents
466 // -----------------
467 // 1. Semantic Analysis (Sema.cpp)
468 // 2. API Notes (SemaAPINotes.cpp)
469 // 3. C++ Access Control (SemaAccess.cpp)
470 // 4. Attributes (SemaAttr.cpp)
471 // 5. Availability Attribute Handling (SemaAvailability.cpp)
472 // 6. Bounds Safety (SemaBoundsSafety.cpp)
473 // 7. Casts (SemaCast.cpp)
474 // 8. Extra Semantic Checking (SemaChecking.cpp)
475 // 9. C++ Coroutines (SemaCoroutine.cpp)
476 // 10. C++ Scope Specifiers (SemaCXXScopeSpec.cpp)
477 // 11. Declarations (SemaDecl.cpp)
478 // 12. Declaration Attribute Handling (SemaDeclAttr.cpp)
479 // 13. C++ Declarations (SemaDeclCXX.cpp)
480 // 14. C++ Exception Specifications (SemaExceptionSpec.cpp)
481 // 15. Expressions (SemaExpr.cpp)
482 // 16. C++ Expressions (SemaExprCXX.cpp)
483 // 17. Member Access Expressions (SemaExprMember.cpp)
484 // 18. Initializers (SemaInit.cpp)
485 // 19. C++ Lambda Expressions (SemaLambda.cpp)
486 // 20. Name Lookup (SemaLookup.cpp)
487 // 21. Modules (SemaModule.cpp)
488 // 22. C++ Overloading (SemaOverload.cpp)
489 // 23. Statements (SemaStmt.cpp)
490 // 24. `inline asm` Statement (SemaStmtAsm.cpp)
491 // 25. Statement Attribute Handling (SemaStmtAttr.cpp)
492 // 26. C++ Templates (SemaTemplate.cpp)
493 // 27. C++ Template Argument Deduction (SemaTemplateDeduction.cpp)
494 // 28. C++ Template Deduction Guide (SemaTemplateDeductionGuide.cpp)
495 // 29. C++ Template Instantiation (SemaTemplateInstantiate.cpp)
496 // 30. C++ Template Declaration Instantiation
497 // (SemaTemplateInstantiateDecl.cpp)
498 // 31. C++ Variadic Templates (SemaTemplateVariadic.cpp)
499 // 32. Constraints and Concepts (SemaConcept.cpp)
500 // 33. Types (SemaType.cpp)
501 // 34. FixIt Helpers (SemaFixItUtils.cpp)
502 // 35. Function Effects (SemaFunctionEffects.cpp)
503
504 /// \name Semantic Analysis
505 /// Implementations are in Sema.cpp
506 ///@{
507
508public:
509 Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
511 CodeCompleteConsumer *CompletionConsumer = nullptr);
512 ~Sema();
513
514 /// Perform initialization that occurs after the parser has been
515 /// initialized but before it parses anything.
516 void Initialize();
517
518 /// This virtual key function only exists to limit the emission of debug info
519 /// describing the Sema class. GCC and Clang only emit debug info for a class
520 /// with a vtable when the vtable is emitted. Sema is final and not
521 /// polymorphic, but the debug info size savings are so significant that it is
522 /// worth adding a vtable just to take advantage of this optimization.
523 virtual void anchor();
524
525 const LangOptions &getLangOpts() const { return LangOpts; }
528
531 Preprocessor &getPreprocessor() const { return PP; }
532 ASTContext &getASTContext() const { return Context; }
536
538 StringRef Platform);
540
541 /// Registers an external source. If an external source already exists,
542 /// creates a multiplex external source and appends to it.
543 ///
544 ///\param[in] E - A non-null external sema source.
545 ///
547
548 /// Print out statistics about the semantic analysis.
549 void PrintStats() const;
550
551 /// Run some code with "sufficient" stack space. (Currently, at least 256K is
552 /// guaranteed). Produces a warning if we're low on stack space and allocates
553 /// more in that case. Use this in code that may recurse deeply (for example,
554 /// in template instantiation) to avoid stack overflow.
556 llvm::function_ref<void()> Fn);
557
558 /// Returns default addr space for method qualifiers.
560
561 /// Load weak undeclared identifiers from the external source.
563
564 /// Determine if VD, which must be a variable or function, is an external
565 /// symbol that nonetheless can't be referenced from outside this translation
566 /// unit because its type has no linkage and it's not extern "C".
567 bool isExternalWithNoLinkageType(const ValueDecl *VD) const;
568
569 /// Obtain a sorted list of functions that are undefined but ODR-used.
571 SmallVectorImpl<std::pair<NamedDecl *, SourceLocation>> &Undefined);
572
573 typedef std::pair<SourceLocation, bool> DeleteExprLoc;
575 /// Retrieves list of suspicious delete-expressions that will be checked at
576 /// the end of translation unit.
577 const llvm::MapVector<FieldDecl *, DeleteLocs> &
579
580 /// Cause the built diagnostic to be emitted on the DiagosticsEngine.
581 /// This is closely coupled to the SemaDiagnosticBuilder class and
582 /// should not be used elsewhere.
583 void EmitDiagnostic(unsigned DiagID, const DiagnosticBuilder &DB);
584
585 void addImplicitTypedef(StringRef Name, QualType T);
586
587 /// Whether uncompilable error has occurred. This includes error happens
588 /// in deferred diagnostics.
589 bool hasUncompilableErrorOccurred() const;
590
591 /// Looks through the macro-expansion chain for the given
592 /// location, looking for a macro expansion with the given name.
593 /// If one is found, returns true and sets the location to that
594 /// expansion loc.
595 bool findMacroSpelling(SourceLocation &loc, StringRef name);
596
597 /// Calls \c Lexer::getLocForEndOfToken()
599
600 /// Retrieve the module loader associated with the preprocessor.
602
603 /// Invent a new identifier for parameters of abbreviated templates.
606 unsigned Index);
607
609
610 // Emit all deferred diagnostics.
611 void emitDeferredDiags();
612
614 /// The global module fragment, between 'module;' and a module-declaration.
616 /// A normal translation unit fragment. For a non-module unit, this is the
617 /// entire translation unit. Otherwise, it runs from the module-declaration
618 /// to the private-module-fragment (if any) or the end of the TU (if not).
620 /// The private module fragment, between 'module :private;' and the end of
621 /// the translation unit.
622 Private
623 };
624
625 /// This is called before the very first declaration in the translation unit
626 /// is parsed. Note that the ASTContext may have already injected some
627 /// declarations.
629 /// ActOnEndOfTranslationUnit - This is called at the very end of the
630 /// translation unit when EOF is reached and all but the top-level scope is
631 /// popped.
634
635 /// Determines the active Scope associated with the given declaration
636 /// context.
637 ///
638 /// This routine maps a declaration context to the active Scope object that
639 /// represents that declaration context in the parser. It is typically used
640 /// from "scope-less" code (e.g., template instantiation, lazy creation of
641 /// declarations) that injects a name for name-lookup purposes and, therefore,
642 /// must update the Scope.
643 ///
644 /// \returns The scope corresponding to the given declaraion context, or NULL
645 /// if no such scope is open.
647
648 void PushFunctionScope();
649 void PushBlockScope(Scope *BlockScope, BlockDecl *Block);
651
652 /// This is used to inform Sema what the current TemplateParameterDepth
653 /// is during Parsing. Currently it is used to pass on the depth
654 /// when parsing generic lambda 'auto' parameters.
655 void RecordParsingTemplateParameterDepth(unsigned Depth);
656
657 void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD,
659 unsigned OpenMPCaptureLevel = 0);
660
661 /// Custom deleter to allow FunctionScopeInfos to be kept alive for a short
662 /// time after they've been popped.
664 Sema *Self;
665
666 public:
667 explicit PoppedFunctionScopeDeleter(Sema *Self) : Self(Self) {}
669 };
670
672 std::unique_ptr<sema::FunctionScopeInfo, PoppedFunctionScopeDeleter>;
673
674 /// Pop a function (or block or lambda or captured region) scope from the
675 /// stack.
676 ///
677 /// \param WP The warning policy to use for CFG-based warnings, or null if
678 /// such warnings should not be produced.
679 /// \param D The declaration corresponding to this function scope, if
680 /// producing CFG-based warnings.
681 /// \param BlockType The type of the block expression, if D is a BlockDecl.
684 const Decl *D = nullptr,
685 QualType BlockType = QualType());
686
688
693
694 void PushCompoundScope(bool IsStmtExpr);
695 void PopCompoundScope();
696
697 /// Determine whether any errors occurred within this function/method/
698 /// block.
700
701 /// Retrieve the current block, if any.
703
704 /// Get the innermost lambda or block enclosing the current location, if any.
705 /// This looks through intervening non-lambda, non-block scopes such as local
706 /// functions.
708
709 /// Retrieve the current lambda scope info, if any.
710 /// \param IgnoreNonLambdaCapturingScope true if should find the top-most
711 /// lambda scope info ignoring all inner capturing scopes that are not
712 /// lambda scopes.
714 getCurLambda(bool IgnoreNonLambdaCapturingScope = false);
715
716 /// Retrieve the current generic lambda info, if any.
718
719 /// Retrieve the current captured region, if any.
721
722 void ActOnComment(SourceRange Comment);
723
724 /// Retrieve the parser's current scope.
725 ///
726 /// This routine must only be used when it is certain that semantic analysis
727 /// and the parser are in precisely the same context, which is not the case
728 /// when, e.g., we are performing any kind of template instantiation.
729 /// Therefore, the only safe places to use this scope are in the parser
730 /// itself and in routines directly invoked from the parser and *never* from
731 /// template substitution or instantiation.
732 Scope *getCurScope() const { return CurScope; }
733
735
738 }
739
740 SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID,
741 const FunctionDecl *FD = nullptr);
743 const PartialDiagnostic &PD,
744 const FunctionDecl *FD = nullptr) {
745 return targetDiag(Loc, PD.getDiagID(), FD) << PD;
746 }
747
748 /// Check if the type is allowed to be used for the current target.
750 ValueDecl *D = nullptr);
751
752 // /// The kind of conversion being performed.
753 // enum CheckedConversionKind {
754 // /// An implicit conversion.
755 // CCK_ImplicitConversion,
756 // /// A C-style cast.
757 // CCK_CStyleCast,
758 // /// A functional-style cast.
759 // CCK_FunctionalCast,
760 // /// A cast other than a C-style cast.
761 // CCK_OtherCast,
762 // /// A conversion for an operand of a builtin overloaded operator.
763 // CCK_ForBuiltinOverloadedOp
764 // };
765
766 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
767 /// cast. If there is already an implicit cast, merge into the existing one.
768 /// If isLvalue, the result of the cast is an lvalue.
771 const CXXCastPath *BasePath = nullptr,
773
774 /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
775 /// to the conversion from scalar type ScalarTy to the Boolean type.
777
778 /// If \p AllowLambda is true, treat lambda as function.
779 DeclContext *getFunctionLevelDeclContext(bool AllowLambda = false) const;
780
781 /// Returns a pointer to the innermost enclosing function, or nullptr if the
782 /// current context is not inside a function. If \p AllowLambda is true,
783 /// this can return the call operator of an enclosing lambda, otherwise
784 /// lambdas are skipped when looking for an enclosing function.
785 FunctionDecl *getCurFunctionDecl(bool AllowLambda = false) const;
786
787 /// getCurMethodDecl - If inside of a method body, this returns a pointer to
788 /// the method decl for the method being parsed. If we're currently
789 /// in a 'block', this returns the containing context.
791
792 /// getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method
793 /// or C function we're in, otherwise return null. If we're currently
794 /// in a 'block', this returns the containing context.
796
797 /// Warn if we're implicitly casting from a _Nullable pointer type to a
798 /// _Nonnull one.
801
802 /// Warn when implicitly casting 0 to nullptr.
804
805 /// Warn when implicitly changing function effects.
808
809 /// makeUnavailableInSystemHeader - There is an error in the current
810 /// context. If we're still in a system header, and we can plausibly
811 /// make the relevant declaration unavailable instead of erroring, do
812 /// so and return true.
814 UnavailableAttr::ImplicitReason reason);
815
816 /// Retrieve a suitable printing policy for diagnostics.
819 }
820
821 /// Retrieve a suitable printing policy for diagnostics.
823 const Preprocessor &PP);
824
825 /// Scope actions.
827
828 /// Determine whether \param D is function like (function or function
829 /// template) for parsing.
831
832 /// The maximum alignment, same as in llvm::Value. We duplicate them here
833 /// because that allows us not to duplicate the constants in clang code,
834 /// which we must to since we can't directly use the llvm constants.
835 /// The value is verified against llvm here: lib/CodeGen/CGDecl.cpp
836 ///
837 /// This is the greatest alignment value supported by load, store, and alloca
838 /// instructions, and global values.
839 static const unsigned MaxAlignmentExponent = 32;
840 static const uint64_t MaximumAlignment = 1ull << MaxAlignmentExponent;
841
842 /// Flag indicating whether or not to collect detailed statistics.
844
845 std::unique_ptr<sema::FunctionScopeInfo> CachedFunctionScope;
846
847 /// Stack containing information about each of the nested
848 /// function, block, and method scopes that are currently active.
850
851 /// The index of the first FunctionScope that corresponds to the current
852 /// context.
854
855 /// Track the number of currently active capturing scopes.
857
858 llvm::BumpPtrAllocator BumpAlloc;
859
860 /// The kind of translation unit we are processing.
861 ///
862 /// When we're processing a complete translation unit, Sema will perform
863 /// end-of-translation-unit semantic tasks (such as creating
864 /// initializers for tentative definitions in C) once parsing has
865 /// completed. Modules and precompiled headers perform different kinds of
866 /// checks.
868
869 /// Translation Unit Scope - useful to Objective-C actions that need
870 /// to lookup file scope declarations in the "ordinary" C decl namespace.
871 /// For example, user-defined classes, built-in "id" type, etc.
873
875 return CurScope->incrementMSManglingNumber();
876 }
877
878 /// Try to recover by turning the given expression into a
879 /// call. Returns true if recovery was attempted or an error was
880 /// emitted; this may also leave the ExprResult invalid.
882 bool ForceComplain = false,
883 bool (*IsPlausibleResult)(QualType) = nullptr);
884
885 /// Figure out if an expression could be turned into a call.
886 ///
887 /// Use this when trying to recover from an error where the programmer may
888 /// have written just the name of a function instead of actually calling it.
889 ///
890 /// \param E - The expression to examine.
891 /// \param ZeroArgCallReturnTy - If the expression can be turned into a call
892 /// with no arguments, this parameter is set to the type returned by such a
893 /// call; otherwise, it is set to an empty QualType.
894 /// \param OverloadSet - If the expression is an overloaded function
895 /// name, this parameter is populated with the decls of the various
896 /// overloads.
897 bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy,
898 UnresolvedSetImpl &NonTemplateOverloads);
899
903
906
914
915 /// A RAII object to enter scope of a compound statement.
917 public:
918 CompoundScopeRAII(Sema &S, bool IsStmtExpr = false) : S(S) {
919 S.ActOnStartOfCompoundStmt(IsStmtExpr);
920 }
921
923
924 private:
925 Sema &S;
926 };
927
928 /// An RAII helper that pops function a function scope on exit.
931 bool Active;
934 if (Active)
936 }
937 void disable() { Active = false; }
938 };
939
941 return FunctionScopes.empty() ? nullptr : FunctionScopes.back();
942 }
943
944 /// Worker object for performing CFG-based warnings.
947
948 /// Callback to the parser to parse templated functions when needed.
949 typedef void LateTemplateParserCB(void *P, LateParsedTemplate &LPT);
950 typedef void LateTemplateParserCleanupCB(void *P);
954
956 LateTemplateParserCleanupCB *LTPCleanup, void *P) {
957 LateTemplateParser = LTP;
958 LateTemplateParserCleanup = LTPCleanup;
959 OpaqueParser = P;
960 }
961
962 /// Callback to the parser to parse a type expressed as a string.
963 std::function<TypeResult(StringRef, StringRef, SourceLocation)>
965
966 /// VAListTagName - The declaration name corresponding to __va_list_tag.
967 /// This is used as part of a hack to omit that class from ADL results.
969
970 /// Is the last error level diagnostic immediate. This is used to determined
971 /// whether the next info diagnostic should be immediate.
973
974 class DelayedDiagnostics;
975
977 sema::DelayedDiagnosticPool *SavedPool = nullptr;
979 };
982
983 /// A class which encapsulates the logic for delaying diagnostics
984 /// during parsing and other processing.
986 /// The current pool of diagnostics into which delayed
987 /// diagnostics should go.
988 sema::DelayedDiagnosticPool *CurPool = nullptr;
989
990 public:
992
993 /// Adds a delayed diagnostic.
994 void add(const sema::DelayedDiagnostic &diag); // in DelayedDiagnostic.h
995
996 /// Determines whether diagnostics should be delayed.
997 bool shouldDelayDiagnostics() { return CurPool != nullptr; }
998
999 /// Returns the current delayed-diagnostics pool.
1000 sema::DelayedDiagnosticPool *getCurrentPool() const { return CurPool; }
1001
1002 /// Enter a new scope. Access and deprecation diagnostics will be
1003 /// collected in this pool.
1006 state.SavedPool = CurPool;
1007 CurPool = &pool;
1008 return state;
1009 }
1010
1011 /// Leave a delayed-diagnostic state that was previously pushed.
1012 /// Do not emit any of the diagnostics. This is performed as part
1013 /// of the bookkeeping of popping a pool "properly".
1015 CurPool = state.SavedPool;
1016 }
1017
1018 /// Enter a new scope where access and deprecation diagnostics are
1019 /// not delayed.
1022 state.SavedPool = CurPool;
1023 CurPool = nullptr;
1024 return state;
1025 }
1026
1027 /// Undo a previous pushUndelayed().
1029 assert(CurPool == nullptr);
1030 CurPool = state.SavedPool;
1031 }
1032 } DelayedDiagnostics;
1033
1035 return DelayedDiagnostics.push(pool);
1036 }
1037
1038 /// Diagnostics that are emitted only if we discover that the given function
1039 /// must be codegen'ed. Because handling these correctly adds overhead to
1040 /// compilation, this is currently only enabled for CUDA compilations.
1041 SemaDiagnosticBuilder::DeferredDiagnosticsType DeviceDeferredDiags;
1042
1043 /// CurContext - This is the current declaration context of parsing.
1045
1047 assert(AMDGPUPtr);
1048 return *AMDGPUPtr;
1049 }
1050
1052 assert(ARMPtr);
1053 return *ARMPtr;
1054 }
1055
1057 assert(AVRPtr);
1058 return *AVRPtr;
1059 }
1060
1062 assert(BPFPtr);
1063 return *BPFPtr;
1064 }
1065
1067 assert(CodeCompletionPtr);
1068 return *CodeCompletionPtr;
1069 }
1070
1072 assert(CUDAPtr);
1073 return *CUDAPtr;
1074 }
1075
1077 assert(HLSLPtr);
1078 return *HLSLPtr;
1079 }
1080
1082 assert(HexagonPtr);
1083 return *HexagonPtr;
1084 }
1085
1087 assert(LoongArchPtr);
1088 return *LoongArchPtr;
1089 }
1090
1092 assert(M68kPtr);
1093 return *M68kPtr;
1094 }
1095
1097 assert(MIPSPtr);
1098 return *MIPSPtr;
1099 }
1100
1102 assert(MSP430Ptr);
1103 return *MSP430Ptr;
1104 }
1105
1107 assert(NVPTXPtr);
1108 return *NVPTXPtr;
1109 }
1110
1112 assert(ObjCPtr);
1113 return *ObjCPtr;
1114 }
1115
1117 assert(OpenACCPtr);
1118 return *OpenACCPtr;
1119 }
1120
1122 assert(OpenCLPtr);
1123 return *OpenCLPtr;
1124 }
1125
1127 assert(OpenMPPtr && "SemaOpenMP is dead");
1128 return *OpenMPPtr;
1129 }
1130
1132 assert(PPCPtr);
1133 return *PPCPtr;
1134 }
1135
1137 assert(PseudoObjectPtr);
1138 return *PseudoObjectPtr;
1139 }
1140
1142 assert(RISCVPtr);
1143 return *RISCVPtr;
1144 }
1145
1147 assert(SPIRVPtr);
1148 return *SPIRVPtr;
1149 }
1150
1152 assert(SYCLPtr);
1153 return *SYCLPtr;
1154 }
1155
1157 assert(SwiftPtr);
1158 return *SwiftPtr;
1159 }
1160
1162 assert(SystemZPtr);
1163 return *SystemZPtr;
1164 }
1165
1167 assert(WasmPtr);
1168 return *WasmPtr;
1169 }
1170
1172 assert(X86Ptr);
1173 return *X86Ptr;
1174 }
1175
1176 /// Source of additional semantic information.
1178
1179protected:
1180 friend class Parser;
1182 friend class ASTReader;
1183 friend class ASTDeclReader;
1184 friend class ASTWriter;
1185
1186private:
1187 std::optional<std::unique_ptr<DarwinSDKInfo>> CachedDarwinSDKInfo;
1188 bool WarnedDarwinSDKInfoMissing = false;
1189
1190 StackExhaustionHandler StackHandler;
1191
1192 Sema(const Sema &) = delete;
1193 void operator=(const Sema &) = delete;
1194
1195 /// The handler for the FileChanged preprocessor events.
1196 ///
1197 /// Used for diagnostics that implement custom semantic analysis for #include
1198 /// directives, like -Wpragma-pack.
1199 sema::SemaPPCallbacks *SemaPPCallbackHandler;
1200
1201 /// The parser's current scope.
1202 ///
1203 /// The parser maintains this state here.
1204 Scope *CurScope;
1205
1206 mutable IdentifierInfo *Ident_super;
1207
1208 std::unique_ptr<SemaAMDGPU> AMDGPUPtr;
1209 std::unique_ptr<SemaARM> ARMPtr;
1210 std::unique_ptr<SemaAVR> AVRPtr;
1211 std::unique_ptr<SemaBPF> BPFPtr;
1212 std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
1213 std::unique_ptr<SemaCUDA> CUDAPtr;
1214 std::unique_ptr<SemaHLSL> HLSLPtr;
1215 std::unique_ptr<SemaHexagon> HexagonPtr;
1216 std::unique_ptr<SemaLoongArch> LoongArchPtr;
1217 std::unique_ptr<SemaM68k> M68kPtr;
1218 std::unique_ptr<SemaMIPS> MIPSPtr;
1219 std::unique_ptr<SemaMSP430> MSP430Ptr;
1220 std::unique_ptr<SemaNVPTX> NVPTXPtr;
1221 std::unique_ptr<SemaObjC> ObjCPtr;
1222 std::unique_ptr<SemaOpenACC> OpenACCPtr;
1223 std::unique_ptr<SemaOpenCL> OpenCLPtr;
1224 std::unique_ptr<SemaOpenMP> OpenMPPtr;
1225 std::unique_ptr<SemaPPC> PPCPtr;
1226 std::unique_ptr<SemaPseudoObject> PseudoObjectPtr;
1227 std::unique_ptr<SemaRISCV> RISCVPtr;
1228 std::unique_ptr<SemaSPIRV> SPIRVPtr;
1229 std::unique_ptr<SemaSYCL> SYCLPtr;
1230 std::unique_ptr<SemaSwift> SwiftPtr;
1231 std::unique_ptr<SemaSystemZ> SystemZPtr;
1232 std::unique_ptr<SemaWasm> WasmPtr;
1233 std::unique_ptr<SemaX86> X86Ptr;
1234
1235 ///@}
1236
1237 //
1238 //
1239 // -------------------------------------------------------------------------
1240 //
1241 //
1242
1243 /// \name API Notes
1244 /// Implementations are in SemaAPINotes.cpp
1245 ///@{
1246
1247public:
1248 /// Map any API notes provided for this declaration to attributes on the
1249 /// declaration.
1250 ///
1251 /// Triggered by declaration-attribute processing.
1252 void ProcessAPINotes(Decl *D);
1253
1254 ///@}
1255
1256 //
1257 //
1258 // -------------------------------------------------------------------------
1259 //
1260 //
1261
1262 /// \name C++ Access Control
1263 /// Implementations are in SemaAccess.cpp
1264 ///@{
1265
1266public:
1273
1274 /// SetMemberAccessSpecifier - Set the access specifier of a member.
1275 /// Returns true on error (when the previous member decl access specifier
1276 /// is different from the new member decl access specifier).
1277 bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
1278 NamedDecl *PrevMemberDecl,
1279 AccessSpecifier LexicalAS);
1280
1281 /// Perform access-control checking on a previously-unresolved member
1282 /// access which has now been resolved to a member.
1284 DeclAccessPair FoundDecl);
1286 DeclAccessPair FoundDecl);
1287
1288 /// Checks access to an overloaded operator new or delete.
1290 SourceRange PlacementRange,
1291 CXXRecordDecl *NamingClass,
1292 DeclAccessPair FoundDecl,
1293 bool Diagnose = true);
1294
1295 /// Checks access to a constructor.
1297 DeclAccessPair FoundDecl,
1298 const InitializedEntity &Entity,
1299 bool IsCopyBindingRefToTemp = false);
1300
1301 /// Checks access to a constructor.
1303 DeclAccessPair FoundDecl,
1304 const InitializedEntity &Entity,
1305 const PartialDiagnostic &PDiag);
1307 CXXDestructorDecl *Dtor,
1308 const PartialDiagnostic &PDiag,
1309 QualType objectType = QualType());
1310
1311 /// Checks access to the target of a friend declaration.
1313
1314 /// Checks access to a member.
1316 CXXRecordDecl *NamingClass,
1318
1319 /// Checks implicit access to a member in a structured binding.
1322 CXXRecordDecl *DecomposedClass,
1323 DeclAccessPair Field);
1325 const SourceRange &,
1326 DeclAccessPair FoundDecl);
1327
1328 /// Checks access to an overloaded member operator, including
1329 /// conversion operators.
1331 Expr *ArgExpr,
1332 DeclAccessPair FoundDecl);
1334 ArrayRef<Expr *> ArgExprs,
1335 DeclAccessPair FoundDecl);
1337 DeclAccessPair FoundDecl);
1338
1339 /// Checks access for a hierarchy conversion.
1340 ///
1341 /// \param ForceCheck true if this check should be performed even if access
1342 /// control is disabled; some things rely on this for semantics
1343 /// \param ForceUnprivileged true if this check should proceed as if the
1344 /// context had no special privileges
1346 QualType Derived, const CXXBasePath &Path,
1347 unsigned DiagID, bool ForceCheck = false,
1348 bool ForceUnprivileged = false);
1349
1350 /// Checks access to all the declarations in the given result set.
1351 void CheckLookupAccess(const LookupResult &R);
1352
1353 /// Checks access to Target from the given class. The check will take access
1354 /// specifiers into account, but no member access expressions and such.
1355 ///
1356 /// \param Target the declaration to check if it can be accessed
1357 /// \param NamingClass the class in which the lookup was started.
1358 /// \param BaseType type of the left side of member access expression.
1359 /// \p BaseType and \p NamingClass are used for C++ access control.
1360 /// Depending on the lookup case, they should be set to the following:
1361 /// - lhs.target (member access without a qualifier):
1362 /// \p BaseType and \p NamingClass are both the type of 'lhs'.
1363 /// - lhs.X::target (member access with a qualifier):
1364 /// BaseType is the type of 'lhs', NamingClass is 'X'
1365 /// - X::target (qualified lookup without member access):
1366 /// BaseType is null, NamingClass is 'X'.
1367 /// - target (unqualified lookup).
1368 /// BaseType is null, NamingClass is the parent class of 'target'.
1369 /// \return true if the Target is accessible from the Class, false otherwise.
1370 bool IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *NamingClass,
1371 QualType BaseType);
1372
1373 /// Is the given member accessible for the purposes of deciding whether to
1374 /// define a special member function as deleted?
1376 DeclAccessPair Found, QualType ObjectType,
1378 const PartialDiagnostic &Diag);
1381 QualType ObjectType) {
1382 return isMemberAccessibleForDeletion(NamingClass, Found, ObjectType,
1383 SourceLocation(), PDiag());
1384 }
1385
1387 const DependentDiagnostic &DD,
1388 const MultiLevelTemplateArgumentList &TemplateArgs);
1390
1391 ///@}
1392
1393 //
1394 //
1395 // -------------------------------------------------------------------------
1396 //
1397 //
1398
1399 /// \name Attributes
1400 /// Implementations are in SemaAttr.cpp
1401 ///@{
1402
1403public:
1404 /// Controls member pointer representation format under the MS ABI.
1407
1408 bool MSStructPragmaOn; // True when \#pragma ms_struct on
1409
1410 /// Source location for newly created implicit MSInheritanceAttrs
1412
1413 /// pragma clang section kind
1420 PCSK_Relro = 5
1422
1424
1426 std::string SectionName;
1427 bool Valid = false;
1429 };
1430
1436
1438 PSK_Reset = 0x0, // #pragma ()
1439 PSK_Set = 0x1, // #pragma (value)
1440 PSK_Push = 0x2, // #pragma (push[, id])
1441 PSK_Pop = 0x4, // #pragma (pop[, id])
1442 PSK_Show = 0x8, // #pragma (show) -- only for "pack"!
1443 PSK_Push_Set = PSK_Push | PSK_Set, // #pragma (push[, id], value)
1444 PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value)
1445 };
1446
1449 StringRef SlotLabel;
1451 };
1452
1453 // #pragma pack and align.
1455 public:
1456 // `Native` represents default align mode, which may vary based on the
1457 // platform.
1458 enum Mode : unsigned char { Native, Natural, Packed, Mac68k };
1459
1460 // #pragma pack info constructor
1461 AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
1462 : PackAttr(true), AlignMode(M), PackNumber(Num), XLStack(IsXL) {
1463 assert(Num == PackNumber && "The pack number has been truncated.");
1464 }
1465
1466 // #pragma align info constructor
1468 : PackAttr(false), AlignMode(M),
1469 PackNumber(M == Packed ? 1 : UninitPackVal), XLStack(IsXL) {}
1470
1471 explicit AlignPackInfo(bool IsXL) : AlignPackInfo(Native, IsXL) {}
1472
1474
1475 // When a AlignPackInfo itself cannot be used, this returns an 32-bit
1476 // integer encoding for it. This should only be passed to
1477 // AlignPackInfo::getFromRawEncoding, it should not be inspected directly.
1478 static uint32_t getRawEncoding(const AlignPackInfo &Info) {
1479 std::uint32_t Encoding{};
1480 if (Info.IsXLStack())
1481 Encoding |= IsXLMask;
1482
1483 Encoding |= static_cast<uint32_t>(Info.getAlignMode()) << 1;
1484
1485 if (Info.IsPackAttr())
1486 Encoding |= PackAttrMask;
1487
1488 Encoding |= static_cast<uint32_t>(Info.getPackNumber()) << 4;
1489
1490 return Encoding;
1491 }
1492
1493 static AlignPackInfo getFromRawEncoding(unsigned Encoding) {
1494 bool IsXL = static_cast<bool>(Encoding & IsXLMask);
1496 static_cast<AlignPackInfo::Mode>((Encoding & AlignModeMask) >> 1);
1497 int PackNumber = (Encoding & PackNumMask) >> 4;
1498
1499 if (Encoding & PackAttrMask)
1500 return AlignPackInfo(M, PackNumber, IsXL);
1501
1502 return AlignPackInfo(M, IsXL);
1503 }
1504
1505 bool IsPackAttr() const { return PackAttr; }
1506
1507 bool IsAlignAttr() const { return !PackAttr; }
1508
1509 Mode getAlignMode() const { return AlignMode; }
1510
1511 unsigned getPackNumber() const { return PackNumber; }
1512
1513 bool IsPackSet() const {
1514 // #pragma align, #pragma pack(), and #pragma pack(0) do not set the pack
1515 // attriute on a decl.
1516 return PackNumber != UninitPackVal && PackNumber != 0;
1517 }
1518
1519 bool IsXLStack() const { return XLStack; }
1520
1521 bool operator==(const AlignPackInfo &Info) const {
1522 return std::tie(AlignMode, PackNumber, PackAttr, XLStack) ==
1523 std::tie(Info.AlignMode, Info.PackNumber, Info.PackAttr,
1524 Info.XLStack);
1525 }
1526
1527 bool operator!=(const AlignPackInfo &Info) const {
1528 return !(*this == Info);
1529 }
1530
1531 private:
1532 /// \brief True if this is a pragma pack attribute,
1533 /// not a pragma align attribute.
1534 bool PackAttr;
1535
1536 /// \brief The alignment mode that is in effect.
1537 Mode AlignMode;
1538
1539 /// \brief The pack number of the stack.
1540 unsigned char PackNumber;
1541
1542 /// \brief True if it is a XL #pragma align/pack stack.
1543 bool XLStack;
1544
1545 /// \brief Uninitialized pack value.
1546 static constexpr unsigned char UninitPackVal = -1;
1547
1548 // Masks to encode and decode an AlignPackInfo.
1549 static constexpr uint32_t IsXLMask{0x0000'0001};
1550 static constexpr uint32_t AlignModeMask{0x0000'0006};
1551 static constexpr uint32_t PackAttrMask{0x00000'0008};
1552 static constexpr uint32_t PackNumMask{0x0000'01F0};
1553 };
1554
1555 template <typename ValueType> struct PragmaStack {
1556 struct Slot {
1557 llvm::StringRef StackSlotLabel;
1558 ValueType Value;
1561 Slot(llvm::StringRef StackSlotLabel, ValueType Value,
1566 };
1567
1568 void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action,
1569 llvm::StringRef StackSlotLabel, ValueType Value) {
1570 if (Action == PSK_Reset) {
1572 CurrentPragmaLocation = PragmaLocation;
1573 return;
1574 }
1575 if (Action & PSK_Push)
1576 Stack.emplace_back(StackSlotLabel, CurrentValue, CurrentPragmaLocation,
1577 PragmaLocation);
1578 else if (Action & PSK_Pop) {
1579 if (!StackSlotLabel.empty()) {
1580 // If we've got a label, try to find it and jump there.
1581 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) {
1582 return x.StackSlotLabel == StackSlotLabel;
1583 });
1584 // If we found the label so pop from there.
1585 if (I != Stack.rend()) {
1586 CurrentValue = I->Value;
1587 CurrentPragmaLocation = I->PragmaLocation;
1588 Stack.erase(std::prev(I.base()), Stack.end());
1589 }
1590 } else if (!Stack.empty()) {
1591 // We do not have a label, just pop the last entry.
1592 CurrentValue = Stack.back().Value;
1593 CurrentPragmaLocation = Stack.back().PragmaLocation;
1594 Stack.pop_back();
1595 }
1596 }
1597 if (Action & PSK_Set) {
1599 CurrentPragmaLocation = PragmaLocation;
1600 }
1601 }
1602
1603 // MSVC seems to add artificial slots to #pragma stacks on entering a C++
1604 // method body to restore the stacks on exit, so it works like this:
1605 //
1606 // struct S {
1607 // #pragma <name>(push, InternalPragmaSlot, <current_pragma_value>)
1608 // void Method {}
1609 // #pragma <name>(pop, InternalPragmaSlot)
1610 // };
1611 //
1612 // It works even with #pragma vtordisp, although MSVC doesn't support
1613 // #pragma vtordisp(push [, id], n)
1614 // syntax.
1615 //
1616 // Push / pop a named sentinel slot.
1617 void SentinelAction(PragmaMsStackAction Action, StringRef Label) {
1618 assert((Action == PSK_Push || Action == PSK_Pop) &&
1619 "Can only push / pop #pragma stack sentinels!");
1621 }
1622
1623 // Constructors.
1624 explicit PragmaStack(const ValueType &Default)
1626
1627 bool hasValue() const { return CurrentValue != DefaultValue; }
1628
1630 ValueType DefaultValue; // Value used for PSK_Reset action.
1631 ValueType CurrentValue;
1633 };
1634 // FIXME: We should serialize / deserialize these if they occur in a PCH (but
1635 // we shouldn't do so if they're in a module).
1636
1637 /// Whether to insert vtordisps prior to virtual bases in the Microsoft
1638 /// C++ ABI. Possible values are 0, 1, and 2, which mean:
1639 ///
1640 /// 0: Suppress all vtordisps
1641 /// 1: Insert vtordisps in the presence of vbase overrides and non-trivial
1642 /// structors
1643 /// 2: Always insert vtordisps to support RTTI on partially constructed
1644 /// objects
1647 // The current #pragma align/pack values and locations at each #include.
1652 };
1654 // Segment #pragmas.
1659
1660 // #pragma strict_gs_check.
1662
1663 // This stack tracks the current state of Sema.CurFPFeatures.
1666 FPOptionsOverride result;
1667 if (!FpPragmaStack.hasValue()) {
1668 result = FPOptionsOverride();
1669 } else {
1670 result = FpPragmaStack.CurrentValue;
1671 }
1672 return result;
1673 }
1674
1680 };
1681
1682 // RAII object to push / pop sentinel slots for all MS #pragma stacks.
1683 // Actions should be performed only if we enter / exit a C++ method body.
1685 public:
1686 PragmaStackSentinelRAII(Sema &S, StringRef SlotLabel, bool ShouldAct);
1688
1689 private:
1690 Sema &S;
1691 StringRef SlotLabel;
1692 bool ShouldAct;
1693 };
1694
1695 /// Last section used with #pragma init_seg.
1698
1699 /// Sections used with #pragma alloc_text.
1700 llvm::StringMap<std::tuple<StringRef, SourceLocation>> FunctionToSectionMap;
1701
1702 /// VisContext - Manages the stack for \#pragma GCC visibility.
1703 void *VisContext; // Really a "PragmaVisStack*"
1704
1705 /// This an attribute introduced by \#pragma clang attribute.
1711 };
1712
1713 /// A push'd group of PragmaAttributeEntries.
1715 /// The location of the push attribute.
1717 /// The namespace of this push group.
1720 };
1721
1723
1724 /// The declaration that is currently receiving an attribute from the
1725 /// #pragma attribute stack.
1727
1728 /// This represents the last location of a "#pragma clang optimize off"
1729 /// directive if such a directive has not been closed by an "on" yet. If
1730 /// optimizations are currently "on", this is set to an invalid location.
1732
1733 /// Get the location for the currently active "\#pragma clang optimize
1734 /// off". If this location is invalid, then the state of the pragma is "on".
1737 }
1738
1739 /// The "on" or "off" argument passed by \#pragma optimize, that denotes
1740 /// whether the optimizations in the list passed to the pragma should be
1741 /// turned off or on. This boolean is true by default because command line
1742 /// options are honored when `#pragma optimize("", on)`.
1743 /// (i.e. `ModifyFnAttributeMSPragmaOptimze()` does nothing)
1745
1746 /// Set of no-builtin functions listed by \#pragma function.
1748
1749 /// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
1750 /// a the record decl, to handle '\#pragma pack' and '\#pragma options align'.
1752
1753 /// AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
1755
1756 /// Add gsl::Pointer attribute to std::container::iterator
1757 /// \param ND The declaration that introduces the name
1758 /// std::container::iterator. \param UnderlyingRecord The record named by ND.
1759 void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord);
1760
1761 /// Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
1763
1764 /// Add [[clang:::lifetimebound]] attr for std:: functions and methods.
1766
1767 /// Add [[clang:::lifetime_capture_by(this)]] to STL container methods.
1769
1770 /// Add [[gsl::Pointer]] attributes for std:: types.
1772
1773 LifetimeCaptureByAttr *ParseLifetimeCaptureByAttr(const ParsedAttr &AL,
1774 StringRef ParamName);
1775 // Processes the argument 'X' in [[clang::lifetime_capture_by(X)]]. Since 'X'
1776 // can be the name of a function parameter, we need to parse the function
1777 // declaration and rest of the parameters before processesing 'X'. Therefore
1778 // do this lazily instead of processing while parsing the annotation itself.
1780
1781 /// Add _Nullable attributes for std:: types.
1783
1785 POAK_Native, // #pragma options align=native
1786 POAK_Natural, // #pragma options align=natural
1787 POAK_Packed, // #pragma options align=packed
1788 POAK_Power, // #pragma options align=power
1789 POAK_Mac68k, // #pragma options align=mac68k
1790 POAK_Reset // #pragma options align=reset
1792
1793 /// ActOnPragmaClangSection - Called on well formed \#pragma clang section
1796 PragmaClangSectionKind SecKind,
1797 StringRef SecName);
1798
1799 /// ActOnPragmaOptionsAlign - Called on well formed \#pragma options align.
1801 SourceLocation PragmaLoc);
1802
1803 /// ActOnPragmaPack - Called on well formed \#pragma pack(...).
1804 void ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action,
1805 StringRef SlotLabel, Expr *Alignment);
1806
1807 /// ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs
1808 /// (unless they are value dependent or type dependent). Returns false
1809 /// and emits a diagnostic if one or more of the arguments could not be
1810 /// folded into a constant.
1813
1817 };
1818
1820 SourceLocation IncludeLoc);
1822
1823 /// ActOnPragmaMSStruct - Called on well formed \#pragma ms_struct [on|off].
1825
1826 /// ActOnPragmaMSComment - Called on well formed
1827 /// \#pragma comment(kind, "arg").
1829 StringRef Arg);
1830
1831 /// ActOnPragmaDetectMismatch - Call on well-formed \#pragma detect_mismatch
1832 void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name,
1833 StringRef Value);
1834
1835 /// Are precise floating point semantics currently enabled?
1837 return !CurFPFeatures.getAllowFPReassociate() &&
1838 !CurFPFeatures.getNoSignedZero() &&
1839 !CurFPFeatures.getAllowReciprocal() &&
1840 !CurFPFeatures.getAllowApproxFunc();
1841 }
1842
1845
1846 /// ActOnPragmaFloatControl - Call on well-formed \#pragma float_control
1849
1850 /// ActOnPragmaMSPointersToMembers - called on well formed \#pragma
1851 /// pointers_to_members(representation method[, general purpose
1852 /// representation]).
1855 SourceLocation PragmaLoc);
1856
1857 /// Called on well formed \#pragma vtordisp().
1860
1861 bool UnifySection(StringRef SectionName, int SectionFlags,
1862 NamedDecl *TheDecl);
1863 bool UnifySection(StringRef SectionName, int SectionFlags,
1864 SourceLocation PragmaSectionLocation);
1865
1866 /// Called on well formed \#pragma bss_seg/data_seg/const_seg/code_seg.
1867 void ActOnPragmaMSSeg(SourceLocation PragmaLocation,
1868 PragmaMsStackAction Action,
1869 llvm::StringRef StackSlotLabel,
1870 StringLiteral *SegmentName, llvm::StringRef PragmaName);
1871
1872 /// Called on well formed \#pragma section().
1873 void ActOnPragmaMSSection(SourceLocation PragmaLocation, int SectionFlags,
1874 StringLiteral *SegmentName);
1875
1876 /// Called on well-formed \#pragma init_seg().
1877 void ActOnPragmaMSInitSeg(SourceLocation PragmaLocation,
1878 StringLiteral *SegmentName);
1879
1880 /// Called on well-formed \#pragma alloc_text().
1882 SourceLocation PragmaLocation, StringRef Section,
1883 const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>>
1884 &Functions);
1885
1886 /// ActOnPragmaMSStrictGuardStackCheck - Called on well formed \#pragma
1887 /// strict_gs_check.
1889 PragmaMsStackAction Action,
1890 bool Value);
1891
1892 /// ActOnPragmaUnused - Called on well-formed '\#pragma unused'.
1893 void ActOnPragmaUnused(const Token &Identifier, Scope *curScope,
1894 SourceLocation PragmaLoc);
1895
1897 SourceLocation PragmaLoc,
1900 const IdentifierInfo *Namespace);
1901
1902 /// Called on well-formed '\#pragma clang attribute pop'.
1904 const IdentifierInfo *Namespace);
1905
1906 /// Adds the attributes that have been specified using the
1907 /// '\#pragma clang attribute push' directives to the given declaration.
1908 void AddPragmaAttributes(Scope *S, Decl *D);
1909
1911
1913
1914 /// Called on well formed \#pragma clang optimize.
1915 void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc);
1916
1917 /// #pragma optimize("[optimization-list]", on | off).
1918 void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn);
1919
1920 /// Call on well formed \#pragma function.
1921 void
1923 const llvm::SmallVectorImpl<StringRef> &NoBuiltins);
1924
1925 /// Only called on function definitions; if there is a pragma in scope
1926 /// with the effect of a range-based optnone, consider marking the function
1927 /// with attribute optnone.
1929
1930 /// Only called on function definitions; if there is a `#pragma alloc_text`
1931 /// that decides which code section the function should be in, add
1932 /// attribute section to the function.
1934
1935 /// Adds the 'optnone' attribute to the function declaration if there
1936 /// are no conflicts; Loc represents the location causing the 'optnone'
1937 /// attribute to be added (usually because of a pragma).
1939
1940 /// Only called on function definitions; if there is a MSVC #pragma optimize
1941 /// in scope, consider changing the function's attributes based on the
1942 /// optimization list passed to the pragma.
1944
1945 /// Only called on function definitions; if there is a pragma in scope
1946 /// with the effect of a range-based no_builtin, consider marking the function
1947 /// with attribute no_builtin.
1949
1950 /// AddPushedVisibilityAttribute - If '\#pragma GCC visibility' was used,
1951 /// add an appropriate visibility attribute.
1953
1954 /// FreeVisContext - Deallocate and null out VisContext.
1955 void FreeVisContext();
1956
1957 /// ActOnPragmaVisibility - Called on well formed \#pragma GCC visibility... .
1958 void ActOnPragmaVisibility(const IdentifierInfo *VisType,
1959 SourceLocation PragmaLoc);
1960
1961 /// ActOnPragmaFPContract - Called on well formed
1962 /// \#pragma {STDC,OPENCL} FP_CONTRACT and
1963 /// \#pragma clang fp contract
1965
1966 /// Called on well formed
1967 /// \#pragma clang fp reassociate
1968 /// or
1969 /// \#pragma clang fp reciprocal
1971 bool IsEnabled);
1972
1973 /// ActOnPragmaFenvAccess - Called on well formed
1974 /// \#pragma STDC FENV_ACCESS
1975 void ActOnPragmaFEnvAccess(SourceLocation Loc, bool IsEnabled);
1976
1977 /// ActOnPragmaCXLimitedRange - Called on well formed
1978 /// \#pragma STDC CX_LIMITED_RANGE
1981
1982 /// Called on well formed '\#pragma clang fp' that has option 'exceptions'.
1985
1986 /// Called to set constant rounding mode for floating point operations.
1987 void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode);
1988
1989 /// Called to set exception behavior for floating point operations.
1991
1992 /// PushNamespaceVisibilityAttr - Note that we've entered a
1993 /// namespace with a visibility attribute.
1994 void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr,
1996
1997 /// PopPragmaVisibility - Pop the top element of the visibility stack; used
1998 /// for '\#pragma GCC visibility' and visibility attributes on namespaces.
1999 void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc);
2000
2001 /// Handles semantic checking for features that are common to all attributes,
2002 /// such as checking whether a parameter was properly specified, or the
2003 /// correct number of arguments were passed, etc. Returns true if the
2004 /// attribute has been diagnosed.
2005 bool checkCommonAttributeFeatures(const Decl *D, const ParsedAttr &A,
2006 bool SkipArgCountCheck = false);
2007 bool checkCommonAttributeFeatures(const Stmt *S, const ParsedAttr &A,
2008 bool SkipArgCountCheck = false);
2009
2010 ///@}
2011
2012 //
2013 //
2014 // -------------------------------------------------------------------------
2015 //
2016 //
2017
2018 /// \name Availability Attribute Handling
2019 /// Implementations are in SemaAvailability.cpp
2020 ///@{
2021
2022public:
2023 /// Issue any -Wunguarded-availability warnings in \c FD
2025
2027
2028 /// Retrieve the current function, if any, that should be analyzed for
2029 /// potential availability violations.
2031
2033 const ObjCInterfaceDecl *UnknownObjCClass,
2034 bool ObjCPropertyAccess,
2035 bool AvoidPartialAvailabilityChecks = false,
2036 ObjCInterfaceDecl *ClassReceiver = nullptr);
2037
2038 ///@}
2039
2040 //
2041 //
2042 // -------------------------------------------------------------------------
2043 //
2044 //
2045
2046 /// \name Bounds Safety
2047 /// Implementations are in SemaBoundsSafety.cpp
2048 ///@{
2049public:
2050 /// Check if applying the specified attribute variant from the "counted by"
2051 /// family of attributes to FieldDecl \p FD is semantically valid. If
2052 /// semantically invalid diagnostics will be emitted explaining the problems.
2053 ///
2054 /// \param FD The FieldDecl to apply the attribute to
2055 /// \param E The count expression on the attribute
2056 /// \param CountInBytes If true the attribute is from the "sized_by" family of
2057 /// attributes. If the false the attribute is from
2058 /// "counted_by" family of attributes.
2059 /// \param OrNull If true the attribute is from the "_or_null" suffixed family
2060 /// of attributes. If false the attribute does not have the
2061 /// suffix.
2062 ///
2063 /// Together \p CountInBytes and \p OrNull decide the attribute variant. E.g.
2064 /// \p CountInBytes and \p OrNull both being true indicates the
2065 /// `counted_by_or_null` attribute.
2066 ///
2067 /// \returns false iff semantically valid.
2068 bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
2069 bool OrNull);
2070
2071 ///@}
2072
2073 //
2074 //
2075 // -------------------------------------------------------------------------
2076 //
2077 //
2078
2079 /// \name Casts
2080 /// Implementations are in SemaCast.cpp
2081 ///@{
2082
2083public:
2085 return CCK == CheckedConversionKind::CStyleCast ||
2088 }
2089
2090 /// ActOnCXXNamedCast - Parse
2091 /// {dynamic,static,reinterpret,const,addrspace}_cast's.
2093 SourceLocation LAngleBracketLoc, Declarator &D,
2094 SourceLocation RAngleBracketLoc,
2095 SourceLocation LParenLoc, Expr *E,
2096 SourceLocation RParenLoc);
2097
2099 TypeSourceInfo *Ty, Expr *E,
2100 SourceRange AngleBrackets, SourceRange Parens);
2101
2103 ExprResult Operand,
2104 SourceLocation RParenLoc);
2105
2107 Expr *Operand, SourceLocation RParenLoc);
2108
2109 // Checks that reinterpret casts don't have undefined behavior.
2110 void CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2111 bool IsDereference, SourceRange Range);
2112
2113 // Checks that the vector type should be initialized from a scalar
2114 // by splatting the value rather than populating a single element.
2115 // This is the case for AltiVecVector types as well as with
2116 // AltiVecPixel and AltiVecBool when -faltivec-src-compat=xl is specified.
2117 bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy);
2118
2119 // Checks if the -faltivec-src-compat=gcc option is specified.
2120 // If so, AltiVecVector, AltiVecBool and AltiVecPixel types are
2121 // treated the same way as they are when trying to initialize
2122 // these vectors on gcc (an error is emitted).
2124 QualType SrcTy);
2125
2127 SourceLocation RParenLoc, Expr *Op);
2128
2130 SourceLocation LParenLoc,
2131 Expr *CastExpr,
2132 SourceLocation RParenLoc);
2133
2134 ///@}
2135
2136 //
2137 //
2138 // -------------------------------------------------------------------------
2139 //
2140 //
2141
2142 /// \name Extra Semantic Checking
2143 /// Implementations are in SemaChecking.cpp
2144 ///@{
2145
2146public:
2147 /// Used to change context to isConstantEvaluated without pushing a heavy
2148 /// ExpressionEvaluationContextRecord object.
2150
2154 }
2155
2157 unsigned ByteNo) const;
2158
2160 FAPK_Fixed, // values to format are fixed (no C-style variadic arguments)
2161 FAPK_Variadic, // values to format are passed as variadic arguments
2162 FAPK_VAList, // values to format are passed in a va_list
2163 };
2164
2165 // Used to grab the relevant information from a FormatAttr and a
2166 // FunctionDeclaration.
2168 unsigned FormatIdx;
2171 };
2172
2173 /// Given a FunctionDecl's FormatAttr, attempts to populate the
2174 /// FomatStringInfo parameter with the FormatAttr's correct format_idx and
2175 /// firstDataArg. Returns true when the format fits the function and the
2176 /// FormatStringInfo has been populated.
2177 static bool getFormatStringInfo(const FormatAttr *Format, bool IsCXXMember,
2178 bool IsVariadic, FormatStringInfo *FSI);
2179
2180 // Used by C++ template instantiation.
2182
2183 /// ConvertVectorExpr - Handle __builtin_convertvector
2185 SourceLocation BuiltinLoc,
2186 SourceLocation RParenLoc);
2187
2201 static FormatStringType GetFormatStringType(const FormatAttr *Format);
2202
2203 bool FormatStringHasSArg(const StringLiteral *FExpr);
2204
2205 /// Check for comparisons of floating-point values using == and !=. Issue a
2206 /// warning if the comparison is not likely to do what the programmer
2207 /// intended.
2209 BinaryOperatorKind Opcode);
2210
2211 /// Register a magic integral constant to be used as a type tag.
2212 void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind,
2213 uint64_t MagicValue, QualType Type,
2214 bool LayoutCompatible, bool MustBeNull);
2215
2218
2222
2224
2225 /// If true, \c Type should be compared with other expression's types for
2226 /// layout-compatibility.
2227 LLVM_PREFERRED_TYPE(bool)
2229 LLVM_PREFERRED_TYPE(bool)
2230 unsigned MustBeNull : 1;
2231 };
2232
2233 /// A pair of ArgumentKind identifier and magic value. This uniquely
2234 /// identifies the magic value.
2235 typedef std::pair<const IdentifierInfo *, uint64_t> TypeTagMagicValue;
2236
2237 /// Diagnoses the current set of gathered accesses. This typically
2238 /// happens at full expression level. The set is cleared after emitting the
2239 /// diagnostics.
2241
2242 /// This function checks if the expression is in the sef of potentially
2243 /// misaligned members and it is converted to some pointer type T with lower
2244 /// or equal alignment requirements. If so it removes it. This is used when
2245 /// we do not want to diagnose such misaligned access (e.g. in conversions to
2246 /// void*).
2248
2249 /// This function calls Action when it determines that E designates a
2250 /// misaligned member due to the packed attribute. This is used to emit
2251 /// local diagnostics like in reference binding.
2253 Expr *E,
2254 llvm::function_ref<void(Expr *, RecordDecl *, FieldDecl *, CharUnits)>
2255 Action);
2256
2257 enum class AtomicArgumentOrder { API, AST };
2259 BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange,
2260 SourceLocation RParenLoc, MultiExprArg Args,
2263
2264 /// Check to see if a given expression could have '.c_str()' called on it.
2265 bool hasCStrMethod(const Expr *E);
2266
2267 /// Diagnose pointers that are always non-null.
2268 /// \param E the expression containing the pointer
2269 /// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
2270 /// compared to a null pointer
2271 /// \param IsEqual True when the comparison is equal to a null pointer
2272 /// \param Range Extra SourceRange to highlight in the diagnostic
2275 bool IsEqual, SourceRange Range);
2276
2277 /// CheckParmsForFunctionDef - Check that the parameters of the given
2278 /// function are appropriate for the definition of a function. This
2279 /// takes care of any checks that cannot be performed on the
2280 /// declaration itself, e.g., that the types of each of the function
2281 /// parameters are complete.
2283 bool CheckParameterNames);
2284
2285 /// CheckCastAlign - Implements -Wcast-align, which warns when a
2286 /// pointer cast increases the alignment requirements.
2287 void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
2288
2289 /// checkUnsafeAssigns - Check whether +1 expr is being assigned
2290 /// to weak/__unsafe_unretained type.
2292
2293 /// checkUnsafeExprAssigns - Check whether +1 expr is being assigned
2294 /// to weak/__unsafe_unretained expression.
2296
2297 /// Emit \p DiagID if statement located on \p StmtLoc has a suspicious null
2298 /// statement as a \p Body, and it is located on the same line.
2299 ///
2300 /// This helps prevent bugs due to typos, such as:
2301 /// if (condition);
2302 /// do_stuff();
2303 void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body,
2304 unsigned DiagID);
2305
2306 /// Warn if a for/while loop statement \p S, which is followed by
2307 /// \p PossibleBody, has a suspicious null statement as a body.
2308 void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody);
2309
2310 /// DiagnoseSelfMove - Emits a warning if a value is moved to itself.
2311 void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr,
2312 SourceLocation OpLoc);
2313
2314 // Used for emitting the right warning by DefaultVariadicArgumentPromotion
2322
2323 bool IsLayoutCompatible(QualType T1, QualType T2) const;
2325 const TypeSourceInfo *Derived);
2326
2327 /// CheckFunctionCall - Check a direct function call for various correctness
2328 /// and safety properties not strictly enforced by the C type system.
2329 bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall,
2330 const FunctionProtoType *Proto);
2331
2332 /// \param FPOnly restricts the arguments to floating-point types.
2333 bool BuiltinVectorMath(CallExpr *TheCall, QualType &Res, bool FPOnly = false);
2334 bool BuiltinVectorToScalarMath(CallExpr *TheCall);
2335
2336 void checkLifetimeCaptureBy(FunctionDecl *FDecl, bool IsMemberFunction,
2337 const Expr *ThisArg, ArrayRef<const Expr *> Args);
2338
2339 /// Handles the checks for format strings, non-POD arguments to vararg
2340 /// functions, NULL arguments passed to non-NULL parameters, diagnose_if
2341 /// attributes and AArch64 SME attributes.
2342 void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
2343 const Expr *ThisArg, ArrayRef<const Expr *> Args,
2344 bool IsMemberFunction, SourceLocation Loc, SourceRange Range,
2345 VariadicCallType CallType);
2346
2347 /// \brief Enforce the bounds of a TCB
2348 /// CheckTCBEnforcement - Enforces that every function in a named TCB only
2349 /// directly calls other functions in the same TCB as marked by the
2350 /// enforce_tcb and enforce_tcb_leaf attributes.
2351 void CheckTCBEnforcement(const SourceLocation CallExprLoc,
2352 const NamedDecl *Callee);
2353
2354 void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc);
2355
2356 /// BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr
2357 /// TheCall is a constant expression.
2358 bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result);
2359
2360 /// BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr
2361 /// TheCall is a constant expression in the range [Low, High].
2362 bool BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, int High,
2363 bool RangeIsError = true);
2364
2365 /// BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr
2366 /// TheCall is a constant expression is a multiple of Num..
2367 bool BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum,
2368 unsigned Multiple);
2369
2370 /// BuiltinConstantArgPower2 - Check if argument ArgNum of TheCall is a
2371 /// constant expression representing a power of 2.
2372 bool BuiltinConstantArgPower2(CallExpr *TheCall, int ArgNum);
2373
2374 /// BuiltinConstantArgShiftedByte - Check if argument ArgNum of TheCall is
2375 /// a constant expression representing an arbitrary byte value shifted left by
2376 /// a multiple of 8 bits.
2377 bool BuiltinConstantArgShiftedByte(CallExpr *TheCall, int ArgNum,
2378 unsigned ArgBits);
2379
2380 /// BuiltinConstantArgShiftedByteOr0xFF - Check if argument ArgNum of
2381 /// TheCall is a constant expression representing either a shifted byte value,
2382 /// or a value of the form 0x??FF (i.e. a member of the arithmetic progression
2383 /// 0x00FF, 0x01FF, ..., 0xFFFF). This strange range check is needed for some
2384 /// Arm MVE intrinsics.
2385 bool BuiltinConstantArgShiftedByteOrXXFF(CallExpr *TheCall, int ArgNum,
2386 unsigned ArgBits);
2387
2388 /// Checks that a call expression's argument count is at least the desired
2389 /// number. This is useful when doing custom type-checking on a variadic
2390 /// function. Returns true on error.
2391 bool checkArgCountAtLeast(CallExpr *Call, unsigned MinArgCount);
2392
2393 /// Checks that a call expression's argument count is at most the desired
2394 /// number. This is useful when doing custom type-checking on a variadic
2395 /// function. Returns true on error.
2396 bool checkArgCountAtMost(CallExpr *Call, unsigned MaxArgCount);
2397
2398 /// Checks that a call expression's argument count is in the desired range.
2399 /// This is useful when doing custom type-checking on a variadic function.
2400 /// Returns true on error.
2401 bool checkArgCountRange(CallExpr *Call, unsigned MinArgCount,
2402 unsigned MaxArgCount);
2403
2404 /// Checks that a call expression's argument count is the desired number.
2405 /// This is useful when doing custom type-checking. Returns true on error.
2406 bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount);
2407
2408 /// Returns true if the argument consists of one contiguous run of 1s with any
2409 /// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB,
2410 /// so 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
2411 /// since all 1s are not contiguous.
2412 bool ValueIsRunOfOnes(CallExpr *TheCall, unsigned ArgNum);
2413
2415 bool *ICContext = nullptr,
2416 bool IsListInit = false);
2417
2419 bool CheckForFloatArgs = true);
2421
2422private:
2423 void CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
2424 const ArraySubscriptExpr *ASE = nullptr,
2425 bool AllowOnePastEnd = true, bool IndexNegated = false);
2426 void CheckArrayAccess(const Expr *E);
2427
2428 bool CheckPointerCall(NamedDecl *NDecl, CallExpr *TheCall,
2429 const FunctionProtoType *Proto);
2430
2431 /// Checks function calls when a FunctionDecl or a NamedDecl is not available,
2432 /// such as function pointers returned from functions.
2433 bool CheckOtherCall(CallExpr *TheCall, const FunctionProtoType *Proto);
2434
2435 /// CheckConstructorCall - Check a constructor call for correctness and safety
2436 /// properties not enforced by the C type system.
2437 void CheckConstructorCall(FunctionDecl *FDecl, QualType ThisType,
2439 const FunctionProtoType *Proto, SourceLocation Loc);
2440
2441 /// Warn if a pointer or reference argument passed to a function points to an
2442 /// object that is less aligned than the parameter. This can happen when
2443 /// creating a typedef with a lower alignment than the original type and then
2444 /// calling functions defined in terms of the original type.
2445 void CheckArgAlignment(SourceLocation Loc, NamedDecl *FDecl,
2446 StringRef ParamName, QualType ArgTy, QualType ParamTy);
2447
2448 ExprResult CheckOSLogFormatStringArg(Expr *Arg);
2449
2450 ExprResult CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
2451 CallExpr *TheCall);
2452
2453 bool CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
2454 CallExpr *TheCall);
2455
2456 void checkFortifiedBuiltinMemoryFunction(FunctionDecl *FD, CallExpr *TheCall);
2457
2458 /// Check the arguments to '__builtin_va_start' or '__builtin_ms_va_start'
2459 /// for validity. Emit an error and return true on failure; return false
2460 /// on success.
2461 bool BuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
2462 bool BuiltinVAStartARMMicrosoft(CallExpr *Call);
2463
2464 /// BuiltinUnorderedCompare - Handle functions like __builtin_isgreater and
2465 /// friends. This is declared to take (...), so we have to check everything.
2466 bool BuiltinUnorderedCompare(CallExpr *TheCall, unsigned BuiltinID);
2467
2468 /// BuiltinSemaBuiltinFPClassification - Handle functions like
2469 /// __builtin_isnan and friends. This is declared to take (...), so we have
2470 /// to check everything.
2471 bool BuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs,
2472 unsigned BuiltinID);
2473
2474 /// Perform semantic analysis for a call to __builtin_complex.
2475 bool BuiltinComplex(CallExpr *TheCall);
2476 bool BuiltinOSLogFormat(CallExpr *TheCall);
2477
2478 /// BuiltinPrefetch - Handle __builtin_prefetch.
2479 /// This is declared to take (const void*, ...) and can take two
2480 /// optional constant int args.
2481 bool BuiltinPrefetch(CallExpr *TheCall);
2482
2483 /// Handle __builtin_alloca_with_align. This is declared
2484 /// as (size_t, size_t) where the second size_t must be a power of 2 greater
2485 /// than 8.
2486 bool BuiltinAllocaWithAlign(CallExpr *TheCall);
2487
2488 /// BuiltinArithmeticFence - Handle __arithmetic_fence.
2489 bool BuiltinArithmeticFence(CallExpr *TheCall);
2490
2491 /// BuiltinAssume - Handle __assume (MS Extension).
2492 /// __assume does not evaluate its arguments, and should warn if its argument
2493 /// has side effects.
2494 bool BuiltinAssume(CallExpr *TheCall);
2495
2496 /// Handle __builtin_assume_aligned. This is declared
2497 /// as (const void*, size_t, ...) and can take one optional constant int arg.
2498 bool BuiltinAssumeAligned(CallExpr *TheCall);
2499
2500 /// BuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val).
2501 /// This checks that the target supports __builtin_longjmp and
2502 /// that val is a constant 1.
2503 bool BuiltinLongjmp(CallExpr *TheCall);
2504
2505 /// BuiltinSetjmp - Handle __builtin_setjmp(void *env[5]).
2506 /// This checks that the target supports __builtin_setjmp.
2507 bool BuiltinSetjmp(CallExpr *TheCall);
2508
2509 /// We have a call to a function like __sync_fetch_and_add, which is an
2510 /// overloaded function based on the pointer type of its first argument.
2511 /// The main BuildCallExpr routines have already promoted the types of
2512 /// arguments because all of these calls are prototyped as void(...).
2513 ///
2514 /// This function goes through and does final semantic checking for these
2515 /// builtins, as well as generating any warnings.
2516 ExprResult BuiltinAtomicOverloaded(ExprResult TheCallResult);
2517
2518 /// BuiltinNontemporalOverloaded - We have a call to
2519 /// __builtin_nontemporal_store or __builtin_nontemporal_load, which is an
2520 /// overloaded function based on the pointer type of its last argument.
2521 ///
2522 /// This function goes through and does final semantic checking for these
2523 /// builtins.
2524 ExprResult BuiltinNontemporalOverloaded(ExprResult TheCallResult);
2525 ExprResult AtomicOpsOverloaded(ExprResult TheCallResult,
2527
2528 /// \param FPOnly restricts the arguments to floating-point types.
2529 bool BuiltinElementwiseMath(CallExpr *TheCall, bool FPOnly = false);
2530 bool PrepareBuiltinReduceMathOneArgCall(CallExpr *TheCall);
2531
2532 bool BuiltinNonDeterministicValue(CallExpr *TheCall);
2533
2534 enum BuiltinCountedByRefKind {
2535 AssignmentKind,
2536 InitializerKind,
2537 FunctionArgKind,
2538 ReturnArgKind,
2539 ArraySubscriptKind,
2540 BinaryExprKind,
2541 };
2542
2543 bool CheckInvalidBuiltinCountedByRef(const Expr *E,
2544 BuiltinCountedByRefKind K);
2545 bool BuiltinCountedByRef(CallExpr *TheCall);
2546
2547 // Matrix builtin handling.
2548 ExprResult BuiltinMatrixTranspose(CallExpr *TheCall, ExprResult CallResult);
2549 ExprResult BuiltinMatrixColumnMajorLoad(CallExpr *TheCall,
2550 ExprResult CallResult);
2551 ExprResult BuiltinMatrixColumnMajorStore(CallExpr *TheCall,
2552 ExprResult CallResult);
2553
2554 /// CheckFormatArguments - Check calls to printf and scanf (and similar
2555 /// functions) for correct use of format strings.
2556 /// Returns true if a format string has been fully checked.
2557 bool CheckFormatArguments(const FormatAttr *Format,
2558 ArrayRef<const Expr *> Args, bool IsCXXMember,
2559 VariadicCallType CallType, SourceLocation Loc,
2560 SourceRange Range,
2561 llvm::SmallBitVector &CheckedVarArgs);
2562 bool CheckFormatArguments(ArrayRef<const Expr *> Args,
2563 FormatArgumentPassingKind FAPK, unsigned format_idx,
2564 unsigned firstDataArg, FormatStringType Type,
2565 VariadicCallType CallType, SourceLocation Loc,
2566 SourceRange range,
2567 llvm::SmallBitVector &CheckedVarArgs);
2568
2569 void CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl);
2570
2571 /// Warn when using the wrong abs() function.
2572 void CheckAbsoluteValueFunction(const CallExpr *Call,
2573 const FunctionDecl *FDecl);
2574
2575 void CheckMaxUnsignedZero(const CallExpr *Call, const FunctionDecl *FDecl);
2576
2577 /// Check for dangerous or invalid arguments to memset().
2578 ///
2579 /// This issues warnings on known problematic, dangerous or unspecified
2580 /// arguments to the standard 'memset', 'memcpy', 'memmove', and 'memcmp'
2581 /// function calls.
2582 ///
2583 /// \param Call The call expression to diagnose.
2584 void CheckMemaccessArguments(const CallExpr *Call, unsigned BId,
2585 IdentifierInfo *FnName);
2586
2587 // Warn if the user has made the 'size' argument to strlcpy or strlcat
2588 // be the size of the source, instead of the destination.
2589 void CheckStrlcpycatArguments(const CallExpr *Call, IdentifierInfo *FnName);
2590
2591 // Warn on anti-patterns as the 'size' argument to strncat.
2592 // The correct size argument should look like following:
2593 // strncat(dst, src, sizeof(dst) - strlen(dest) - 1);
2594 void CheckStrncatArguments(const CallExpr *Call, IdentifierInfo *FnName);
2595
2596 /// Alerts the user that they are attempting to free a non-malloc'd object.
2597 void CheckFreeArguments(const CallExpr *E);
2598
2599 void CheckReturnValExpr(Expr *RetValExp, QualType lhsType,
2600 SourceLocation ReturnLoc, bool isObjCMethod = false,
2601 const AttrVec *Attrs = nullptr,
2602 const FunctionDecl *FD = nullptr);
2603
2604 /// Diagnoses "dangerous" implicit conversions within the given
2605 /// expression (which is a full expression). Implements -Wconversion
2606 /// and -Wsign-compare.
2607 ///
2608 /// \param CC the "context" location of the implicit conversion, i.e.
2609 /// the most location of the syntactic entity requiring the implicit
2610 /// conversion
2611 void CheckImplicitConversions(Expr *E, SourceLocation CC = SourceLocation());
2612
2613 /// CheckBoolLikeConversion - Check conversion of given expression to boolean.
2614 /// Input argument E is a logical expression.
2615 void CheckBoolLikeConversion(Expr *E, SourceLocation CC);
2616
2617 /// Diagnose when expression is an integer constant expression and its
2618 /// evaluation results in integer overflow
2619 void CheckForIntOverflow(const Expr *E);
2620 void CheckUnsequencedOperations(const Expr *E);
2621
2622 /// Perform semantic checks on a completed expression. This will either
2623 /// be a full-expression or a default argument expression.
2624 void CheckCompletedExpr(Expr *E, SourceLocation CheckLoc = SourceLocation(),
2625 bool IsConstexpr = false);
2626
2627 void CheckBitFieldInitialization(SourceLocation InitLoc, FieldDecl *Field,
2628 Expr *Init);
2629
2630 /// A map from magic value to type information.
2631 std::unique_ptr<llvm::DenseMap<TypeTagMagicValue, TypeTagData>>
2632 TypeTagForDatatypeMagicValues;
2633
2634 /// Peform checks on a call of a function with argument_with_type_tag
2635 /// or pointer_with_type_tag attributes.
2636 void CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr,
2637 const ArrayRef<const Expr *> ExprArgs,
2638 SourceLocation CallSiteLoc);
2639
2640 /// Check if we are taking the address of a packed field
2641 /// as this may be a problem if the pointer value is dereferenced.
2642 void CheckAddressOfPackedMember(Expr *rhs);
2643
2644 /// Helper class that collects misaligned member designations and
2645 /// their location info for delayed diagnostics.
2646 struct MisalignedMember {
2647 Expr *E;
2648 RecordDecl *RD;
2649 ValueDecl *MD;
2650 CharUnits Alignment;
2651
2652 MisalignedMember() : E(), RD(), MD() {}
2653 MisalignedMember(Expr *E, RecordDecl *RD, ValueDecl *MD,
2654 CharUnits Alignment)
2655 : E(E), RD(RD), MD(MD), Alignment(Alignment) {}
2656 explicit MisalignedMember(Expr *E)
2657 : MisalignedMember(E, nullptr, nullptr, CharUnits()) {}
2658
2659 bool operator==(const MisalignedMember &m) { return this->E == m.E; }
2660 };
2661 /// Small set of gathered accesses to potentially misaligned members
2662 /// due to the packed attribute.
2663 SmallVector<MisalignedMember, 4> MisalignedMembers;
2664
2665 /// Adds an expression to the set of gathered misaligned members.
2666 void AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD,
2667 CharUnits Alignment);
2668 ///@}
2669
2670 //
2671 //
2672 // -------------------------------------------------------------------------
2673 //
2674 //
2675
2676 /// \name C++ Coroutines
2677 /// Implementations are in SemaCoroutine.cpp
2678 ///@{
2679
2680public:
2681 /// The C++ "std::coroutine_traits" template, which is defined in
2682 /// <coroutine_traits>
2684
2686 StringRef Keyword);
2690
2693 UnresolvedLookupExpr *Lookup);
2695 Expr *Awaiter, bool IsImplicit = false);
2697 UnresolvedLookupExpr *Lookup);
2700 bool IsImplicit = false);
2705
2706 // As a clang extension, enforces that a non-coroutine function must be marked
2707 // with [[clang::coro_wrapper]] if it returns a type marked with
2708 // [[clang::coro_return_type]].
2709 // Expects that FD is not a coroutine.
2711 /// Lookup 'coroutine_traits' in std namespace and std::experimental
2712 /// namespace. The namespace found is recorded in Namespace.
2714 SourceLocation FuncLoc);
2715 /// Check that the expression co_await promise.final_suspend() shall not be
2716 /// potentially-throwing.
2717 bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend);
2718
2719 ///@}
2720
2721 //
2722 //
2723 // -------------------------------------------------------------------------
2724 //
2725 //
2726
2727 /// \name C++ Scope Specifiers
2728 /// Implementations are in SemaCXXScopeSpec.cpp
2729 ///@{
2730
2731public:
2732 // Marks SS invalid if it represents an incomplete type.
2734 // Complete an enum decl, maybe without a scope spec.
2736 CXXScopeSpec *SS = nullptr);
2737
2738 /// Compute the DeclContext that is associated with the given type.
2739 ///
2740 /// \param T the type for which we are attempting to find a DeclContext.
2741 ///
2742 /// \returns the declaration context represented by the type T,
2743 /// or NULL if the declaration context cannot be computed (e.g., because it is
2744 /// dependent and not the current instantiation).
2746
2747 /// Compute the DeclContext that is associated with the given
2748 /// scope specifier.
2749 ///
2750 /// \param SS the C++ scope specifier as it appears in the source
2751 ///
2752 /// \param EnteringContext when true, we will be entering the context of
2753 /// this scope specifier, so we can retrieve the declaration context of a
2754 /// class template or class template partial specialization even if it is
2755 /// not the current instantiation.
2756 ///
2757 /// \returns the declaration context represented by the scope specifier @p SS,
2758 /// or NULL if the declaration context cannot be computed (e.g., because it is
2759 /// dependent and not the current instantiation).
2761 bool EnteringContext = false);
2763
2764 /// If the given nested name specifier refers to the current
2765 /// instantiation, return the declaration that corresponds to that
2766 /// current instantiation (C++0x [temp.dep.type]p1).
2767 ///
2768 /// \param NNS a dependent nested name specifier.
2770
2771 /// The parser has parsed a global nested-name-specifier '::'.
2772 ///
2773 /// \param CCLoc The location of the '::'.
2774 ///
2775 /// \param SS The nested-name-specifier, which will be updated in-place
2776 /// to reflect the parsed nested-name-specifier.
2777 ///
2778 /// \returns true if an error occurred, false otherwise.
2780
2781 /// The parser has parsed a '__super' nested-name-specifier.
2782 ///
2783 /// \param SuperLoc The location of the '__super' keyword.
2784 ///
2785 /// \param ColonColonLoc The location of the '::'.
2786 ///
2787 /// \param SS The nested-name-specifier, which will be updated in-place
2788 /// to reflect the parsed nested-name-specifier.
2789 ///
2790 /// \returns true if an error occurred, false otherwise.
2792 SourceLocation ColonColonLoc, CXXScopeSpec &SS);
2793
2794 /// Determines whether the given declaration is an valid acceptable
2795 /// result for name lookup of a nested-name-specifier.
2796 /// \param SD Declaration checked for nested-name-specifier.
2797 /// \param IsExtension If not null and the declaration is accepted as an
2798 /// extension, the pointed variable is assigned true.
2800 bool *CanCorrect = nullptr);
2801
2802 /// If the given nested-name-specifier begins with a bare identifier
2803 /// (e.g., Base::), perform name lookup for that identifier as a
2804 /// nested-name-specifier within the given scope, and return the result of
2805 /// that name lookup.
2807
2808 /// Keeps information about an identifier in a nested-name-spec.
2809 ///
2811 /// The type of the object, if we're parsing nested-name-specifier in
2812 /// a member access expression.
2814
2815 /// The identifier preceding the '::'.
2817
2818 /// The location of the identifier.
2820
2821 /// The location of the '::'.
2823
2824 /// Creates info object for the most typical case.
2826 SourceLocation ColonColonLoc,
2827 ParsedType ObjectType = ParsedType())
2828 : ObjectType(ObjectType), Identifier(II), IdentifierLoc(IdLoc),
2829 CCLoc(ColonColonLoc) {}
2830
2832 SourceLocation ColonColonLoc, QualType ObjectType)
2833 : ObjectType(ParsedType::make(ObjectType)), Identifier(II),
2834 IdentifierLoc(IdLoc), CCLoc(ColonColonLoc) {}
2835 };
2836
2837 /// Build a new nested-name-specifier for "identifier::", as described
2838 /// by ActOnCXXNestedNameSpecifier.
2839 ///
2840 /// \param S Scope in which the nested-name-specifier occurs.
2841 /// \param IdInfo Parser information about an identifier in the
2842 /// nested-name-spec.
2843 /// \param EnteringContext If true, enter the context specified by the
2844 /// nested-name-specifier.
2845 /// \param SS Optional nested name specifier preceding the identifier.
2846 /// \param ScopeLookupResult Provides the result of name lookup within the
2847 /// scope of the nested-name-specifier that was computed at template
2848 /// definition time.
2849 /// \param ErrorRecoveryLookup Specifies if the method is called to improve
2850 /// error recovery and what kind of recovery is performed.
2851 /// \param IsCorrectedToColon If not null, suggestion of replace '::' -> ':'
2852 /// are allowed. The bool value pointed by this parameter is set to
2853 /// 'true' if the identifier is treated as if it was followed by ':',
2854 /// not '::'.
2855 /// \param OnlyNamespace If true, only considers namespaces in lookup.
2856 ///
2857 /// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in
2858 /// that it contains an extra parameter \p ScopeLookupResult, which provides
2859 /// the result of name lookup within the scope of the nested-name-specifier
2860 /// that was computed at template definition time.
2861 ///
2862 /// If ErrorRecoveryLookup is true, then this call is used to improve error
2863 /// recovery. This means that it should not emit diagnostics, it should
2864 /// just return true on failure. It also means it should only return a valid
2865 /// scope if it *knows* that the result is correct. It should not return in a
2866 /// dependent context, for example. Nor will it extend \p SS with the scope
2867 /// specifier.
2868 bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
2869 bool EnteringContext, CXXScopeSpec &SS,
2870 NamedDecl *ScopeLookupResult,
2871 bool ErrorRecoveryLookup,
2872 bool *IsCorrectedToColon = nullptr,
2873 bool OnlyNamespace = false);
2874
2875 /// The parser has parsed a nested-name-specifier 'identifier::'.
2876 ///
2877 /// \param S The scope in which this nested-name-specifier occurs.
2878 ///
2879 /// \param IdInfo Parser information about an identifier in the
2880 /// nested-name-spec.
2881 ///
2882 /// \param EnteringContext Whether we're entering the context nominated by
2883 /// this nested-name-specifier.
2884 ///
2885 /// \param SS The nested-name-specifier, which is both an input
2886 /// parameter (the nested-name-specifier before this type) and an
2887 /// output parameter (containing the full nested-name-specifier,
2888 /// including this new type).
2889 ///
2890 /// \param IsCorrectedToColon If not null, suggestions to replace '::' -> ':'
2891 /// are allowed. The bool value pointed by this parameter is set to 'true'
2892 /// if the identifier is treated as if it was followed by ':', not '::'.
2893 ///
2894 /// \param OnlyNamespace If true, only considers namespaces in lookup.
2895 ///
2896 /// \returns true if an error occurred, false otherwise.
2897 bool ActOnCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo,
2898 bool EnteringContext, CXXScopeSpec &SS,
2899 bool *IsCorrectedToColon = nullptr,
2900 bool OnlyNamespace = false);
2901
2902 /// The parser has parsed a nested-name-specifier
2903 /// 'template[opt] template-name < template-args >::'.
2904 ///
2905 /// \param S The scope in which this nested-name-specifier occurs.
2906 ///
2907 /// \param SS The nested-name-specifier, which is both an input
2908 /// parameter (the nested-name-specifier before this type) and an
2909 /// output parameter (containing the full nested-name-specifier,
2910 /// including this new type).
2911 ///
2912 /// \param TemplateKWLoc the location of the 'template' keyword, if any.
2913 /// \param TemplateName the template name.
2914 /// \param TemplateNameLoc The location of the template name.
2915 /// \param LAngleLoc The location of the opening angle bracket ('<').
2916 /// \param TemplateArgs The template arguments.
2917 /// \param RAngleLoc The location of the closing angle bracket ('>').
2918 /// \param CCLoc The location of the '::'.
2919 ///
2920 /// \param EnteringContext Whether we're entering the context of the
2921 /// nested-name-specifier.
2922 ///
2923 ///
2924 /// \returns true if an error occurred, false otherwise.
2926 Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
2927 TemplateTy TemplateName, SourceLocation TemplateNameLoc,
2928 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
2929 SourceLocation RAngleLoc, SourceLocation CCLoc, bool EnteringContext);
2930
2932 SourceLocation ColonColonLoc);
2933
2935 const DeclSpec &DS,
2936 SourceLocation ColonColonLoc,
2937 QualType Type);
2938
2939 /// IsInvalidUnlessNestedName - This method is used for error recovery
2940 /// purposes to determine whether the specified identifier is only valid as
2941 /// a nested name specifier, for example a namespace name. It is
2942 /// conservatively correct to always return false from this method.
2943 ///
2944 /// The arguments are the same as those passed to ActOnCXXNestedNameSpecifier.
2946 NestedNameSpecInfo &IdInfo,
2947 bool EnteringContext);
2948
2949 /// Given a C++ nested-name-specifier, produce an annotation value
2950 /// that the parser can use later to reconstruct the given
2951 /// nested-name-specifier.
2952 ///
2953 /// \param SS A nested-name-specifier.
2954 ///
2955 /// \returns A pointer containing all of the information in the
2956 /// nested-name-specifier \p SS.
2958
2959 /// Given an annotation pointer for a nested-name-specifier, restore
2960 /// the nested-name-specifier structure.
2961 ///
2962 /// \param Annotation The annotation pointer, produced by
2963 /// \c SaveNestedNameSpecifierAnnotation().
2964 ///
2965 /// \param AnnotationRange The source range corresponding to the annotation.
2966 ///
2967 /// \param SS The nested-name-specifier that will be updated with the contents
2968 /// of the annotation pointer.
2969 void RestoreNestedNameSpecifierAnnotation(void *Annotation,
2970 SourceRange AnnotationRange,
2971 CXXScopeSpec &SS);
2972
2973 bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
2974
2975 /// ActOnCXXEnterDeclaratorScope - Called when a C++ scope specifier (global
2976 /// scope or nested-name-specifier) is parsed, part of a declarator-id.
2977 /// After this method is called, according to [C++ 3.4.3p3], names should be
2978 /// looked up in the declarator-id's scope, until the declarator is parsed and
2979 /// ActOnCXXExitDeclaratorScope is called.
2980 /// The 'SS' should be a non-empty valid CXXScopeSpec.
2982
2983 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
2984 /// invoked ActOnCXXEnterDeclaratorScope(), is finished. 'SS' is the same
2985 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
2986 /// Used to indicate that names should revert to being looked up in the
2987 /// defining scope.
2989
2990 ///@}
2991
2992 //
2993 //
2994 // -------------------------------------------------------------------------
2995 //
2996 //
2997
2998 /// \name Declarations
2999 /// Implementations are in SemaDecl.cpp
3000 ///@{
3001
3002public:
3004
3005 /// The index of the first InventedParameterInfo that refers to the current
3006 /// context.
3008
3009 /// A RAII object to temporarily push a declaration context.
3011 private:
3012 Sema &S;
3013 DeclContext *SavedContext;
3014 ProcessingContextState SavedContextState;
3015 QualType SavedCXXThisTypeOverride;
3016 unsigned SavedFunctionScopesStart;
3017 unsigned SavedInventedParameterInfosStart;
3018
3019 public:
3020 ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext = true)
3021 : S(S), SavedContext(S.CurContext),
3022 SavedContextState(S.DelayedDiagnostics.pushUndelayed()),
3023 SavedCXXThisTypeOverride(S.CXXThisTypeOverride),
3024 SavedFunctionScopesStart(S.FunctionScopesStart),
3025 SavedInventedParameterInfosStart(S.InventedParameterInfosStart) {
3026 assert(ContextToPush && "pushing null context");
3027 S.CurContext = ContextToPush;
3028 if (NewThisContext)
3029 S.CXXThisTypeOverride = QualType();
3030 // Any saved FunctionScopes do not refer to this context.
3031 S.FunctionScopesStart = S.FunctionScopes.size();
3032 S.InventedParameterInfosStart = S.InventedParameterInfos.size();
3033 }
3034
3035 void pop() {
3036 if (!SavedContext)
3037 return;
3038 S.CurContext = SavedContext;
3039 S.DelayedDiagnostics.popUndelayed(SavedContextState);
3040 S.CXXThisTypeOverride = SavedCXXThisTypeOverride;
3041 S.FunctionScopesStart = SavedFunctionScopesStart;
3042 S.InventedParameterInfosStart = SavedInventedParameterInfosStart;
3043 SavedContext = nullptr;
3044 }
3045
3046 ~ContextRAII() { pop(); }
3047 };
3048
3049 void DiagnoseInvalidJumps(Stmt *Body);
3050
3051 /// The function definitions which were renamed as part of typo-correction
3052 /// to match their respective declarations. We want to keep track of them
3053 /// to ensure that we don't emit a "redefinition" error if we encounter a
3054 /// correctly named definition after the renamed definition.
3056
3057 /// A cache of the flags available in enumerations with the flag_bits
3058 /// attribute.
3059 mutable llvm::DenseMap<const EnumDecl *, llvm::APInt> FlagBitsCache;
3060
3061 /// WeakUndeclaredIdentifiers - Identifiers contained in \#pragma weak before
3062 /// declared. Rare. May alias another identifier, declared or undeclared.
3063 ///
3064 /// For aliases, the target identifier is used as a key for eventual
3065 /// processing when the target is declared. For the single-identifier form,
3066 /// the sole identifier is used as the key. Each entry is a `SetVector`
3067 /// (ordered by parse order) of aliases (identified by the alias name) in case
3068 /// of multiple aliases to the same undeclared identifier.
3069 llvm::MapVector<
3071 llvm::SetVector<
3073 llvm::SmallDenseSet<WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly>>>
3075
3076 /// ExtnameUndeclaredIdentifiers - Identifiers contained in
3077 /// \#pragma redefine_extname before declared. Used in Solaris system headers
3078 /// to define functions that occur in multiple standards to call the version
3079 /// in the currently selected standard.
3080 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *> ExtnameUndeclaredIdentifiers;
3081
3082 /// Set containing all typedefs that are likely unused.
3085
3089
3090 /// The set of file scoped decls seen so far that have not been used
3091 /// and must warn if not used. Only contains the first declaration.
3093
3097
3098 /// All the tentative definitions encountered in the TU.
3100
3101 /// All the external declarations encoutered and used in the TU.
3103
3104 /// Generally null except when we temporarily switch decl contexts,
3105 /// like in \see SemaObjC::ActOnObjCTemporaryExitContainerContext.
3107
3108 /// Is the module scope we are in a C++ Header Unit?
3110 return ModuleScopes.empty() ? false
3111 : ModuleScopes.back().Module->isHeaderUnit();
3112 }
3113
3114 /// Get the module owning an entity.
3115 Module *getOwningModule(const Decl *Entity) {
3116 return Entity->getOwningModule();
3117 }
3118
3119 DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = nullptr);
3120
3121 /// If the identifier refers to a type name within this scope,
3122 /// return the declaration of that type.
3123 ///
3124 /// This routine performs ordinary name lookup of the identifier II
3125 /// within the given scope, with optional C++ scope specifier SS, to
3126 /// determine whether the name refers to a type. If so, returns an
3127 /// opaque pointer (actually a QualType) corresponding to that
3128 /// type. Otherwise, returns NULL.
3130 Scope *S, CXXScopeSpec *SS = nullptr,
3131 bool isClassName = false, bool HasTrailingDot = false,
3132 ParsedType ObjectType = nullptr,
3133 bool IsCtorOrDtorName = false,
3134 bool WantNontrivialTypeSourceInfo = false,
3135 bool IsClassTemplateDeductionContext = true,
3136 ImplicitTypenameContext AllowImplicitTypename =
3138 IdentifierInfo **CorrectedII = nullptr);
3139
3140 /// isTagName() - This method is called *for error recovery purposes only*
3141 /// to determine if the specified name is a valid tag name ("struct foo"). If
3142 /// so, this returns the TST for the tag corresponding to it (TST_enum,
3143 /// TST_union, TST_struct, TST_interface, TST_class). This is used to
3144 /// diagnose cases in C where the user forgot to specify the tag.
3146
3147 /// isMicrosoftMissingTypename - In Microsoft mode, within class scope,
3148 /// if a CXXScopeSpec's type is equal to the type of one of the base classes
3149 /// then downgrade the missing typename error to a warning.
3150 /// This is needed for MSVC compatibility; Example:
3151 /// @code
3152 /// template<class T> class A {
3153 /// public:
3154 /// typedef int TYPE;
3155 /// };
3156 /// template<class T> class B : public A<T> {
3157 /// public:
3158 /// A<T>::TYPE a; // no typename required because A<T> is a base class.
3159 /// };
3160 /// @endcode
3161 bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S);
3163 Scope *S, CXXScopeSpec *SS,
3164 ParsedType &SuggestedType,
3165 bool IsTemplateName = false);
3166
3167 /// Attempt to behave like MSVC in situations where lookup of an unqualified
3168 /// type name has failed in a dependent context. In these situations, we
3169 /// automatically form a DependentTypeName that will retry lookup in a related
3170 /// scope during instantiation.
3172 SourceLocation NameLoc,
3173 bool IsTemplateTypeArg);
3174
3175 /// Describes the result of the name lookup and resolution performed
3176 /// by \c ClassifyName().
3178 /// This name is not a type or template in this context, but might be
3179 /// something else.
3181 /// Classification failed; an error has been produced.
3183 /// The name has been typo-corrected to a keyword.
3185 /// The name was classified as a type.
3187 /// The name was classified as a specific non-type, non-template
3188 /// declaration. ActOnNameClassifiedAsNonType should be called to
3189 /// convert the declaration to an expression.
3191 /// The name was classified as an ADL-only function name.
3192 /// ActOnNameClassifiedAsUndeclaredNonType should be called to convert the
3193 /// result to an expression.
3195 /// The name denotes a member of a dependent type that could not be
3196 /// resolved. ActOnNameClassifiedAsDependentNonType should be called to
3197 /// convert the result to an expression.
3199 /// The name was classified as an overload set, and an expression
3200 /// representing that overload set has been formed.
3201 /// ActOnNameClassifiedAsOverloadSet should be called to form a suitable
3202 /// expression referencing the overload set.
3204 /// The name was classified as a template whose specializations are types.
3206 /// The name was classified as a variable template name.
3208 /// The name was classified as a function template name.
3210 /// The name was classified as an ADL-only function template name.
3212 /// The name was classified as a concept name.
3214 };
3215
3218 union {
3223 };
3224
3226
3227 public:
3229
3230 NameClassification(const IdentifierInfo *Keyword) : Kind(NC_Keyword) {}
3231
3232 static NameClassification Error() { return NameClassification(NC_Error); }
3233
3235 return NameClassification(NC_Unknown);
3236 }
3237
3239 NameClassification Result(NC_OverloadSet);
3240 Result.Expr = E;
3241 return Result;
3242 }
3243
3245 NameClassification Result(NC_NonType);
3246 Result.NonTypeDecl = D;
3247 return Result;
3248 }
3249
3251 return NameClassification(NC_UndeclaredNonType);
3252 }
3253
3255 return NameClassification(NC_DependentNonType);
3256 }
3257
3259 NameClassification Result(NC_TypeTemplate);
3260 Result.Template = Name;
3261 return Result;
3262 }
3263
3265 NameClassification Result(NC_VarTemplate);
3266 Result.Template = Name;
3267 return Result;
3268 }
3269
3271 NameClassification Result(NC_FunctionTemplate);
3272 Result.Template = Name;
3273 return Result;
3274 }
3275
3277 NameClassification Result(NC_Concept);
3278 Result.Template = Name;
3279 return Result;
3280 }
3281
3283 NameClassification Result(NC_UndeclaredTemplate);
3284 Result.Template = Name;
3285 return Result;
3286 }
3287
3289
3291 assert(Kind == NC_OverloadSet);
3292 return Expr;
3293 }
3294
3296 assert(Kind == NC_Type);
3297 return Type;
3298 }
3299
3301 assert(Kind == NC_NonType);
3302 return NonTypeDecl;
3303 }
3304
3306 assert(Kind == NC_TypeTemplate || Kind == NC_FunctionTemplate ||
3307 Kind == NC_VarTemplate || Kind == NC_Concept ||
3308 Kind == NC_UndeclaredTemplate);
3309 return Template;
3310 }
3311
3313 switch (Kind) {
3314 case NC_TypeTemplate:
3315 return TNK_Type_template;
3316 case NC_FunctionTemplate:
3317 return TNK_Function_template;
3318 case NC_VarTemplate:
3319 return TNK_Var_template;
3320 case NC_Concept:
3321 return TNK_Concept_template;
3322 case NC_UndeclaredTemplate:
3324 default:
3325 llvm_unreachable("unsupported name classification.");
3326 }
3327 }
3328 };
3329
3330 /// Perform name lookup on the given name, classifying it based on
3331 /// the results of name lookup and the following token.
3332 ///
3333 /// This routine is used by the parser to resolve identifiers and help direct
3334 /// parsing. When the identifier cannot be found, this routine will attempt
3335 /// to correct the typo and classify based on the resulting name.
3336 ///
3337 /// \param S The scope in which we're performing name lookup.
3338 ///
3339 /// \param SS The nested-name-specifier that precedes the name.
3340 ///
3341 /// \param Name The identifier. If typo correction finds an alternative name,
3342 /// this pointer parameter will be updated accordingly.
3343 ///
3344 /// \param NameLoc The location of the identifier.
3345 ///
3346 /// \param NextToken The token following the identifier. Used to help
3347 /// disambiguate the name.
3348 ///
3349 /// \param CCC The correction callback, if typo correction is desired.
3350 NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS,
3351 IdentifierInfo *&Name, SourceLocation NameLoc,
3352 const Token &NextToken,
3353 CorrectionCandidateCallback *CCC = nullptr);
3354
3355 /// Act on the result of classifying a name as an undeclared (ADL-only)
3356 /// non-type declaration.
3358 SourceLocation NameLoc);
3359 /// Act on the result of classifying a name as an undeclared member of a
3360 /// dependent base class.
3362 IdentifierInfo *Name,
3363 SourceLocation NameLoc,
3364 bool IsAddressOfOperand);
3365 /// Act on the result of classifying a name as a specific non-type
3366 /// declaration.
3369 SourceLocation NameLoc,
3370 const Token &NextToken);
3371 /// Act on the result of classifying a name as an overload set.
3373
3374 /// Describes the detailed kind of a template name. Used in diagnostics.
3381 Concept,
3383 };
3386
3387 /// Determine whether it's plausible that E was intended to be a
3388 /// template-name.
3390 if (!getLangOpts().CPlusPlus || E.isInvalid())
3391 return false;
3392 Dependent = false;
3393 if (auto *DRE = dyn_cast<DeclRefExpr>(E.get()))
3394 return !DRE->hasExplicitTemplateArgs();
3395 if (auto *ME = dyn_cast<MemberExpr>(E.get()))
3396 return !ME->hasExplicitTemplateArgs();
3397 Dependent = true;
3398 if (auto *DSDRE = dyn_cast<DependentScopeDeclRefExpr>(E.get()))
3399 return !DSDRE->hasExplicitTemplateArgs();
3400 if (auto *DSME = dyn_cast<CXXDependentScopeMemberExpr>(E.get()))
3401 return !DSME->hasExplicitTemplateArgs();
3402 // Any additional cases recognized here should also be handled by
3403 // diagnoseExprIntendedAsTemplateName.
3404 return false;
3405 }
3406
3408
3410
3412 MultiTemplateParamsArg TemplateParameterLists);
3413
3414 /// Attempt to fold a variable-sized type to a constant-sized type, returning
3415 /// true if we were successful.
3418 unsigned FailedFoldDiagID);
3419
3420 /// Register the given locally-scoped extern "C" declaration so
3421 /// that it can be found later for redeclarations. We include any extern "C"
3422 /// declaration that is not visible in the translation unit here, not just
3423 /// function-scope declarations.
3425
3426 /// DiagnoseClassNameShadow - Implement C++ [class.mem]p13:
3427 /// If T is the name of a class, then each of the following shall have a
3428 /// name different from T:
3429 /// - every static data member of class T;
3430 /// - every member function of class T
3431 /// - every member of class T that is itself a type;
3432 /// \returns true if the declaration name violates these rules.
3434
3435 /// Diagnose a declaration whose declarator-id has the given
3436 /// nested-name-specifier.
3437 ///
3438 /// \param SS The nested-name-specifier of the declarator-id.
3439 ///
3440 /// \param DC The declaration context to which the nested-name-specifier
3441 /// resolves.
3442 ///
3443 /// \param Name The name of the entity being declared.
3444 ///
3445 /// \param Loc The location of the name of the entity being declared.
3446 ///
3447 /// \param IsMemberSpecialization Whether we are declaring a member
3448 /// specialization.
3449 ///
3450 /// \param TemplateId The template-id, if any.
3451 ///
3452 /// \returns true if we cannot safely recover from this error, false
3453 /// otherwise.
3456 TemplateIdAnnotation *TemplateId,
3457 bool IsMemberSpecialization);
3458
3460
3461 bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key);
3462
3463 /// Diagnose function specifiers on a declaration of an identifier that
3464 /// does not identify a function.
3465 void DiagnoseFunctionSpecifiers(const DeclSpec &DS);
3466
3467 /// Return the declaration shadowed by the given typedef \p D, or null
3468 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3470 const LookupResult &R);
3471
3472 /// Return the declaration shadowed by the given variable \p D, or null
3473 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3475
3476 /// Return the declaration shadowed by the given variable \p D, or null
3477 /// if it doesn't shadow any declaration or shadowing warnings are disabled.
3479 const LookupResult &R);
3480 /// Diagnose variable or built-in function shadowing. Implements
3481 /// -Wshadow.
3482 ///
3483 /// This method is called whenever a VarDecl is added to a "useful"
3484 /// scope.
3485 ///
3486 /// \param ShadowedDecl the declaration that is shadowed by the given variable
3487 /// \param R the lookup of the name
3488 void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
3489 const LookupResult &R);
3490
3491 /// Check -Wshadow without the advantage of a previous lookup.
3492 void CheckShadow(Scope *S, VarDecl *D);
3493
3494 /// Warn if 'E', which is an expression that is about to be modified, refers
3495 /// to a shadowing declaration.
3497
3498 /// Diagnose shadowing for variables shadowed in the lambda record \p LambdaRD
3499 /// when these variables are captured by the lambda.
3501
3502 void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
3503 void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
3504 TypedefNameDecl *NewTD);
3507 TypeSourceInfo *TInfo,
3509
3510 /// ActOnTypedefNameDecl - Perform semantic checking for a declaration which
3511 /// declares a typedef-name, either using the 'typedef' type specifier or via
3512 /// a C++0x [dcl.typedef]p2 alias-declaration: 'using T = A;'.
3514 LookupResult &Previous, bool &Redeclaration);
3516 TypeSourceInfo *TInfo,
3518 MultiTemplateParamsArg TemplateParamLists,
3519 bool &AddToScope,
3521
3522 /// Perform semantic checking on a newly-created variable
3523 /// declaration.
3524 ///
3525 /// This routine performs all of the type-checking required for a
3526 /// variable declaration once it has been built. It is used both to
3527 /// check variables after they have been parsed and their declarators
3528 /// have been translated into a declaration, and to check variables
3529 /// that have been instantiated from a template.
3530 ///
3531 /// Sets NewVD->isInvalidDecl() if an error was encountered.
3532 ///
3533 /// Returns true if the variable declaration is a redeclaration.
3534 bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
3535 void CheckVariableDeclarationType(VarDecl *NewVD);
3536 void CheckCompleteVariableDeclaration(VarDecl *VD);
3537
3538 NamedDecl *ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
3539 TypeSourceInfo *TInfo,
3540 LookupResult &Previous,
3541 MultiTemplateParamsArg TemplateParamLists,
3542 bool &AddToScope);
3543
3544 /// AddOverriddenMethods - See if a method overrides any in the base classes,
3545 /// and if so, check that it's a valid override and remember it.
3546 bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD);
3547
3548 /// Perform semantic checking of a new function declaration.
3549 ///
3550 /// Performs semantic analysis of the new function declaration
3551 /// NewFD. This routine performs all semantic checking that does not
3552 /// require the actual declarator involved in the declaration, and is
3553 /// used both for the declaration of functions as they are parsed
3554 /// (called via ActOnDeclarator) and for the declaration of functions
3555 /// that have been instantiated via C++ template instantiation (called
3556 /// via InstantiateDecl).
3557 ///
3558 /// \param IsMemberSpecialization whether this new function declaration is
3559 /// a member specialization (that replaces any definition provided by the
3560 /// previous declaration).
3561 ///
3562 /// This sets NewFD->isInvalidDecl() to true if there was an error.
3563 ///
3564 /// \returns true if the function declaration is a redeclaration.
3565 bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
3566 LookupResult &Previous,
3567 bool IsMemberSpecialization, bool DeclIsDefn);
3568
3569 /// Checks if the new declaration declared in dependent context must be
3570 /// put in the same redeclaration chain as the specified declaration.
3571 ///
3572 /// \param D Declaration that is checked.
3573 /// \param PrevDecl Previous declaration found with proper lookup method for
3574 /// the same declaration name.
3575 /// \returns True if D must be added to the redeclaration chain which PrevDecl
3576 /// belongs to.
3577 bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl);
3578
3579 /// Determines if we can perform a correct type check for \p D as a
3580 /// redeclaration of \p PrevDecl. If not, we can generally still perform a
3581 /// best-effort check.
3582 ///
3583 /// \param NewD The new declaration.
3584 /// \param OldD The old declaration.
3585 /// \param NewT The portion of the type of the new declaration to check.
3586 /// \param OldT The portion of the type of the old declaration to check.
3587 bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD,
3588 QualType NewT, QualType OldT);
3589 void CheckMain(FunctionDecl *FD, const DeclSpec &D);
3590 void CheckMSVCRTEntryPoint(FunctionDecl *FD);
3591
3592 /// Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a
3593 /// containing class. Otherwise it will return implicit SectionAttr if the
3594 /// function is a definition and there is an active value on CodeSegStack
3595 /// (from the current #pragma code-seg value).
3596 ///
3597 /// \param FD Function being declared.
3598 /// \param IsDefinition Whether it is a definition or just a declaration.
3599 /// \returns A CodeSegAttr or SectionAttr to apply to the function or
3600 /// nullptr if no attribute should be added.
3601 Attr *getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD,
3602 bool IsDefinition);
3603
3604 /// Common checks for a parameter-declaration that should apply to both
3605 /// function parameters and non-type template parameters.
3606 void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D);
3607
3608 /// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()
3609 /// to introduce parameters into function prototype scope.
3610 Decl *ActOnParamDeclarator(Scope *S, Declarator &D,
3611 SourceLocation ExplicitThisLoc = {});
3612
3613 /// Synthesizes a variable for a parameter arising from a
3614 /// typedef.
3615 ParmVarDecl *BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc,
3616 QualType T);
3617 ParmVarDecl *CheckParameter(DeclContext *DC, SourceLocation StartLoc,
3618 SourceLocation NameLoc,
3619 const IdentifierInfo *Name, QualType T,
3620 TypeSourceInfo *TSInfo, StorageClass SC);
3621
3622 // Contexts where using non-trivial C union types can be disallowed. This is
3623 // passed to err_non_trivial_c_union_in_invalid_context.
3625 // Function parameter.
3627 // Function return.
3629 // Default-initialized object.
3631 // Variable with automatic storage duration.
3633 // Initializer expression that might copy from another object.
3635 // Assignment.
3637 // Compound literal.
3639 // Block capture.
3641 // lvalue-to-rvalue conversion of volatile type.
3643 };
3644
3645 /// Emit diagnostics if the initializer or any of its explicit or
3646 /// implicitly-generated subexpressions require copying or
3647 /// default-initializing a type that is or contains a C union type that is
3648 /// non-trivial to copy or default-initialize.
3650
3651 // These flags are passed to checkNonTrivialCUnion.
3656 };
3657
3658 /// Emit diagnostics if a non-trivial C union type or a struct that contains
3659 /// a non-trivial C union is used in an invalid context.
3661 NonTrivialCUnionContext UseContext,
3662 unsigned NonTrivialKind);
3663
3664 /// AddInitializerToDecl - Adds the initializer Init to the
3665 /// declaration dcl. If DirectInit is true, this is C++ direct
3666 /// initialization rather than copy initialization.
3667 void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit);
3668 void ActOnUninitializedDecl(Decl *dcl);
3669
3670 /// ActOnInitializerError - Given that there was an error parsing an
3671 /// initializer for the given declaration, try to at least re-establish
3672 /// invariants such as whether a variable's type is either dependent or
3673 /// complete.
3674 void ActOnInitializerError(Decl *Dcl);
3675
3678 IdentifierInfo *Ident,
3679 ParsedAttributes &Attrs);
3680
3681 /// Check if VD needs to be dllexport/dllimport due to being in a
3682 /// dllexport/import function.
3685
3686 /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform
3687 /// any semantic actions necessary after any initializer has been attached.
3688 void FinalizeDeclaration(Decl *D);
3690 ArrayRef<Decl *> Group);
3691
3692 /// BuildDeclaratorGroup - convert a list of declarations into a declaration
3693 /// group, performing any necessary semantic checking.
3695
3696 /// Should be called on all declarations that might have attached
3697 /// documentation comments.
3700
3701 enum class FnBodyKind {
3702 /// C++26 [dcl.fct.def.general]p1
3703 /// function-body:
3704 /// ctor-initializer[opt] compound-statement
3705 /// function-try-block
3706 Other,
3707 /// = default ;
3708 Default,
3709 /// deleted-function-body
3710 ///
3711 /// deleted-function-body:
3712 /// = delete ;
3713 /// = delete ( unevaluated-string ) ;
3714 Delete
3715 };
3716
3718 SourceLocation LocAfterDecls);
3720 FunctionDecl *FD, const FunctionDecl *EffectiveDefinition = nullptr,
3721 SkipBodyInfo *SkipBody = nullptr);
3723 MultiTemplateParamsArg TemplateParamLists,
3724 SkipBodyInfo *SkipBody = nullptr,
3725 FnBodyKind BodyKind = FnBodyKind::Other);
3727 SkipBodyInfo *SkipBody = nullptr,
3728 FnBodyKind BodyKind = FnBodyKind::Other);
3730
3731 /// Determine whether we can delay parsing the body of a function or
3732 /// function template until it is used, assuming we don't care about emitting
3733 /// code for that function.
3734 ///
3735 /// This will be \c false if we may need the body of the function in the
3736 /// middle of parsing an expression (where it's impractical to switch to
3737 /// parsing a different function), for instance, if it's constexpr in C++11
3738 /// or has an 'auto' return type in C++14. These cases are essentially bugs.
3739 bool canDelayFunctionBody(const Declarator &D);
3740
3741 /// Determine whether we can skip parsing the body of a function
3742 /// definition, assuming we don't care about analyzing its body or emitting
3743 /// code for that function.
3744 ///
3745 /// This will be \c false only if we may need the body of the function in
3746 /// order to parse the rest of the program (for instance, if it is
3747 /// \c constexpr in C++11 or has an 'auto' return type in C++14).
3748 bool canSkipFunctionBody(Decl *D);
3749
3750 /// Given the set of return statements within a function body,
3751 /// compute the variables that are subject to the named return value
3752 /// optimization.
3753 ///
3754 /// Each of the variables that is subject to the named return value
3755 /// optimization will be marked as NRVO variables in the AST, and any
3756 /// return statement that has a marked NRVO variable as its NRVO candidate can
3757 /// use the named return value optimization.
3758 ///
3759 /// This function applies a very simplistic algorithm for NRVO: if every
3760 /// return statement in the scope of a variable has the same NRVO candidate,
3761 /// that candidate is an NRVO variable.
3764 Decl *ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation);
3767
3768 /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an
3769 /// attribute for which parsing is delayed.
3771
3772 /// Diagnose any unused parameters in the given sequence of
3773 /// ParmVarDecl pointers.
3775
3776 /// Diagnose whether the size of parameters or return value of a
3777 /// function or obj-c method definition is pass-by-value and larger than a
3778 /// specified threshold.
3779 void
3781 QualType ReturnTy, NamedDecl *D);
3782
3784 SourceLocation RParenLoc);
3785
3788
3790
3791 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
3792 /// no declarator (e.g. "struct foo;") is parsed.
3794 const ParsedAttributesView &DeclAttrs,
3795 RecordDecl *&AnonRecord);
3796
3797 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
3798 /// no declarator (e.g. "struct foo;") is parsed. It also accepts template
3799 /// parameters to cope with template friend declarations.
3801 const ParsedAttributesView &DeclAttrs,
3802 MultiTemplateParamsArg TemplateParams,
3803 bool IsExplicitInstantiation,
3804 RecordDecl *&AnonRecord,
3805 SourceLocation EllipsisLoc = {});
3806
3807 /// BuildAnonymousStructOrUnion - Handle the declaration of an
3808 /// anonymous structure or union. Anonymous unions are a C++ feature
3809 /// (C++ [class.union]) and a C11 feature; anonymous structures
3810 /// are a C11 feature and GNU C++ extension.
3811 Decl *BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS,
3812 RecordDecl *Record,
3813 const PrintingPolicy &Policy);
3814
3815 /// Called once it is known whether
3816 /// a tag declaration is an anonymous union or struct.
3818
3819 /// Emit diagnostic warnings for placeholder members.
3820 /// We can only do that after the class is fully constructed,
3821 /// as anonymous union/structs can insert placeholders
3822 /// in their parent scope (which might be a Record).
3824
3825 /// BuildMicrosoftCAnonymousStruct - Handle the declaration of an
3826 /// Microsoft C anonymous structure.
3827 /// Ref: http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
3828 /// Example:
3829 ///
3830 /// struct A { int a; };
3831 /// struct B { struct A; int b; };
3832 ///
3833 /// void foo() {
3834 /// B var;
3835 /// var.a = 3;
3836 /// }
3837 Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS,
3838 RecordDecl *Record);
3839
3840 /// Common ways to introduce type names without a tag for use in diagnostics.
3841 /// Keep in sync with err_tag_reference_non_tag.
3852 };
3853
3854 /// Given a non-tag type declaration, returns an enum useful for indicating
3855 /// what kind of non-tag type this is.
3857
3858 /// Determine whether a tag with a given kind is acceptable
3859 /// as a redeclaration of the given tag declaration.
3860 ///
3861 /// \returns true if the new tag kind is acceptable, false otherwise.
3863 bool isDefinition, SourceLocation NewTagLoc,
3864 const IdentifierInfo *Name);
3865
3867 // Not parsing a type within __builtin_offsetof.
3869 // Parsing a type within __builtin_offsetof.
3871 // Parsing a type within macro "offsetof", defined in __buitin_offsetof
3872 // To improve our diagnostic message.
3874 };
3875
3876 /// This is invoked when we see 'struct foo' or 'struct {'. In the
3877 /// former case, Name will be non-null. In the later case, Name will be null.
3878 /// TagSpec indicates what kind of tag this is. TUK indicates whether this is
3879 /// a reference/declaration/definition of a tag.
3880 ///
3881 /// \param IsTypeSpecifier \c true if this is a type-specifier (or
3882 /// trailing-type-specifier) other than one in an alias-declaration.
3883 ///
3884 /// \param SkipBody If non-null, will be set to indicate if the caller should
3885 /// skip the definition of this tag and treat it as if it were a declaration.
3886 DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
3887 SourceLocation KWLoc, CXXScopeSpec &SS,
3888 IdentifierInfo *Name, SourceLocation NameLoc,
3890 SourceLocation ModulePrivateLoc,
3891 MultiTemplateParamsArg TemplateParameterLists,
3892 bool &OwnedDecl, bool &IsDependent,
3893 SourceLocation ScopedEnumKWLoc,
3894 bool ScopedEnumUsesClassTag, TypeResult UnderlyingType,
3895 bool IsTypeSpecifier, bool IsTemplateParamOrArg,
3896 OffsetOfKind OOK, SkipBodyInfo *SkipBody = nullptr);
3897
3898 /// ActOnField - Each field of a C struct/union is passed into this in order
3899 /// to create a FieldDecl object for it.
3900 Decl *ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart,
3901 Declarator &D, Expr *BitfieldWidth);
3902
3903 /// HandleField - Analyze a field of a C struct or a C++ data member.
3904 FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart,
3905 Declarator &D, Expr *BitfieldWidth,
3906 InClassInitStyle InitStyle, AccessSpecifier AS);
3907
3908 /// Build a new FieldDecl and check its well-formedness.
3909 ///
3910 /// This routine builds a new FieldDecl given the fields name, type,
3911 /// record, etc. \p PrevDecl should refer to any previous declaration
3912 /// with the same name and in the same scope as the field to be
3913 /// created.
3914 ///
3915 /// \returns a new FieldDecl.
3916 ///
3917 /// \todo The Declarator argument is a hack. It will be removed once
3920 SourceLocation Loc, bool Mutable,
3921 Expr *BitfieldWidth, InClassInitStyle InitStyle,
3923 NamedDecl *PrevDecl, Declarator *D = nullptr);
3924
3926
3927 /// ActOnLastBitfield - This routine handles synthesized bitfields rules for
3928 /// class and class extensions. For every class \@interface and class
3929 /// extension \@interface, if the last ivar is a bitfield of any type,
3930 /// then add an implicit `char :0` ivar to the end of that interface.
3931 void ActOnLastBitfield(SourceLocation DeclStart,
3932 SmallVectorImpl<Decl *> &AllIvarDecls);
3933
3934 // This is used for both record definitions and ObjC interface declarations.
3935 void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl,
3936 ArrayRef<Decl *> Fields, SourceLocation LBrac,
3937 SourceLocation RBrac, const ParsedAttributesView &AttrList);
3938
3939 /// ActOnTagStartDefinition - Invoked when we have entered the
3940 /// scope of a tag's definition (e.g., for an enumeration, class,
3941 /// struct, or union).
3943
3944 /// Perform ODR-like check for C/ObjC when merging tag types from modules.
3945 /// Differently from C++, actually parse the body and reject / error out
3946 /// in case of a structural mismatch.
3947 bool ActOnDuplicateDefinition(Decl *Prev, SkipBodyInfo &SkipBody);
3948
3950
3951 /// Invoked when we enter a tag definition that we're skipping.
3953
3954 /// ActOnStartCXXMemberDeclarations - Invoked when we have parsed a
3955 /// C++ record definition's base-specifiers clause and are starting its
3956 /// member declarations.
3958 SourceLocation FinalLoc,
3959 bool IsFinalSpelledSealed,
3960 bool IsAbstract,
3961 SourceLocation LBraceLoc);
3962
3963 /// ActOnTagFinishDefinition - Invoked once we have finished parsing
3964 /// the definition of a tag (enumeration, class, struct, or union).
3966 SourceRange BraceRange);
3967
3969
3970 /// ActOnTagDefinitionError - Invoked when there was an unrecoverable
3971 /// error parsing the definition of a tag.
3973
3975 EnumConstantDecl *LastEnumConst,
3977 Expr *val);
3978
3979 /// Check that this is a valid underlying type for an enum declaration.
3981
3982 /// Check whether this is a valid redeclaration of a previous enumeration.
3983 /// \return true if the redeclaration was invalid.
3984 bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped,
3985 QualType EnumUnderlyingTy, bool IsFixed,
3986 const EnumDecl *Prev);
3987
3988 /// Determine whether the body of an anonymous enumeration should be skipped.
3989 /// \param II The name of the first enumerator.
3991 SourceLocation IILoc);
3992
3993 Decl *ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant,
3995 const ParsedAttributesView &Attrs,
3996 SourceLocation EqualLoc, Expr *Val);
3997 void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange,
3998 Decl *EnumDecl, ArrayRef<Decl *> Elements, Scope *S,
3999 const ParsedAttributesView &Attr);
4000
4001 /// Set the current declaration context until it gets popped.
4002 void PushDeclContext(Scope *S, DeclContext *DC);
4003 void PopDeclContext();
4004
4005 /// EnterDeclaratorContext - Used when we must lookup names in the context
4006 /// of a declarator's nested name specifier.
4009
4010 /// Enter a template parameter scope, after it's been associated with a
4011 /// particular DeclContext. Causes lookup within the scope to chain through
4012 /// enclosing contexts in the correct order.
4014
4015 /// Push the parameters of D, which must be a function, into scope.
4018
4019 /// Add this decl to the scope shadowed decl chains.
4020 void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext = true);
4021
4022 /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
4023 /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
4024 /// true if 'D' belongs to the given declaration context.
4025 ///
4026 /// \param AllowInlineNamespace If \c true, allow the declaration to be in the
4027 /// enclosing namespace set of the context, rather than contained
4028 /// directly within it.
4029 bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S = nullptr,
4030 bool AllowInlineNamespace = false) const;
4031
4032 /// Finds the scope corresponding to the given decl context, if it
4033 /// happens to be an enclosing scope. Otherwise return NULL.
4035
4036 /// Subroutines of ActOnDeclarator().
4038 TypeSourceInfo *TInfo);
4039 bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New);
4040
4041 /// Describes the kind of merge to perform for availability
4042 /// attributes (including "deprecated", "unavailable", and "availability").
4044 /// Don't merge availability attributes at all.
4046 /// Merge availability attributes for a redeclaration, which requires
4047 /// an exact match.
4049 /// Merge availability attributes for an override, which requires
4050 /// an exact match or a weakening of constraints.
4052 /// Merge availability attributes for an implementation of
4053 /// a protocol requirement.
4055 /// Merge availability attributes for an implementation of
4056 /// an optional protocol requirement.
4059
4060 /// mergeDeclAttributes - Copy attributes from the Old decl to the New one.
4061 void mergeDeclAttributes(NamedDecl *New, Decl *Old,
4063
4064 /// MergeTypedefNameDecl - We just parsed a typedef 'New' which has the
4065 /// same name and scope as a previous declaration 'Old'. Figure out
4066 /// how to resolve this situation, merging decls or emitting
4067 /// diagnostics as appropriate. If there was an error, set New to be invalid.
4069 LookupResult &OldDecls);
4070
4071 /// MergeFunctionDecl - We just parsed a function 'New' from
4072 /// declarator D which has the same name and scope as a previous
4073 /// declaration 'Old'. Figure out how to resolve this situation,
4074 /// merging decls or emitting diagnostics as appropriate.
4075 ///
4076 /// In C++, New and Old must be declarations that are not
4077 /// overloaded. Use IsOverload to determine whether New and Old are
4078 /// overloaded, and to select the Old declaration that New should be
4079 /// merged with.
4080 ///
4081 /// Returns true if there was an error, false otherwise.
4082 bool MergeFunctionDecl(FunctionDecl *New, NamedDecl *&Old, Scope *S,
4083 bool MergeTypeWithOld, bool NewDeclIsDefn);
4084
4085 /// Completes the merge of two function declarations that are
4086 /// known to be compatible.
4087 ///
4088 /// This routine handles the merging of attributes and other
4089 /// properties of function declarations from the old declaration to
4090 /// the new declaration, once we know that New is in fact a
4091 /// redeclaration of Old.
4092 ///
4093 /// \returns false
4095 Scope *S, bool MergeTypeWithOld);
4097
4098 /// MergeVarDecl - We just parsed a variable 'New' which has the same name
4099 /// and scope as a previous declaration 'Old'. Figure out how to resolve this
4100 /// situation, merging decls or emitting diagnostics as appropriate.
4101 ///
4102 /// Tentative definition rules (C99 6.9.2p2) are checked by
4103 /// FinalizeDeclaratorGroup. Unfortunately, we can't analyze tentative
4104 /// definitions here, since the initializer hasn't been attached.
4106
4107 /// MergeVarDeclTypes - We parsed a variable 'New' which has the same name and
4108 /// scope as a previous declaration 'Old'. Figure out how to merge their
4109 /// types, emitting diagnostics as appropriate.
4110 ///
4111 /// Declarations using the auto type specifier (C++ [decl.spec.auto]) call
4112 /// back to here in AddInitializerToDecl. We can't check them before the
4113 /// initializer is attached.
4114 void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld);
4115
4116 /// We've just determined that \p Old and \p New both appear to be definitions
4117 /// of the same variable. Either diagnose or fix the problem.
4118 bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn);
4119 void notePreviousDefinition(const NamedDecl *Old, SourceLocation New);
4120
4121 /// Filters out lookup results that don't fall within the given scope
4122 /// as determined by isDeclInScope.
4124 bool ConsiderLinkage, bool AllowInlineNamespace);
4125
4126 /// We've determined that \p New is a redeclaration of \p Old. Check that they
4127 /// have compatible owning modules.
4129
4130 /// [module.interface]p6:
4131 /// A redeclaration of an entity X is implicitly exported if X was introduced
4132 /// by an exported declaration; otherwise it shall not be exported.
4134
4135 /// A wrapper function for checking the semantic restrictions of
4136 /// a redeclaration within a module.
4138
4139 /// Check the redefinition in C++20 Modules.
4140 ///
4141 /// [basic.def.odr]p14:
4142 /// For any definable item D with definitions in multiple translation units,
4143 /// - if D is a non-inline non-templated function or variable, or
4144 /// - if the definitions in different translation units do not satisfy the
4145 /// following requirements,
4146 /// the program is ill-formed; a diagnostic is required only if the
4147 /// definable item is attached to a named module and a prior definition is
4148 /// reachable at the point where a later definition occurs.
4149 /// - Each such definition shall not be attached to a named module
4150 /// ([module.unit]).
4151 /// - Each such definition shall consist of the same sequence of tokens, ...
4152 /// ...
4153 ///
4154 /// Return true if the redefinition is not allowed. Return false otherwise.
4155 bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const;
4156
4158
4159 /// If it's a file scoped decl that must warn if not used, keep track
4160 /// of it.
4162
4163 typedef llvm::function_ref<void(SourceLocation Loc, PartialDiagnostic PD)>
4165
4168 DiagReceiverTy DiagReceiver);
4169 void DiagnoseUnusedDecl(const NamedDecl *ND);
4170
4171 /// DiagnoseUnusedDecl - Emit warnings about declarations that are not used
4172 /// unless they are marked attr(unused).
4173 void DiagnoseUnusedDecl(const NamedDecl *ND, DiagReceiverTy DiagReceiver);
4174
4175 /// If VD is set but not otherwise used, diagnose, for a parameter or a
4176 /// variable.
4177 void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver);
4178
4179 /// getNonFieldDeclScope - Retrieves the innermost scope, starting
4180 /// from S, where a non-field would be declared. This routine copes
4181 /// with the difference between C and C++ scoping rules in structs and
4182 /// unions. For example, the following code is well-formed in C but
4183 /// ill-formed in C++:
4184 /// @code
4185 /// struct S6 {
4186 /// enum { BAR } e;
4187 /// };
4188 ///
4189 /// void test_S6() {
4190 /// struct S6 a;
4191 /// a.e = BAR;
4192 /// }
4193 /// @endcode
4194 /// For the declaration of BAR, this routine will return a different
4195 /// scope. The scope S will be the scope of the unnamed enumeration
4196 /// within S6. In C++, this routine will return the scope associated
4197 /// with S6, because the enumeration's scope is a transparent
4198 /// context but structures can contain non-field names. In C, this
4199 /// routine will return the translation unit scope, since the
4200 /// enumeration's scope is a transparent context and structures cannot
4201 /// contain non-field names.
4203
4206
4207 /// LazilyCreateBuiltin - The specified Builtin-ID was first used at
4208 /// file scope. lazily create a decl for it. ForRedeclaration is true
4209 /// if we're creating this built-in in anticipation of redeclaring the
4210 /// built-in.
4212 bool ForRedeclaration, SourceLocation Loc);
4213
4214 /// Get the outermost AttributedType node that sets a calling convention.
4215 /// Valid types should not have multiple attributes with different CCs.
4217
4218 /// GetNameForDeclarator - Determine the full declaration name for the
4219 /// given Declarator.
4221
4222 /// Retrieves the declaration name from a parsed unqualified-id.
4224
4225 /// ParsingInitForAutoVars - a set of declarations with auto types for which
4226 /// we are currently parsing the initializer.
4228
4229 /// Look for a locally scoped extern "C" declaration by the given name.
4231
4233
4234 /// Adjust the \c DeclContext for a function or variable that might be a
4235 /// function-local external declaration.
4237
4239
4240 /// Checks if the variant/multiversion functions are compatible.
4242 const FunctionDecl *OldFD, const FunctionDecl *NewFD,
4243 const PartialDiagnostic &NoProtoDiagID,
4244 const PartialDiagnosticAt &NoteCausedDiagIDAt,
4245 const PartialDiagnosticAt &NoSupportDiagIDAt,
4246 const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported,
4247 bool ConstexprSupported, bool CLinkageMayDiffer);
4248
4249 /// type checking declaration initializers (C99 6.7.8)
4251 Expr *Init, unsigned DiagID = diag::err_init_element_not_constant);
4252
4256 Expr *Init);
4257
4259 Expr *Init);
4260
4262
4263 // Heuristically tells if the function is `get_return_object` member of a
4264 // coroutine promise_type by matching the function name.
4265 static bool CanBeGetReturnObject(const FunctionDecl *FD);
4266 static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD);
4267
4268 /// ImplicitlyDefineFunction - An undeclared identifier was used in a function
4269 /// call, forming a call to an implicitly defined function (per C99 6.5.1p2).
4271 Scope *S);
4272
4273 /// If this function is a C++ replaceable global allocation function
4274 /// (C++2a [basic.stc.dynamic.allocation], C++2a [new.delete]),
4275 /// adds any function attributes that we know a priori based on the standard.
4276 ///
4277 /// We need to check for duplicate attributes both here and where user-written
4278 /// attributes are applied to declarations.
4280 FunctionDecl *FD);
4281
4282 /// Adds any function attributes that we know a priori based on
4283 /// the declaration of this function.
4284 ///
4285 /// These attributes can apply both to implicitly-declared builtins
4286 /// (like __builtin___printf_chk) or to library-declared functions
4287 /// like NSLog or printf.
4288 ///
4289 /// We need to check for duplicate attributes both here and where user-written
4290 /// attributes are applied to declarations.
4292
4293 /// VerifyBitField - verifies that a bit field expression is an ICE and has
4294 /// the correct width, and that the field type is valid.
4295 /// Returns false on success.
4297 const IdentifierInfo *FieldName, QualType FieldTy,
4298 bool IsMsStruct, Expr *BitWidth);
4299
4300 /// IsValueInFlagEnum - Determine if a value is allowed as part of a flag
4301 /// enum. If AllowMask is true, then we also allow the complement of a valid
4302 /// value, to be used as a mask.
4303 bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val,
4304 bool AllowMask) const;
4305
4306 /// ActOnPragmaWeakID - Called on well formed \#pragma weak ident.
4307 void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc,
4308 SourceLocation WeakNameLoc);
4309
4310 /// ActOnPragmaRedefineExtname - Called on well formed
4311 /// \#pragma redefine_extname oldname newname.
4313 IdentifierInfo *AliasName,
4314 SourceLocation PragmaLoc,
4315 SourceLocation WeakNameLoc,
4316 SourceLocation AliasNameLoc);
4317
4318 /// ActOnPragmaWeakAlias - Called on well formed \#pragma weak ident = ident.
4319 void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName,
4320 SourceLocation PragmaLoc,
4321 SourceLocation WeakNameLoc,
4322 SourceLocation AliasNameLoc);
4323
4324 /// Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
4326 Emitted,
4327 CUDADiscarded, // Discarded due to CUDA/HIP hostness
4328 OMPDiscarded, // Discarded due to OpenMP hostness
4329 TemplateDiscarded, // Discarded due to uninstantiated templates
4330 Unknown,
4331 };
4332 FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl,
4333 bool Final = false);
4334
4335 // Whether the callee should be ignored in CUDA/HIP/OpenMP host/device check.
4337
4338private:
4339 /// Function or variable declarations to be checked for whether the deferred
4340 /// diagnostics should be emitted.
4341 llvm::SmallSetVector<Decl *, 4> DeclsToCheckForDeferredDiags;
4342
4343 /// Map of current shadowing declarations to shadowed declarations. Warn if
4344 /// it looks like the user is trying to modify the shadowing declaration.
4345 llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls;
4346
4347 // We need this to handle
4348 //
4349 // typedef struct {
4350 // void *foo() { return 0; }
4351 // } A;
4352 //
4353 // When we see foo we don't know if after the typedef we will get 'A' or '*A'
4354 // for example. If 'A', foo will have external linkage. If we have '*A',
4355 // foo will have no linkage. Since we can't know until we get to the end
4356 // of the typedef, this function finds out if D might have non-external
4357 // linkage. Callers should verify at the end of the TU if it D has external
4358 // linkage or not.
4359 static bool mightHaveNonExternalLinkage(const DeclaratorDecl *FD);
4360
4361 ///@}
4362
4363 //
4364 //
4365 // -------------------------------------------------------------------------
4366 //
4367 //
4368
4369 /// \name Declaration Attribute Handling
4370 /// Implementations are in SemaDeclAttr.cpp
4371 ///@{
4372
4373public:
4374 /// Describes the kind of priority given to an availability attribute.
4375 ///
4376 /// The sum of priorities deteremines the final priority of the attribute.
4377 /// The final priority determines how the attribute will be merged.
4378 /// An attribute with a lower priority will always remove higher priority
4379 /// attributes for the specified platform when it is being applied. An
4380 /// attribute with a higher priority will not be applied if the declaration
4381 /// already has an availability attribute with a lower priority for the
4382 /// specified platform. The final prirority values are not expected to match
4383 /// the values in this enumeration, but instead should be treated as a plain
4384 /// integer value. This enumeration just names the priority weights that are
4385 /// used to calculate that final vaue.
4387 /// The availability attribute was specified explicitly next to the
4388 /// declaration.
4390
4391 /// The availability attribute was applied using '#pragma clang attribute'.
4393
4394 /// The availability attribute for a specific platform was inferred from
4395 /// an availability attribute for another platform.
4398
4399 /// Describes the reason a calling convention specification was ignored, used
4400 /// for diagnostics.
4402 ForThisTarget = 0,
4406 };
4407
4408 /// A helper function to provide Attribute Location for the Attr types
4409 /// AND the ParsedAttr.
4410 template <typename AttrInfo>
4411 static std::enable_if_t<std::is_base_of_v<Attr, AttrInfo>, SourceLocation>
4412 getAttrLoc(const AttrInfo &AL) {
4413 return AL.getLocation();
4414 }
4416
4417 /// If Expr is a valid integer constant, get the value of the integer
4418 /// expression and return success or failure. May output an error.
4419 ///
4420 /// Negative argument is implicitly converted to unsigned, unless
4421 /// \p StrictlyUnsigned is true.
4422 template <typename AttrInfo>
4423 bool checkUInt32Argument(const AttrInfo &AI, const Expr *Expr, uint32_t &Val,
4424 unsigned Idx = UINT_MAX,
4425 bool StrictlyUnsigned = false) {
4426 std::optional<llvm::APSInt> I = llvm::APSInt(32);
4427 if (Expr->isTypeDependent() ||
4429 if (Idx != UINT_MAX)
4430 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4431 << &AI << Idx << AANT_ArgumentIntegerConstant
4432 << Expr->getSourceRange();
4433 else
4434 Diag(getAttrLoc(AI), diag::err_attribute_argument_type)
4436 return false;
4437 }
4438
4439 if (!I->isIntN(32)) {
4440 Diag(Expr->getExprLoc(), diag::err_ice_too_large)
4441 << toString(*I, 10, false) << 32 << /* Unsigned */ 1;
4442 return false;
4443 }
4444
4445 if (StrictlyUnsigned && I->isSigned() && I->isNegative()) {
4446 Diag(getAttrLoc(AI), diag::err_attribute_requires_positive_integer)
4447 << &AI << /*non-negative*/ 1;
4448 return false;
4449 }
4450
4451 Val = (uint32_t)I->getZExtValue();
4452 return true;
4453 }
4454
4455 /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
4456 /// \#pragma weak during processing of other Decls.
4457 /// I couldn't figure out a clean way to generate these in-line, so
4458 /// we store them here and handle separately -- which is a hack.
4459 /// It would be best to refactor this.
4461
4462 /// WeakTopLevelDeclDecls - access to \#pragma weak-generated Decls
4464
4468
4469 /// ExtVectorDecls - This is a list all the extended vector types. This allows
4470 /// us to associate a raw vector type with one of the ext_vector type names.
4471 /// This is only necessary for issuing pretty diagnostics.
4473
4474 /// Check if the argument \p E is a ASCII string literal. If not emit an error
4475 /// and return false, otherwise set \p Str to the value of the string literal
4476 /// and return true.
4478 const Expr *E, StringRef &Str,
4479 SourceLocation *ArgLocation = nullptr);
4480
4481 /// Check if the argument \p ArgNum of \p Attr is a ASCII string literal.
4482 /// If not emit an error and return false. If the argument is an identifier it
4483 /// will emit an error with a fixit hint and treat it as if it was a string
4484 /// literal.
4485 bool checkStringLiteralArgumentAttr(const ParsedAttr &Attr, unsigned ArgNum,
4486 StringRef &Str,
4487 SourceLocation *ArgLocation = nullptr);
4488
4489 /// Determine if type T is a valid subject for a nonnull and similar
4490 /// attributes. Dependent types are considered valid so they can be checked
4491 /// during instantiation time. By default, we look through references (the
4492 /// behavior used by nonnull), but if the second parameter is true, then we
4493 /// treat a reference type as valid.
4494 bool isValidPointerAttrType(QualType T, bool RefOkay = false);
4495
4496 /// AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular
4497 /// declaration.
4499 Expr *OE);
4500
4501 /// AddAllocAlignAttr - Adds an alloc_align attribute to a particular
4502 /// declaration.
4504 Expr *ParamExpr);
4505
4506 bool CheckAttrTarget(const ParsedAttr &CurrAttr);
4507 bool CheckAttrNoArgs(const ParsedAttr &CurrAttr);
4508
4509 AvailabilityAttr *mergeAvailabilityAttr(
4510 NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform,
4511 bool Implicit, VersionTuple Introduced, VersionTuple Deprecated,
4512 VersionTuple Obsoleted, bool IsUnavailable, StringRef Message,
4513 bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK,
4514 int Priority, IdentifierInfo *IIEnvironment);
4515
4516 TypeVisibilityAttr *
4518 TypeVisibilityAttr::VisibilityType Vis);
4519 VisibilityAttr *mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI,
4520 VisibilityAttr::VisibilityType Vis);
4521 SectionAttr *mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI,
4522 StringRef Name);
4523
4524 /// Used to implement to perform semantic checking on
4525 /// attribute((section("foo"))) specifiers.
4526 ///
4527 /// In this case, "foo" is passed in to be checked. If the section
4528 /// specifier is invalid, return an Error that indicates the problem.
4529 ///
4530 /// This is a simple quality of implementation feature to catch errors
4531 /// and give good diagnostics in cases when the assembler or code generator
4532 /// would otherwise reject the section specifier.
4533 llvm::Error isValidSectionSpecifier(StringRef Str);
4534 bool checkSectionName(SourceLocation LiteralLoc, StringRef Str);
4535 CodeSegAttr *mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI,
4536 StringRef Name);
4537
4538 // Check for things we'd like to warn about. Multiversioning issues are
4539 // handled later in the process, once we know how many exist.
4540 bool checkTargetAttr(SourceLocation LiteralLoc, StringRef Str);
4541
4542 /// Check Target Version attrs
4543 bool checkTargetVersionAttr(SourceLocation Loc, Decl *D, StringRef Str);
4545 SourceLocation LiteralLoc, StringRef Str, const StringLiteral *Literal,
4546 Decl *D, bool &HasDefault, bool &HasCommas, bool &HasNotDefault,
4547 SmallVectorImpl<SmallString<64>> &StringsBuffer);
4548
4549 ErrorAttr *mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI,
4550 StringRef NewUserDiagnostic);
4551 FormatAttr *mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI,
4552 IdentifierInfo *Format, int FormatIdx,
4553 int FirstArg);
4554
4555 /// AddAlignedAttr - Adds an aligned attribute to a particular declaration.
4556 void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
4557 bool IsPackExpansion);
4559 bool IsPackExpansion);
4560
4561 /// AddAlignValueAttr - Adds an align_value attribute to a particular
4562 /// declaration.
4563 void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E);
4564
4565 /// CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
4566 Attr *CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot,
4569
4571 bool BestCase,
4572 MSInheritanceModel SemanticSpelling);
4573
4575
4576 /// AddModeAttr - Adds a mode attribute to a particular declaration.
4577 void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name,
4578 bool InInstantiation = false);
4579 AlwaysInlineAttr *mergeAlwaysInlineAttr(Decl *D,
4580 const AttributeCommonInfo &CI,
4581 const IdentifierInfo *Ident);
4582 MinSizeAttr *mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI);
4583 OptimizeNoneAttr *mergeOptimizeNoneAttr(Decl *D,
4584 const AttributeCommonInfo &CI);
4585 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL);
4586 InternalLinkageAttr *mergeInternalLinkageAttr(Decl *D,
4587 const InternalLinkageAttr &AL);
4588
4589 /// Check validaty of calling convention attribute \p attr. If \p FD
4590 /// is not null pointer, use \p FD to determine the CUDA/HIP host/device
4591 /// target. Otherwise, it is specified by \p CFT.
4593 const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD = nullptr,
4595
4596 /// Checks a regparm attribute, returning true if it is ill-formed and
4597 /// otherwise setting numParams to the appropriate value.
4598 bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value);
4599
4600 /// Create an CUDALaunchBoundsAttr attribute.
4601 CUDALaunchBoundsAttr *CreateLaunchBoundsAttr(const AttributeCommonInfo &CI,
4602 Expr *MaxThreads,
4603 Expr *MinBlocks,
4604 Expr *MaxBlocks);
4605
4606 /// AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular
4607 /// declaration.
4609 Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks);
4610
4611 enum class RetainOwnershipKind { NS, CF, OS };
4612
4613 UuidAttr *mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI,
4614 StringRef UuidAsWritten, MSGuidDecl *GuidDecl);
4615
4616 BTFDeclTagAttr *mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL);
4617
4618 DLLImportAttr *mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI);
4619 DLLExportAttr *mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI);
4620 MSInheritanceAttr *mergeMSInheritanceAttr(Decl *D,
4621 const AttributeCommonInfo &CI,
4622 bool BestCase,
4623 MSInheritanceModel Model);
4624
4625 EnforceTCBAttr *mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL);
4626 EnforceTCBLeafAttr *mergeEnforceTCBLeafAttr(Decl *D,
4627 const EnforceTCBLeafAttr &AL);
4628
4629 /// Helper for delayed processing TransparentUnion or
4630 /// BPFPreserveAccessIndexAttr attribute.
4632 const ParsedAttributesView &AttrList);
4633
4634 // Options for ProcessDeclAttributeList().
4637 : IncludeCXX11Attributes(true), IgnoreTypeAttributes(false) {}
4638
4640 ProcessDeclAttributeOptions Result = *this;
4641 Result.IncludeCXX11Attributes = Val;
4642 return Result;
4643 }
4644
4646 ProcessDeclAttributeOptions Result = *this;
4647 Result.IgnoreTypeAttributes = Val;
4648 return Result;
4649 }
4650
4651 // Should C++11 attributes be processed?
4653
4654 // Should any type attributes encountered be ignored?
4655 // If this option is false, a diagnostic will be emitted for any type
4656 // attributes of a kind that does not "slide" from the declaration to
4657 // the decl-specifier-seq.
4659 };
4660
4661 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
4662 /// attribute list to the specified decl, ignoring any type attributes.
4664 const ParsedAttributesView &AttrList,
4665 const ProcessDeclAttributeOptions &Options =
4667
4668 /// Annotation attributes are the only attributes allowed after an access
4669 /// specifier.
4671 const ParsedAttributesView &AttrList);
4672
4673 /// checkUnusedDeclAttributes - Given a declarator which is not being
4674 /// used to build a declaration, complain about any decl attributes
4675 /// which might be lying around on it.
4677
4678 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
4679 /// \#pragma weak needs a non-definition decl and source may not have one.
4682
4683 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
4684 /// applied to it, possibly with an alias.
4685 void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W);
4686
4687 void ProcessPragmaWeak(Scope *S, Decl *D);
4688 // Decl attributes - this routine is the top level dispatcher.
4689 void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD);
4690
4692
4693 /// Given a set of delayed diagnostics, re-emit them as if they had
4694 /// been delayed in the current context instead of in the given pool.
4695 /// Essentially, this just moves them to the current pool.
4697
4698 /// Check if IdxExpr is a valid parameter index for a function or
4699 /// instance method D. May output an error.
4700 ///
4701 /// \returns true if IdxExpr is a valid index.
4702 template <typename AttrInfo>
4703 bool checkFunctionOrMethodParameterIndex(const Decl *D, const AttrInfo &AI,
4704 unsigned AttrArgNum,
4705 const Expr *IdxExpr, ParamIdx &Idx,
4706 bool CanIndexImplicitThis = false) {
4708
4709 // In C++ the implicit 'this' function parameter also counts.
4710 // Parameters are counted from one.
4711 bool HP = hasFunctionProto(D);
4712 bool HasImplicitThisParam = isInstanceMethod(D);
4713 bool IV = HP && isFunctionOrMethodVariadic(D);
4714 unsigned NumParams =
4715 (HP ? getFunctionOrMethodNumParams(D) : 0) + HasImplicitThisParam;
4716
4717 std::optional<llvm::APSInt> IdxInt;
4718 if (IdxExpr->isTypeDependent() ||
4719 !(IdxInt = IdxExpr->getIntegerConstantExpr(Context))) {
4720 Diag(getAttrLoc(AI), diag::err_attribute_argument_n_type)
4721 << &AI << AttrArgNum << AANT_ArgumentIntegerConstant
4722 << IdxExpr->getSourceRange();
4723 return false;
4724 }
4725
4726 unsigned IdxSource = IdxInt->getLimitedValue(UINT_MAX);
4727 if (IdxSource < 1 || (!IV && IdxSource > NumParams)) {
4728 Diag(getAttrLoc(AI), diag::err_attribute_argument_out_of_bounds)
4729 << &AI << AttrArgNum << IdxExpr->getSourceRange();
4730 return false;
4731 }
4732 if (HasImplicitThisParam && !CanIndexImplicitThis) {
4733 if (IdxSource == 1) {
4734 Diag(getAttrLoc(AI), diag::err_attribute_invalid_implicit_this_argument)
4735 << &AI << IdxExpr->getSourceRange();
4736 return false;
4737 }
4738 }
4739
4740 Idx = ParamIdx(IdxSource, D);
4741 return true;
4742 }
4743
4744 ///@}
4745
4746 //
4747 //
4748 // -------------------------------------------------------------------------
4749 //
4750 //
4751
4752 /// \name C++ Declarations
4753 /// Implementations are in SemaDeclCXX.cpp
4754 ///@{
4755
4756public:
4758
4759 /// Called before parsing a function declarator belonging to a function
4760 /// declaration.
4762 unsigned TemplateParameterDepth);
4763
4764 /// Called after parsing a function declarator belonging to a function
4765 /// declaration.
4767
4768 // Act on C++ namespaces
4770 SourceLocation NamespaceLoc,
4771 SourceLocation IdentLoc, IdentifierInfo *Ident,
4772 SourceLocation LBrace,
4773 const ParsedAttributesView &AttrList,
4774 UsingDirectiveDecl *&UsingDecl, bool IsNested);
4775
4776 /// ActOnFinishNamespaceDef - This callback is called after a namespace is
4777 /// exited. Decl is the DeclTy returned by ActOnStartNamespaceDef.
4778 void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace);
4779
4781
4782 /// Retrieve the special "std" namespace, which may require us to
4783 /// implicitly define the namespace.
4785
4787 EnumDecl *getStdAlignValT() const;
4788
4790 const IdentifierInfo *MemberOrBase);
4791
4793 /// The '<=>' operator was used in an expression and a builtin operator
4794 /// was selected.
4796 /// A defaulted 'operator<=>' needed the comparison category. This
4797 /// typically only applies to 'std::strong_ordering', due to the implicit
4798 /// fallback return value.
4800 };
4801
4802 /// Lookup the specified comparison category types in the standard
4803 /// library, an check the VarDecls possibly returned by the operator<=>
4804 /// builtins for that type.
4805 ///
4806 /// \return The type of the comparison category type corresponding to the
4807 /// specified Kind, or a null type if an error occurs
4811
4812 /// Tests whether Ty is an instance of std::initializer_list and, if
4813 /// it is and Element is not NULL, assigns the element type to Element.
4814 bool isStdInitializerList(QualType Ty, QualType *Element);
4815
4816 /// Looks for the std::initializer_list template and instantiates it
4817 /// with Element, or emits an error if it's not found.
4818 ///
4819 /// \returns The instantiated template, or null on error.
4821
4822 /// Determine whether Ctor is an initializer-list constructor, as
4823 /// defined in [dcl.init.list]p2.
4824 bool isInitListConstructor(const FunctionDecl *Ctor);
4825
4826 Decl *ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc,
4827 SourceLocation NamespcLoc, CXXScopeSpec &SS,
4828 SourceLocation IdentLoc,
4829 IdentifierInfo *NamespcName,
4830 const ParsedAttributesView &AttrList);
4831
4833
4834 Decl *ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc,
4835 SourceLocation AliasLoc, IdentifierInfo *Alias,
4836 CXXScopeSpec &SS, SourceLocation IdentLoc,
4837 IdentifierInfo *Ident);
4838
4839 /// Remove decls we can't actually see from a lookup being used to declare
4840 /// shadow using decls.
4841 ///
4842 /// \param S - The scope of the potential shadow decl
4843 /// \param Previous - The lookup of a potential shadow decl's name.
4844 void FilterUsingLookup(Scope *S, LookupResult &lookup);
4845
4846 /// Hides a using shadow declaration. This is required by the current
4847 /// using-decl implementation when a resolvable using declaration in a
4848 /// class is followed by a declaration which would hide or override
4849 /// one or more of the using decl's targets; for example:
4850 ///
4851 /// struct Base { void foo(int); };
4852 /// struct Derived : Base {
4853 /// using Base::foo;
4854 /// void foo(int);
4855 /// };
4856 ///
4857 /// The governing language is C++03 [namespace.udecl]p12:
4858 ///
4859 /// When a using-declaration brings names from a base class into a
4860 /// derived class scope, member functions in the derived class
4861 /// override and/or hide member functions with the same name and
4862 /// parameter types in a base class (rather than conflicting).
4863 ///
4864 /// There are two ways to implement this:
4865 /// (1) optimistically create shadow decls when they're not hidden
4866 /// by existing declarations, or
4867 /// (2) don't create any shadow decls (or at least don't make them
4868 /// visible) until we've fully parsed/instantiated the class.
4869 /// The problem with (1) is that we might have to retroactively remove
4870 /// a shadow decl, which requires several O(n) operations because the
4871 /// decl structures are (very reasonably) not designed for removal.
4872 /// (2) avoids this but is very fiddly and phase-dependent.
4873 void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow);
4874
4875 /// Determines whether to create a using shadow decl for a particular
4876 /// decl, given the set of decls existing prior to this using lookup.
4878 const LookupResult &PreviousDecls,
4879 UsingShadowDecl *&PrevShadow);
4880
4881 /// Builds a shadow declaration corresponding to a 'using' declaration.
4884 UsingShadowDecl *PrevDecl);
4885
4886 /// Checks that the given using declaration is not an invalid
4887 /// redeclaration. Note that this is checking only for the using decl
4888 /// itself, not for any ill-formedness among the UsingShadowDecls.
4890 bool HasTypenameKeyword,
4891 const CXXScopeSpec &SS,
4892 SourceLocation NameLoc,
4893 const LookupResult &Previous);
4894
4895 /// Checks that the given nested-name qualifier used in a using decl
4896 /// in the current context is appropriately related to the current
4897 /// scope. If an error is found, diagnoses it and returns true.
4898 /// R is nullptr, if the caller has not (yet) done a lookup, otherwise it's
4899 /// the result of that lookup. UD is likewise nullptr, except when we have an
4900 /// already-populated UsingDecl whose shadow decls contain the same
4901 /// information (i.e. we're instantiating a UsingDecl with non-dependent
4902 /// scope).
4903 bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
4904 const CXXScopeSpec &SS,
4905 const DeclarationNameInfo &NameInfo,
4906 SourceLocation NameLoc,
4907 const LookupResult *R = nullptr,
4908 const UsingDecl *UD = nullptr);
4909
4910 /// Builds a using declaration.
4911 ///
4912 /// \param IsInstantiation - Whether this call arises from an
4913 /// instantiation of an unresolved using declaration. We treat
4914 /// the lookup differently for these declarations.
4916 SourceLocation UsingLoc,
4917 bool HasTypenameKeyword,
4918 SourceLocation TypenameLoc, CXXScopeSpec &SS,
4919 DeclarationNameInfo NameInfo,
4920 SourceLocation EllipsisLoc,
4921 const ParsedAttributesView &AttrList,
4922 bool IsInstantiation, bool IsUsingIfExists);
4924 SourceLocation UsingLoc,
4925 SourceLocation EnumLoc,
4926 SourceLocation NameLoc,
4928 NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
4929 ArrayRef<NamedDecl *> Expansions);
4930
4931 /// Additional checks for a using declaration referring to a constructor name.
4933
4934 /// Given a derived-class using shadow declaration for a constructor and the
4935 /// correspnding base class constructor, find or create the implicit
4936 /// synthesized derived class constructor to use for this initialization.
4939 ConstructorUsingShadowDecl *DerivedShadow);
4940
4942 SourceLocation UsingLoc,
4943 SourceLocation TypenameLoc, CXXScopeSpec &SS,
4944 UnqualifiedId &Name, SourceLocation EllipsisLoc,
4945 const ParsedAttributesView &AttrList);
4947 SourceLocation UsingLoc,
4948 SourceLocation EnumLoc, SourceRange TyLoc,
4949 const IdentifierInfo &II, ParsedType Ty,
4950 CXXScopeSpec *SS = nullptr);
4952 MultiTemplateParamsArg TemplateParams,
4953 SourceLocation UsingLoc, UnqualifiedId &Name,
4954 const ParsedAttributesView &AttrList,
4955 TypeResult Type, Decl *DeclFromDeclSpec);
4956
4957 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
4958 /// including handling of its default argument expressions.
4959 ///
4960 /// \param ConstructKind - a CXXConstructExpr::ConstructionKind
4962 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
4963 CXXConstructorDecl *Constructor, MultiExprArg Exprs,
4964 bool HadMultipleCandidates, bool IsListInitialization,
4965 bool IsStdInitListInitialization, bool RequiresZeroInit,
4966 CXXConstructionKind ConstructKind, SourceRange ParenRange);
4967
4968 /// Build a CXXConstructExpr whose constructor has already been resolved if
4969 /// it denotes an inherited constructor.
4971 SourceLocation ConstructLoc, QualType DeclInitType,
4972 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
4973 bool HadMultipleCandidates, bool IsListInitialization,
4974 bool IsStdInitListInitialization, bool RequiresZeroInit,
4975 CXXConstructionKind ConstructKind, SourceRange ParenRange);
4976
4977 // FIXME: Can we remove this and have the above BuildCXXConstructExpr check if
4978 // the constructor can be elidable?
4980 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
4981 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg Exprs,
4982 bool HadMultipleCandidates, bool IsListInitialization,
4983 bool IsStdInitListInitialization, bool RequiresZeroInit,
4984 CXXConstructionKind ConstructKind, SourceRange ParenRange);
4985
4987 SourceLocation InitLoc);
4988
4989 /// FinalizeVarWithDestructor - Prepare for calling destructor on the
4990 /// constructed variable.
4991 void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType);
4992
4993 /// Helper class that collects exception specifications for
4994 /// implicitly-declared special member functions.
4996 // Pointer to allow copying
4997 Sema *Self;
4998 // We order exception specifications thus:
4999 // noexcept is the most restrictive, but is only used in C++11.
5000 // throw() comes next.
5001 // Then a throw(collected exceptions)
5002 // Finally no specification, which is expressed as noexcept(false).
5003 // throw(...) is used instead if any called function uses it.
5004 ExceptionSpecificationType ComputedEST;
5005 llvm::SmallPtrSet<CanQualType, 4> ExceptionsSeen;
5006 SmallVector<QualType, 4> Exceptions;
5007
5008 void ClearExceptions() {
5009 ExceptionsSeen.clear();
5010 Exceptions.clear();
5011 }
5012
5013 public:
5015 : Self(&Self), ComputedEST(EST_BasicNoexcept) {
5016 if (!Self.getLangOpts().CPlusPlus11)
5017 ComputedEST = EST_DynamicNone;
5018 }
5019
5020 /// Get the computed exception specification type.
5022 assert(!isComputedNoexcept(ComputedEST) &&
5023 "noexcept(expr) should not be a possible result");
5024 return ComputedEST;
5025 }
5026
5027 /// The number of exceptions in the exception specification.
5028 unsigned size() const { return Exceptions.size(); }
5029
5030 /// The set of exceptions in the exception specification.
5031 const QualType *data() const { return Exceptions.data(); }
5032
5033 /// Integrate another called method into the collected data.
5034 void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method);
5035
5036 /// Integrate an invoked expression into the collected data.
5037 void CalledExpr(Expr *E) { CalledStmt(E); }
5038
5039 /// Integrate an invoked statement into the collected data.
5040 void CalledStmt(Stmt *S);
5041
5042 /// Overwrite an EPI's exception specification with this
5043 /// computed exception specification.
5046 ESI.Type = getExceptionSpecType();
5047 if (ESI.Type == EST_Dynamic) {
5048 ESI.Exceptions = Exceptions;
5049 } else if (ESI.Type == EST_None) {
5050 /// C++11 [except.spec]p14:
5051 /// The exception-specification is noexcept(false) if the set of
5052 /// potential exceptions of the special member function contains "any"
5053 ESI.Type = EST_NoexceptFalse;
5054 ESI.NoexceptExpr =
5055 Self->ActOnCXXBoolLiteral(SourceLocation(), tok::kw_false).get();
5056 }
5057 return ESI;
5058 }
5059 };
5060
5061 /// Evaluate the implicit exception specification for a defaulted
5062 /// special member function.
5064
5065 /// Check the given exception-specification and update the
5066 /// exception specification information with the results.
5067 void checkExceptionSpecification(bool IsTopLevel,
5069 ArrayRef<ParsedType> DynamicExceptions,
5070 ArrayRef<SourceRange> DynamicExceptionRanges,
5071 Expr *NoexceptExpr,
5072 SmallVectorImpl<QualType> &Exceptions,
5074
5075 /// Add an exception-specification to the given member or friend function
5076 /// (or function template). The exception-specification was parsed
5077 /// after the function itself was declared.
5079 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
5080 ArrayRef<ParsedType> DynamicExceptions,
5081 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr);
5082
5083 class InheritedConstructorInfo;
5084
5085 /// Determine if a special member function should have a deleted
5086 /// definition when it is defaulted.
5088 InheritedConstructorInfo *ICI = nullptr,
5089 bool Diagnose = false);
5090
5091 /// Produce notes explaining why a defaulted function was defined as deleted.
5093
5094 /// Declare the implicit default constructor for the given class.
5095 ///
5096 /// \param ClassDecl The class declaration into which the implicit
5097 /// default constructor will be added.
5098 ///
5099 /// \returns The implicitly-declared default constructor.
5102
5103 /// DefineImplicitDefaultConstructor - Checks for feasibility of
5104 /// defining this constructor as the default constructor.
5106 CXXConstructorDecl *Constructor);
5107
5108 /// Declare the implicit destructor for the given class.
5109 ///
5110 /// \param ClassDecl The class declaration into which the implicit
5111 /// destructor will be added.
5112 ///
5113 /// \returns The implicitly-declared destructor.
5115
5116 /// DefineImplicitDestructor - Checks for feasibility of
5117 /// defining this destructor as the default destructor.
5118 void DefineImplicitDestructor(SourceLocation CurrentLocation,
5120
5121 /// Build an exception spec for destructors that don't have one.
5122 ///
5123 /// C++11 says that user-defined destructors with no exception spec get one
5124 /// that looks as if the destructor was implicitly declared.
5126
5127 /// Define the specified inheriting constructor.
5129 CXXConstructorDecl *Constructor);
5130
5131 /// Declare the implicit copy constructor for the given class.
5132 ///
5133 /// \param ClassDecl The class declaration into which the implicit
5134 /// copy constructor will be added.
5135 ///
5136 /// \returns The implicitly-declared copy constructor.
5138
5139 /// DefineImplicitCopyConstructor - Checks for feasibility of
5140 /// defining this constructor as the copy constructor.
5141 void DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
5142 CXXConstructorDecl *Constructor);
5143
5144 /// Declare the implicit move constructor for the given class.
5145 ///
5146 /// \param ClassDecl The Class declaration into which the implicit
5147 /// move constructor will be added.
5148 ///
5149 /// \returns The implicitly-declared move constructor, or NULL if it wasn't
5150 /// declared.
5152
5153 /// DefineImplicitMoveConstructor - Checks for feasibility of
5154 /// defining this constructor as the move constructor.
5155 void DefineImplicitMoveConstructor(SourceLocation CurrentLocation,
5156 CXXConstructorDecl *Constructor);
5157
5158 /// Declare the implicit copy assignment operator for the given class.
5159 ///
5160 /// \param ClassDecl The class declaration into which the implicit
5161 /// copy assignment operator will be added.
5162 ///
5163 /// \returns The implicitly-declared copy assignment operator.
5165
5166 /// Defines an implicitly-declared copy assignment operator.
5167 void DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
5168 CXXMethodDecl *MethodDecl);
5169
5170 /// Declare the implicit move assignment operator for the given class.
5171 ///
5172 /// \param ClassDecl The Class declaration into which the implicit
5173 /// move assignment operator will be added.
5174 ///
5175 /// \returns The implicitly-declared move assignment operator, or NULL if it
5176 /// wasn't declared.
5178
5179 /// Defines an implicitly-declared move assignment operator.
5180 void DefineImplicitMoveAssignment(SourceLocation CurrentLocation,
5181 CXXMethodDecl *MethodDecl);
5182
5183 /// Check a completed declaration of an implicit special member.
5185
5186 /// Determine whether the given function is an implicitly-deleted
5187 /// special member function.
5189
5190 /// Check whether 'this' shows up in the type of a static member
5191 /// function after the (naturally empty) cv-qualifier-seq would be.
5192 ///
5193 /// \returns true if an error occurred.
5195
5196 /// Whether this' shows up in the exception specification of a static
5197 /// member function.
5199
5200 /// Check whether 'this' shows up in the attributes of the given
5201 /// static member function.
5202 ///
5203 /// \returns true if an error occurred.
5205
5207 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI);
5208
5210
5211 /// Given a constructor and the set of arguments provided for the
5212 /// constructor, convert the arguments and add any required default arguments
5213 /// to form a proper call to this constructor.
5214 ///
5215 /// \returns true if an error occurred, false otherwise.
5217 QualType DeclInitType, MultiExprArg ArgsPtr,
5219 SmallVectorImpl<Expr *> &ConvertedArgs,
5220 bool AllowExplicit = false,
5221 bool IsListInitialization = false);
5222
5223 /// ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an
5224 /// initializer for the declaration 'Dcl'.
5225 /// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
5226 /// static data member of class X, names should be looked up in the scope of
5227 /// class X.
5229
5230 /// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
5231 /// initializer for the declaration 'Dcl'.
5232 void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl);
5233
5234 /// Define the "body" of the conversion from a lambda object to a
5235 /// function pointer.
5236 ///
5237 /// This routine doesn't actually define a sensible body; rather, it fills
5238 /// in the initialization expression needed to copy the lambda object into
5239 /// the block, and IR generation actually generates the real body of the
5240 /// block pointer conversion.
5241 void
5243 CXXConversionDecl *Conv);
5244
5245 /// Define the "body" of the conversion from a lambda object to a
5246 /// block pointer.
5247 ///
5248 /// This routine doesn't actually define a sensible body; rather, it fills
5249 /// in the initialization expression needed to copy the lambda object into
5250 /// the block, and IR generation actually generates the real body of the
5251 /// block pointer conversion.
5253 CXXConversionDecl *Conv);
5254
5255 /// ActOnStartLinkageSpecification - Parsed the beginning of a C++
5256 /// linkage specification, including the language and (if present)
5257 /// the '{'. ExternLoc is the location of the 'extern', Lang is the
5258 /// language string literal. LBraceLoc, if valid, provides the location of
5259 /// the '{' brace. Otherwise, this linkage specification does not
5260 /// have any braces.
5262 Expr *LangStr, SourceLocation LBraceLoc);
5263
5264 /// ActOnFinishLinkageSpecification - Complete the definition of
5265 /// the C++ linkage specification LinkageSpec. If RBraceLoc is
5266 /// valid, it's the position of the closing '}' brace in a linkage
5267 /// specification that uses braces.
5269 SourceLocation RBraceLoc);
5270
5271 //===--------------------------------------------------------------------===//
5272 // C++ Classes
5273 //
5274
5275 /// Get the class that is directly named by the current context. This is the
5276 /// class for which an unqualified-id in this scope could name a constructor
5277 /// or destructor.
5278 ///
5279 /// If the scope specifier denotes a class, this will be that class.
5280 /// If the scope specifier is empty, this will be the class whose
5281 /// member-specification we are currently within. Otherwise, there
5282 /// is no such class.
5284
5285 /// isCurrentClassName - Determine whether the identifier II is the
5286 /// name of the class type currently being defined. In the case of
5287 /// nested classes, this will only return true if II is the name of
5288 /// the innermost class.
5289 bool isCurrentClassName(const IdentifierInfo &II, Scope *S,
5290 const CXXScopeSpec *SS = nullptr);
5291
5292 /// Determine whether the identifier II is a typo for the name of
5293 /// the class type currently being defined. If so, update it to the identifier
5294 /// that should have been used.
5296
5297 /// ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
5299 SourceLocation ColonLoc,
5300 const ParsedAttributesView &Attrs);
5301
5302 /// ActOnCXXMemberDeclarator - This is invoked when a C++ class member
5303 /// declarator is parsed. 'AS' is the access specifier, 'BW' specifies the
5304 /// bitfield width if there is one, 'InitExpr' specifies the initializer if
5305 /// one has been parsed, and 'InitStyle' is set if an in-class initializer is
5306 /// present (but parsing it has been deferred).
5307 NamedDecl *
5309 MultiTemplateParamsArg TemplateParameterLists,
5310 Expr *BitfieldWidth, const VirtSpecifiers &VS,
5311 InClassInitStyle InitStyle);
5312
5313 /// Enter a new C++ default initializer scope. After calling this, the
5314 /// caller must call \ref ActOnFinishCXXInClassMemberInitializer, even if
5315 /// parsing or instantiating the initializer failed.
5317
5318 /// This is invoked after parsing an in-class initializer for a
5319 /// non-static C++ class member, and after instantiating an in-class
5320 /// initializer in a class template. Such actions are deferred until the class
5321 /// is complete.
5323 SourceLocation EqualLoc,
5325
5326 /// Handle a C++ member initializer using parentheses syntax.
5328 ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS,
5329 IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy,
5330 const DeclSpec &DS, SourceLocation IdLoc,
5331 SourceLocation LParenLoc, ArrayRef<Expr *> Args,
5332 SourceLocation RParenLoc, SourceLocation EllipsisLoc);
5333
5334 /// Handle a C++ member initializer using braced-init-list syntax.
5335 MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S,
5336 CXXScopeSpec &SS,
5337 IdentifierInfo *MemberOrBase,
5338 ParsedType TemplateTypeTy,
5339 const DeclSpec &DS, SourceLocation IdLoc,
5340 Expr *InitList, SourceLocation EllipsisLoc);
5341
5342 /// Handle a C++ member initializer.
5343 MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S,
5344 CXXScopeSpec &SS,
5345 IdentifierInfo *MemberOrBase,
5346 ParsedType TemplateTypeTy,
5347 const DeclSpec &DS, SourceLocation IdLoc,
5348 Expr *Init, SourceLocation EllipsisLoc);
5349
5351 SourceLocation IdLoc);
5352
5354 TypeSourceInfo *BaseTInfo, Expr *Init,
5355 CXXRecordDecl *ClassDecl,
5356 SourceLocation EllipsisLoc);
5357
5359 CXXRecordDecl *ClassDecl);
5360
5363
5364 bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors,
5365 ArrayRef<CXXCtorInitializer *> Initializers = {});
5366
5367 /// MarkBaseAndMemberDestructorsReferenced - Given a record decl,
5368 /// mark all the non-trivial destructors of its members and bases as
5369 /// referenced.
5370 void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc,
5371 CXXRecordDecl *Record);
5372
5373 /// Mark destructors of virtual bases of this class referenced. In the Itanium
5374 /// C++ ABI, this is done when emitting a destructor for any non-abstract
5375 /// class. In the Microsoft C++ ABI, this is done any time a class's
5376 /// destructor is referenced.
5378 SourceLocation Location, CXXRecordDecl *ClassDecl,
5379 llvm::SmallPtrSetImpl<const RecordType *> *DirectVirtualBases = nullptr);
5380
5381 /// Do semantic checks to allow the complete destructor variant to be emitted
5382 /// when the destructor is defined in another translation unit. In the Itanium
5383 /// C++ ABI, destructor variants are emitted together. In the MS C++ ABI, they
5384 /// can be emitted in separate TUs. To emit the complete variant, run a subset
5385 /// of the checks performed when emitting a regular destructor.
5386 void CheckCompleteDestructorVariant(SourceLocation CurrentLocation,
5387 CXXDestructorDecl *Dtor);
5388
5389 /// The list of classes whose vtables have been used within
5390 /// this translation unit, and the source locations at which the
5391 /// first use occurred.
5392 typedef std::pair<CXXRecordDecl *, SourceLocation> VTableUse;
5393
5394 /// The list of vtables that are required but have not yet been
5395 /// materialized.
5397
5398 /// The set of classes whose vtables have been used within
5399 /// this translation unit, and a bit that will be true if the vtable is
5400 /// required to be emitted (otherwise, it should be emitted only if needed
5401 /// by code generation).
5402 llvm::DenseMap<CXXRecordDecl *, bool> VTablesUsed;
5403
5404 /// Load any externally-stored vtable uses.
5406
5407 /// Note that the vtable for the given class was used at the
5408 /// given location.
5410 bool DefinitionRequired = false);
5411
5412 /// Mark the exception specifications of all virtual member functions
5413 /// in the given class as needed.
5415 const CXXRecordDecl *RD);
5416
5417 /// MarkVirtualMembersReferenced - Will mark all members of the given
5418 /// CXXRecordDecl referenced.
5420 bool ConstexprOnly = false);
5421
5422 /// Define all of the vtables that have been used in this
5423 /// translation unit and reference any virtual members used by those
5424 /// vtables.
5425 ///
5426 /// \returns true if any work was done, false otherwise.
5427 bool DefineUsedVTables();
5428
5429 /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared
5430 /// special functions, such as the default constructor, copy
5431 /// constructor, or destructor, to the given C++ class (C++
5432 /// [special]p1). This routine can only be executed just before the
5433 /// definition of the class is complete.
5435
5436 /// ActOnMemInitializers - Handle the member initializers for a constructor.
5437 void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc,
5439 bool AnyErrors);
5440
5441 /// Check class-level dllimport/dllexport attribute. The caller must
5442 /// ensure that referenceDLLExportedClassMethods is called some point later
5443 /// when all outer classes of Class are complete.
5446
5448
5449 /// Perform propagation of DLL attributes from a derived class to a
5450 /// templated base class for MS compatibility.
5452 CXXRecordDecl *Class, Attr *ClassAttr,
5453 ClassTemplateSpecializationDecl *BaseTemplateSpec,
5454 SourceLocation BaseLoc);
5455
5456 /// Perform semantic checks on a class definition that has been
5457 /// completing, introducing implicitly-declared members, checking for
5458 /// abstract types, etc.
5459 ///
5460 /// \param S The scope in which the class was parsed. Null if we didn't just
5461 /// parse a class definition.
5462 /// \param Record The completed class.
5464
5465 /// Check that the C++ class annoated with "trivial_abi" satisfies all the
5466 /// conditions that are needed for the attribute to have an effect.
5468
5469 /// Check that VTable Pointer authentication is only being set on the first
5470 /// first instantiation of the vtable
5472
5474 Decl *TagDecl, SourceLocation LBrac,
5475 SourceLocation RBrac,
5476 const ParsedAttributesView &AttrList);
5477
5478 /// Perform any semantic analysis which needs to be delayed until all
5479 /// pending class member declarations have been parsed.
5482
5483 /// This is used to implement the constant expression evaluation part of the
5484 /// attribute enable_if extension. There is nothing in standard C++ which
5485 /// would require reentering parameters.
5487 unsigned ActOnReenterTemplateScope(Decl *Template,
5488 llvm::function_ref<Scope *()> EnterScope);
5490
5491 /// ActOnStartDelayedCXXMethodDeclaration - We have completed
5492 /// parsing a top-level (non-nested) C++ class, and we are now
5493 /// parsing those parts of the given Method declaration that could
5494 /// not be parsed earlier (C++ [class.mem]p2), such as default
5495 /// arguments. This action should enter the scope of the given
5496 /// Method declaration as if we had just parsed the qualified method
5497 /// name. However, it should not bring the parameters into scope;
5498 /// that will be performed by ActOnDelayedCXXMethodParameter.
5500 void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
5502
5503 /// ActOnFinishDelayedCXXMethodDeclaration - We have finished
5504 /// processing the delayed method declaration for Method. The method
5505 /// declaration is now considered finished. There may be a separate
5506 /// ActOnStartOfFunctionDef action later (not necessarily
5507 /// immediately!) for this method, if it was also defined inside the
5508 /// class body.
5511
5512 bool EvaluateStaticAssertMessageAsString(Expr *Message, std::string &Result,
5513 ASTContext &Ctx,
5514 bool ErrorOnInvalidMessage);
5516 Expr *AssertExpr, Expr *AssertMessageExpr,
5517 SourceLocation RParenLoc);
5519 Expr *AssertExpr, Expr *AssertMessageExpr,
5520 SourceLocation RParenLoc, bool Failed);
5521
5522 /// Try to print more useful information about a failed static_assert
5523 /// with expression \E
5524 void DiagnoseStaticAssertDetails(const Expr *E);
5525
5526 /// Handle a friend type declaration. This works in tandem with
5527 /// ActOnTag.
5528 ///
5529 /// Notes on friend class templates:
5530 ///
5531 /// We generally treat friend class declarations as if they were
5532 /// declaring a class. So, for example, the elaborated type specifier
5533 /// in a friend declaration is required to obey the restrictions of a
5534 /// class-head (i.e. no typedefs in the scope chain), template
5535 /// parameters are required to match up with simple template-ids, &c.
5536 /// However, unlike when declaring a template specialization, it's
5537 /// okay to refer to a template specialization without an empty
5538 /// template parameter declaration, e.g.
5539 /// friend class A<T>::B<unsigned>;
5540 /// We permit this as a special case; if there are any template
5541 /// parameters present at all, require proper matching, i.e.
5542 /// template <> template <class T> friend class A<int>::B;
5543 Decl *ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
5544 MultiTemplateParamsArg TemplateParams,
5545 SourceLocation EllipsisLoc);
5547 MultiTemplateParamsArg TemplateParams);
5548
5549 /// CheckConstructorDeclarator - Called by ActOnDeclarator to check
5550 /// the well-formedness of the constructor declarator @p D with type @p
5551 /// R. If there are any errors in the declarator, this routine will
5552 /// emit diagnostics and set the invalid bit to true. In any case, the type
5553 /// will be updated to reflect a well-formed type for the constructor and
5554 /// returned.
5556 StorageClass &SC);
5557
5558 /// CheckConstructor - Checks a fully-formed constructor for
5559 /// well-formedness, issuing any diagnostics required. Returns true if
5560 /// the constructor declarator is invalid.
5561 void CheckConstructor(CXXConstructorDecl *Constructor);
5562
5563 /// CheckDestructorDeclarator - Called by ActOnDeclarator to check
5564 /// the well-formednes of the destructor declarator @p D with type @p
5565 /// R. If there are any errors in the declarator, this routine will
5566 /// emit diagnostics and set the declarator to invalid. Even if this happens,
5567 /// will be updated to reflect a well-formed type for the destructor and
5568 /// returned.
5570 StorageClass &SC);
5571
5572 /// CheckDestructor - Checks a fully-formed destructor definition for
5573 /// well-formedness, issuing any diagnostics required. Returns true
5574 /// on error.
5576
5577 /// CheckConversionDeclarator - Called by ActOnDeclarator to check the
5578 /// well-formednes of the conversion function declarator @p D with
5579 /// type @p R. If there are any errors in the declarator, this routine
5580 /// will emit diagnostics and return true. Otherwise, it will return
5581 /// false. Either way, the type @p R will be updated to reflect a
5582 /// well-formed type for the conversion operator.
5584
5585 /// ActOnConversionDeclarator - Called by ActOnDeclarator to complete
5586 /// the declaration of the given C++ conversion function. This routine
5587 /// is responsible for recording the conversion function in the C++
5588 /// class, if possible.
5590
5591 /// Check the validity of a declarator that we parsed for a deduction-guide.
5592 /// These aren't actually declarators in the grammar, so we need to check that
5593 /// the user didn't specify any pieces that are not part of the
5594 /// deduction-guide grammar. Return true on invalid deduction-guide.
5596 StorageClass &SC);
5597
5599
5602 SourceLocation DefaultLoc);
5604
5605 /// Kinds of defaulted comparison operator functions.
5606 enum class DefaultedComparisonKind : unsigned char {
5607 /// This is not a defaultable comparison operator.
5608 None,
5609 /// This is an operator== that should be implemented as a series of
5610 /// subobject comparisons.
5611 Equal,
5612 /// This is an operator<=> that should be implemented as a series of
5613 /// subobject comparisons.
5614 ThreeWay,
5615 /// This is an operator!= that should be implemented as a rewrite in terms
5616 /// of a == comparison.
5617 NotEqual,
5618 /// This is an <, <=, >, or >= that should be implemented as a rewrite in
5619 /// terms of a <=> comparison.
5620 Relational,
5621 };
5622
5626 FunctionDecl *Spaceship);
5629
5631 QualType R, bool IsLambda,
5632 DeclContext *DC = nullptr);
5634 DeclarationName Name, QualType R);
5636
5637 //===--------------------------------------------------------------------===//
5638 // C++ Derived Classes
5639 //
5640
5641 /// Check the validity of a C++ base class specifier.
5642 ///
5643 /// \returns a new CXXBaseSpecifier if well-formed, emits diagnostics
5644 /// and returns NULL otherwise.
5646 SourceRange SpecifierRange, bool Virtual,
5647 AccessSpecifier Access,
5648 TypeSourceInfo *TInfo,
5649 SourceLocation EllipsisLoc);
5650
5651 /// ActOnBaseSpecifier - Parsed a base specifier. A base specifier is
5652 /// one entry in the base class list of a class specifier, for
5653 /// example:
5654 /// class foo : public bar, virtual private baz {
5655 /// 'public bar' and 'virtual private baz' are each base-specifiers.
5656 BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange,
5657 const ParsedAttributesView &Attrs, bool Virtual,
5658 AccessSpecifier Access, ParsedType basetype,
5659 SourceLocation BaseLoc,
5660 SourceLocation EllipsisLoc);
5661
5662 /// Performs the actual work of attaching the given base class
5663 /// specifiers to a C++ class.
5666
5667 /// ActOnBaseSpecifiers - Attach the given base specifiers to the
5668 /// class, after checking whether there are any duplicate base
5669 /// classes.
5670 void ActOnBaseSpecifiers(Decl *ClassDecl,
5672
5673 /// Determine whether the type \p Derived is a C++ class that is
5674 /// derived from the type \p Base.
5676
5677 /// Determine whether the type \p Derived is a C++ class that is
5678 /// derived from the type \p Base.
5680 CXXBasePaths &Paths);
5681
5682 // FIXME: I don't like this name.
5683 void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath);
5684
5687 CXXCastPath *BasePath = nullptr,
5688 bool IgnoreAccess = false);
5689
5690 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
5691 /// conversion (where Derived and Base are class types) is
5692 /// well-formed, meaning that the conversion is unambiguous (and
5693 /// that all of the base classes are accessible). Returns true
5694 /// and emits a diagnostic if the code is ill-formed, returns false
5695 /// otherwise. Loc is the location where this routine should point to
5696 /// if there is an error, and Range is the source range to highlight
5697 /// if there is an error.
5698 ///
5699 /// If either InaccessibleBaseID or AmbiguousBaseConvID are 0, then the
5700 /// diagnostic for the respective type of error will be suppressed, but the
5701 /// check for ill-formed code will still be performed.
5703 unsigned InaccessibleBaseID,
5704 unsigned AmbiguousBaseConvID,
5706 DeclarationName Name, CXXCastPath *BasePath,
5707 bool IgnoreAccess = false);
5708
5709 /// Builds a string representing ambiguous paths from a
5710 /// specific derived class to different subobjects of the same base
5711 /// class.
5712 ///
5713 /// This function builds a string that can be used in error messages
5714 /// to show the different paths that one can take through the
5715 /// inheritance hierarchy to go from the derived class to different
5716 /// subobjects of a base class. The result looks something like this:
5717 /// @code
5718 /// struct D -> struct B -> struct A
5719 /// struct D -> struct C -> struct A
5720 /// @endcode
5721 std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
5722
5724 const CXXMethodDecl *Old);
5725
5726 /// CheckOverridingFunctionReturnType - Checks whether the return types are
5727 /// covariant, according to C++ [class.virtual]p5.
5729 const CXXMethodDecl *Old);
5730
5731 // Check that the overriding method has no explicit object parameter.
5733 const CXXMethodDecl *Old);
5734
5735 /// Mark the given method pure.
5736 ///
5737 /// \param Method the method to be marked pure.
5738 ///
5739 /// \param InitRange the source range that covers the "0" initializer.
5740 bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange);
5741
5742 /// CheckOverrideControl - Check C++11 override control semantics.
5744
5745 /// DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was
5746 /// not used in the declaration of an overriding method.
5748
5749 /// CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member
5750 /// function overrides a virtual member function marked 'final', according to
5751 /// C++11 [class.virtual]p4.
5753 const CXXMethodDecl *Old);
5754
5765
5766 struct TypeDiagnoser;
5767
5770 TypeDiagnoser &Diagnoser);
5771 template <typename... Ts>
5773 const Ts &...Args) {
5774 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
5775 return RequireNonAbstractType(Loc, T, Diagnoser);
5776 }
5777
5778 void DiagnoseAbstractType(const CXXRecordDecl *RD);
5779
5780 //===--------------------------------------------------------------------===//
5781 // C++ Overloaded Operators [C++ 13.5]
5782 //
5783
5784 /// CheckOverloadedOperatorDeclaration - Check whether the declaration
5785 /// of this overloaded operator is well-formed. If so, returns false;
5786 /// otherwise, emits appropriate diagnostics and returns true.
5788
5789 /// CheckLiteralOperatorDeclaration - Check whether the declaration
5790 /// of this literal operator function is well-formed. If so, returns
5791 /// false; otherwise, emits appropriate diagnostics and returns true.
5793
5794 /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression
5795 /// found in an explicit(bool) specifier.
5797
5798 /// tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
5799 /// Returns true if the explicit specifier is now resolved.
5801
5802 /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
5803 /// C++ if/switch/while/for statement.
5804 /// e.g: "if (int x = f()) {...}"
5806
5807 // Emitting members of dllexported classes is delayed until the class
5808 // (including field initializers) is fully parsed.
5811
5812 /// Merge the exception specifications of two variable declarations.
5813 ///
5814 /// This is called when there's a redeclaration of a VarDecl. The function
5815 /// checks if the redeclaration might have an exception specification and
5816 /// validates compatibility and merges the specs if necessary.
5818
5819 /// MergeCXXFunctionDecl - Merge two declarations of the same C++
5820 /// function, once we already know that they have the same
5821 /// type. Subroutine of MergeFunctionDecl. Returns true if there was an
5822 /// error, false otherwise.
5824
5825 /// Helpers for dealing with blocks and functions.
5827
5828 /// CheckExtraCXXDefaultArguments - Check for any extra default
5829 /// arguments in the declarator, which is not a function declaration
5830 /// or definition and therefore is not permitted to have default
5831 /// arguments. This routine should be invoked for every declarator
5832 /// that is not a function declaration or definition.
5834
5837 }
5838
5839 /// Perform semantic analysis for the variable declaration that
5840 /// occurs within a C++ catch clause, returning the newly-created
5841 /// variable.
5843 SourceLocation StartLoc,
5844 SourceLocation IdLoc,
5845 const IdentifierInfo *Id);
5846
5847 /// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
5848 /// handler.
5850
5852
5853 /// Handle a friend tag declaration where the scope specifier was
5854 /// templated.
5856 unsigned TagSpec, SourceLocation TagLoc,
5857 CXXScopeSpec &SS, IdentifierInfo *Name,
5858 SourceLocation NameLoc,
5859 SourceLocation EllipsisLoc,
5861 MultiTemplateParamsArg TempParamLists);
5862
5864 SourceLocation DeclStart, Declarator &D,
5865 Expr *BitfieldWidth,
5866 InClassInitStyle InitStyle,
5867 AccessSpecifier AS,
5868 const ParsedAttr &MSPropertyAttr);
5869
5870 /// Diagnose why the specified class does not have a trivial special member of
5871 /// the given kind.
5874
5876 /// The triviality of a method unaffected by "trivial_abi".
5878
5879 /// The triviality of a method affected by "trivial_abi".
5882
5883 /// Determine whether a defaulted or deleted special member function is
5884 /// trivial, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p12,
5885 /// C++11 [class.copy]p25, and C++11 [class.dtor]p5.
5888 bool Diagnose = false);
5889
5890 /// For a defaulted function, the kind of defaulted function that it is.
5892 LLVM_PREFERRED_TYPE(CXXSpecialMemberKind)
5893 unsigned SpecialMember : 8;
5894 unsigned Comparison : 8;
5895
5896 public:
5898 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
5899 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
5901 : SpecialMember(llvm::to_underlying(CSM)),
5902 Comparison(llvm::to_underlying(DefaultedComparisonKind::None)) {}
5904 : SpecialMember(llvm::to_underlying(CXXSpecialMemberKind::Invalid)),
5905 Comparison(llvm::to_underlying(Comp)) {}
5906
5907 bool isSpecialMember() const {
5908 return static_cast<CXXSpecialMemberKind>(SpecialMember) !=
5909 CXXSpecialMemberKind::Invalid;
5910 }
5911 bool isComparison() const {
5912 return static_cast<DefaultedComparisonKind>(Comparison) !=
5913 DefaultedComparisonKind::None;
5914 }
5915
5916 explicit operator bool() const {
5917 return isSpecialMember() || isComparison();
5918 }
5919
5921 return static_cast<CXXSpecialMemberKind>(SpecialMember);
5922 }
5924 return static_cast<DefaultedComparisonKind>(Comparison);
5925 }
5926
5927 /// Get the index of this function kind for use in diagnostics.
5928 unsigned getDiagnosticIndex() const {
5929 static_assert(llvm::to_underlying(CXXSpecialMemberKind::Invalid) >
5930 llvm::to_underlying(CXXSpecialMemberKind::Destructor),
5931 "invalid should have highest index");
5932 static_assert((unsigned)DefaultedComparisonKind::None == 0,
5933 "none should be equal to zero");
5934 return SpecialMember + Comparison;
5935 }
5936 };
5937
5938 /// Determine the kind of defaulting that would be done for a given function.
5939 ///
5940 /// If the function is both a default constructor and a copy / move
5941 /// constructor (due to having a default argument for the first parameter),
5942 /// this picks CXXSpecialMemberKind::DefaultConstructor.
5943 ///
5944 /// FIXME: Check that case is properly handled by all callers.
5945 DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD);
5946
5947 /// Handle a C++11 empty-declaration and attribute-declaration.
5949 SourceLocation SemiLoc);
5950
5952 /// Diagnose issues that are non-constant or that are extensions.
5953 Diagnose,
5954 /// Identify whether this function satisfies the formal rules for constexpr
5955 /// functions in the current lanugage mode (with no extensions).
5957 };
5958
5959 // Check whether a function declaration satisfies the requirements of a
5960 // constexpr function definition or a constexpr constructor definition. If so,
5961 // return true. If not, produce appropriate diagnostics (unless asked not to
5962 // by Kind) and return false.
5963 //
5964 // This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.
5967
5968 /// Diagnose methods which overload virtual methods in a base class
5969 /// without overriding any.
5971
5972 /// Check if a method overloads virtual methods in a base class without
5973 /// overriding any.
5974 void
5976 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
5977 void
5979 SmallVectorImpl<CXXMethodDecl *> &OverloadedMethods);
5980
5981 /// ActOnParamDefaultArgument - Check whether the default argument
5982 /// provided for a function parameter is well-formed. If so, attach it
5983 /// to the parameter declaration.
5984 void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc,
5985 Expr *defarg);
5986
5987 /// ActOnParamUnparsedDefaultArgument - We've seen a default
5988 /// argument for a function parameter, but we can't parse it yet
5989 /// because we're inside a class definition. Note that this default
5990 /// argument will be parsed later.
5992 SourceLocation ArgLoc);
5993
5994 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
5995 /// the default argument for the parameter param failed.
5997 Expr *DefaultArg);
5999 SourceLocation EqualLoc);
6000 void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
6001 SourceLocation EqualLoc);
6002
6003 void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc);
6004 void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc,
6005 StringLiteral *Message = nullptr);
6006 void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc);
6007
6009 StringLiteral *DeletedMessage = nullptr);
6013
6014 NamedDecl *
6016 MultiTemplateParamsArg TemplateParamLists);
6019 RecordDecl *ClassDecl,
6020 const IdentifierInfo *Name);
6021
6023
6024 /// Stack containing information needed when in C++2a an 'auto' is encountered
6025 /// in a function declaration parameter type specifier in order to invent a
6026 /// corresponding template parameter in the enclosing abbreviated function
6027 /// template. This information is also present in LambdaScopeInfo, stored in
6028 /// the FunctionScopes stack.
6030
6031 /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
6032 std::unique_ptr<CXXFieldCollector> FieldCollector;
6033
6035 /// Set containing all declared private fields that are not used.
6037
6039
6040 /// PureVirtualClassDiagSet - a set of class declarations which we have
6041 /// emitted a list of pure virtual functions. Used to prevent emitting the
6042 /// same list more than once.
6043 std::unique_ptr<RecordDeclSetTy> PureVirtualClassDiagSet;
6044
6048
6049 /// All the delegating constructors seen so far in the file, used for
6050 /// cycle detection at the end of the TU.
6052
6053 /// The C++ "std" namespace, where the standard library resides.
6055
6056 /// The C++ "std::initializer_list" template, which is defined in
6057 /// <initializer_list>.
6059
6060 // Contains the locations of the beginning of unparsed default
6061 // argument locations.
6062 llvm::DenseMap<ParmVarDecl *, SourceLocation> UnparsedDefaultArgLocs;
6063
6064 /// UndefinedInternals - all the used, undefined objects which require a
6065 /// definition in this translation unit.
6066 llvm::MapVector<NamedDecl *, SourceLocation> UndefinedButUsed;
6067
6068 typedef llvm::PointerIntPair<CXXRecordDecl *, 3, CXXSpecialMemberKind>
6070
6071 /// The C++ special members which we are currently in the process of
6072 /// declaring. If this process recursively triggers the declaration of the
6073 /// same special member, we should act as if it is not yet declared.
6075
6077
6078 void ActOnDefaultCtorInitializers(Decl *CDtorDecl);
6079
6082 ParsingClassDepth++;
6084 }
6086 ParsingClassDepth--;
6088 }
6089
6091 CXXScopeSpec &SS,
6092 ParsedType TemplateTypeTy,
6093 IdentifierInfo *MemberOrBase);
6094
6095private:
6096 void setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
6097 QualType ResultTy,
6098 ArrayRef<QualType> Args);
6099
6100 // A cache representing if we've fully checked the various comparison category
6101 // types stored in ASTContext. The bit-index corresponds to the integer value
6102 // of a ComparisonCategoryType enumerator.
6103 llvm::SmallBitVector FullyCheckedComparisonCategories;
6104
6105 /// Check if there is a field shadowing.
6106 void CheckShadowInheritedFields(const SourceLocation &Loc,
6107 DeclarationName FieldName,
6108 const CXXRecordDecl *RD,
6109 bool DeclIsField = true);
6110
6111 ///@}
6112
6113 //
6114 //
6115 // -------------------------------------------------------------------------
6116 //
6117 //
6118
6119 /// \name C++ Exception Specifications
6120 /// Implementations are in SemaExceptionSpec.cpp
6121 ///@{
6122
6123public:
6124 /// All the overriding functions seen during a class definition
6125 /// that had their exception spec checks delayed, plus the overridden
6126 /// function.
6129
6130 /// All the function redeclarations seen during a class definition that had
6131 /// their exception spec checks delayed, plus the prior declaration they
6132 /// should be checked against. Except during error recovery, the new decl
6133 /// should always be a friend declaration, as that's the only valid way to
6134 /// redeclare a special member before its class is complete.
6137
6138 /// Determine if we're in a case where we need to (incorrectly) eagerly
6139 /// parse an exception specification to work around a libstdc++ bug.
6141
6142 /// Check the given noexcept-specifier, convert its expression, and compute
6143 /// the appropriate ExceptionSpecificationType.
6144 ExprResult ActOnNoexceptSpec(Expr *NoexceptExpr,
6146
6147 CanThrowResult canThrow(const Stmt *E);
6148 /// Determine whether the callee of a particular function call can throw.
6149 /// E, D and Loc are all optional.
6150 static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D,
6153 const FunctionProtoType *FPT);
6156
6157 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
6158 /// exception specification. Incomplete types, or pointers to incomplete types
6159 /// other than void are not allowed.
6160 ///
6161 /// \param[in,out] T The exception type. This will be decayed to a pointer
6162 /// type
6163 /// when the input is an array or a function type.
6165
6166 /// CheckDistantExceptionSpec - Check if the given type is a pointer or
6167 /// pointer to member to a function with an exception specification. This
6168 /// means that it is invalid to add another level of indirection.
6171
6172 /// CheckEquivalentExceptionSpec - Check if the two types have equivalent
6173 /// exception specifications. Exception specifications are equivalent if
6174 /// they allow exactly the same set of exception types. It does not matter how
6175 /// that is achieved. See C++ [except.spec]p2.
6177 SourceLocation OldLoc,
6178 const FunctionProtoType *New,
6179 SourceLocation NewLoc);
6181 const PartialDiagnostic &NoteID,
6182 const FunctionProtoType *Old,
6183 SourceLocation OldLoc,
6184 const FunctionProtoType *New,
6185 SourceLocation NewLoc);
6186 bool handlerCanCatch(QualType HandlerType, QualType ExceptionType);
6187
6188 /// CheckExceptionSpecSubset - Check whether the second function type's
6189 /// exception specification is a subset (or equivalent) of the first function
6190 /// type. This is used by override and pointer assignment checks.
6192 const PartialDiagnostic &DiagID, const PartialDiagnostic &NestedDiagID,
6193 const PartialDiagnostic &NoteID, const PartialDiagnostic &NoThrowDiagID,
6194 const FunctionProtoType *Superset, bool SkipSupersetFirstParameter,
6195 SourceLocation SuperLoc, const FunctionProtoType *Subset,
6196 bool SkipSubsetFirstParameter, SourceLocation SubLoc);
6197
6198 /// CheckParamExceptionSpec - Check if the parameter and return types of the
6199 /// two functions have equivalent exception specs. This is part of the
6200 /// assignment and override compatibility check. We do not check the
6201 /// parameters of parameter function pointers recursively, as no sane
6202 /// programmer would even be able to write such a function type.
6204 const PartialDiagnostic &NestedDiagID, const PartialDiagnostic &NoteID,
6205 const FunctionProtoType *Target, bool SkipTargetFirstParameter,
6206 SourceLocation TargetLoc, const FunctionProtoType *Source,
6207 bool SkipSourceFirstParameter, SourceLocation SourceLoc);
6208
6209 bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType);
6210
6211 /// CheckOverridingFunctionExceptionSpec - Checks whether the exception
6212 /// spec is a subset of base spec.
6214 const CXXMethodDecl *Old);
6215
6216 ///@}
6217
6218 //
6219 //
6220 // -------------------------------------------------------------------------
6221 //
6222 //
6223
6224 /// \name Expressions
6225 /// Implementations are in SemaExpr.cpp
6226 ///@{
6227
6228public:
6229 /// Describes how the expressions currently being parsed are
6230 /// evaluated at run-time, if at all.
6232 /// The current expression and its subexpressions occur within an
6233 /// unevaluated operand (C++11 [expr]p7), such as the subexpression of
6234 /// \c sizeof, where the type of the expression may be significant but
6235 /// no code will be generated to evaluate the value of the expression at
6236 /// run time.
6238
6239 /// The current expression occurs within a braced-init-list within
6240 /// an unevaluated operand. This is mostly like a regular unevaluated
6241 /// context, except that we still instantiate constexpr functions that are
6242 /// referenced here so that we can perform narrowing checks correctly.
6244
6245 /// The current expression occurs within a discarded statement.
6246 /// This behaves largely similarly to an unevaluated operand in preventing
6247 /// definitions from being required, but not in other ways.
6249
6250 /// The current expression occurs within an unevaluated
6251 /// operand that unconditionally permits abstract references to
6252 /// fields, such as a SIZE operator in MS-style inline assembly.
6254
6255 /// The current context is "potentially evaluated" in C++11 terms,
6256 /// but the expression is evaluated at compile-time (like the values of
6257 /// cases in a switch statement).
6259
6260 /// In addition of being constant evaluated, the current expression
6261 /// occurs in an immediate function context - either a consteval function
6262 /// or a consteval if statement.
6264
6265 /// The current expression is potentially evaluated at run time,
6266 /// which means that code may be generated to evaluate the value of the
6267 /// expression at run time.
6269
6270 /// The current expression is potentially evaluated, but any
6271 /// declarations referenced inside that expression are only used if
6272 /// in fact the current expression is used.
6273 ///
6274 /// This value is used when parsing default function arguments, for which
6275 /// we would like to provide diagnostics (e.g., passing non-POD arguments
6276 /// through varargs) but do not want to mark declarations as "referenced"
6277 /// until the default argument is used.
6279 };
6280
6281 /// Store a set of either DeclRefExprs or MemberExprs that contain a reference
6282 /// to a variable (constant) that may or may not be odr-used in this Expr, and
6283 /// we won't know until all lvalue-to-rvalue and discarded value conversions
6284 /// have been applied to all subexpressions of the enclosing full expression.
6285 /// This is cleared at the end of each full expression.
6288
6289 using ImmediateInvocationCandidate = llvm::PointerIntPair<ConstantExpr *, 1>;
6290
6291 /// Data structure used to record current or nested
6292 /// expression evaluation contexts.
6294 /// The expression evaluation context.
6296
6297 /// Whether the enclosing context needed a cleanup.
6299
6300 /// The number of active cleanup objects when we entered
6301 /// this expression evaluation context.
6303
6304 /// The number of typos encountered during this expression evaluation
6305 /// context (i.e. the number of TypoExprs created).
6306 unsigned NumTypos;
6307
6309
6310 /// The lambdas that are present within this context, if it
6311 /// is indeed an unevaluated context.
6313
6314 /// The declaration that provides context for lambda expressions
6315 /// and block literals if the normal declaration context does not
6316 /// suffice, e.g., in a default function argument.
6318
6319 /// If we are processing a decltype type, a set of call expressions
6320 /// for which we have deferred checking the completeness of the return type.
6322
6323 /// If we are processing a decltype type, a set of temporary binding
6324 /// expressions for which we have deferred checking the destructor.
6326
6328
6329 /// Expressions appearing as the LHS of a volatile assignment in this
6330 /// context. We produce a warning for these when popping the context if
6331 /// they are not discarded-value expressions nor unevaluated operands.
6333
6334 /// Set of candidates for starting an immediate invocation.
6337
6338 /// Set of DeclRefExprs referencing a consteval function when used in a
6339 /// context not already known to be immediately invoked.
6341
6342 /// P2718R0 - Lifetime extension in range-based for loops.
6343 /// MaterializeTemporaryExprs in for-range-init expressions which need to
6344 /// extend lifetime. Add MaterializeTemporaryExpr* if the value of
6345 /// InLifetimeExtendingContext is true.
6347
6348 /// \brief Describes whether we are in an expression constext which we have
6349 /// to handle differently.
6354 EK_Other
6355 } ExprContext;
6356
6357 // A context can be nested in both a discarded statement context and
6358 // an immediate function context, so they need to be tracked independently.
6362
6363 bool IsCurrentlyCheckingDefaultArgumentOrInitializer = false;
6364
6365 // We are in a constant context, but we also allow
6366 // non constant expressions, for example for array bounds (which may be
6367 // VLAs).
6368 bool InConditionallyConstantEvaluateContext = false;
6369
6370 /// Whether we are currently in a context in which all temporaries must be
6371 /// lifetime-extended, even if they're not bound to a reference (for
6372 /// example, in a for-range initializer).
6373 bool InLifetimeExtendingContext = false;
6374
6375 /// Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
6376 bool RebuildDefaultArgOrDefaultInit = false;
6377
6378 // When evaluating immediate functions in the initializer of a default
6379 // argument or default member initializer, this is the declaration whose
6380 // default initializer is being evaluated and the location of the call
6381 // or constructor definition.
6384 DeclContext *Context)
6385 : Loc(Loc), Decl(Decl), Context(Context) {
6386 assert(Decl && Context && "invalid initialization context");
6387 }
6388
6390 ValueDecl *Decl = nullptr;
6391 DeclContext *Context = nullptr;
6392 };
6393 std::optional<InitializationContext> DelayedDefaultInitializationContext;
6394
6396 unsigned NumCleanupObjects,
6397 CleanupInfo ParentCleanup,
6398 Decl *ManglingContextDecl,
6399 ExpressionKind ExprContext)
6400 : Context(Context), ParentCleanup(ParentCleanup),
6401 NumCleanupObjects(NumCleanupObjects), NumTypos(0),
6402 ManglingContextDecl(ManglingContextDecl), ExprContext(ExprContext),
6403 InDiscardedStatement(false), InImmediateFunctionContext(false),
6404 InImmediateEscalatingFunctionContext(false) {}
6405
6406 bool isUnevaluated() const {
6407 return Context == ExpressionEvaluationContext::Unevaluated ||
6408 Context == ExpressionEvaluationContext::UnevaluatedAbstract ||
6409 Context == ExpressionEvaluationContext::UnevaluatedList;
6410 }
6411
6413 return Context == ExpressionEvaluationContext::PotentiallyEvaluated ||
6414 Context ==
6415 ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed ||
6416 Context == ExpressionEvaluationContext::ConstantEvaluated;
6417 }
6418
6419 bool isConstantEvaluated() const {
6420 return Context == ExpressionEvaluationContext::ConstantEvaluated ||
6421 Context == ExpressionEvaluationContext::ImmediateFunctionContext;
6422 }
6423
6425 return Context == ExpressionEvaluationContext::ImmediateFunctionContext ||
6426 (Context == ExpressionEvaluationContext::DiscardedStatement &&
6427 InImmediateFunctionContext) ||
6428 // C++23 [expr.const]p14:
6429 // An expression or conversion is in an immediate function
6430 // context if it is potentially evaluated and either:
6431 // * its innermost enclosing non-block scope is a function
6432 // parameter scope of an immediate function, or
6433 // * its enclosing statement is enclosed by the compound-
6434 // statement of a consteval if statement.
6435 (Context == ExpressionEvaluationContext::PotentiallyEvaluated &&
6436 InImmediateFunctionContext);
6437 }
6438
6440 return Context == ExpressionEvaluationContext::DiscardedStatement ||
6441 (Context ==
6442 ExpressionEvaluationContext::ImmediateFunctionContext &&
6443 InDiscardedStatement);
6444 }
6445 };
6446
6448 assert(!ExprEvalContexts.empty() &&
6449 "Must be in an expression evaluation context");
6450 return ExprEvalContexts.back();
6451 };
6452
6454 assert(!ExprEvalContexts.empty() &&
6455 "Must be in an expression evaluation context");
6456 return ExprEvalContexts.back();
6457 };
6458
6460 assert(ExprEvalContexts.size() >= 2 &&
6461 "Must be in an expression evaluation context");
6462 return ExprEvalContexts[ExprEvalContexts.size() - 2];
6463 };
6464
6466 return const_cast<Sema *>(this)->parentEvaluationContext();
6467 };
6468
6469 bool isAttrContext() const {
6470 return ExprEvalContexts.back().ExprContext ==
6472 }
6473
6474 /// Increment when we find a reference; decrement when we find an ignored
6475 /// assignment. Ultimately the value is 0 if every reference is an ignored
6476 /// assignment.
6477 llvm::DenseMap<const VarDecl *, int> RefsMinusAssignments;
6478
6479 /// Used to control the generation of ExprWithCleanups.
6481
6482 /// ExprCleanupObjects - This is the stack of objects requiring
6483 /// cleanup that are created by the current full expression.
6485
6486 /// Determine whether the use of this declaration is valid, without
6487 /// emitting diagnostics.
6488 bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid);
6489 // A version of DiagnoseUseOfDecl that should be used if overload resolution
6490 // has been used to find this declaration, which means we don't have to bother
6491 // checking the trailing requires clause.
6493 return DiagnoseUseOfDecl(
6494 D, Loc, /*UnknownObjCClass=*/nullptr, /*ObjCPropertyAccess=*/false,
6495 /*AvoidPartialAvailabilityChecks=*/false, /*ClassReceiver=*/nullptr,
6496 /*SkipTrailingRequiresClause=*/true);
6497 }
6498
6499 /// Determine whether the use of this declaration is valid, and
6500 /// emit any corresponding diagnostics.
6501 ///
6502 /// This routine diagnoses various problems with referencing
6503 /// declarations that can occur when using a declaration. For example,
6504 /// it might warn if a deprecated or unavailable declaration is being
6505 /// used, or produce an error (and return true) if a C++0x deleted
6506 /// function is being used.
6507 ///
6508 /// \returns true if there was an error (this declaration cannot be
6509 /// referenced), false otherwise.
6511 const ObjCInterfaceDecl *UnknownObjCClass = nullptr,
6512 bool ObjCPropertyAccess = false,
6513 bool AvoidPartialAvailabilityChecks = false,
6514 ObjCInterfaceDecl *ClassReciever = nullptr,
6515 bool SkipTrailingRequiresClause = false);
6516
6517 /// Emit a note explaining that this function is deleted.
6519
6520 /// DiagnoseSentinelCalls - This routine checks whether a call or
6521 /// message-send is to a declaration with the sentinel attribute, and
6522 /// if so, it checks that the requirements of the sentinel are
6523 /// satisfied.
6525 ArrayRef<Expr *> Args);
6526
6528 ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl = nullptr,
6537
6539
6543
6544 /// Check whether E, which is either a discarded-value expression or an
6545 /// unevaluated operand, is a simple-assignment to a volatlie-qualified
6546 /// lvalue, and if so, remove it from the list of volatile-qualified
6547 /// assignments that we are going to warn are deprecated.
6549
6551
6552 // Functions for marking a declaration referenced. These functions also
6553 // contain the relevant logic for marking if a reference to a function or
6554 // variable is an odr-use (in the C++11 sense). There are separate variants
6555 // for expressions referring to a decl; these exist because odr-use marking
6556 // needs to be delayed for some constant variables when we build one of the
6557 // named expressions.
6558 //
6559 // MightBeOdrUse indicates whether the use could possibly be an odr-use, and
6560 // should usually be true. This only needs to be set to false if the lack of
6561 // odr-use cannot be determined from the current context (for instance,
6562 // because the name denotes a virtual function and was written without an
6563 // explicit nested-name-specifier).
6564 void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse);
6565
6566 /// Mark a function referenced, and check whether it is odr-used
6567 /// (C++ [basic.def.odr]p2, C99 6.9p3)
6569 bool MightBeOdrUse = true);
6570
6571 /// Mark a variable referenced, and check whether it is odr-used
6572 /// (C++ [basic.def.odr]p2, C99 6.9p3). Note that this should not be
6573 /// used directly for normal expressions referring to VarDecl.
6575
6576 /// Perform reference-marking and odr-use handling for a DeclRefExpr.
6577 ///
6578 /// Note, this may change the dependence of the DeclRefExpr, and so needs to
6579 /// be handled with care if the DeclRefExpr is not newly-created.
6580 void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base = nullptr);
6581
6582 /// Perform reference-marking and odr-use handling for a MemberExpr.
6584
6585 /// Perform reference-marking and odr-use handling for a FunctionParmPackExpr.
6588 unsigned CapturingScopeIndex);
6589
6591 void CleanupVarDeclMarking();
6592
6598
6599 /// Try to capture the given variable.
6600 ///
6601 /// \param Var The variable to capture.
6602 ///
6603 /// \param Loc The location at which the capture occurs.
6604 ///
6605 /// \param Kind The kind of capture, which may be implicit (for either a
6606 /// block or a lambda), or explicit by-value or by-reference (for a lambda).
6607 ///
6608 /// \param EllipsisLoc The location of the ellipsis, if one is provided in
6609 /// an explicit lambda capture.
6610 ///
6611 /// \param BuildAndDiagnose Whether we are actually supposed to add the
6612 /// captures or diagnose errors. If false, this routine merely check whether
6613 /// the capture can occur without performing the capture itself or complaining
6614 /// if the variable cannot be captured.
6615 ///
6616 /// \param CaptureType Will be set to the type of the field used to capture
6617 /// this variable in the innermost block or lambda. Only valid when the
6618 /// variable can be captured.
6619 ///
6620 /// \param DeclRefType Will be set to the type of a reference to the capture
6621 /// from within the current scope. Only valid when the variable can be
6622 /// captured.
6623 ///
6624 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
6625 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
6626 /// This is useful when enclosing lambdas must speculatively capture
6627 /// variables that may or may not be used in certain specializations of
6628 /// a nested generic lambda.
6629 ///
6630 /// \returns true if an error occurred (i.e., the variable cannot be
6631 /// captured) and false if the capture succeeded.
6633 TryCaptureKind Kind, SourceLocation EllipsisLoc,
6634 bool BuildAndDiagnose, QualType &CaptureType,
6635 QualType &DeclRefType,
6636 const unsigned *const FunctionScopeIndexToStopAt);
6637
6638 /// Try to capture the given variable.
6641 SourceLocation EllipsisLoc = SourceLocation());
6642
6643 /// Checks if the variable must be captured.
6645
6646 /// Given a variable, determine the type that a reference to that
6647 /// variable will have in the given scope.
6649
6650 /// Mark all of the declarations referenced within a particular AST node as
6651 /// referenced. Used when template instantiation instantiates a non-dependent
6652 /// type -- entities referenced by the type are now referenced.
6654
6655 /// Mark any declarations that appear within this expression or any
6656 /// potentially-evaluated subexpressions as "referenced".
6657 ///
6658 /// \param SkipLocalVariables If true, don't mark local variables as
6659 /// 'referenced'.
6660 /// \param StopAt Subexpressions that we shouldn't recurse into.
6662 bool SkipLocalVariables = false,
6663 ArrayRef<const Expr *> StopAt = {});
6664
6665 /// Try to convert an expression \p E to type \p Ty. Returns the result of the
6666 /// conversion.
6667 ExprResult tryConvertExprToType(Expr *E, QualType Ty);
6668
6669 /// Conditionally issue a diagnostic based on the statements's reachability
6670 /// analysis.
6671 ///
6672 /// \param Stmts If Stmts is non-empty, delay reporting the diagnostic until
6673 /// the function body is parsed, and then do a basic reachability analysis to
6674 /// determine if the statement is reachable. If it is unreachable, the
6675 /// diagnostic will not be emitted.
6676 bool DiagIfReachable(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
6677 const PartialDiagnostic &PD);
6678
6679 /// Conditionally issue a diagnostic based on the current
6680 /// evaluation context.
6681 ///
6682 /// \param Statement If Statement is non-null, delay reporting the
6683 /// diagnostic until the function body is parsed, and then do a basic
6684 /// reachability analysis to determine if the statement is reachable.
6685 /// If it is unreachable, the diagnostic will not be emitted.
6686 bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement,
6687 const PartialDiagnostic &PD);
6688 /// Similar, but diagnostic is only produced if all the specified statements
6689 /// are reachable.
6690 bool DiagRuntimeBehavior(SourceLocation Loc, ArrayRef<const Stmt *> Stmts,
6691 const PartialDiagnostic &PD);
6692
6693 // Primary Expressions.
6694 SourceRange getExprRange(Expr *E) const;
6695
6696 ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS,
6697 SourceLocation TemplateKWLoc, UnqualifiedId &Id,
6698 bool HasTrailingLParen, bool IsAddressOfOperand,
6699 CorrectionCandidateCallback *CCC = nullptr,
6700 bool IsInlineAsmIdentifier = false,
6701 Token *KeywordReplacement = nullptr);
6702
6703 /// Decomposes the given name into a DeclarationNameInfo, its location, and
6704 /// possibly a list of template arguments.
6705 ///
6706 /// If this produces template arguments, it is permitted to call
6707 /// DecomposeTemplateName.
6708 ///
6709 /// This actually loses a lot of source location information for
6710 /// non-standard name kinds; we should consider preserving that in
6711 /// some way.
6712 void DecomposeUnqualifiedId(const UnqualifiedId &Id,
6713 TemplateArgumentListInfo &Buffer,
6714 DeclarationNameInfo &NameInfo,
6715 const TemplateArgumentListInfo *&TemplateArgs);
6716
6717 /// Diagnose a lookup that found results in an enclosing class during error
6718 /// recovery. This usually indicates that the results were found in a
6719 /// dependent base class that could not be searched as part of a template
6720 /// definition. Always issues a diagnostic (though this may be only a warning
6721 /// in MS compatibility mode).
6722 ///
6723 /// Return \c true if the error is unrecoverable, or \c false if the caller
6724 /// should attempt to recover using these lookup results.
6725 bool DiagnoseDependentMemberLookup(const LookupResult &R);
6726
6727 /// Diagnose an empty lookup.
6728 ///
6729 /// \return false if new lookup candidates were found
6730 bool
6731 DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
6732 CorrectionCandidateCallback &CCC,
6733 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
6734 ArrayRef<Expr *> Args = {},
6735 DeclContext *LookupCtx = nullptr,
6736 TypoExpr **Out = nullptr);
6737
6738 /// If \p D cannot be odr-used in the current expression evaluation context,
6739 /// return a reason explaining why. Otherwise, return NOUR_None.
6741
6742 DeclRefExpr *BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
6743 SourceLocation Loc,
6744 const CXXScopeSpec *SS = nullptr);
6745 DeclRefExpr *
6746 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
6747 const DeclarationNameInfo &NameInfo,
6748 const CXXScopeSpec *SS = nullptr,
6749 NamedDecl *FoundD = nullptr,
6750 SourceLocation TemplateKWLoc = SourceLocation(),
6751 const TemplateArgumentListInfo *TemplateArgs = nullptr);
6752
6753 /// BuildDeclRefExpr - Build an expression that references a
6754 /// declaration that does not require a closure capture.
6755 DeclRefExpr *
6756 BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
6757 const DeclarationNameInfo &NameInfo,
6758 NestedNameSpecifierLoc NNS, NamedDecl *FoundD = nullptr,
6759 SourceLocation TemplateKWLoc = SourceLocation(),
6760 const TemplateArgumentListInfo *TemplateArgs = nullptr);
6761
6762 bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R,
6763 bool HasTrailingLParen);
6764
6765 /// BuildQualifiedDeclarationNameExpr - Build a C++ qualified
6766 /// declaration name, generally during template instantiation.
6767 /// There's a large number of things which don't need to be done along
6768 /// this path.
6770 CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
6771 bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI = nullptr);
6772
6773 ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R,
6774 bool NeedsADL,
6775 bool AcceptInvalidDecl = false);
6776
6777 /// Complete semantic analysis for a reference to the given declaration.
6779 const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D,
6780 NamedDecl *FoundD = nullptr,
6781 const TemplateArgumentListInfo *TemplateArgs = nullptr,
6782 bool AcceptInvalidDecl = false);
6783
6784 // ExpandFunctionLocalPredefinedMacros - Returns a new vector of Tokens,
6785 // where Tokens representing function local predefined macros (such as
6786 // __FUNCTION__) are replaced (expanded) with string-literal Tokens.
6787 std::vector<Token> ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> Toks);
6788
6791 ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val);
6792
6793 bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero);
6794
6795 ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope = nullptr);
6796 ExprResult ActOnCharacterConstant(const Token &Tok,
6797 Scope *UDLScope = nullptr);
6798 ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E);
6799 ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R,
6800 MultiExprArg Val);
6801
6802 /// ActOnStringLiteral - The specified tokens were lexed as pasted string
6803 /// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle
6804 /// string concatenation ([C99 5.1.1.2, translation phase #6]), so it may come
6805 /// from multiple tokens. However, the common case is that StringToks points
6806 /// to one string.
6807 ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
6808 Scope *UDLScope = nullptr);
6809
6810 ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
6811
6812 /// ControllingExprOrType is either an opaque pointer coming out of a
6813 /// ParsedType or an Expr *. FIXME: it'd be better to split this interface
6814 /// into two so we don't take a void *, but that's awkward because one of
6815 /// the operands is either a ParsedType or an Expr *, which doesn't lend
6816 /// itself to generic code very well.
6817 ExprResult ActOnGenericSelectionExpr(SourceLocation KeyLoc,
6818 SourceLocation DefaultLoc,
6819 SourceLocation RParenLoc,
6820 bool PredicateIsExpr,
6821 void *ControllingExprOrType,
6822 ArrayRef<ParsedType> ArgTypes,
6823 ArrayRef<Expr *> ArgExprs);
6824 /// ControllingExprOrType is either a TypeSourceInfo * or an Expr *. FIXME:
6825 /// it'd be better to split this interface into two so we don't take a
6826 /// void *, but see the FIXME on ActOnGenericSelectionExpr as to why that
6827 /// isn't a trivial change.
6828 ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc,
6829 SourceLocation DefaultLoc,
6830 SourceLocation RParenLoc,
6831 bool PredicateIsExpr,
6832 void *ControllingExprOrType,
6833 ArrayRef<TypeSourceInfo *> Types,
6834 ArrayRef<Expr *> Exprs);
6835
6836 // Binary/Unary Operators. 'Tok' is the token for the operator.
6837 ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc,
6838 Expr *InputExpr, bool IsAfterAmp = false);
6839 ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc,
6840 Expr *Input, bool IsAfterAmp = false);
6841
6842 /// Unary Operators. 'Tok' is the token for the operator.
6843 ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op,
6844 Expr *Input, bool IsAfterAmp = false);
6845
6846 /// Determine whether the given expression is a qualified member
6847 /// access expression, of a form that could be turned into a pointer to member
6848 /// with the address-of operator.
6849 bool isQualifiedMemberAccess(Expr *E);
6850 bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc,
6851 const Expr *Op,
6852 const CXXMethodDecl *MD);
6853
6854 /// CheckAddressOfOperand - The operand of & must be either a function
6855 /// designator or an lvalue designating an object. If it is an lvalue, the
6856 /// object cannot be declared with storage class register or be a bit field.
6857 /// Note: The usual conversions are *not* applied to the operand of the &
6858 /// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
6859 /// In C++, the operand might be an overloaded function name, in which case
6860 /// we allow the '&' but retain the overloaded-function type.
6861 QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc);
6862
6863 /// ActOnAlignasTypeArgument - Handle @c alignas(type-id) and @c
6864 /// _Alignas(type-name) .
6865 /// [dcl.align] An alignment-specifier of the form
6866 /// alignas(type-id) has the same effect as alignas(alignof(type-id)).
6867 ///
6868 /// [N1570 6.7.5] _Alignas(type-name) is equivalent to
6869 /// _Alignas(_Alignof(type-name)).
6870 bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty,
6871 SourceLocation OpLoc, SourceRange R);
6872 bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo,
6873 SourceLocation OpLoc, SourceRange R);
6874
6875 /// Build a sizeof or alignof expression given a type operand.
6876 ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
6877 SourceLocation OpLoc,
6878 UnaryExprOrTypeTrait ExprKind,
6879 SourceRange R);
6880
6881 /// Build a sizeof or alignof expression given an expression
6882 /// operand.
6883 ExprResult CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
6884 UnaryExprOrTypeTrait ExprKind);
6885
6886 /// ActOnUnaryExprOrTypeTraitExpr - Handle @c sizeof(type) and @c sizeof @c
6887 /// expr and the same for @c alignof and @c __alignof
6888 /// Note that the ArgRange is invalid if isType is false.
6889 ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc,
6890 UnaryExprOrTypeTrait ExprKind,
6891 bool IsType, void *TyOrEx,
6892 SourceRange ArgRange);
6893
6894 /// Check for operands with placeholder types and complain if found.
6895 /// Returns ExprError() if there was an error and no recovery was possible.
6897 bool CheckVecStepExpr(Expr *E);
6898
6899 /// Check the constraints on expression operands to unary type expression
6900 /// and type traits.
6901 ///
6902 /// Completes any types necessary and validates the constraints on the operand
6903 /// expression. The logic mostly mirrors the type-based overload, but may
6904 /// modify the expression as it completes the type for that expression through
6905 /// template instantiation, etc.
6907
6908 /// Check the constraints on operands to unary expression and type
6909 /// traits.
6910 ///
6911 /// This will complete any types necessary, and validate the various
6912 /// constraints on those operands.
6913 ///
6914 /// The UsualUnaryConversions() function is *not* called by this routine.
6915 /// C99 6.3.2.1p[2-4] all state:
6916 /// Except when it is the operand of the sizeof operator ...
6917 ///
6918 /// C++ [expr.sizeof]p4
6919 /// The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
6920 /// standard conversions are not applied to the operand of sizeof.
6921 ///
6922 /// This policy is followed for all of the unary trait expressions.
6923 bool CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc,
6924 SourceRange ExprRange,
6925 UnaryExprOrTypeTrait ExprKind,
6926 StringRef KWName);
6927
6928 ExprResult ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc,
6929 tok::TokenKind Kind, Expr *Input);
6930
6931 ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc,
6932 MultiExprArg ArgExprs,
6933 SourceLocation RLoc);
6934 ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
6935 Expr *Idx, SourceLocation RLoc);
6936
6938 Expr *ColumnIdx,
6939 SourceLocation RBLoc);
6940
6941 /// ConvertArgumentsForCall - Converts the arguments specified in
6942 /// Args/NumArgs to the parameter types of the function FDecl with
6943 /// function prototype Proto. Call is the call expression itself, and
6944 /// Fn is the function expression. For a C++ member function, this
6945 /// routine does not attempt to convert the object argument. Returns
6946 /// true if the call is ill-formed.
6947 bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl,
6948 const FunctionProtoType *Proto,
6949 ArrayRef<Expr *> Args, SourceLocation RParenLoc,
6950 bool ExecConfig = false);
6951
6952 /// CheckStaticArrayArgument - If the given argument corresponds to a static
6953 /// array parameter, check that it is non-null, and that if it is formed by
6954 /// array-to-pointer decay, the underlying array is sufficiently large.
6955 ///
6956 /// C99 6.7.5.3p7: If the keyword static also appears within the [ and ] of
6957 /// the array type derivation, then for each call to the function, the value
6958 /// of the corresponding actual argument shall provide access to the first
6959 /// element of an array with at least as many elements as specified by the
6960 /// size expression.
6961 void CheckStaticArrayArgument(SourceLocation CallLoc, ParmVarDecl *Param,
6962 const Expr *ArgExpr);
6963
6964 /// ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
6965 /// This provides the location of the left/right parens and a list of comma
6966 /// locations.
6967 ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
6968 MultiExprArg ArgExprs, SourceLocation RParenLoc,
6969 Expr *ExecConfig = nullptr);
6970
6971 /// BuildCallExpr - Handle a call to Fn with the specified array of arguments.
6972 /// This provides the location of the left/right parens and a list of comma
6973 /// locations.
6974 ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
6975 MultiExprArg ArgExprs, SourceLocation RParenLoc,
6976 Expr *ExecConfig = nullptr,
6977 bool IsExecConfig = false,
6978 bool AllowRecovery = false);
6979
6980 /// BuildBuiltinCallExpr - Create a call to a builtin function specified by Id
6981 // with the specified CallArgs
6982 Expr *BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id,
6983 MultiExprArg CallArgs);
6984
6986
6987 /// BuildResolvedCallExpr - Build a call to a resolved expression,
6988 /// i.e. an expression not of \p OverloadTy. The expression should
6989 /// unary-convert to an expression of function-pointer or
6990 /// block-pointer type.
6991 ///
6992 /// \param NDecl the declaration being called, if available
6994 BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc,
6995 ArrayRef<Expr *> Arg, SourceLocation RParenLoc,
6996 Expr *Config = nullptr, bool IsExecConfig = false,
6997 ADLCallKind UsesADL = ADLCallKind::NotADL);
6998
7000 ParsedType &Ty, SourceLocation RParenLoc,
7001 Expr *CastExpr);
7002
7003 /// Prepares for a scalar cast, performing all the necessary stages
7004 /// except the final cast and returning the kind required.
7006
7007 /// Build an altivec or OpenCL literal.
7009 SourceLocation RParenLoc, Expr *E,
7010 TypeSourceInfo *TInfo);
7011
7012 /// This is not an AltiVec-style cast or or C++ direct-initialization, so turn
7013 /// the ParenListExpr into a sequence of comma binary operators.
7015
7017 SourceLocation RParenLoc, Expr *InitExpr);
7018
7020 TypeSourceInfo *TInfo,
7021 SourceLocation RParenLoc,
7022 Expr *LiteralExpr);
7023
7024 ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7025 SourceLocation RBraceLoc);
7026
7027 ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList,
7028 SourceLocation RBraceLoc);
7029
7030 /// Binary Operators. 'Tok' is the token for the operator.
7032 Expr *LHSExpr, Expr *RHSExpr);
7034 Expr *LHSExpr, Expr *RHSExpr);
7035
7036 /// CreateBuiltinBinOp - Creates a new built-in binary operation with
7037 /// operator @p Opc at location @c TokLoc. This routine only supports
7038 /// built-in operations; ActOnBinOp handles overloaded operators.
7040 Expr *LHSExpr, Expr *RHSExpr);
7042 UnresolvedSetImpl &Functions);
7043
7044 /// Look for instances where it is likely the comma operator is confused with
7045 /// another operator. There is an explicit list of acceptable expressions for
7046 /// the left hand side of the comma operator, otherwise emit a warning.
7047 void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc);
7048
7049 /// ActOnConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
7050 /// in the case of a the GNU conditional expr extension.
7052 SourceLocation ColonLoc, Expr *CondExpr,
7053 Expr *LHSExpr, Expr *RHSExpr);
7054
7055 /// ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
7057 LabelDecl *TheDecl);
7058
7059 void ActOnStartStmtExpr();
7060 ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt,
7061 SourceLocation RPLoc);
7063 SourceLocation RPLoc, unsigned TemplateDepth);
7064 // Handle the final expression in a statement expression.
7066 void ActOnStmtExprError();
7067
7068 // __builtin_offsetof(type, identifier(.identifier|[expr])*)
7071 bool isBrackets; // true if [expr], false if .ident
7072 union {
7075 } U;
7076 };
7077
7078 /// __builtin_offsetof(type, a.b[123][456].c)
7080 TypeSourceInfo *TInfo,
7081 ArrayRef<OffsetOfComponent> Components,
7082 SourceLocation RParenLoc);
7085 ParsedType ParsedArgTy,
7086 ArrayRef<OffsetOfComponent> Components,
7087 SourceLocation RParenLoc);
7088
7089 // __builtin_choose_expr(constExpr, expr1, expr2)
7090 ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr,
7091 Expr *LHSExpr, Expr *RHSExpr,
7092 SourceLocation RPLoc);
7093
7094 // __builtin_va_arg(expr, type)
7096 SourceLocation RPLoc);
7098 TypeSourceInfo *TInfo, SourceLocation RPLoc);
7099
7100 // __builtin_LINE(), __builtin_FUNCTION(), __builtin_FUNCSIG(),
7101 // __builtin_FILE(), __builtin_COLUMN(), __builtin_source_location()
7103 SourceLocation BuiltinLoc,
7104 SourceLocation RPLoc);
7105
7106 // #embed
7108 StringLiteral *BinaryData);
7109
7110 // Build a potentially resolved SourceLocExpr.
7112 SourceLocation BuiltinLoc, SourceLocation RPLoc,
7113 DeclContext *ParentContext);
7114
7115 // __null
7117
7118 bool CheckCaseExpression(Expr *E);
7119
7120 //===------------------------- "Block" Extension ------------------------===//
7121
7122 /// ActOnBlockStart - This callback is invoked when a block literal is
7123 /// started.
7124 void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope);
7125
7126 /// ActOnBlockArguments - This callback allows processing of block arguments.
7127 /// If there are no arguments, this is still invoked.
7128 void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
7129 Scope *CurScope);
7130
7131 /// ActOnBlockError - If there is an error parsing a block, this callback
7132 /// is invoked to pop the information about the block from the action impl.
7133 void ActOnBlockError(SourceLocation CaretLoc, Scope *CurScope);
7134
7135 /// ActOnBlockStmtExpr - This is called when the body of a block statement
7136 /// literal was successfully completed. ^(int x){...}
7138 Scope *CurScope);
7139
7140 //===---------------------------- Clang Extensions ----------------------===//
7141
7142 /// ActOnConvertVectorExpr - create a new convert-vector expression from the
7143 /// provided arguments.
7144 ///
7145 /// __builtin_convertvector( value, dst type )
7146 ///
7148 SourceLocation BuiltinLoc,
7149 SourceLocation RParenLoc);
7150
7151 //===---------------------------- OpenCL Features -----------------------===//
7152
7153 /// Parse a __builtin_astype expression.
7154 ///
7155 /// __builtin_astype( value, dst type )
7156 ///
7158 SourceLocation BuiltinLoc,
7159 SourceLocation RParenLoc);
7160
7161 /// Create a new AsTypeExpr node (bitcast) from the arguments.
7163 SourceLocation BuiltinLoc,
7164 SourceLocation RParenLoc);
7165
7166 /// Attempts to produce a RecoveryExpr after some AST node cannot be created.
7168 ArrayRef<Expr *> SubExprs,
7169 QualType T = QualType());
7170
7171 /// Cast a base object to a member's actual type.
7172 ///
7173 /// There are two relevant checks:
7174 ///
7175 /// C++ [class.access.base]p7:
7176 ///
7177 /// If a class member access operator [...] is used to access a non-static
7178 /// data member or non-static member function, the reference is ill-formed
7179 /// if the left operand [...] cannot be implicitly converted to a pointer to
7180 /// the naming class of the right operand.
7181 ///
7182 /// C++ [expr.ref]p7:
7183 ///
7184 /// If E2 is a non-static data member or a non-static member function, the
7185 /// program is ill-formed if the class of which E2 is directly a member is
7186 /// an ambiguous base (11.8) of the naming class (11.9.3) of E2.
7187 ///
7188 /// Note that the latter check does not consider access; the access of the
7189 /// "real" base class is checked as appropriate when checking the access of
7190 /// the member name.
7192 NestedNameSpecifier *Qualifier,
7193 NamedDecl *FoundDecl,
7194 NamedDecl *Member);
7195
7196 /// CheckCallReturnType - Checks that a call expression's return type is
7197 /// complete. Returns true on failure. The location passed in is the location
7198 /// that best represents the call.
7200 CallExpr *CE, FunctionDecl *FD);
7201
7202 /// Emit a warning for all pending noderef expressions that we recorded.
7203 void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec);
7204
7206
7207 /// Instantiate or parse a C++ default argument expression as necessary.
7208 /// Return true on error.
7210 ParmVarDecl *Param, Expr *Init = nullptr,
7211 bool SkipImmediateInvocations = true);
7212
7213 /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
7214 /// the default expr if needed.
7216 ParmVarDecl *Param, Expr *Init = nullptr);
7217
7218 /// Wrap the expression in a ConstantExpr if it is a potential immediate
7219 /// invocation.
7221
7223
7224 // Check that the SME attributes for PSTATE.ZA and PSTATE.SM are compatible.
7225 bool IsInvalidSMECallConversion(QualType FromType, QualType ToType);
7226
7227 /// Abstract base class used for diagnosing integer constant
7228 /// expression violations.
7230 public:
7232
7233 VerifyICEDiagnoser(bool Suppress = false) : Suppress(Suppress) {}
7234
7235 virtual SemaDiagnosticBuilder
7236 diagnoseNotICEType(Sema &S, SourceLocation Loc, QualType T);
7238 SourceLocation Loc) = 0;
7239 virtual SemaDiagnosticBuilder diagnoseFold(Sema &S, SourceLocation Loc);
7241 };
7242
7246 };
7247
7248 /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
7249 /// and reports the appropriate diagnostics. Returns false on success.
7250 /// Can optionally return the value of the expression.
7252 VerifyICEDiagnoser &Diagnoser,
7253 AllowFoldKind CanFold = NoFold);
7255 unsigned DiagID,
7256 AllowFoldKind CanFold = NoFold);
7258 llvm::APSInt *Result = nullptr,
7259 AllowFoldKind CanFold = NoFold);
7261 AllowFoldKind CanFold = NoFold) {
7262 return VerifyIntegerConstantExpression(E, nullptr, CanFold);
7263 }
7264
7265 /// DiagnoseAssignmentAsCondition - Given that an expression is
7266 /// being used as a boolean condition, warn if it's an assignment.
7268
7269 /// Redundant parentheses over an equality comparison can indicate
7270 /// that the user intended an assignment used as condition.
7272
7274 public:
7275 FullExprArg() : E(nullptr) {}
7276 FullExprArg(Sema &actions) : E(nullptr) {}
7277
7278 ExprResult release() { return E; }
7279
7280 Expr *get() const { return E; }
7281
7282 Expr *operator->() { return E; }
7283
7284 private:
7285 // FIXME: No need to make the entire Sema class a friend when it's just
7286 // Sema::MakeFullExpr that needs access to the constructor below.
7287 friend class Sema;
7288
7289 explicit FullExprArg(Expr *expr) : E(expr) {}
7290
7291 Expr *E;
7292 };
7293
7295 return MakeFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation());
7296 }
7298 return FullExprArg(
7299 ActOnFinishFullExpr(Arg, CC, /*DiscardedValue*/ false).get());
7300 }
7302 ExprResult FE =
7303 ActOnFinishFullExpr(Arg, Arg ? Arg->getExprLoc() : SourceLocation(),
7304 /*DiscardedValue*/ true);
7305 return FullExprArg(FE.get());
7306 }
7307
7309 Decl *ConditionVar;
7311 bool Invalid;
7312 std::optional<bool> KnownValue;
7313
7314 friend class Sema;
7315 ConditionResult(Sema &S, Decl *ConditionVar, FullExprArg Condition,
7316 bool IsConstexpr)
7317 : ConditionVar(ConditionVar), Condition(Condition), Invalid(false) {
7318 if (IsConstexpr && Condition.get()) {
7319 if (std::optional<llvm::APSInt> Val =
7320 Condition.get()->getIntegerConstantExpr(S.Context)) {
7321 KnownValue = !!(*Val);
7322 }
7323 }
7324 }
7325 explicit ConditionResult(bool Invalid)
7326 : ConditionVar(nullptr), Condition(nullptr), Invalid(Invalid),
7327 KnownValue(std::nullopt) {}
7328
7329 public:
7331 bool isInvalid() const { return Invalid; }
7332 std::pair<VarDecl *, Expr *> get() const {
7333 return std::make_pair(cast_or_null<VarDecl>(ConditionVar),
7334 Condition.get());
7335 }
7336 std::optional<bool> getKnownValue() const { return KnownValue; }
7337 };
7339
7340 /// CheckBooleanCondition - Diagnose problems involving the use of
7341 /// the given expression as a boolean condition (e.g. in an if
7342 /// statement). Also performs the standard function and array
7343 /// decays, possibly changing the input variable.
7344 ///
7345 /// \param Loc - A location associated with the condition, e.g. the
7346 /// 'if' keyword.
7347 /// \return true iff there were any errors
7349 bool IsConstexpr = false);
7350
7351 enum class ConditionKind {
7352 Boolean, ///< A boolean condition, from 'if', 'while', 'for', or 'do'.
7353 ConstexprIf, ///< A constant boolean condition from 'if constexpr'.
7354 Switch ///< An integral condition for a 'switch' statement.
7355 };
7356
7357 ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr,
7358 ConditionKind CK, bool MissingOK = false);
7359
7360 QualType CheckConditionalOperands( // C99 6.5.15
7361 ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK,
7362 ExprObjectKind &OK, SourceLocation QuestionLoc);
7363
7364 /// Emit a specialized diagnostic when one expression is a null pointer
7365 /// constant and the other is not a pointer. Returns true if a diagnostic is
7366 /// emitted.
7367 bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr,
7368 SourceLocation QuestionLoc);
7369
7370 /// type checking for vector binary operators.
7372 SourceLocation Loc, bool IsCompAssign,
7373 bool AllowBothBool, bool AllowBoolConversion,
7374 bool AllowBoolOperation, bool ReportInvalid);
7375
7376 /// Return a signed ext_vector_type that is of identical size and number of
7377 /// elements. For floating point vectors, return an integer type of identical
7378 /// size and number of elements. In the non ext_vector_type case, search from
7379 /// the largest type to the smallest type to avoid cases where long long ==
7380 /// long, where long gets picked over long long.
7383
7384 /// CheckVectorCompareOperands - vector comparisons are a clang extension that
7385 /// operates on extended vector types. Instead of producing an IntTy result,
7386 /// like a scalar comparison, a vector comparison produces a vector of integer
7387 /// types.
7390 BinaryOperatorKind Opc);
7393 BinaryOperatorKind Opc);
7396 BinaryOperatorKind Opc);
7397
7398 /// Context in which we're performing a usual arithmetic conversion.
7400 /// An arithmetic operation.
7402 /// A bitwise operation.
7404 /// A comparison.
7406 /// A conditional (?:) operator.
7408 /// A compound assignment expression.
7410 };
7411
7412 // type checking for sizeless vector binary operators.
7414 SourceLocation Loc, bool IsCompAssign,
7415 ArithConvKind OperationKind);
7416
7417 /// Type checking for matrix binary operators.
7420 bool IsCompAssign);
7422 SourceLocation Loc, bool IsCompAssign);
7423
7424 /// Are the two types SVE-bitcast-compatible types? I.e. is bitcasting from
7425 /// the first SVE type (e.g. an SVE VLAT) to the second type (e.g. an SVE
7426 /// VLST) allowed?
7427 ///
7428 /// This will also return false if the two given types do not make sense from
7429 /// the perspective of SVE bitcasts.
7430 bool isValidSveBitcast(QualType srcType, QualType destType);
7431
7432 /// Are the two types matrix types and do they have the same dimensions i.e.
7433 /// do they have the same number of rows and the same number of columns?
7435
7436 bool areVectorTypesSameSize(QualType srcType, QualType destType);
7437
7438 /// Are the two types lax-compatible vector types? That is, given
7439 /// that one of them is a vector, do they have equal storage sizes,
7440 /// where the storage size is the number of elements times the element
7441 /// size?
7442 ///
7443 /// This will also return false if either of the types is neither a
7444 /// vector nor a real type.
7445 bool areLaxCompatibleVectorTypes(QualType srcType, QualType destType);
7446
7447 /// Is this a legal conversion between two types, one of which is
7448 /// known to be a vector type?
7449 bool isLaxVectorConversion(QualType srcType, QualType destType);
7450
7451 // This returns true if at least one of the types is an altivec vector.
7452 bool anyAltivecTypes(QualType srcType, QualType destType);
7453
7454 // type checking C++ declaration initializers (C++ [dcl.init]).
7455
7456 /// Check a cast of an unknown-any type. We intentionally only
7457 /// trigger this for C-style casts.
7461
7462 /// Force an expression with unknown-type to an expression of the
7463 /// given type.
7465
7466 /// Type-check an expression that's being passed to an
7467 /// __unknown_anytype parameter.
7469 QualType &paramType);
7470
7471 // CheckMatrixCast - Check type constraints for matrix casts.
7472 // We allow casting between matrixes of the same dimensions i.e. when they
7473 // have the same number of rows and column. Returns true if the cast is
7474 // invalid.
7475 bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy,
7476 CastKind &Kind);
7477
7478 // CheckVectorCast - check type constraints for vectors.
7479 // Since vectors are an extension, there are no C standard reference for this.
7480 // We allow casting between vectors and integer datatypes of the same size.
7481 // returns true if the cast is invalid
7482 bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty,
7483 CastKind &Kind);
7484
7485 /// Prepare `SplattedExpr` for a vector splat operation, adding
7486 /// implicit casts if necessary.
7487 ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr);
7488
7489 // CheckExtVectorCast - check type constraints for extended vectors.
7490 // Since vectors are an extension, there are no C standard reference for this.
7491 // We allow casting between vectors and integer datatypes of the same size,
7492 // or vectors and the element type of that vector.
7493 // returns the cast expr
7495 CastKind &Kind);
7496
7499 }
7500
7501 // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2) and converts
7502 // functions and arrays to their respective pointers (C99 6.3.2.1).
7504
7505 /// CallExprUnaryConversions - a special case of an unary conversion
7506 /// performed on a function designator of a call expression.
7508
7509 // DefaultFunctionArrayConversion - converts functions and arrays
7510 // to their respective pointers (C99 6.3.2.1).
7512
7513 // DefaultFunctionArrayLvalueConversion - converts functions and
7514 // arrays to their respective pointers and performs the
7515 // lvalue-to-rvalue conversion.
7517 bool Diagnose = true);
7518
7519 // DefaultLvalueConversion - performs lvalue-to-rvalue conversion on
7520 // the operand. This function is a no-op if the operand has a function type
7521 // or an array type.
7523
7524 // DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
7525 // do not have a prototype. Integer promotions are performed on each
7526 // argument, and arguments that have type float are promoted to double.
7528
7530 const FunctionProtoType *Proto,
7531 Expr *Fn);
7532
7533 // Used for determining in which context a type is allowed to be passed to a
7534 // vararg function.
7542
7543 /// Determine the degree of POD-ness for an expression.
7544 /// Incomplete types are considered POD, since this check can be performed
7545 /// when we're in an unevaluated context.
7547
7548 /// Check to see if the given expression is a valid argument to a variadic
7549 /// function, issuing a diagnostic if not.
7551
7552 /// GatherArgumentsForCall - Collector argument expressions for various
7553 /// form of call prototypes.
7555 const FunctionProtoType *Proto,
7556 unsigned FirstParam, ArrayRef<Expr *> Args,
7557 SmallVectorImpl<Expr *> &AllArgs,
7559 bool AllowExplicit = false,
7560 bool IsListInitialization = false);
7561
7562 // DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
7563 // will create a runtime trap if the resulting type is not a POD type.
7565 FunctionDecl *FDecl);
7566
7567 // UsualArithmeticConversions - performs the UsualUnaryConversions on it's
7568 // operands and then handles various conversions that are common to binary
7569 // operators (C99 6.3.1.8). If both operands aren't arithmetic, this
7570 // routine returns the first non-arithmetic type found. The client is
7571 // responsible for emitting appropriate error diagnostics.
7574
7575 /// AssignConvertType - All of the 'assignment' semantic checks return this
7576 /// enum to indicate whether the assignment was allowed. These checks are
7577 /// done for simple assignments, as well as initialization, return from
7578 /// function, argument passing, etc. The query is phrased in terms of a
7579 /// source and destination type.
7581 /// Compatible - the types are compatible according to the standard.
7583
7584 /// PointerToInt - The assignment converts a pointer to an int, which we
7585 /// accept as an extension.
7587
7588 /// IntToPointer - The assignment converts an int to a pointer, which we
7589 /// accept as an extension.
7591
7592 /// FunctionVoidPointer - The assignment is between a function pointer and
7593 /// void*, which the standard doesn't allow, but we accept as an extension.
7595
7596 /// IncompatiblePointer - The assignment is between two pointers types that
7597 /// are not compatible, but we accept them as an extension.
7599
7600 /// IncompatibleFunctionPointer - The assignment is between two function
7601 /// pointers types that are not compatible, but we accept them as an
7602 /// extension.
7604
7605 /// IncompatibleFunctionPointerStrict - The assignment is between two
7606 /// function pointer types that are not identical, but are compatible,
7607 /// unless compiled with -fsanitize=cfi, in which case the type mismatch
7608 /// may trip an indirect call runtime check.
7610
7611 /// IncompatiblePointerSign - The assignment is between two pointers types
7612 /// which point to integers which have a different sign, but are otherwise
7613 /// identical. This is a subset of the above, but broken out because it's by
7614 /// far the most common case of incompatible pointers.
7616
7617 /// CompatiblePointerDiscardsQualifiers - The assignment discards
7618 /// c/v/r qualifiers, which we accept as an extension.
7620
7621 /// IncompatiblePointerDiscardsQualifiers - The assignment
7622 /// discards qualifiers that we don't permit to be discarded,
7623 /// like address spaces.
7625
7626 /// IncompatibleNestedPointerAddressSpaceMismatch - The assignment
7627 /// changes address spaces in nested pointer types which is not allowed.
7628 /// For instance, converting __private int ** to __generic int ** is
7629 /// illegal even though __private could be converted to __generic.
7631
7632 /// IncompatibleNestedPointerQualifiers - The assignment is between two
7633 /// nested pointer types, and the qualifiers other than the first two
7634 /// levels differ e.g. char ** -> const char **, but we accept them as an
7635 /// extension.
7637
7638 /// IncompatibleVectors - The assignment is between two vector types that
7639 /// have the same size, which we accept as an extension.
7641
7642 /// IntToBlockPointer - The assignment converts an int to a block
7643 /// pointer. We disallow this.
7645
7646 /// IncompatibleBlockPointer - The assignment is between two block
7647 /// pointers types that are not compatible.
7649
7650 /// IncompatibleObjCQualifiedId - The assignment is between a qualified
7651 /// id type and something else (that is incompatible with it). For example,
7652 /// "id <XXX>" = "Foo *", where "Foo *" doesn't implement the XXX protocol.
7654
7655 /// IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an
7656 /// object with __weak qualifier.
7658
7659 /// Incompatible - We reject this conversion outright, it is invalid to
7660 /// represent it in the AST.
7663
7664 /// DiagnoseAssignmentResult - Emit a diagnostic, if required, for the
7665 /// assignment conversion type specified by ConvTy. This returns true if the
7666 /// conversion was invalid or false if the conversion was accepted.
7668 QualType DstType, QualType SrcType,
7669 Expr *SrcExpr, AssignmentAction Action,
7670 bool *Complained = nullptr);
7671
7672 /// CheckAssignmentConstraints - Perform type checking for assignment,
7673 /// argument passing, variable initialization, and function return values.
7674 /// C99 6.5.16.
7676 QualType LHSType,
7677 QualType RHSType);
7678
7679 /// Check assignment constraints and optionally prepare for a conversion of
7680 /// the RHS to the LHS type. The conversion is prepared for if ConvertRHS
7681 /// is true.
7683 ExprResult &RHS, CastKind &Kind,
7684 bool ConvertRHS = true);
7685
7686 /// Check assignment constraints for an assignment of RHS to LHSType.
7687 ///
7688 /// \param LHSType The destination type for the assignment.
7689 /// \param RHS The source expression for the assignment.
7690 /// \param Diagnose If \c true, diagnostics may be produced when checking
7691 /// for assignability. If a diagnostic is produced, \p RHS will be
7692 /// set to ExprError(). Note that this function may still return
7693 /// without producing a diagnostic, even for an invalid assignment.
7694 /// \param DiagnoseCFAudited If \c true, the target is a function parameter
7695 /// in an audited Core Foundation API and does not need to be checked
7696 /// for ARC retain issues.
7697 /// \param ConvertRHS If \c true, \p RHS will be updated to model the
7698 /// conversions necessary to perform the assignment. If \c false,
7699 /// \p Diagnose must also be \c false.
7701 QualType LHSType, ExprResult &RHS, bool Diagnose = true,
7702 bool DiagnoseCFAudited = false, bool ConvertRHS = true);
7703
7704 // If the lhs type is a transparent union, check whether we
7705 // can initialize the transparent union with the given expression.
7707 ExprResult &RHS);
7708
7709 /// the following "Check" methods will return a valid/converted QualType
7710 /// or a null QualType (indicating an error diagnostic was issued).
7711
7712 /// type checking binary operators (subroutines of CreateBuiltinBinOp).
7714 ExprResult &RHS);
7715
7716 /// Diagnose cases where a scalar was implicitly converted to a vector and
7717 /// diagnose the underlying types. Otherwise, diagnose the error
7718 /// as invalid vector logical operands for non-C++ cases.
7720 ExprResult &RHS);
7721
7723 ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign,
7724 bool IsDivide);
7725 QualType CheckRemainderOperands( // C99 6.5.5
7727 bool IsCompAssign = false);
7728 QualType CheckAdditionOperands( // C99 6.5.6
7730 BinaryOperatorKind Opc, QualType *CompLHSTy = nullptr);
7733 QualType *CompLHSTy = nullptr);
7734 QualType CheckShiftOperands( // C99 6.5.7
7736 BinaryOperatorKind Opc, bool IsCompAssign = false);
7738 QualType CheckCompareOperands( // C99 6.5.8/9
7740 BinaryOperatorKind Opc);
7741 QualType CheckBitwiseOperands( // C99 6.5.[10...12]
7743 BinaryOperatorKind Opc);
7744 QualType CheckLogicalOperands( // C99 6.5.[13,14]
7746 BinaryOperatorKind Opc);
7747 // CheckAssignmentOperands is used for both simple and compound assignment.
7748 // For simple assignment, pass both expressions and a null converted type.
7749 // For compound assignment, pass both expressions and the converted type.
7750 QualType CheckAssignmentOperands( // C99 6.5.16.[1,2]
7751 Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType,
7752 BinaryOperatorKind Opc);
7753
7754 /// To be used for checking whether the arguments being passed to
7755 /// function exceeds the number of parameters expected for it.
7756 static bool TooManyArguments(size_t NumParams, size_t NumArgs,
7757 bool PartialOverloading = false) {
7758 // We check whether we're just after a comma in code-completion.
7759 if (NumArgs > 0 && PartialOverloading)
7760 return NumArgs + 1 > NumParams; // If so, we view as an extra argument.
7761 return NumArgs > NumParams;
7762 }
7763
7764 /// Whether the AST is currently being rebuilt to correct immediate
7765 /// invocations. Immediate invocation candidates and references to consteval
7766 /// functions aren't tracked when this is set.
7768
7773 }
7774
7775 /// Determines whether we are currently in a context that
7776 /// is not evaluated as per C++ [expr] p5.
7779 }
7780
7783 }
7784
7787 }
7788
7791 }
7792
7795 return (Ctx.Context ==
7798 }
7799
7800 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
7802 assert(!ExprEvalContexts.empty() &&
7803 "Must be in an expression evaluation context");
7804 for (const auto &Ctx : llvm::reverse(ExprEvalContexts)) {
7806 Ctx.DelayedDefaultInitializationContext)
7807 return Ctx.DelayedDefaultInitializationContext;
7808 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
7809 Ctx.isUnevaluated())
7810 break;
7811 }
7812 return std::nullopt;
7813 }
7814
7815 std::optional<ExpressionEvaluationContextRecord::InitializationContext>
7817 assert(!ExprEvalContexts.empty() &&
7818 "Must be in an expression evaluation context");
7819 std::optional<ExpressionEvaluationContextRecord::InitializationContext> Res;
7820 for (auto &Ctx : llvm::reverse(ExprEvalContexts)) {
7822 !Ctx.DelayedDefaultInitializationContext && Res)
7823 break;
7824 if (Ctx.isConstantEvaluated() || Ctx.isImmediateFunctionContext() ||
7825 Ctx.isUnevaluated())
7826 break;
7827 Res = Ctx.DelayedDefaultInitializationContext;
7828 }
7829 return Res;
7830 }
7831
7834 }
7835
7836 /// Returns a field in a CXXRecordDecl that has the same name as the decl \p
7837 /// SelfAssigned when inside a CXXMethodDecl.
7838 const FieldDecl *
7840
7842
7843 template <typename... Ts>
7845 const Ts &...Args) {
7846 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
7848 }
7849
7850 template <typename... Ts>
7851 bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID,
7852 const Ts &...Args) {
7853 SizelessTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
7855 }
7856
7857 /// Abstract class used to diagnose incomplete types.
7860
7861 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
7862 virtual ~TypeDiagnoser() {}
7863 };
7864
7865 template <typename... Ts> class BoundTypeDiagnoser : public TypeDiagnoser {
7866 protected:
7867 unsigned DiagID;
7868 std::tuple<const Ts &...> Args;
7869
7870 template <std::size_t... Is>
7872 std::index_sequence<Is...>) const {
7873 // Apply all tuple elements to the builder in order.
7874 bool Dummy[] = {false, (DB << getPrintable(std::get<Is>(Args)))...};
7875 (void)Dummy;
7876 }
7877
7878 public:
7879 BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
7880 : TypeDiagnoser(), DiagID(DiagID), Args(Args...) {
7881 assert(DiagID != 0 && "no diagnostic for type diagnoser");
7882 }
7883
7884 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
7885 const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID);
7886 emit(DB, std::index_sequence_for<Ts...>());
7887 DB << T;
7888 }
7889 };
7890
7891 /// A derivative of BoundTypeDiagnoser for which the diagnostic's type
7892 /// parameter is preceded by a 0/1 enum that is 1 if the type is sizeless.
7893 /// For example, a diagnostic with no other parameters would generally have
7894 /// the form "...%select{incomplete|sizeless}0 type %1...".
7895 template <typename... Ts>
7897 public:
7898 SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
7899 : BoundTypeDiagnoser<Ts...>(DiagID, Args...) {}
7900
7901 void diagnose(Sema &S, SourceLocation Loc, QualType T) override {
7902 const SemaDiagnosticBuilder &DB = S.Diag(Loc, this->DiagID);
7903 this->emit(DB, std::index_sequence_for<Ts...>());
7904 DB << T->isSizelessType() << T;
7905 }
7906 };
7907
7908 /// Check an argument list for placeholders that we won't try to
7909 /// handle later.
7911
7912 /// The C++ "std::source_location::__impl" struct, defined in
7913 /// <source_location>.
7915
7916 /// A stack of expression evaluation contexts.
7918
7919 // Set of failed immediate invocations to avoid double diagnosing.
7921
7922 /// List of SourceLocations where 'self' is implicitly retained inside a
7923 /// block.
7926
7927 /// Do an explicit extend of the given block pointer if we're in ARC.
7929
7930 std::vector<std::pair<QualType, unsigned>> ExcessPrecisionNotSatisfied;
7933
7934private:
7935 static BinaryOperatorKind ConvertTokenKindToBinaryOpcode(tok::TokenKind Kind);
7936
7937 /// Methods for marking which expressions involve dereferencing a pointer
7938 /// marked with the 'noderef' attribute. Expressions are checked bottom up as
7939 /// they are parsed, meaning that a noderef pointer may not be accessed. For
7940 /// example, in `&*p` where `p` is a noderef pointer, we will first parse the
7941 /// `*p`, but need to check that `address of` is called on it. This requires
7942 /// keeping a container of all pending expressions and checking if the address
7943 /// of them are eventually taken.
7944 void CheckSubscriptAccessOfNoDeref(const ArraySubscriptExpr *E);
7945 void CheckAddressOfNoDeref(const Expr *E);
7946
7947 ///@}
7948
7949 //
7950 //
7951 // -------------------------------------------------------------------------
7952 //
7953 //
7954
7955 /// \name C++ Expressions
7956 /// Implementations are in SemaExprCXX.cpp
7957 ///@{
7958
7959public:
7960 /// The C++ "std::bad_alloc" class, which is defined by the C++
7961 /// standard library.
7963
7964 /// The C++ "std::align_val_t" enum class, which is defined by the C++
7965 /// standard library.
7967
7968 /// The C++ "type_info" declaration, which is defined in <typeinfo>.
7970
7971 /// A flag to remember whether the implicit forms of operator new and delete
7972 /// have been declared.
7974
7975 /// Delete-expressions to be analyzed at the end of translation unit
7976 ///
7977 /// This list contains class members, and locations of delete-expressions
7978 /// that could not be proven as to whether they mismatch with new-expression
7979 /// used in initializer of the field.
7980 llvm::MapVector<FieldDecl *, DeleteLocs> DeleteExprs;
7981
7982 /// Handle the result of the special case name lookup for inheriting
7983 /// constructor declarations. 'NS::X::X' and 'NS::X<...>::X' are treated as
7984 /// constructor names in member using declarations, even if 'X' is not the
7985 /// name of the corresponding type.
7987 SourceLocation NameLoc,
7988 const IdentifierInfo &Name);
7989
7991 SourceLocation NameLoc, Scope *S,
7992 CXXScopeSpec &SS, bool EnteringContext);
7994 Scope *S, CXXScopeSpec &SS,
7995 ParsedType ObjectType, bool EnteringContext);
7996
7998 ParsedType ObjectType);
7999
8000 /// Build a C++ typeid expression with a type operand.
8001 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8002 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8003
8004 /// Build a C++ typeid expression with an expression operand.
8005 ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc,
8006 Expr *Operand, SourceLocation RParenLoc);
8007
8008 /// ActOnCXXTypeid - Parse typeid( something ).
8010 bool isType, void *TyOrExpr,
8011 SourceLocation RParenLoc);
8012
8013 /// Build a Microsoft __uuidof expression with a type operand.
8014 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8015 TypeSourceInfo *Operand, SourceLocation RParenLoc);
8016
8017 /// Build a Microsoft __uuidof expression with an expression operand.
8018 ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc,
8019 Expr *Operand, SourceLocation RParenLoc);
8020
8021 /// ActOnCXXUuidof - Parse __uuidof( something ).
8023 bool isType, void *TyOrExpr,
8024 SourceLocation RParenLoc);
8025
8026 //// ActOnCXXThis - Parse 'this' pointer.
8028
8029 /// Check whether the type of 'this' is valid in the current context.
8031
8032 /// Build a CXXThisExpr and mark it referenced in the current context.
8034 void MarkThisReferenced(CXXThisExpr *This);
8035
8036 /// Try to retrieve the type of the 'this' pointer.
8037 ///
8038 /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.
8040
8041 /// When non-NULL, the C++ 'this' expression is allowed despite the
8042 /// current context not being a non-static member function. In such cases,
8043 /// this provides the type used for 'this'.
8045
8046 /// RAII object used to temporarily allow the C++ 'this' expression
8047 /// to be used, with the given qualifiers on the current class type.
8049 Sema &S;
8050 QualType OldCXXThisTypeOverride;
8051 bool Enabled;
8052
8053 public:
8054 /// Introduce a new scope where 'this' may be allowed (when enabled),
8055 /// using the given declaration (which is either a class template or a
8056 /// class) along with the given qualifiers.
8057 /// along with the qualifiers placed on '*this'.
8058 CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals,
8059 bool Enabled = true);
8060
8062 };
8063
8064 /// Make sure the value of 'this' is actually available in the current
8065 /// context, if it is a potentially evaluated context.
8066 ///
8067 /// \param Loc The location at which the capture of 'this' occurs.
8068 ///
8069 /// \param Explicit Whether 'this' is explicitly captured in a lambda
8070 /// capture list.
8071 ///
8072 /// \param FunctionScopeIndexToStopAt If non-null, it points to the index
8073 /// of the FunctionScopeInfo stack beyond which we do not attempt to capture.
8074 /// This is useful when enclosing lambdas must speculatively capture
8075 /// 'this' that may or may not be used in certain specializations of
8076 /// a nested generic lambda (depending on whether the name resolves to
8077 /// a non-static member function or a static function).
8078 /// \return returns 'true' if failed, 'false' if success.
8080 SourceLocation Loc, bool Explicit = false, bool BuildAndDiagnose = true,
8081 const unsigned *const FunctionScopeIndexToStopAt = nullptr,
8082 bool ByCopy = false);
8083
8084 /// Determine whether the given type is the type of *this that is used
8085 /// outside of the body of a member function for a type that is currently
8086 /// being defined.
8088
8089 /// ActOnCXXBoolLiteral - Parse {true,false} literals.
8091
8092 /// ActOnCXXNullPtrLiteral - Parse 'nullptr'.
8094
8095 //// ActOnCXXThrow - Parse throw expressions.
8098 bool IsThrownVarInScope);
8099
8100 /// CheckCXXThrowOperand - Validate the operand of a throw.
8101 bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E);
8102
8103 /// ActOnCXXTypeConstructExpr - Parse construction of a specified type.
8104 /// Can be interpreted either as function-style casting ("int(x)")
8105 /// or class type construction ("ClassType(x,y,z)")
8106 /// or creation of a value-initialized type ("int()").
8108 SourceLocation LParenOrBraceLoc,
8109 MultiExprArg Exprs,
8110 SourceLocation RParenOrBraceLoc,
8111 bool ListInitialization);
8112
8114 SourceLocation LParenLoc,
8115 MultiExprArg Exprs,
8116 SourceLocation RParenLoc,
8117 bool ListInitialization);
8118
8119 /// Parsed a C++ 'new' expression (C++ 5.3.4).
8120 ///
8121 /// E.g.:
8122 /// @code new (memory) int[size][4] @endcode
8123 /// or
8124 /// @code ::new Foo(23, "hello") @endcode
8125 ///
8126 /// \param StartLoc The first location of the expression.
8127 /// \param UseGlobal True if 'new' was prefixed with '::'.
8128 /// \param PlacementLParen Opening paren of the placement arguments.
8129 /// \param PlacementArgs Placement new arguments.
8130 /// \param PlacementRParen Closing paren of the placement arguments.
8131 /// \param TypeIdParens If the type is in parens, the source range.
8132 /// \param D The type to be allocated, as well as array dimensions.
8133 /// \param Initializer The initializing expression or initializer-list, or
8134 /// null if there is none.
8135 ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
8136 SourceLocation PlacementLParen,
8137 MultiExprArg PlacementArgs,
8138 SourceLocation PlacementRParen,
8139 SourceRange TypeIdParens, Declarator &D,
8140 Expr *Initializer);
8142 BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen,
8143 MultiExprArg PlacementArgs, SourceLocation PlacementRParen,
8144 SourceRange TypeIdParens, QualType AllocType,
8145 TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize,
8146 SourceRange DirectInitRange, Expr *Initializer);
8147
8148 /// Determine whether \p FD is an aligned allocation or deallocation
8149 /// function that is unavailable.
8151
8152 /// Produce diagnostics if \p FD is an aligned allocation or deallocation
8153 /// function that is unavailable.
8156
8157 /// Checks that a type is suitable as the allocated type
8158 /// in a new-expression.
8160 SourceRange R);
8161
8162 /// The scope in which to find allocation functions.
8164 /// Only look for allocation functions in the global scope.
8166 /// Only look for allocation functions in the scope of the
8167 /// allocated class.
8169 /// Look for allocation functions in both the global scope
8170 /// and in the scope of the allocated class.
8171 AFS_Both
8173
8174 /// Finds the overloads of operator new and delete that are appropriate
8175 /// for the allocation.
8177 AllocationFunctionScope NewScope,
8178 AllocationFunctionScope DeleteScope,
8179 QualType AllocType, bool IsArray,
8180 bool &PassAlignment, MultiExprArg PlaceArgs,
8181 FunctionDecl *&OperatorNew,
8182 FunctionDecl *&OperatorDelete,
8183 bool Diagnose = true);
8184
8185 /// DeclareGlobalNewDelete - Declare the global forms of operator new and
8186 /// delete. These are:
8187 /// @code
8188 /// // C++03:
8189 /// void* operator new(std::size_t) throw(std::bad_alloc);
8190 /// void* operator new[](std::size_t) throw(std::bad_alloc);
8191 /// void operator delete(void *) throw();
8192 /// void operator delete[](void *) throw();
8193 /// // C++11:
8194 /// void* operator new(std::size_t);
8195 /// void* operator new[](std::size_t);
8196 /// void operator delete(void *) noexcept;
8197 /// void operator delete[](void *) noexcept;
8198 /// // C++1y:
8199 /// void* operator new(std::size_t);
8200 /// void* operator new[](std::size_t);
8201 /// void operator delete(void *) noexcept;
8202 /// void operator delete[](void *) noexcept;
8203 /// void operator delete(void *, std::size_t) noexcept;
8204 /// void operator delete[](void *, std::size_t) noexcept;
8205 /// @endcode
8206 /// Note that the placement and nothrow forms of new are *not* implicitly
8207 /// declared. Their use requires including <new>.
8210 ArrayRef<QualType> Params);
8211
8213 DeclarationName Name, FunctionDecl *&Operator,
8214 bool Diagnose = true, bool WantSize = false,
8215 bool WantAligned = false);
8217 bool CanProvideSize,
8218 bool Overaligned,
8219 DeclarationName Name);
8221 CXXRecordDecl *RD);
8222
8223 /// ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
8224 /// @code ::delete ptr; @endcode
8225 /// or
8226 /// @code delete [] ptr; @endcode
8227 ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
8228 bool ArrayForm, Expr *Operand);
8230 bool IsDelete, bool CallCanBeVirtual,
8231 bool WarnOnNonAbstractTypes,
8232 SourceLocation DtorLoc);
8233
8235 Expr *Operand, SourceLocation RParen);
8237 SourceLocation RParen);
8238
8240 SourceLocation OpLoc,
8241 tok::TokenKind OpKind,
8242 ParsedType &ObjectType,
8243 bool &MayBePseudoDestructor);
8244
8246 Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8247 const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc,
8248 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType);
8249
8251 Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind,
8252 CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc,
8253 SourceLocation TildeLoc, UnqualifiedId &SecondTypeName);
8254
8256 SourceLocation OpLoc,
8257 tok::TokenKind OpKind,
8258 SourceLocation TildeLoc,
8259 const DeclSpec &DS);
8260
8261 /// MaybeCreateExprWithCleanups - If the current full-expression
8262 /// requires any cleanups, surround it with a ExprWithCleanups node.
8263 /// Otherwise, just returns the passed-in expression.
8267
8268 ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue) {
8269 return ActOnFinishFullExpr(
8270 Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue);
8271 }
8273 bool DiscardedValue, bool IsConstexpr = false,
8274 bool IsTemplateArgument = false);
8276
8277 /// Process the expression contained within a decltype. For such expressions,
8278 /// certain semantic checks on temporaries are delayed until this point, and
8279 /// are omitted for the 'topmost' call in the decltype expression. If the
8280 /// topmost call bound a temporary, strip that temporary off the expression.
8282
8283 bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id,
8284 bool IsUDSuffix);
8285
8287
8288 ConditionResult ActOnConditionVariable(Decl *ConditionVar,
8289 SourceLocation StmtLoc,
8290 ConditionKind CK);
8291
8292 /// Check the use of the given variable as a C++ condition in an if,
8293 /// while, do-while, or switch statement.
8295 SourceLocation StmtLoc, ConditionKind CK);
8296
8297 /// CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
8298 ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr = false);
8299
8300 /// Helper function to determine whether this is the (deprecated) C++
8301 /// conversion from a string literal to a pointer to non-const char or
8302 /// non-const wchar_t (for narrow and wide string literals,
8303 /// respectively).
8305
8306 /// PerformImplicitConversion - Perform an implicit conversion of the
8307 /// expression From to the type ToType using the pre-computed implicit
8308 /// conversion sequence ICS. Returns the converted
8309 /// expression. Action is the kind of conversion we're performing,
8310 /// used in the error message.
8312 Expr *From, QualType ToType, const ImplicitConversionSequence &ICS,
8313 AssignmentAction Action,
8315
8316 /// PerformImplicitConversion - Perform an implicit conversion of the
8317 /// expression From to the type ToType by following the standard
8318 /// conversion sequence SCS. Returns the converted
8319 /// expression. Flavor is the context in which we're performing this
8320 /// conversion, for use in error messages.
8322 const StandardConversionSequence &SCS,
8323 AssignmentAction Action,
8325
8326 bool CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N);
8327
8328 /// Parsed one of the type trait support pseudo-functions.
8331 SourceLocation RParenLoc);
8334 SourceLocation RParenLoc);
8335
8336 /// ActOnArrayTypeTrait - Parsed one of the binary type trait support
8337 /// pseudo-functions.
8339 ParsedType LhsTy, Expr *DimExpr,
8340 SourceLocation RParen);
8341
8343 TypeSourceInfo *TSInfo, Expr *DimExpr,
8344 SourceLocation RParen);
8345
8346 /// ActOnExpressionTrait - Parsed one of the unary type trait support
8347 /// pseudo-functions.
8349 Expr *Queried, SourceLocation RParen);
8350
8352 Expr *Queried, SourceLocation RParen);
8353
8355 ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation OpLoc,
8356 bool isIndirect);
8358 ExprResult &RHS,
8359 SourceLocation QuestionLoc);
8360
8362 ExprResult &LHS, ExprResult &RHS,
8363 SourceLocation QuestionLoc);
8364
8365 /// Check the operands of ?: under C++ semantics.
8366 ///
8367 /// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y
8368 /// extension. In this case, LHS == Cond. (But they're not aliases.)
8369 ///
8370 /// This function also implements GCC's vector extension and the
8371 /// OpenCL/ext_vector_type extension for conditionals. The vector extensions
8372 /// permit the use of a?b:c where the type of a is that of a integer vector
8373 /// with the same number of elements and size as the vectors of b and c. If
8374 /// one of either b or c is a scalar it is implicitly converted to match the
8375 /// type of the vector. Otherwise the expression is ill-formed. If both b and
8376 /// c are scalars, then b and c are checked and converted to the type of a if
8377 /// possible.
8378 ///
8379 /// The expressions are evaluated differently for GCC's and OpenCL's
8380 /// extensions. For the GCC extension, the ?: operator is evaluated as
8381 /// (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).
8382 /// For the OpenCL extensions, the ?: operator is evaluated as
8383 /// (most-significant-bit-set(a[0]) ? b[0] : c[0], .. ,
8384 /// most-significant-bit-set(a[n]) ? b[n] : c[n]).
8386 ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK,
8387 ExprObjectKind &OK, SourceLocation questionLoc);
8388
8389 /// Find a merged pointer type and convert the two expressions to it.
8390 ///
8391 /// This finds the composite pointer type for \p E1 and \p E2 according to
8392 /// C++2a [expr.type]p3. It converts both expressions to this type and returns
8393 /// it. It does not emit diagnostics (FIXME: that's not true if \p
8394 /// ConvertArgs is \c true).
8395 ///
8396 /// \param Loc The location of the operator requiring these two expressions to
8397 /// be converted to the composite pointer type.
8398 ///
8399 /// \param ConvertArgs If \c false, do not convert E1 and E2 to the target
8400 /// type.
8402 bool ConvertArgs = true);
8404 ExprResult &E2, bool ConvertArgs = true) {
8405 Expr *E1Tmp = E1.get(), *E2Tmp = E2.get();
8406 QualType Composite =
8407 FindCompositePointerType(Loc, E1Tmp, E2Tmp, ConvertArgs);
8408 E1 = E1Tmp;
8409 E2 = E2Tmp;
8410 return Composite;
8411 }
8412
8413 /// MaybeBindToTemporary - If the passed in expression has a record type with
8414 /// a non-trivial destructor, this will return CXXBindTemporaryExpr. Otherwise
8415 /// it simply returns the passed in expression.
8417
8418 /// IgnoredValueConversions - Given that an expression's result is
8419 /// syntactically ignored, perform any conversions that are
8420 /// required.
8422
8424
8425 /// Process any TypoExprs in the given Expr and its children,
8426 /// generating diagnostics as appropriate and returning a new Expr if there
8427 /// were typos that were all successfully corrected and ExprError if one or
8428 /// more typos could not be corrected.
8429 ///
8430 /// \param E The Expr to check for TypoExprs.
8431 ///
8432 /// \param InitDecl A VarDecl to avoid because the Expr being corrected is its
8433 /// initializer.
8434 ///
8435 /// \param RecoverUncorrectedTypos If true, when typo correction fails, it
8436 /// will rebuild the given Expr with all TypoExprs degraded to RecoveryExprs.
8437 ///
8438 /// \param Filter A function applied to a newly rebuilt Expr to determine if
8439 /// it is an acceptable/usable result from a single combination of typo
8440 /// corrections. As long as the filter returns ExprError, different
8441 /// combinations of corrections will be tried until all are exhausted.
8443 Expr *E, VarDecl *InitDecl = nullptr,
8444 bool RecoverUncorrectedTypos = false,
8445 llvm::function_ref<ExprResult(Expr *)> Filter =
8446 [](Expr *E) -> ExprResult { return E; });
8447
8449 ExprResult ER, VarDecl *InitDecl = nullptr,
8450 bool RecoverUncorrectedTypos = false,
8451 llvm::function_ref<ExprResult(Expr *)> Filter =
8452 [](Expr *E) -> ExprResult { return E; }) {
8453 return ER.isInvalid()
8454 ? ER
8455 : CorrectDelayedTyposInExpr(ER.get(), InitDecl,
8456 RecoverUncorrectedTypos, Filter);
8457 }
8458
8459 /// Describes the result of an "if-exists" condition check.
8461 /// The symbol exists.
8463
8464 /// The symbol does not exist.
8466
8467 /// The name is a dependent name, so the results will differ
8468 /// from one instantiation to the next.
8470
8471 /// An error occurred.
8472 IER_Error
8474
8477 const DeclarationNameInfo &TargetNameInfo);
8478
8480 SourceLocation KeywordLoc,
8481 bool IsIfExists, CXXScopeSpec &SS,
8482 UnqualifiedId &Name);
8483
8486 ArrayRef<ParmVarDecl *> LocalParameters,
8487 Scope *BodyScope);
8491 CXXScopeSpec &SS,
8492 SourceLocation NameLoc,
8493 const IdentifierInfo *TypeName,
8494 TemplateIdAnnotation *TemplateId);
8496 SourceLocation NoexceptLoc);
8498 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8499 TemplateIdAnnotation *TypeConstraint, unsigned Depth);
8502 Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc,
8506 bool IsSatisfied, SourceLocation NoexceptLoc,
8513 BuildNestedRequirement(StringRef InvalidConstraintEntity,
8514 const ASTConstraintSatisfaction &Satisfaction);
8517 SourceLocation LParenLoc,
8518 ArrayRef<ParmVarDecl *> LocalParameters,
8519 SourceLocation RParenLoc,
8521 SourceLocation ClosingBraceLoc);
8522
8523private:
8524 ExprResult BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
8525 bool IsDelete);
8526
8527 void AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE);
8528 void AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
8529 bool DeleteWasArrayForm);
8530
8531 ///@}
8532
8533 //
8534 //
8535 // -------------------------------------------------------------------------
8536 //
8537 //
8538
8539 /// \name Member Access Expressions
8540 /// Implementations are in SemaExprMember.cpp
8541 ///@{
8542
8543public:
8544 /// Check whether an expression might be an implicit class member access.
8546 bool IsAddressOfOperand);
8547
8548 /// Builds an expression which might be an implicit member expression.
8550 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R,
8551 const TemplateArgumentListInfo *TemplateArgs, const Scope *S);
8552
8553 /// Builds an implicit member access expression. The current context
8554 /// is known to be an instance method, and the given unqualified lookup
8555 /// set is known to contain only instance members, at least one of which
8556 /// is from an appropriate type.
8558 BuildImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8559 LookupResult &R,
8560 const TemplateArgumentListInfo *TemplateArgs,
8561 bool IsDefiniteInstance, const Scope *S);
8562
8564 Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc,
8565 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8566 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8567 const TemplateArgumentListInfo *TemplateArgs);
8568
8569 /// The main callback when the parser finds something like
8570 /// expression . [nested-name-specifier] identifier
8571 /// expression -> [nested-name-specifier] identifier
8572 /// where 'identifier' encompasses a fairly broad spectrum of
8573 /// possibilities, including destructor and operator references.
8574 ///
8575 /// \param OpKind either tok::arrow or tok::period
8576 /// \param ObjCImpDecl the current Objective-C \@implementation
8577 /// decl; this is an ugly hack around the fact that Objective-C
8578 /// \@implementations aren't properly put in the context chain
8580 tok::TokenKind OpKind, CXXScopeSpec &SS,
8581 SourceLocation TemplateKWLoc,
8582 UnqualifiedId &Member, Decl *ObjCImpDecl);
8583
8584 MemberExpr *
8585 BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc,
8586 NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc,
8587 ValueDecl *Member, DeclAccessPair FoundDecl,
8588 bool HadMultipleCandidates,
8589 const DeclarationNameInfo &MemberNameInfo, QualType Ty,
8591 const TemplateArgumentListInfo *TemplateArgs = nullptr);
8592
8593 // Check whether the declarations we found through a nested-name
8594 // specifier in a member expression are actually members of the base
8595 // type. The restriction here is:
8596 //
8597 // C++ [expr.ref]p2:
8598 // ... In these cases, the id-expression shall name a
8599 // member of the class or of one of its base classes.
8600 //
8601 // So it's perfectly legitimate for the nested-name specifier to name
8602 // an unrelated class, and for us to find an overload set including
8603 // decls from classes which are not superclasses, as long as the decl
8604 // we actually pick through overload resolution is from a superclass.
8605 bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType,
8606 const CXXScopeSpec &SS,
8607 const LookupResult &R);
8608
8609 // This struct is for use by ActOnMemberAccess to allow
8610 // BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
8611 // changing the access operator from a '.' to a '->' (to see if that is the
8612 // change needed to fix an error about an unknown member, e.g. when the class
8613 // defines a custom operator->).
8618 };
8619
8621 Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow,
8622 CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
8623 NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo,
8624 const TemplateArgumentListInfo *TemplateArgs, const Scope *S,
8625 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8626
8629 bool IsArrow, const CXXScopeSpec &SS,
8630 SourceLocation TemplateKWLoc,
8631 NamedDecl *FirstQualifierInScope, LookupResult &R,
8632 const TemplateArgumentListInfo *TemplateArgs,
8633 const Scope *S, bool SuppressQualifierCheck = false,
8634 ActOnMemberAccessExtraArgs *ExtraArgs = nullptr);
8635
8636 ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow,
8637 SourceLocation OpLoc,
8638 const CXXScopeSpec &SS, FieldDecl *Field,
8639 DeclAccessPair FoundDecl,
8640 const DeclarationNameInfo &MemberNameInfo);
8641
8642 /// Perform conversions on the LHS of a member access expression.
8644
8646 const CXXScopeSpec &SS, SourceLocation nameLoc,
8647 IndirectFieldDecl *indirectField,
8648 DeclAccessPair FoundDecl = DeclAccessPair::make(nullptr, AS_none),
8649 Expr *baseObjectExpr = nullptr, SourceLocation opLoc = SourceLocation());
8650
8651private:
8652 void CheckMemberAccessOfNoDeref(const MemberExpr *E);
8653
8654 ///@}
8655
8656 //
8657 //
8658 // -------------------------------------------------------------------------
8659 //
8660 //
8661
8662 /// \name Initializers
8663 /// Implementations are in SemaInit.cpp
8664 ///@{
8665
8666public:
8667 /// Stack of types that correspond to the parameter entities that are
8668 /// currently being copy-initialized. Can be empty.
8670
8671 llvm::DenseMap<unsigned, CXXDeductionGuideDecl *>
8673
8674 bool IsStringInit(Expr *Init, const ArrayType *AT);
8675
8676 /// Determine whether we can perform aggregate initialization for the purposes
8677 /// of overload resolution.
8679 const InitializedEntity &Entity, InitListExpr *From);
8680
8682 SourceLocation EqualOrColonLoc,
8683 bool GNUSyntax, ExprResult Init);
8684
8685 /// Check that the lifetime of the initializer (and its subobjects) is
8686 /// sufficient for initializing the entity, and perform lifetime extension
8687 /// (when permitted) if not.
8689
8692 bool BoundToLvalueReference);
8693
8694 /// If \p E is a prvalue denoting an unmaterialized temporary, materialize
8695 /// it as an xvalue. In C++98, the result will still be a prvalue, because
8696 /// we don't have xvalues there.
8698
8702
8706 SourceLocation EqualLoc, ExprResult Init,
8707 bool TopLevelOfInitList = false,
8708 bool AllowExplicit = false);
8709
8711 TypeSourceInfo *TInfo, const InitializedEntity &Entity,
8713
8714 ///@}
8715
8716 //
8717 //
8718 // -------------------------------------------------------------------------
8719 //
8720 //
8721
8722 /// \name C++ Lambda Expressions
8723 /// Implementations are in SemaLambda.cpp
8724 ///@{
8725
8726public:
8727 /// Create a new lambda closure type.
8729 TypeSourceInfo *Info,
8730 unsigned LambdaDependencyKind,
8731 LambdaCaptureDefault CaptureDefault);
8732
8733 /// Number lambda for linkage purposes if necessary.
8735 std::optional<CXXRecordDecl::LambdaNumbering>
8736 NumberingOverride = std::nullopt);
8737
8738 /// Endow the lambda scope info with the relevant properties.
8739 void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator,
8740 SourceRange IntroducerRange,
8741 LambdaCaptureDefault CaptureDefault,
8742 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
8743 bool Mutable);
8744
8747
8749 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
8750 TemplateParameterList *TemplateParams);
8751
8753 CXXMethodDecl *Method, SourceLocation LambdaLoc,
8754 SourceLocation CallOperatorLoc, Expr *TrailingRequiresClause,
8755 TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind,
8757 bool HasExplicitResultType);
8758
8759 /// Returns true if the explicit object parameter was invalid.
8761 SourceLocation CallLoc);
8762
8763 /// Perform initialization analysis of the init-capture and perform
8764 /// any implicit conversions such as an lvalue-to-rvalue conversion if
8765 /// not being used to initialize a reference.
8767 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
8770 Loc, ByRef, EllipsisLoc, std::nullopt, Id,
8772 }
8774 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
8775 std::optional<unsigned> NumExpansions, IdentifierInfo *Id,
8776 bool DirectInit, Expr *&Init);
8777
8778 /// Create a dummy variable within the declcontext of the lambda's
8779 /// call operator, for name lookup purposes for a lambda init capture.
8780 ///
8781 /// CodeGen handles emission of lambda captures, ignoring these dummy
8782 /// variables appropriately.
8784 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
8785 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx);
8786
8787 /// Add an init-capture to a lambda scope.
8788 void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef);
8789
8790 /// Note that we have finished the explicit captures for the
8791 /// given lambda.
8793
8794 /// Deduce a block or lambda's return type based on the return
8795 /// statements present in the body.
8797
8798 /// Once the Lambdas capture are known, we can start to create the closure,
8799 /// call operator method, and keep track of the captures.
8800 /// We do the capture lookup here, but they are not actually captured until
8801 /// after we know what the qualifiers of the call operator are.
8803 Scope *CurContext);
8804
8805 /// This is called after parsing the explicit template parameter list
8806 /// on a lambda (if it exists) in C++2a.
8808 SourceLocation LAngleLoc,
8809 ArrayRef<NamedDecl *> TParams,
8810 SourceLocation RAngleLoc,
8811 ExprResult RequiresClause);
8812
8814 SourceLocation MutableLoc);
8815
8817 Scope *LambdaScope,
8819
8820 /// ActOnStartOfLambdaDefinition - This is called just before we start
8821 /// parsing the body of a lambda; it analyzes the explicit captures and
8822 /// arguments, and sets up various data-structures for the body of the
8823 /// lambda.
8825 Declarator &ParamInfo, const DeclSpec &DS);
8826
8827 /// ActOnLambdaError - If there is an error parsing a lambda, this callback
8828 /// is invoked to pop the information about the lambda.
8829 void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
8830 bool IsInstantiation = false);
8831
8832 /// ActOnLambdaExpr - This is called when the body of a lambda expression
8833 /// was successfully completed.
8835
8836 /// Does copying/destroying the captured variable have side effects?
8837 bool CaptureHasSideEffects(const sema::Capture &From);
8838
8839 /// Diagnose if an explicit lambda capture is unused. Returns true if a
8840 /// diagnostic is emitted.
8841 bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange,
8842 const sema::Capture &From);
8843
8844 /// Build a FieldDecl suitable to hold the given capture.
8846
8847 /// Initialize the given capture with a suitable expression.
8849 SourceLocation ImplicitCaptureLoc,
8850 bool IsOpenMPMapping = false);
8851
8852 /// Complete a lambda-expression having processed and attached the
8853 /// lambda body.
8856
8857 /// Get the return type to use for a lambda's conversion function(s) to
8858 /// function pointer type, given the type of the call operator.
8859 QualType
8861 CallingConv CC);
8862
8864 SourceLocation ConvLocation,
8865 CXXConversionDecl *Conv, Expr *Src);
8866
8868 : private FunctionScopeRAII {
8869 public:
8871 Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL,
8873 bool ShouldAddDeclsFromParentScope = true);
8874 };
8875
8876 /// Compute the mangling number context for a lambda expression or
8877 /// block literal. Also return the extra mangling decl if any.
8878 ///
8879 /// \param DC - The DeclContext containing the lambda expression or
8880 /// block literal.
8881 std::tuple<MangleNumberingContext *, Decl *>
8883
8884 ///@}
8885
8886 //
8887 //
8888 // -------------------------------------------------------------------------
8889 //
8890 //
8891
8892 /// \name Name Lookup
8893 ///
8894 /// These routines provide name lookup that is used during semantic
8895 /// analysis to resolve the various kinds of names (identifiers,
8896 /// overloaded operator names, constructor names, etc.) into zero or
8897 /// more declarations within a particular scope. The major entry
8898 /// points are LookupName, which performs unqualified name lookup,
8899 /// and LookupQualifiedName, which performs qualified name lookup.
8900 ///
8901 /// All name lookup is performed based on some specific criteria,
8902 /// which specify what names will be visible to name lookup and how
8903 /// far name lookup should work. These criteria are important both
8904 /// for capturing language semantics (certain lookups will ignore
8905 /// certain names, for example) and for performance, since name
8906 /// lookup is often a bottleneck in the compilation of C++. Name
8907 /// lookup criteria is specified via the LookupCriteria enumeration.
8908 ///
8909 /// The results of name lookup can vary based on the kind of name
8910 /// lookup performed, the current language, and the translation
8911 /// unit. In C, for example, name lookup will either return nothing
8912 /// (no entity found) or a single declaration. In C++, name lookup
8913 /// can additionally refer to a set of overloaded functions or
8914 /// result in an ambiguity. All of the possible results of name
8915 /// lookup are captured by the LookupResult class, which provides
8916 /// the ability to distinguish among them.
8917 ///
8918 /// Implementations are in SemaLookup.cpp
8919 ///@{
8920
8921public:
8922 /// Tracks whether we are in a context where typo correction is
8923 /// disabled.
8925
8926 /// The number of typos corrected by CorrectTypo.
8928
8929 typedef llvm::SmallSet<SourceLocation, 2> SrcLocSet;
8930 typedef llvm::DenseMap<IdentifierInfo *, SrcLocSet> IdentifierSourceLocations;
8931
8932 /// A cache containing identifiers for which typo correction failed and
8933 /// their locations, so that repeated attempts to correct an identifier in a
8934 /// given location are ignored if typo correction already failed for it.
8936
8937 /// SpecialMemberOverloadResult - The overloading result for a special member
8938 /// function.
8939 ///
8940 /// This is basically a wrapper around PointerIntPair. The lowest bits of the
8941 /// integer are used to determine whether overload resolution succeeded.
8943 public:
8944 enum Kind { NoMemberOrDeleted, Ambiguous, Success };
8945
8946 private:
8947 llvm::PointerIntPair<CXXMethodDecl *, 2> Pair;
8948
8949 public:
8952 : Pair(MD, MD->isDeleted() ? NoMemberOrDeleted : Success) {}
8953
8954 CXXMethodDecl *getMethod() const { return Pair.getPointer(); }
8955 void setMethod(CXXMethodDecl *MD) { Pair.setPointer(MD); }
8956
8957 Kind getKind() const { return static_cast<Kind>(Pair.getInt()); }
8958 void setKind(Kind K) { Pair.setInt(K); }
8959 };
8960
8961 class SpecialMemberOverloadResultEntry : public llvm::FastFoldingSetNode,
8963 public:
8964 SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
8965 : FastFoldingSetNode(ID) {}
8966 };
8967
8968 /// A cache of special member function overload resolution results
8969 /// for C++ records.
8970 llvm::FoldingSet<SpecialMemberOverloadResultEntry> SpecialMemberCache;
8971
8972 /// Holds TypoExprs that are created from `createDelayedTypo`. This is used by
8973 /// `TransformTypos` in order to keep track of any TypoExprs that are created
8974 /// recursively during typo correction and wipe them away if the correction
8975 /// fails.
8977
8979
8980 // Members have to be NamespaceDecl* or TranslationUnitDecl*.
8981 // TODO: make this is a typesafe union.
8984
8985 /// Describes the kind of name lookup to perform.
8987 /// Ordinary name lookup, which finds ordinary names (functions,
8988 /// variables, typedefs, etc.) in C and most kinds of names
8989 /// (functions, variables, members, types, etc.) in C++.
8991 /// Tag name lookup, which finds the names of enums, classes,
8992 /// structs, and unions.
8994 /// Label name lookup.
8996 /// Member name lookup, which finds the names of
8997 /// class/struct/union members.
8999 /// Look up of an operator name (e.g., operator+) for use with
9000 /// operator overloading. This lookup is similar to ordinary name
9001 /// lookup, but will ignore any declarations that are class members.
9003 /// Look up a name following ~ in a destructor name. This is an ordinary
9004 /// lookup, but prefers tags to typedefs.
9006 /// Look up of a name that precedes the '::' scope resolution
9007 /// operator in C++. This lookup completely ignores operator, object,
9008 /// function, and enumerator names (C++ [basic.lookup.qual]p1).
9010 /// Look up a namespace name within a C++ using directive or
9011 /// namespace alias definition, ignoring non-namespace names (C++
9012 /// [basic.lookup.udir]p1).
9014 /// Look up all declarations in a scope with the given name,
9015 /// including resolved using declarations. This is appropriate
9016 /// for checking redeclarations for a using declaration.
9018 /// Look up an ordinary name that is going to be redeclared as a
9019 /// name with linkage. This lookup ignores any declarations that
9020 /// are outside of the current scope unless they have linkage. See
9021 /// C99 6.2.2p4-5 and C++ [basic.link]p6.
9023 /// Look up a friend of a local class. This lookup does not look
9024 /// outside the innermost non-class scope. See C++11 [class.friend]p11.
9026 /// Look up the name of an Objective-C protocol.
9028 /// Look up implicit 'self' parameter of an objective-c method.
9030 /// Look up the name of an OpenMP user-defined reduction operation.
9032 /// Look up the name of an OpenMP user-defined mapper.
9034 /// Look up any declaration with any name.
9037
9038 /// The possible outcomes of name lookup for a literal operator.
9040 /// The lookup resulted in an error.
9042 /// The lookup found no match but no diagnostic was issued.
9044 /// The lookup found a single 'cooked' literal operator, which
9045 /// expects a normal literal to be built and passed to it.
9047 /// The lookup found a single 'raw' literal operator, which expects
9048 /// a string literal containing the spelling of the literal token.
9050 /// The lookup found an overload set of literal operator templates,
9051 /// which expect the characters of the spelling of the literal token to be
9052 /// passed as a non-type template argument pack.
9054 /// The lookup found an overload set of literal operator templates,
9055 /// which expect the character type and characters of the spelling of the
9056 /// string literal token to be passed as template arguments.
9058 };
9059
9060 SpecialMemberOverloadResult
9062 bool VolatileArg, bool RValueThis, bool ConstThis,
9063 bool VolatileThis);
9064
9065 typedef std::function<void(const TypoCorrection &)> TypoDiagnosticGenerator;
9066 typedef std::function<ExprResult(Sema &, TypoExpr *, TypoCorrection)>
9068
9070
9071 /// Look up a name, looking for a single declaration. Return
9072 /// null if the results were absent, ambiguous, or overloaded.
9073 ///
9074 /// It is preferable to use the elaborated form and explicitly handle
9075 /// ambiguity and overloaded.
9078 LookupNameKind NameKind,
9079 RedeclarationKind Redecl = RedeclarationKind::NotForRedeclaration);
9080
9081 /// Lookup a builtin function, when name lookup would otherwise
9082 /// fail.
9083 bool LookupBuiltin(LookupResult &R);
9084 void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID);
9085
9086 /// Perform unqualified name lookup starting from a given
9087 /// scope.
9088 ///
9089 /// Unqualified name lookup (C++ [basic.lookup.unqual], C99 6.2.1) is
9090 /// used to find names within the current scope. For example, 'x' in
9091 /// @code
9092 /// int x;
9093 /// int f() {
9094 /// return x; // unqualified name look finds 'x' in the global scope
9095 /// }
9096 /// @endcode
9097 ///
9098 /// Different lookup criteria can find different names. For example, a
9099 /// particular scope can have both a struct and a function of the same
9100 /// name, and each can be found by certain lookup criteria. For more
9101 /// information about lookup criteria, see the documentation for the
9102 /// class LookupCriteria.
9103 ///
9104 /// @param S The scope from which unqualified name lookup will
9105 /// begin. If the lookup criteria permits, name lookup may also search
9106 /// in the parent scopes.
9107 ///
9108 /// @param [in,out] R Specifies the lookup to perform (e.g., the name to
9109 /// look up and the lookup kind), and is updated with the results of lookup
9110 /// including zero or more declarations and possibly additional information
9111 /// used to diagnose ambiguities.
9112 ///
9113 /// @returns \c true if lookup succeeded and false otherwise.
9114 bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation = false,
9115 bool ForceNoCPlusPlus = false);
9116
9117 /// Perform qualified name lookup into a given context.
9118 ///
9119 /// Qualified name lookup (C++ [basic.lookup.qual]) is used to find
9120 /// names when the context of those names is explicit specified, e.g.,
9121 /// "std::vector" or "x->member", or as part of unqualified name lookup.
9122 ///
9123 /// Different lookup criteria can find different names. For example, a
9124 /// particular scope can have both a struct and a function of the same
9125 /// name, and each can be found by certain lookup criteria. For more
9126 /// information about lookup criteria, see the documentation for the
9127 /// class LookupCriteria.
9128 ///
9129 /// \param R captures both the lookup criteria and any lookup results found.
9130 ///
9131 /// \param LookupCtx The context in which qualified name lookup will
9132 /// search. If the lookup criteria permits, name lookup may also search
9133 /// in the parent contexts or (for C++ classes) base classes.
9134 ///
9135 /// \param InUnqualifiedLookup true if this is qualified name lookup that
9136 /// occurs as part of unqualified name lookup.
9137 ///
9138 /// \returns true if lookup succeeded, false if it failed.
9139 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9140 bool InUnqualifiedLookup = false);
9141
9142 /// Performs qualified name lookup or special type of lookup for
9143 /// "__super::" scope specifier.
9144 ///
9145 /// This routine is a convenience overload meant to be called from contexts
9146 /// that need to perform a qualified name lookup with an optional C++ scope
9147 /// specifier that might require special kind of lookup.
9148 ///
9149 /// \param R captures both the lookup criteria and any lookup results found.
9150 ///
9151 /// \param LookupCtx The context in which qualified name lookup will
9152 /// search.
9153 ///
9154 /// \param SS An optional C++ scope-specifier.
9155 ///
9156 /// \returns true if lookup succeeded, false if it failed.
9157 bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
9158 CXXScopeSpec &SS);
9159
9160 /// Performs name lookup for a name that was parsed in the
9161 /// source code, and may contain a C++ scope specifier.
9162 ///
9163 /// This routine is a convenience routine meant to be called from
9164 /// contexts that receive a name and an optional C++ scope specifier
9165 /// (e.g., "N::M::x"). It will then perform either qualified or
9166 /// unqualified name lookup (with LookupQualifiedName or LookupName,
9167 /// respectively) on the given name and return those results. It will
9168 /// perform a special type of lookup for "__super::" scope specifier.
9169 ///
9170 /// @param S The scope from which unqualified name lookup will
9171 /// begin.
9172 ///
9173 /// @param SS An optional C++ scope-specifier, e.g., "::N::M".
9174 ///
9175 /// @param EnteringContext Indicates whether we are going to enter the
9176 /// context of the scope-specifier SS (if present).
9177 ///
9178 /// @returns True if any decls were found (but possibly ambiguous)
9180 QualType ObjectType, bool AllowBuiltinCreation = false,
9181 bool EnteringContext = false);
9182
9183 /// Perform qualified name lookup into all base classes of the given
9184 /// class.
9185 ///
9186 /// \param R captures both the lookup criteria and any lookup results found.
9187 ///
9188 /// \param Class The context in which qualified name lookup will
9189 /// search. Name lookup will search in all base classes merging the results.
9190 ///
9191 /// @returns True if any decls were found (but possibly ambiguous)
9193
9195 UnresolvedSetImpl &Functions);
9196
9197 /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.
9198 /// If GnuLabelLoc is a valid source location, then this is a definition
9199 /// of an __label__ label name, otherwise it is a normal label definition
9200 /// or use.
9202 SourceLocation GnuLabelLoc = SourceLocation());
9203
9204 /// Look up the constructors for the given class.
9206
9207 /// Look up the default constructor for the given class.
9209
9210 /// Look up the copying constructor for the given class.
9212 unsigned Quals);
9213
9214 /// Look up the copying assignment operator for the given class.
9216 bool RValueThis, unsigned ThisQuals);
9217
9218 /// Look up the moving constructor for the given class.
9220 unsigned Quals);
9221
9222 /// Look up the moving assignment operator for the given class.
9224 bool RValueThis, unsigned ThisQuals);
9225
9226 /// Look for the destructor of the given class.
9227 ///
9228 /// During semantic analysis, this routine should be used in lieu of
9229 /// CXXRecordDecl::getDestructor().
9230 ///
9231 /// \returns The destructor for this class.
9233
9234 /// Force the declaration of any implicitly-declared members of this
9235 /// class.
9237
9238 /// Make a merged definition of an existing hidden definition \p ND
9239 /// visible at the specified location.
9241
9242 /// Check ODR hashes for C/ObjC when merging types from modules.
9243 /// Differently from C++, actually parse the body and reject in case
9244 /// of a mismatch.
9245 template <typename T,
9246 typename = std::enable_if_t<std::is_base_of<NamedDecl, T>::value>>
9248 if (Duplicate->getODRHash() != Previous->getODRHash())
9249 return false;
9250
9251 // Make the previous decl visible.
9253 return true;
9254 }
9255
9256 /// Get the set of additional modules that should be checked during
9257 /// name lookup. A module and its imports become visible when instanting a
9258 /// template defined within it.
9259 llvm::DenseSet<Module *> &getLookupModules();
9260
9261 bool hasVisibleMergedDefinition(const NamedDecl *Def);
9263
9264 /// Determine if the template parameter \p D has a visible default argument.
9265 bool
9267 llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9268 /// Determine if the template parameter \p D has a reachable default argument.
9270 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9271 /// Determine if the template parameter \p D has a reachable default argument.
9275
9276 /// Determine if there is a visible declaration of \p D that is an explicit
9277 /// specialization declaration for a specialization of a template. (For a
9278 /// member specialization, use hasVisibleMemberSpecialization.)
9280 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9281 /// Determine if there is a reachable declaration of \p D that is an explicit
9282 /// specialization declaration for a specialization of a template. (For a
9283 /// member specialization, use hasReachableMemberSpecialization.)
9285 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9286
9287 /// Determine if there is a visible declaration of \p D that is a member
9288 /// specialization declaration (as opposed to an instantiated declaration).
9290 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9291 /// Determine if there is a reachable declaration of \p D that is a member
9292 /// specialization declaration (as opposed to an instantiated declaration).
9294 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9295
9296 bool isModuleVisible(const Module *M, bool ModulePrivate = false);
9297
9298 /// Determine whether any declaration of an entity is visible.
9299 bool
9301 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9302 return isVisible(D) || hasVisibleDeclarationSlow(D, Modules);
9303 }
9304
9307 /// Determine whether any declaration of an entity is reachable.
9308 bool
9310 llvm::SmallVectorImpl<Module *> *Modules = nullptr) {
9311 return isReachable(D) || hasReachableDeclarationSlow(D, Modules);
9312 }
9314 const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules = nullptr);
9315
9316 void diagnoseTypo(const TypoCorrection &Correction,
9317 const PartialDiagnostic &TypoDiag,
9318 bool ErrorRecovery = true);
9319
9320 /// Diagnose a successfully-corrected typo. Separated from the correction
9321 /// itself to allow external validation of the result, etc.
9322 ///
9323 /// \param Correction The result of performing typo correction.
9324 /// \param TypoDiag The diagnostic to produce. This will have the corrected
9325 /// string added to it (and usually also a fixit).
9326 /// \param PrevNote A note to use when indicating the location of the entity
9327 /// to which we are correcting. Will have the correction string added
9328 /// to it.
9329 /// \param ErrorRecovery If \c true (the default), the caller is going to
9330 /// recover from the typo as if the corrected string had been typed.
9331 /// In this case, \c PDiag must be an error, and we will attach a fixit
9332 /// to it.
9333 void diagnoseTypo(const TypoCorrection &Correction,
9334 const PartialDiagnostic &TypoDiag,
9335 const PartialDiagnostic &PrevNote,
9336 bool ErrorRecovery = true);
9337
9338 /// Find the associated classes and namespaces for
9339 /// argument-dependent lookup for a call with the given set of
9340 /// arguments.
9341 ///
9342 /// This routine computes the sets of associated classes and associated
9343 /// namespaces searched by argument-dependent lookup
9344 /// (C++ [basic.lookup.argdep]) for a given set of arguments.
9346 SourceLocation InstantiationLoc, ArrayRef<Expr *> Args,
9347 AssociatedNamespaceSet &AssociatedNamespaces,
9348 AssociatedClassSet &AssociatedClasses);
9349
9350 /// Produce a diagnostic describing the ambiguity that resulted
9351 /// from name lookup.
9352 ///
9353 /// \param Result The result of the ambiguous lookup to be diagnosed.
9355
9356 /// LookupLiteralOperator - Determine which literal operator should be used
9357 /// for a user-defined literal, per C++11 [lex.ext].
9358 ///
9359 /// Normal overload resolution is not used to select which literal operator to
9360 /// call for a user-defined literal. Look up the provided literal operator
9361 /// name, and filter the results to the appropriate set for the given argument
9362 /// types.
9365 bool AllowRaw, bool AllowTemplate,
9366 bool AllowStringTemplate, bool DiagnoseMissing,
9367 StringLiteral *StringLit = nullptr);
9368
9370 ArrayRef<Expr *> Args, ADLResult &Functions);
9371
9374 bool IncludeGlobalScope = true,
9375 bool LoadExternal = true);
9378 bool IncludeGlobalScope = true,
9379 bool IncludeDependentBases = false,
9380 bool LoadExternal = true);
9381
9383 CTK_NonError, // CorrectTypo used in a non error recovery situation.
9384 CTK_ErrorRecovery // CorrectTypo used in normal error recovery.
9386
9387 /// Try to "correct" a typo in the source code by finding
9388 /// visible declarations whose names are similar to the name that was
9389 /// present in the source code.
9390 ///
9391 /// \param TypoName the \c DeclarationNameInfo structure that contains
9392 /// the name that was present in the source code along with its location.
9393 ///
9394 /// \param LookupKind the name-lookup criteria used to search for the name.
9395 ///
9396 /// \param S the scope in which name lookup occurs.
9397 ///
9398 /// \param SS the nested-name-specifier that precedes the name we're
9399 /// looking for, if present.
9400 ///
9401 /// \param CCC A CorrectionCandidateCallback object that provides further
9402 /// validation of typo correction candidates. It also provides flags for
9403 /// determining the set of keywords permitted.
9404 ///
9405 /// \param MemberContext if non-NULL, the context in which to look for
9406 /// a member access expression.
9407 ///
9408 /// \param EnteringContext whether we're entering the context described by
9409 /// the nested-name-specifier SS.
9410 ///
9411 /// \param OPT when non-NULL, the search for visible declarations will
9412 /// also walk the protocols in the qualified interfaces of \p OPT.
9413 ///
9414 /// \returns a \c TypoCorrection containing the corrected name if the typo
9415 /// along with information such as the \c NamedDecl where the corrected name
9416 /// was declared, and any additional \c NestedNameSpecifier needed to access
9417 /// it (C++ only). The \c TypoCorrection is empty if there is no correction.
9419 Sema::LookupNameKind LookupKind, Scope *S,
9421 CorrectTypoKind Mode,
9422 DeclContext *MemberContext = nullptr,
9423 bool EnteringContext = false,
9424 const ObjCObjectPointerType *OPT = nullptr,
9425 bool RecordFailure = true);
9426
9427 /// Try to "correct" a typo in the source code by finding
9428 /// visible declarations whose names are similar to the name that was
9429 /// present in the source code.
9430 ///
9431 /// \param TypoName the \c DeclarationNameInfo structure that contains
9432 /// the name that was present in the source code along with its location.
9433 ///
9434 /// \param LookupKind the name-lookup criteria used to search for the name.
9435 ///
9436 /// \param S the scope in which name lookup occurs.
9437 ///
9438 /// \param SS the nested-name-specifier that precedes the name we're
9439 /// looking for, if present.
9440 ///
9441 /// \param CCC A CorrectionCandidateCallback object that provides further
9442 /// validation of typo correction candidates. It also provides flags for
9443 /// determining the set of keywords permitted.
9444 ///
9445 /// \param TDG A TypoDiagnosticGenerator functor that will be used to print
9446 /// diagnostics when the actual typo correction is attempted.
9447 ///
9448 /// \param TRC A TypoRecoveryCallback functor that will be used to build an
9449 /// Expr from a typo correction candidate.
9450 ///
9451 /// \param MemberContext if non-NULL, the context in which to look for
9452 /// a member access expression.
9453 ///
9454 /// \param EnteringContext whether we're entering the context described by
9455 /// the nested-name-specifier SS.
9456 ///
9457 /// \param OPT when non-NULL, the search for visible declarations will
9458 /// also walk the protocols in the qualified interfaces of \p OPT.
9459 ///
9460 /// \returns a new \c TypoExpr that will later be replaced in the AST with an
9461 /// Expr representing the result of performing typo correction, or nullptr if
9462 /// typo correction is not possible. If nullptr is returned, no diagnostics
9463 /// will be emitted and it is the responsibility of the caller to emit any
9464 /// that are needed.
9466 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9469 CorrectTypoKind Mode, DeclContext *MemberContext = nullptr,
9470 bool EnteringContext = false, const ObjCObjectPointerType *OPT = nullptr);
9471
9472 /// Kinds of missing import. Note, the values of these enumerators correspond
9473 /// to %select values in diagnostics.
9476 Definition,
9480 };
9481
9482 /// Diagnose that the specified declaration needs to be visible but
9483 /// isn't, and suggest a module import that would resolve the problem.
9485 MissingImportKind MIK, bool Recover = true);
9487 SourceLocation DeclLoc, ArrayRef<Module *> Modules,
9488 MissingImportKind MIK, bool Recover);
9489
9491 std::unique_ptr<TypoCorrectionConsumer> Consumer;
9494 TypoExprState();
9495 TypoExprState(TypoExprState &&other) noexcept;
9496 TypoExprState &operator=(TypoExprState &&other) noexcept;
9497 };
9498
9499 const TypoExprState &getTypoExprState(TypoExpr *TE) const;
9500
9501 /// Clears the state of the given TypoExpr.
9502 void clearDelayedTypo(TypoExpr *TE);
9503
9504 /// Called on #pragma clang __debug dump II
9506
9507 /// Called on #pragma clang __debug dump E
9508 void ActOnPragmaDump(Expr *E);
9509
9510private:
9511 // The set of known/encountered (unique, canonicalized) NamespaceDecls.
9512 //
9513 // The boolean value will be true to indicate that the namespace was loaded
9514 // from an AST/PCH file, or false otherwise.
9515 llvm::MapVector<NamespaceDecl *, bool> KnownNamespaces;
9516
9517 /// Whether we have already loaded known namespaces from an extenal
9518 /// source.
9519 bool LoadedExternalKnownNamespaces;
9520
9521 bool CppLookupName(LookupResult &R, Scope *S);
9522
9523 /// Determine if we could use all the declarations in the module.
9524 bool isUsableModule(const Module *M);
9525
9526 /// Helper for CorrectTypo and CorrectTypoDelayed used to create and
9527 /// populate a new TypoCorrectionConsumer. Returns nullptr if typo correction
9528 /// should be skipped entirely.
9529 std::unique_ptr<TypoCorrectionConsumer> makeTypoCorrectionConsumer(
9530 const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind,
9532 DeclContext *MemberContext, bool EnteringContext,
9533 const ObjCObjectPointerType *OPT, bool ErrorRecovery);
9534
9535 /// The set of unhandled TypoExprs and their associated state.
9536 llvm::MapVector<TypoExpr *, TypoExprState> DelayedTypos;
9537
9538 /// Creates a new TypoExpr AST node.
9539 TypoExpr *createDelayedTypo(std::unique_ptr<TypoCorrectionConsumer> TCC,
9542
9543 /// Cache for module units which is usable for current module.
9544 llvm::DenseSet<const Module *> UsableModuleUnitsCache;
9545
9546 /// Record the typo correction failure and return an empty correction.
9547 TypoCorrection FailedCorrection(IdentifierInfo *Typo, SourceLocation TypoLoc,
9548 bool RecordFailure = true) {
9549 if (RecordFailure)
9550 TypoCorrectionFailures[Typo].insert(TypoLoc);
9551 return TypoCorrection();
9552 }
9553
9554 bool isAcceptableSlow(const NamedDecl *D, AcceptableKind Kind);
9555
9556 /// Determine whether two declarations should be linked together, given that
9557 /// the old declaration might not be visible and the new declaration might
9558 /// not have external linkage.
9559 bool shouldLinkPossiblyHiddenDecl(const NamedDecl *Old,
9560 const NamedDecl *New) {
9561 if (isVisible(Old))
9562 return true;
9563 // See comment in below overload for why it's safe to compute the linkage
9564 // of the new declaration here.
9565 if (New->isExternallyDeclarable()) {
9566 assert(Old->isExternallyDeclarable() &&
9567 "should not have found a non-externally-declarable previous decl");
9568 return true;
9569 }
9570 return false;
9571 }
9572 bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New);
9573
9574 ///@}
9575
9576 //
9577 //
9578 // -------------------------------------------------------------------------
9579 //
9580 //
9581
9582 /// \name Modules
9583 /// Implementations are in SemaModule.cpp
9584 ///@{
9585
9586public:
9587 /// Get the module unit whose scope we are currently within.
9589 return ModuleScopes.empty() ? nullptr : ModuleScopes.back().Module;
9590 }
9591
9592 /// Is the module scope we are an implementation unit?
9594 return ModuleScopes.empty()
9595 ? false
9596 : ModuleScopes.back().Module->isModuleImplementation();
9597 }
9598
9599 // When loading a non-modular PCH files, this is used to restore module
9600 // visibility.
9602 VisibleModules.setVisible(Mod, ImportLoc);
9603 }
9604
9605 enum class ModuleDeclKind {
9606 Interface, ///< 'export module X;'
9607 Implementation, ///< 'module X;'
9608 PartitionInterface, ///< 'export module X:Y;'
9609 PartitionImplementation, ///< 'module X:Y;'
9610 };
9611
9612 /// An enumeration to represent the transition of states in parsing module
9613 /// fragments and imports. If we are not parsing a C++20 TU, or we find
9614 /// an error in state transition, the state is set to NotACXX20Module.
9616 FirstDecl, ///< Parsing the first decl in a TU.
9617 GlobalFragment, ///< after 'module;' but before 'module X;'
9618 ImportAllowed, ///< after 'module X;' but before any non-import decl.
9619 ImportFinished, ///< after any non-import decl.
9620 PrivateFragmentImportAllowed, ///< after 'module :private;' but before any
9621 ///< non-import decl.
9622 PrivateFragmentImportFinished, ///< after 'module :private;' but a
9623 ///< non-import decl has already been seen.
9624 NotACXX20Module ///< Not a C++20 TU, or an invalid state was found.
9625 };
9626
9627 /// The parser has processed a module-declaration that begins the definition
9628 /// of a module interface or implementation.
9630 SourceLocation ModuleLoc, ModuleDeclKind MDK,
9631 ModuleIdPath Path, ModuleIdPath Partition,
9632 ModuleImportState &ImportState);
9633
9634 /// The parser has processed a global-module-fragment declaration that begins
9635 /// the definition of the global module fragment of the current module unit.
9636 /// \param ModuleLoc The location of the 'module' keyword.
9638
9639 /// The parser has processed a private-module-fragment declaration that begins
9640 /// the definition of the private module fragment of the current module unit.
9641 /// \param ModuleLoc The location of the 'module' keyword.
9642 /// \param PrivateLoc The location of the 'private' keyword.
9644 SourceLocation PrivateLoc);
9645
9646 /// The parser has processed a module import declaration.
9647 ///
9648 /// \param StartLoc The location of the first token in the declaration. This
9649 /// could be the location of an '@', 'export', or 'import'.
9650 /// \param ExportLoc The location of the 'export' keyword, if any.
9651 /// \param ImportLoc The location of the 'import' keyword.
9652 /// \param Path The module toplevel name as an access path.
9653 /// \param IsPartition If the name is for a partition.
9655 SourceLocation ExportLoc,
9656 SourceLocation ImportLoc, ModuleIdPath Path,
9657 bool IsPartition = false);
9659 SourceLocation ExportLoc,
9660 SourceLocation ImportLoc, Module *M,
9661 ModuleIdPath Path = {});
9662
9663 /// The parser has processed a module import translated from a
9664 /// #include or similar preprocessing directive.
9665 void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9666 void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
9667
9668 /// The parsed has entered a submodule.
9669 void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
9670 /// The parser has left a submodule.
9671 void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
9672
9673 /// Create an implicit import of the given module at the given
9674 /// source location, for error recovery, if possible.
9675 ///
9676 /// This routine is typically used when an entity found by name lookup
9677 /// is actually hidden within a module that we know about but the user
9678 /// has forgotten to import.
9680 Module *Mod);
9681
9682 /// We have parsed the start of an export declaration, including the '{'
9683 /// (if present).
9684 Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
9685 SourceLocation LBraceLoc);
9686
9687 /// Complete the definition of an export declaration.
9688 Decl *ActOnFinishExportDecl(Scope *S, Decl *ExportDecl,
9689 SourceLocation RBraceLoc);
9690
9691private:
9692 /// The parser has begun a translation unit to be compiled as a C++20
9693 /// Header Unit, helper for ActOnStartOfTranslationUnit() only.
9694 void HandleStartOfHeaderUnit();
9695
9696 struct ModuleScope {
9697 SourceLocation BeginLoc;
9698 clang::Module *Module = nullptr;
9699 VisibleModuleSet OuterVisibleModules;
9700 };
9701 /// The modules we're currently parsing.
9703
9704 /// For an interface unit, this is the implicitly imported interface unit.
9705 clang::Module *ThePrimaryInterface = nullptr;
9706
9707 /// The explicit global module fragment of the current translation unit.
9708 /// The explicit Global Module Fragment, as specified in C++
9709 /// [module.global.frag].
9710 clang::Module *TheGlobalModuleFragment = nullptr;
9711
9712 /// The implicit global module fragments of the current translation unit.
9713 ///
9714 /// The contents in the implicit global module fragment can't be discarded.
9715 clang::Module *TheImplicitGlobalModuleFragment = nullptr;
9716
9717 /// Namespace definitions that we will export when they finish.
9718 llvm::SmallPtrSet<const NamespaceDecl *, 8> DeferredExportedNamespaces;
9719
9720 /// In a C++ standard module, inline declarations require a definition to be
9721 /// present at the end of a definition domain. This set holds the decls to
9722 /// be checked at the end of the TU.
9723 llvm::SmallPtrSet<const FunctionDecl *, 8> PendingInlineFuncDecls;
9724
9725 /// Helper function to judge if we are in module purview.
9726 /// Return false if we are not in a module.
9727 bool isCurrentModulePurview() const;
9728
9729 /// Enter the scope of the explicit global module fragment.
9730 Module *PushGlobalModuleFragment(SourceLocation BeginLoc);
9731 /// Leave the scope of the explicit global module fragment.
9732 void PopGlobalModuleFragment();
9733
9734 /// Enter the scope of an implicit global module fragment.
9735 Module *PushImplicitGlobalModuleFragment(SourceLocation BeginLoc);
9736 /// Leave the scope of an implicit global module fragment.
9737 void PopImplicitGlobalModuleFragment();
9738
9739 VisibleModuleSet VisibleModules;
9740
9741 ///@}
9742
9743 //
9744 //
9745 // -------------------------------------------------------------------------
9746 //
9747 //
9748
9749 /// \name C++ Overloading
9750 /// Implementations are in SemaOverload.cpp
9751 ///@{
9752
9753public:
9754 /// Whether deferrable diagnostics should be deferred.
9755 bool DeferDiags = false;
9756
9757 /// RAII class to control scope of DeferDiags.
9759 Sema &S;
9760 bool SavedDeferDiags = false;
9761
9762 public:
9763 DeferDiagsRAII(Sema &S, bool DeferDiags)
9764 : S(S), SavedDeferDiags(S.DeferDiags) {
9765 S.DeferDiags = DeferDiags;
9766 }
9767 ~DeferDiagsRAII() { S.DeferDiags = SavedDeferDiags; }
9768 };
9769
9770 /// Flag indicating if Sema is building a recovery call expression.
9771 ///
9772 /// This flag is used to avoid building recovery call expressions
9773 /// if Sema is already doing so, which would cause infinite recursions.
9775
9777 /// This is a legitimate overload: the existing declarations are
9778 /// functions or function templates with different signatures.
9780
9781 /// This is not an overload because the signature exactly matches
9782 /// an existing declaration.
9784
9785 /// This is not an overload because the lookup results contain a
9786 /// non-function.
9789
9790 /// Determine whether the given New declaration is an overload of the
9791 /// declarations in Old. This routine returns Ovl_Match or Ovl_NonFunction if
9792 /// New and Old cannot be overloaded, e.g., if New has the same signature as
9793 /// some function in Old (C++ 1.3.10) or if the Old declarations aren't
9794 /// functions (or function templates) at all. When it does return Ovl_Match or
9795 /// Ovl_NonFunction, MatchedDecl will point to the decl that New cannot be
9796 /// overloaded with. This decl may be a UsingShadowDecl on top of the
9797 /// underlying declaration.
9798 ///
9799 /// Example: Given the following input:
9800 ///
9801 /// void f(int, float); // #1
9802 /// void f(int, int); // #2
9803 /// int f(int, int); // #3
9804 ///
9805 /// When we process #1, there is no previous declaration of "f", so IsOverload
9806 /// will not be used.
9807 ///
9808 /// When we process #2, Old contains only the FunctionDecl for #1. By
9809 /// comparing the parameter types, we see that #1 and #2 are overloaded (since
9810 /// they have different signatures), so this routine returns Ovl_Overload;
9811 /// MatchedDecl is unchanged.
9812 ///
9813 /// When we process #3, Old is an overload set containing #1 and #2. We
9814 /// compare the signatures of #3 to #1 (they're overloaded, so we do nothing)
9815 /// and then #3 to #2. Since the signatures of #3 and #2 are identical (return
9816 /// types of functions are not part of the signature), IsOverload returns
9817 /// Ovl_Match and MatchedDecl will be set to point to the FunctionDecl for #2.
9818 ///
9819 /// 'NewIsUsingShadowDecl' indicates that 'New' is being introduced into a
9820 /// class by a using declaration. The rules for whether to hide shadow
9821 /// declarations ignore some properties which otherwise figure into a function
9822 /// template's signature.
9824 const LookupResult &OldDecls, NamedDecl *&OldDecl,
9825 bool UseMemberUsingDeclRules);
9826 bool IsOverload(FunctionDecl *New, FunctionDecl *Old,
9827 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
9828
9829 // Checks whether MD constitutes an override the base class method BaseMD.
9830 // When checking for overrides, the object object members are ignored.
9831 bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD,
9832 bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs = true);
9833
9834 enum class AllowedExplicit {
9835 /// Allow no explicit functions to be used.
9836 None,
9837 /// Allow explicit conversion functions but not explicit constructors.
9839 /// Allow both explicit conversion functions and explicit constructors.
9840 All
9841 };
9842
9844 Expr *From, QualType ToType, bool SuppressUserConversions,
9845 AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle,
9846 bool AllowObjCWritebackConversion);
9847
9848 /// PerformImplicitConversion - Perform an implicit conversion of the
9849 /// expression From to the type ToType. Returns the
9850 /// converted expression. Flavor is the kind of conversion we're
9851 /// performing, used in the error message. If @p AllowExplicit,
9852 /// explicit user-defined conversions are permitted.
9854 AssignmentAction Action,
9855 bool AllowExplicit = false);
9856
9857 /// IsIntegralPromotion - Determines whether the conversion from the
9858 /// expression From (whose potentially-adjusted type is FromType) to
9859 /// ToType is an integral promotion (C++ 4.5). If so, returns true and
9860 /// sets PromotedType to the promoted type.
9861 bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType);
9862
9863 /// IsFloatingPointPromotion - Determines whether the conversion from
9864 /// FromType to ToType is a floating point promotion (C++ 4.6). If so,
9865 /// returns true and sets PromotedType to the promoted type.
9866 bool IsFloatingPointPromotion(QualType FromType, QualType ToType);
9867
9868 /// Determine if a conversion is a complex promotion.
9869 ///
9870 /// A complex promotion is defined as a complex -> complex conversion
9871 /// where the conversion between the underlying real types is a
9872 /// floating-point or integral promotion.
9873 bool IsComplexPromotion(QualType FromType, QualType ToType);
9874
9875 /// IsPointerConversion - Determines whether the conversion of the
9876 /// expression From, which has the (possibly adjusted) type FromType,
9877 /// can be converted to the type ToType via a pointer conversion (C++
9878 /// 4.10). If so, returns true and places the converted type (that
9879 /// might differ from ToType in its cv-qualifiers at some level) into
9880 /// ConvertedType.
9881 ///
9882 /// This routine also supports conversions to and from block pointers
9883 /// and conversions with Objective-C's 'id', 'id<protocols...>', and
9884 /// pointers to interfaces. FIXME: Once we've determined the
9885 /// appropriate overloading rules for Objective-C, we may want to
9886 /// split the Objective-C checks into a different routine; however,
9887 /// GCC seems to consider all of these conversions to be pointer
9888 /// conversions, so for now they live here. IncompatibleObjC will be
9889 /// set if the conversion is an allowed Objective-C conversion that
9890 /// should result in a warning.
9891 bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
9892 bool InOverloadResolution, QualType &ConvertedType,
9893 bool &IncompatibleObjC);
9894
9895 /// isObjCPointerConversion - Determines whether this is an
9896 /// Objective-C pointer conversion. Subroutine of IsPointerConversion,
9897 /// with the same arguments and return values.
9898 bool isObjCPointerConversion(QualType FromType, QualType ToType,
9899 QualType &ConvertedType, bool &IncompatibleObjC);
9900 bool IsBlockPointerConversion(QualType FromType, QualType ToType,
9901 QualType &ConvertedType);
9902
9903 /// FunctionParamTypesAreEqual - This routine checks two function proto types
9904 /// for equality of their parameter types. Caller has already checked that
9905 /// they have same number of parameters. If the parameters are different,
9906 /// ArgPos will have the parameter index of the first different parameter.
9907 /// If `Reversed` is true, the parameters of `NewType` will be compared in
9908 /// reverse order. That's useful if one of the functions is being used as a
9909 /// C++20 synthesized operator overload with a reversed parameter order.
9912 unsigned *ArgPos = nullptr,
9913 bool Reversed = false);
9914
9916 const FunctionProtoType *NewType,
9917 unsigned *ArgPos = nullptr,
9918 bool Reversed = false);
9919
9920 bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction,
9921 const FunctionDecl *NewFunction,
9922 unsigned *ArgPos = nullptr,
9923 bool Reversed = false);
9924
9925 /// HandleFunctionTypeMismatch - Gives diagnostic information for differeing
9926 /// function types. Catches different number of parameter, mismatch in
9927 /// parameter types, and different return types.
9929 QualType ToType);
9930
9931 /// CheckPointerConversion - Check the pointer conversion from the
9932 /// expression From to the type ToType. This routine checks for
9933 /// ambiguous or inaccessible derived-to-base pointer
9934 /// conversions for which IsPointerConversion has already returned
9935 /// true. It returns true and produces a diagnostic if there was an
9936 /// error, or returns false otherwise.
9937 bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind,
9938 CXXCastPath &BasePath, bool IgnoreBaseAccess,
9939 bool Diagnose = true);
9940
9941 /// IsMemberPointerConversion - Determines whether the conversion of the
9942 /// expression From, which has the (possibly adjusted) type FromType, can be
9943 /// converted to the type ToType via a member pointer conversion (C++ 4.11).
9944 /// If so, returns true and places the converted type (that might differ from
9945 /// ToType in its cv-qualifiers at some level) into ConvertedType.
9946 bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
9947 bool InOverloadResolution,
9948 QualType &ConvertedType);
9949
9950 /// CheckMemberPointerConversion - Check the member pointer conversion from
9951 /// the expression From to the type ToType. This routine checks for ambiguous
9952 /// or virtual or inaccessible base-to-derived member pointer conversions for
9953 /// which IsMemberPointerConversion has already returned true. It returns true
9954 /// and produces a diagnostic if there was an error, or returns false
9955 /// otherwise.
9957 CXXCastPath &BasePath,
9958 bool IgnoreBaseAccess);
9959
9960 /// IsQualificationConversion - Determines whether the conversion from
9961 /// an rvalue of type FromType to ToType is a qualification conversion
9962 /// (C++ 4.4).
9963 ///
9964 /// \param ObjCLifetimeConversion Output parameter that will be set to
9965 /// indicate when the qualification conversion involves a change in the
9966 /// Objective-C object lifetime.
9967 bool IsQualificationConversion(QualType FromType, QualType ToType,
9968 bool CStyle, bool &ObjCLifetimeConversion);
9969
9970 /// Determine whether the conversion from FromType to ToType is a valid
9971 /// conversion that strips "noexcept" or "noreturn" off the nested function
9972 /// type.
9973 bool IsFunctionConversion(QualType FromType, QualType ToType,
9974 QualType &ResultTy);
9977 DeclarationName Name,
9978 OverloadCandidateSet &CandidateSet,
9979 FunctionDecl *Fn, MultiExprArg Args,
9980 bool IsMember = false);
9981
9983 FunctionDecl *Fun);
9985 Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl,
9986 CXXMethodDecl *Method);
9987
9988 /// PerformContextuallyConvertToBool - Perform a contextual conversion
9989 /// of the expression From to bool (C++0x [conv]p3).
9991
9992 /// PerformContextuallyConvertToObjCPointer - Perform a contextual
9993 /// conversion of the expression From to an Objective-C pointer type.
9994 /// Returns a valid but null ExprResult if no conversion sequence exists.
9996
9997 /// Contexts in which a converted constant expression is required.
9998 enum CCEKind {
9999 CCEK_CaseValue, ///< Expression in a case label.
10000 CCEK_Enumerator, ///< Enumerator value with fixed underlying type.
10001 CCEK_TemplateArg, ///< Value of a non-type template parameter.
10002 CCEK_ArrayBound, ///< Array bound in array declarator or new-expression.
10003 CCEK_ExplicitBool, ///< Condition in an explicit(bool) specifier.
10004 CCEK_Noexcept, ///< Condition in a noexcept(bool) specifier.
10005 CCEK_StaticAssertMessageSize, ///< Call to size() in a static assert
10006 ///< message.
10007 CCEK_StaticAssertMessageData, ///< Call to data() in a static assert
10008 ///< message.
10009 };
10010
10012 CCEKind CCE,
10013 NamedDecl *Dest = nullptr);
10014
10016 llvm::APSInt &Value, CCEKind CCE);
10018 APValue &Value, CCEKind CCE,
10019 NamedDecl *Dest = nullptr);
10020
10021 /// EvaluateConvertedConstantExpression - Evaluate an Expression
10022 /// That is a converted constant expression
10023 /// (which was built with BuildConvertedConstantExpression)
10026 CCEKind CCE, bool RequireInt,
10027 const APValue &PreNarrowingValue);
10028
10029 /// Abstract base class used to perform a contextual implicit
10030 /// conversion from an expression to any type passing a filter.
10032 public:
10035
10036 ContextualImplicitConverter(bool Suppress = false,
10037 bool SuppressConversion = false)
10038 : Suppress(Suppress), SuppressConversion(SuppressConversion) {}
10039
10040 /// Determine whether the specified type is a valid destination type
10041 /// for this conversion.
10042 virtual bool match(QualType T) = 0;
10043
10044 /// Emits a diagnostic complaining that the expression does not have
10045 /// integral or enumeration type.
10047 QualType T) = 0;
10048
10049 /// Emits a diagnostic when the expression has incomplete class type.
10050 virtual SemaDiagnosticBuilder
10052
10053 /// Emits a diagnostic when the only matching conversion function
10054 /// is explicit.
10057 QualType T,
10058 QualType ConvTy) = 0;
10059
10060 /// Emits a note for the explicit conversion function.
10061 virtual SemaDiagnosticBuilder
10063
10064 /// Emits a diagnostic when there are multiple possible conversion
10065 /// functions.
10067 QualType T) = 0;
10068
10069 /// Emits a note for one of the candidate conversions.
10070 virtual SemaDiagnosticBuilder
10072
10073 /// Emits a diagnostic when we picked a conversion function
10074 /// (for cases when we are not allowed to pick a conversion function).
10077 QualType T,
10078 QualType ConvTy) = 0;
10079
10081 };
10082
10084 bool AllowScopedEnumerations;
10085
10086 public:
10087 ICEConvertDiagnoser(bool AllowScopedEnumerations, bool Suppress,
10088 bool SuppressConversion)
10089 : ContextualImplicitConverter(Suppress, SuppressConversion),
10090 AllowScopedEnumerations(AllowScopedEnumerations) {}
10091
10092 /// Match an integral or (possibly scoped) enumeration type.
10093 bool match(QualType T) override;
10094
10096 QualType T) override {
10097 return diagnoseNotInt(S, Loc, T);
10098 }
10099
10100 /// Emits a diagnostic complaining that the expression does not have
10101 /// integral or enumeration type.
10103 QualType T) = 0;
10104 };
10105
10106 /// Perform a contextual implicit conversion.
10109 ContextualImplicitConverter &Converter);
10110
10111 /// ReferenceCompareResult - Expresses the result of comparing two
10112 /// types (cv1 T1 and cv2 T2) to determine their compatibility for the
10113 /// purposes of initialization by reference (C++ [dcl.init.ref]p4).
10115 /// Ref_Incompatible - The two types are incompatible, so direct
10116 /// reference binding is not possible.
10118 /// Ref_Related - The two types are reference-related, which means
10119 /// that their unqualified forms (T1 and T2) are either the same
10120 /// or T1 is a base class of T2.
10122 /// Ref_Compatible - The two types are reference-compatible.
10125
10126 // Fake up a scoped enumeration that still contextually converts to bool.
10128 /// The conversions that would be performed on an lvalue of type T2 when
10129 /// binding a reference of type T1 to it, as determined when evaluating
10130 /// whether T1 is reference-compatible with T2.
10132 Qualification = 0x1,
10133 NestedQualification = 0x2,
10135 DerivedToBase = 0x8,
10136 ObjC = 0x10,
10137 ObjCLifetime = 0x20,
10138
10139 LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/ObjCLifetime)
10140 };
10141 };
10143
10144 /// CompareReferenceRelationship - Compare the two types T1 and T2 to
10145 /// determine whether they are reference-compatible,
10146 /// reference-related, or incompatible, for use in C++ initialization by
10147 /// reference (C++ [dcl.ref.init]p4). Neither type can be a reference
10148 /// type, and the first type (T1) is the pointee type of the reference
10149 /// type being initialized.
10152 ReferenceConversions *Conv = nullptr);
10153
10154 /// AddOverloadCandidate - Adds the given function to the set of
10155 /// candidate functions, using the given function call arguments. If
10156 /// @p SuppressUserConversions, then don't allow user-defined
10157 /// conversions via constructors or conversion operators.
10158 ///
10159 /// \param PartialOverloading true if we are performing "partial" overloading
10160 /// based on an incomplete set of function arguments. This feature is used by
10161 /// code completion.
10163 ArrayRef<Expr *> Args,
10164 OverloadCandidateSet &CandidateSet,
10165 bool SuppressUserConversions = false,
10166 bool PartialOverloading = false,
10167 bool AllowExplicit = true,
10168 bool AllowExplicitConversion = false,
10169 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10170 ConversionSequenceList EarlyConversions = {},
10172 bool AggregateCandidateDeduction = false);
10173
10174 /// Add all of the function declarations in the given function set to
10175 /// the overload candidate set.
10177 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10178 OverloadCandidateSet &CandidateSet,
10179 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
10180 bool SuppressUserConversions = false, bool PartialOverloading = false,
10181 bool FirstArgumentIsBase = false);
10182
10183 /// AddMethodCandidate - Adds a named decl (which is some kind of
10184 /// method) as a method candidate to the given overload set.
10185 void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
10186 Expr::Classification ObjectClassification,
10187 ArrayRef<Expr *> Args,
10188 OverloadCandidateSet &CandidateSet,
10189 bool SuppressUserConversion = false,
10191
10192 /// AddMethodCandidate - Adds the given C++ member function to the set
10193 /// of candidate functions, using the given function call arguments
10194 /// and the object argument (@c Object). For example, in a call
10195 /// @c o.f(a1,a2), @c Object will contain @c o and @c Args will contain
10196 /// both @c a1 and @c a2. If @p SuppressUserConversions, then don't
10197 /// allow user-defined conversions via constructors or conversion
10198 /// operators.
10199 void AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
10200 CXXRecordDecl *ActingContext, QualType ObjectType,
10201 Expr::Classification ObjectClassification,
10202 ArrayRef<Expr *> Args,
10203 OverloadCandidateSet &CandidateSet,
10204 bool SuppressUserConversions = false,
10205 bool PartialOverloading = false,
10206 ConversionSequenceList EarlyConversions = {},
10208
10209 /// Add a C++ member function template as a candidate to the candidate
10210 /// set, using template argument deduction to produce an appropriate member
10211 /// function template specialization.
10213 FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl,
10214 CXXRecordDecl *ActingContext,
10215 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType,
10216 Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
10217 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10218 bool PartialOverloading = false, OverloadCandidateParamOrder PO = {});
10219
10220 /// Add a C++ function template specialization as a candidate
10221 /// in the candidate set, using template argument deduction to produce
10222 /// an appropriate function template specialization.
10224 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10225 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
10226 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions = false,
10227 bool PartialOverloading = false, bool AllowExplicit = true,
10228 ADLCallKind IsADLCandidate = ADLCallKind::NotADL,
10230 bool AggregateCandidateDeduction = false);
10231
10232 /// Check that implicit conversion sequences can be formed for each argument
10233 /// whose corresponding parameter has a non-dependent type, per DR1391's
10234 /// [temp.deduct.call]p10.
10236 FunctionTemplateDecl *FunctionTemplate, ArrayRef<QualType> ParamTypes,
10237 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet,
10238 ConversionSequenceList &Conversions, bool SuppressUserConversions,
10239 CXXRecordDecl *ActingContext = nullptr, QualType ObjectType = QualType(),
10240 Expr::Classification ObjectClassification = {},
10242
10243 /// AddConversionCandidate - Add a C++ conversion function as a
10244 /// candidate in the candidate set (C++ [over.match.conv],
10245 /// C++ [over.match.copy]). From is the expression we're converting from,
10246 /// and ToType is the type that we're eventually trying to convert to
10247 /// (which may or may not be the same type as the type that the
10248 /// conversion function produces).
10250 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
10251 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10252 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10253 bool AllowExplicit, bool AllowResultConversion = true);
10254
10255 /// Adds a conversion function template specialization
10256 /// candidate to the overload set, using template argument deduction
10257 /// to deduce the template arguments of the conversion function
10258 /// template from the type that we are converting to (C++
10259 /// [temp.deduct.conv]).
10261 FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl,
10262 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
10263 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
10264 bool AllowExplicit, bool AllowResultConversion = true);
10265
10266 /// AddSurrogateCandidate - Adds a "surrogate" candidate function that
10267 /// converts the given @c Object to a function pointer via the
10268 /// conversion function @c Conversion, and then attempts to call it
10269 /// with the given arguments (C++ [over.call.object]p2-4). Proto is
10270 /// the type of function that we'll eventually be calling.
10271 void AddSurrogateCandidate(CXXConversionDecl *Conversion,
10272 DeclAccessPair FoundDecl,
10273 CXXRecordDecl *ActingContext,
10274 const FunctionProtoType *Proto, Expr *Object,
10275 ArrayRef<Expr *> Args,
10276 OverloadCandidateSet &CandidateSet);
10277
10278 /// Add all of the non-member operator function declarations in the given
10279 /// function set to the overload candidate set.
10281 const UnresolvedSetImpl &Functions, ArrayRef<Expr *> Args,
10282 OverloadCandidateSet &CandidateSet,
10283 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10284
10285 /// Add overload candidates for overloaded operators that are
10286 /// member functions.
10287 ///
10288 /// Add the overloaded operator candidates that are member functions
10289 /// for the operator Op that was used in an operator expression such
10290 /// as "x Op y". , Args/NumArgs provides the operator arguments, and
10291 /// CandidateSet will store the added overload candidates. (C++
10292 /// [over.match.oper]).
10294 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10295 OverloadCandidateSet &CandidateSet,
10297
10298 /// AddBuiltinCandidate - Add a candidate for a built-in
10299 /// operator. ResultTy and ParamTys are the result and parameter types
10300 /// of the built-in candidate, respectively. Args and NumArgs are the
10301 /// arguments being passed to the candidate. IsAssignmentOperator
10302 /// should be true when this built-in candidate is an assignment
10303 /// operator. NumContextualBoolArguments is the number of arguments
10304 /// (at the beginning of the argument list) that will be contextually
10305 /// converted to bool.
10306 void AddBuiltinCandidate(QualType *ParamTys, ArrayRef<Expr *> Args,
10307 OverloadCandidateSet &CandidateSet,
10308 bool IsAssignmentOperator = false,
10309 unsigned NumContextualBoolArguments = 0);
10310
10311 /// AddBuiltinOperatorCandidates - Add the appropriate built-in
10312 /// operator overloads to the candidate set (C++ [over.built]), based
10313 /// on the operator @p Op and the arguments given. For example, if the
10314 /// operator is a binary '+', this routine might add "int
10315 /// operator+(int, int)" to cover integer addition.
10317 SourceLocation OpLoc, ArrayRef<Expr *> Args,
10318 OverloadCandidateSet &CandidateSet);
10319
10320 /// Add function candidates found via argument-dependent lookup
10321 /// to the set of overloading candidates.
10322 ///
10323 /// This routine performs argument-dependent name lookup based on the
10324 /// given function name (which may also be an operator name) and adds
10325 /// all of the overload candidates found by ADL to the overload
10326 /// candidate set (C++ [basic.lookup.argdep]).
10328 DeclarationName Name, SourceLocation Loc, ArrayRef<Expr *> Args,
10329 TemplateArgumentListInfo *ExplicitTemplateArgs,
10330 OverloadCandidateSet &CandidateSet, bool PartialOverloading = false);
10331
10332 /// Check the enable_if expressions on the given function. Returns the first
10333 /// failing attribute, or NULL if they were all successful.
10334 EnableIfAttr *CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc,
10335 ArrayRef<Expr *> Args,
10336 bool MissingImplicitThis = false);
10337
10338 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10339 /// non-ArgDependent DiagnoseIfAttrs.
10340 ///
10341 /// Argument-dependent diagnose_if attributes should be checked each time a
10342 /// function is used as a direct callee of a function call.
10343 ///
10344 /// Returns true if any errors were emitted.
10345 bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function,
10346 const Expr *ThisArg,
10347 ArrayRef<const Expr *> Args,
10348 SourceLocation Loc);
10349
10350 /// Emit diagnostics for the diagnose_if attributes on Function, ignoring any
10351 /// ArgDependent DiagnoseIfAttrs.
10352 ///
10353 /// Argument-independent diagnose_if attributes should be checked on every use
10354 /// of a function.
10355 ///
10356 /// Returns true if any errors were emitted.
10357 bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND,
10358 SourceLocation Loc);
10359
10360 /// Determine if \p A and \p B are equivalent internal linkage declarations
10361 /// from different modules, and thus an ambiguity error can be downgraded to
10362 /// an extension warning.
10363 bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A,
10364 const NamedDecl *B);
10366 SourceLocation Loc, const NamedDecl *D,
10367 ArrayRef<const NamedDecl *> Equiv);
10368
10369 // Emit as a 'note' the specific overload candidate
10371 const NamedDecl *Found, const FunctionDecl *Fn,
10373 QualType DestType = QualType(), bool TakingAddress = false);
10374
10375 // Emit as a series of 'note's all template and non-templates identified by
10376 // the expression Expr
10377 void NoteAllOverloadCandidates(Expr *E, QualType DestType = QualType(),
10378 bool TakingAddress = false);
10379
10380 /// Returns whether the given function's address can be taken or not,
10381 /// optionally emitting a diagnostic if the address can't be taken.
10382 ///
10383 /// Returns false if taking the address of the function is illegal.
10384 bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function,
10385 bool Complain = false,
10386 SourceLocation Loc = SourceLocation());
10387
10388 // [PossiblyAFunctionType] --> [Return]
10389 // NonFunctionType --> NonFunctionType
10390 // R (A) --> R(A)
10391 // R (*)(A) --> R (A)
10392 // R (&)(A) --> R (A)
10393 // R (S::*)(A) --> R (A)
10394 QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType);
10395
10396 /// ResolveAddressOfOverloadedFunction - Try to resolve the address of
10397 /// an overloaded function (C++ [over.over]), where @p From is an
10398 /// expression with overloaded function type and @p ToType is the type
10399 /// we're trying to resolve to. For example:
10400 ///
10401 /// @code
10402 /// int f(double);
10403 /// int f(int);
10404 ///
10405 /// int (*pfd)(double) = f; // selects f(double)
10406 /// @endcode
10407 ///
10408 /// This routine returns the resulting FunctionDecl if it could be
10409 /// resolved, and NULL otherwise. When @p Complain is true, this
10410 /// routine will emit diagnostics if there is an error.
10411 FunctionDecl *
10412 ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType,
10413 bool Complain, DeclAccessPair &Found,
10414 bool *pHadMultipleCandidates = nullptr);
10415
10416 /// Given an expression that refers to an overloaded function, try to
10417 /// resolve that function to a single function that can have its address
10418 /// taken. This will modify `Pair` iff it returns non-null.
10419 ///
10420 /// This routine can only succeed if from all of the candidates in the
10421 /// overload set for SrcExpr that can have their addresses taken, there is one
10422 /// candidate that is more constrained than the rest.
10423 FunctionDecl *
10424 resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult);
10425
10426 /// Given an overloaded function, tries to turn it into a non-overloaded
10427 /// function reference using resolveAddressOfSingleOverloadCandidate. This
10428 /// will perform access checks, diagnose the use of the resultant decl, and,
10429 /// if requested, potentially perform a function-to-pointer decay.
10430 ///
10431 /// Returns false if resolveAddressOfSingleOverloadCandidate fails.
10432 /// Otherwise, returns true. This may emit diagnostics and return true.
10434 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false);
10435
10436 /// Given an expression that refers to an overloaded function, try to
10437 /// resolve that overloaded function expression down to a single function.
10438 ///
10439 /// This routine can only resolve template-ids that refer to a single function
10440 /// template, where that template-id refers to a single template whose
10441 /// template arguments are either provided by the template-id or have
10442 /// defaults, as described in C++0x [temp.arg.explicit]p3.
10443 ///
10444 /// If no template-ids are found, no diagnostics are emitted and NULL is
10445 /// returned.
10447 OverloadExpr *ovl, bool Complain = false, DeclAccessPair *Found = nullptr,
10448 TemplateSpecCandidateSet *FailedTSC = nullptr);
10449
10450 // Resolve and fix an overloaded expression that can be resolved
10451 // because it identifies a single function template specialization.
10452 //
10453 // Last three arguments should only be supplied if Complain = true
10454 //
10455 // Return true if it was logically possible to so resolve the
10456 // expression, regardless of whether or not it succeeded. Always
10457 // returns true if 'complain' is set.
10459 ExprResult &SrcExpr, bool DoFunctionPointerConversion = false,
10460 bool Complain = false, SourceRange OpRangeForComplaining = SourceRange(),
10461 QualType DestTypeForComplaining = QualType(),
10462 unsigned DiagIDForComplaining = 0);
10463
10464 /// Add the overload candidates named by callee and/or found by argument
10465 /// dependent lookup to the given overload set.
10466 void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE,
10467 ArrayRef<Expr *> Args,
10468 OverloadCandidateSet &CandidateSet,
10469 bool PartialOverloading = false);
10470
10471 /// Add the call candidates from the given set of lookup results to the given
10472 /// overload set. Non-function lookup results are ignored.
10474 LookupResult &R, TemplateArgumentListInfo *ExplicitTemplateArgs,
10475 ArrayRef<Expr *> Args, OverloadCandidateSet &CandidateSet);
10476
10477 // An enum used to represent the different possible results of building a
10478 // range-based for loop.
10484
10485 /// Build a call to 'begin' or 'end' for a C++11 for-range statement. If the
10486 /// given LookupResult is non-empty, it is assumed to describe a member which
10487 /// will be invoked. Otherwise, the function will be found via argument
10488 /// dependent lookup.
10489 /// CallExpr is set to a valid expression and FRS_Success returned on success,
10490 /// otherwise CallExpr is set to ExprError() and some non-success value
10491 /// is returned.
10493 SourceLocation RangeLoc,
10494 const DeclarationNameInfo &NameInfo,
10495 LookupResult &MemberLookup,
10496 OverloadCandidateSet *CandidateSet,
10498
10499 /// BuildOverloadedCallExpr - Given the call expression that calls Fn
10500 /// (which eventually refers to the declaration Func) and the call
10501 /// arguments Args/NumArgs, attempt to resolve the function call down
10502 /// to a specific function. If overload resolution succeeds, returns
10503 /// the call expression produced by overload resolution.
10504 /// Otherwise, emits diagnostics and returns ExprError.
10506 Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc,
10507 MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig,
10508 bool AllowTypoCorrection = true, bool CalleesAddressIsTaken = false);
10509
10510 /// Constructs and populates an OverloadedCandidateSet from
10511 /// the given function.
10512 /// \returns true when an the ExprResult output parameter has been set.
10514 MultiExprArg Args, SourceLocation RParenLoc,
10515 OverloadCandidateSet *CandidateSet,
10517
10521 const UnresolvedSetImpl &Fns,
10522 bool PerformADL = true);
10523
10524 /// Create a unary operation that may resolve to an overloaded
10525 /// operator.
10526 ///
10527 /// \param OpLoc The location of the operator itself (e.g., '*').
10528 ///
10529 /// \param Opc The UnaryOperatorKind that describes this operator.
10530 ///
10531 /// \param Fns The set of non-member functions that will be
10532 /// considered by overload resolution. The caller needs to build this
10533 /// set based on the context using, e.g.,
10534 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10535 /// set should not contain any member functions; those will be added
10536 /// by CreateOverloadedUnaryOp().
10537 ///
10538 /// \param Input The input argument.
10541 const UnresolvedSetImpl &Fns, Expr *input,
10542 bool RequiresADL = true);
10543
10544 /// Perform lookup for an overloaded binary operator.
10547 const UnresolvedSetImpl &Fns,
10548 ArrayRef<Expr *> Args, bool RequiresADL = true);
10549
10550 /// Create a binary operation that may resolve to an overloaded
10551 /// operator.
10552 ///
10553 /// \param OpLoc The location of the operator itself (e.g., '+').
10554 ///
10555 /// \param Opc The BinaryOperatorKind that describes this operator.
10556 ///
10557 /// \param Fns The set of non-member functions that will be
10558 /// considered by overload resolution. The caller needs to build this
10559 /// set based on the context using, e.g.,
10560 /// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This
10561 /// set should not contain any member functions; those will be added
10562 /// by CreateOverloadedBinOp().
10563 ///
10564 /// \param LHS Left-hand argument.
10565 /// \param RHS Right-hand argument.
10566 /// \param PerformADL Whether to consider operator candidates found by ADL.
10567 /// \param AllowRewrittenCandidates Whether to consider candidates found by
10568 /// C++20 operator rewrites.
10569 /// \param DefaultedFn If we are synthesizing a defaulted operator function,
10570 /// the function in question. Such a function is never a candidate in
10571 /// our overload resolution. This also enables synthesizing a three-way
10572 /// comparison from < and == as described in C++20 [class.spaceship]p1.
10574 const UnresolvedSetImpl &Fns, Expr *LHS,
10575 Expr *RHS, bool RequiresADL = true,
10576 bool AllowRewrittenCandidates = true,
10577 FunctionDecl *DefaultedFn = nullptr);
10579 const UnresolvedSetImpl &Fns,
10580 Expr *LHS, Expr *RHS,
10581 FunctionDecl *DefaultedFn);
10582
10584 SourceLocation RLoc, Expr *Base,
10585 MultiExprArg Args);
10586
10587 /// BuildCallToMemberFunction - Build a call to a member
10588 /// function. MemExpr is the expression that refers to the member
10589 /// function (and includes the object parameter), Args/NumArgs are the
10590 /// arguments to the function call (not including the object
10591 /// parameter). The caller needs to validate that the member
10592 /// expression refers to a non-static member function or an overloaded
10593 /// member function.
10595 Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args,
10596 SourceLocation RParenLoc, Expr *ExecConfig = nullptr,
10597 bool IsExecConfig = false, bool AllowRecovery = false);
10598
10599 /// BuildCallToObjectOfClassType - Build a call to an object of class
10600 /// type (C++ [over.call.object]), which can end up invoking an
10601 /// overloaded function call operator (@c operator()) or performing a
10602 /// user-defined conversion on the object argument.
10604 SourceLocation LParenLoc,
10605 MultiExprArg Args,
10606 SourceLocation RParenLoc);
10607
10608 /// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->
10609 /// (if one exists), where @c Base is an expression of class type and
10610 /// @c Member is the name of the member we're trying to find.
10612 SourceLocation OpLoc,
10613 bool *NoArrowOperatorFound = nullptr);
10614
10616 CXXConversionDecl *Method,
10617 bool HadMultipleCandidates);
10618
10619 /// BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call
10620 /// to a literal operator described by the provided lookup results.
10623 SourceLocation LitEndLoc,
10624 TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
10625
10626 /// FixOverloadedFunctionReference - E is an expression that refers to
10627 /// a C++ overloaded function (possibly with some parentheses and
10628 /// perhaps a '&' around it). We have resolved the overloaded function
10629 /// to the function declaration Fn, so patch up the expression E to
10630 /// refer (possibly indirectly) to Fn. Returns the new expr.
10632 FunctionDecl *Fn);
10634 DeclAccessPair FoundDecl,
10635 FunctionDecl *Fn);
10636
10637 /// - Returns a selector which best matches given argument list or
10638 /// nullptr if none could be found
10640 bool IsInstance,
10642
10643 ///@}
10644
10645 //
10646 //
10647 // -------------------------------------------------------------------------
10648 //
10649 //
10650
10651 /// \name Statements
10652 /// Implementations are in SemaStmt.cpp
10653 ///@{
10654
10655public:
10656 /// Stack of active SEH __finally scopes. Can be empty.
10658
10659 StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue = true);
10661
10663 bool HasLeadingEmptyMacro = false);
10664
10666 SourceLocation EndLoc);
10668
10669 /// DiagnoseDiscardedExprMarkedNodiscard - Given an expression that is
10670 /// semantically a discarded-value expression, diagnose if any [[nodiscard]]
10671 /// value has been discarded.
10673
10674 /// DiagnoseUnusedExprResult - If the statement passed in is an expression
10675 /// whose result is unused, warn.
10676 void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID);
10677
10678 void ActOnStartOfCompoundStmt(bool IsStmtExpr);
10682 ArrayRef<Stmt *> Elts, bool isStmtExpr);
10683
10685
10688 SourceLocation DotDotDotLoc, ExprResult RHS,
10689 SourceLocation ColonLoc);
10690
10691 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
10692 void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt);
10693
10695 SourceLocation ColonLoc, Stmt *SubStmt,
10696 Scope *CurScope);
10698 SourceLocation ColonLoc, Stmt *SubStmt);
10699
10701 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
10703 Stmt *SubStmt);
10704
10705 /// Check whether the given statement can have musttail applied to it,
10706 /// issuing a diagnostic and returning false if not. In the success case,
10707 /// the statement is rewritten to remove implicit nodes from the return
10708 /// value.
10709 bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA);
10710
10712 SourceLocation LParenLoc, Stmt *InitStmt,
10713 ConditionResult Cond, SourceLocation RParenLoc,
10714 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
10716 SourceLocation LParenLoc, Stmt *InitStmt,
10717 ConditionResult Cond, SourceLocation RParenLoc,
10718 Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal);
10719
10721
10723 SourceLocation LParenLoc, Stmt *InitStmt,
10724 ConditionResult Cond,
10725 SourceLocation RParenLoc);
10727 Stmt *Body);
10728
10729 /// DiagnoseAssignmentEnum - Warn if assignment to enum is a constant
10730 /// integer not in the range of enum values.
10731 void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
10732 Expr *SrcExpr);
10733
10735 ConditionResult Cond, SourceLocation RParenLoc,
10736 Stmt *Body);
10738 SourceLocation WhileLoc, SourceLocation CondLParen,
10739 Expr *Cond, SourceLocation CondRParen);
10740
10742 Stmt *First, ConditionResult Second,
10743 FullExprArg Third, SourceLocation RParenLoc,
10744 Stmt *Body);
10745
10746 /// In an Objective C collection iteration statement:
10747 /// for (x in y)
10748 /// x can be an arbitrary l-value expression. Bind it up as a
10749 /// full-expression.
10751
10753 /// Initial building of a for-range statement.
10755 /// Instantiation or recovery rebuild of a for-range statement. Don't
10756 /// attempt any typo-correction.
10758 /// Determining whether a for-range statement could be built. Avoid any
10759 /// unnecessary or irreversible actions.
10762
10763 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
10764 ///
10765 /// C++11 [stmt.ranged]:
10766 /// A range-based for statement is equivalent to
10767 ///
10768 /// {
10769 /// auto && __range = range-init;
10770 /// for ( auto __begin = begin-expr,
10771 /// __end = end-expr;
10772 /// __begin != __end;
10773 /// ++__begin ) {
10774 /// for-range-declaration = *__begin;
10775 /// statement
10776 /// }
10777 /// }
10778 ///
10779 /// The body of the loop is not available yet, since it cannot be analysed
10780 /// until we have determined the type of the for-range-declaration.
10782 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc,
10783 Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection,
10785 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
10786
10787 /// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
10789 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
10790 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
10791 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
10793 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps = {});
10794
10795 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
10796 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
10797 /// body cannot be performed until after the type of the range variable is
10798 /// determined.
10799 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body);
10800
10801 StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
10802 LabelDecl *TheDecl);
10803 StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc,
10804 SourceLocation StarLoc, Expr *DestExp);
10805 StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope);
10806 StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope);
10807
10810
10811 enum Status : uint8_t { None, MoveEligible, MoveEligibleAndCopyElidable };
10813
10814 bool isMoveEligible() const { return S != None; };
10815 bool isCopyElidable() const { return S == MoveEligibleAndCopyElidable; }
10816 };
10818
10819 /// Determine whether the given expression might be move-eligible or
10820 /// copy-elidable in either a (co_)return statement or throw expression,
10821 /// without considering function return type, if applicable.
10822 ///
10823 /// \param E The expression being returned from the function or block,
10824 /// being thrown, or being co_returned from a coroutine. This expression
10825 /// might be modified by the implementation.
10826 ///
10827 /// \param Mode Overrides detection of current language mode
10828 /// and uses the rules for C++23.
10829 ///
10830 /// \returns An aggregate which contains the Candidate and isMoveEligible
10831 /// and isCopyElidable methods. If Candidate is non-null, it means
10832 /// isMoveEligible() would be true under the most permissive language
10833 /// standard.
10834 NamedReturnInfo getNamedReturnInfo(
10836
10837 /// Determine whether the given NRVO candidate variable is move-eligible or
10838 /// copy-elidable, without considering function return type.
10839 ///
10840 /// \param VD The NRVO candidate variable.
10841 ///
10842 /// \returns An aggregate which contains the Candidate and isMoveEligible
10843 /// and isCopyElidable methods. If Candidate is non-null, it means
10844 /// isMoveEligible() would be true under the most permissive language
10845 /// standard.
10846 NamedReturnInfo getNamedReturnInfo(const VarDecl *VD);
10847
10848 /// Updates given NamedReturnInfo's move-eligible and
10849 /// copy-elidable statuses, considering the function
10850 /// return type criteria as applicable to return statements.
10851 ///
10852 /// \param Info The NamedReturnInfo object to update.
10853 ///
10854 /// \param ReturnType This is the return type of the function.
10855 /// \returns The copy elision candidate, in case the initial return expression
10856 /// was copy elidable, or nullptr otherwise.
10857 const VarDecl *getCopyElisionCandidate(NamedReturnInfo &Info,
10858 QualType ReturnType);
10859
10860 /// Perform the initialization of a potentially-movable value, which
10861 /// is the result of return value.
10862 ///
10863 /// This routine implements C++20 [class.copy.elision]p3, which attempts to
10864 /// treat returned lvalues as rvalues in certain cases (to prefer move
10865 /// construction), then falls back to treating them as lvalues if that failed.
10868 const NamedReturnInfo &NRInfo, Expr *Value,
10869 bool SupressSimplerImplicitMoves = false);
10870
10872
10873 /// Deduce the return type for a function from a returned expression, per
10874 /// C++1y [dcl.spec.auto]p6.
10876 SourceLocation ReturnLoc, Expr *RetExpr,
10877 const AutoType *AT);
10878
10879 StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
10880 Scope *CurScope);
10881 StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
10882 bool AllowRecovery = false);
10883
10884 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
10885 /// for capturing scopes.
10887 NamedReturnInfo &NRInfo,
10888 bool SupressSimplerImplicitMoves);
10889
10890 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
10891 /// and creates a proper catch handler from them.
10893 Stmt *HandlerBlock);
10894
10895 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
10896 /// handlers and creates a try statement from them.
10898 ArrayRef<Stmt *> Handlers);
10899
10900 StmtResult ActOnSEHTryBlock(bool IsCXXTry, // try (true) or __try (false) ?
10901 SourceLocation TryLoc, Stmt *TryBlock,
10902 Stmt *Handler);
10904 Stmt *Block);
10909
10911 bool IsIfExists,
10912 NestedNameSpecifierLoc QualifierLoc,
10913 DeclarationNameInfo NameInfo,
10914 Stmt *Nested);
10916 bool IsIfExists, CXXScopeSpec &SS,
10917 UnqualifiedId &Name, Stmt *Nested);
10918
10920 CapturedRegionKind Kind, unsigned NumParams);
10921 typedef std::pair<StringRef, QualType> CapturedParamNameType;
10925 unsigned OpenMPCaptureLevel = 0);
10930 unsigned NumParams);
10931
10932private:
10933 /// Check whether the given statement can have musttail applied to it,
10934 /// issuing a diagnostic and returning false if not.
10935 bool checkMustTailAttr(const Stmt *St, const Attr &MTA);
10936
10937 /// Check if the given expression contains 'break' or 'continue'
10938 /// statement that produces control flow different from GCC.
10939 void CheckBreakContinueBinding(Expr *E);
10940
10941 ///@}
10942
10943 //
10944 //
10945 // -------------------------------------------------------------------------
10946 //
10947 //
10948
10949 /// \name `inline asm` Statement
10950 /// Implementations are in SemaStmtAsm.cpp
10951 ///@{
10952
10953public:
10954 StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
10955 bool IsVolatile, unsigned NumOutputs,
10956 unsigned NumInputs, IdentifierInfo **Names,
10957 MultiExprArg Constraints, MultiExprArg Exprs,
10958 Expr *AsmString, MultiExprArg Clobbers,
10959 unsigned NumLabels, SourceLocation RParenLoc);
10960
10962 llvm::InlineAsmIdentifierInfo &Info);
10964 SourceLocation TemplateKWLoc,
10966 bool IsUnevaluatedContext);
10967 bool LookupInlineAsmField(StringRef Base, StringRef Member, unsigned &Offset,
10968 SourceLocation AsmLoc);
10970 SourceLocation AsmLoc);
10972 ArrayRef<Token> AsmToks, StringRef AsmString,
10973 unsigned NumOutputs, unsigned NumInputs,
10974 ArrayRef<StringRef> Constraints,
10975 ArrayRef<StringRef> Clobbers,
10976 ArrayRef<Expr *> Exprs, SourceLocation EndLoc);
10977 LabelDecl *GetOrCreateMSAsmLabel(StringRef ExternalLabelName,
10978 SourceLocation Location, bool AlwaysCreate);
10979
10980 ///@}
10981
10982 //
10983 //
10984 // -------------------------------------------------------------------------
10985 //
10986 //
10987
10988 /// \name Statement Attribute Handling
10989 /// Implementations are in SemaStmtAttr.cpp
10990 ///@{
10991
10992public:
10993 bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
10994 const AttributeCommonInfo &A);
10995 bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt,
10996 const AttributeCommonInfo &A);
10997
10998 CodeAlignAttr *BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E);
11000
11001 /// Process the attributes before creating an attributed statement. Returns
11002 /// the semantic attributes that have been processed.
11003 void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs,
11005
11009 const IdentifierInfo *AttrName,
11011
11012 ///@}
11013
11014 //
11015 //
11016 // -------------------------------------------------------------------------
11017 //
11018 //
11019
11020 /// \name C++ Templates
11021 /// Implementations are in SemaTemplate.cpp
11022 ///@{
11023
11024public:
11025 // Saves the current floating-point pragma stack and clear it in this Sema.
11027 public:
11029 : S(S), SavedStack(std::move(S.FpPragmaStack)) {
11030 S.FpPragmaStack.Stack.clear();
11031 }
11032 ~FpPragmaStackSaveRAII() { S.FpPragmaStack = std::move(SavedStack); }
11033
11034 private:
11035 Sema &S;
11037 };
11038
11040 CurFPFeatures = FPO;
11041 FpPragmaStack.CurrentValue = FPO.getChangesFrom(FPOptions(LangOpts));
11042 }
11043
11045 return llvm::ArrayRef(InventedParameterInfos.begin() +
11048 }
11049
11050 /// The number of SFINAE diagnostics that have been trapped.
11052
11055 FunctionScopes.end());
11056 }
11057
11058 typedef llvm::MapVector<const FunctionDecl *,
11059 std::unique_ptr<LateParsedTemplate>>
11062
11063 /// Determine the number of levels of enclosing template parameters. This is
11064 /// only usable while parsing. Note that this does not include dependent
11065 /// contexts in which no template parameters have yet been declared, such as
11066 /// in a terse function template or generic lambda before the first 'auto' is
11067 /// encountered.
11068 unsigned getTemplateDepth(Scope *S) const;
11069
11071 bool AllowFunctionTemplates = true,
11072 bool AllowDependent = true);
11074 bool AllowFunctionTemplates = true,
11075 bool AllowDependent = true,
11076 bool AllowNonTemplateFunctions = false);
11077 /// Try to interpret the lookup result D as a template-name.
11078 ///
11079 /// \param D A declaration found by name lookup.
11080 /// \param AllowFunctionTemplates Whether function templates should be
11081 /// considered valid results.
11082 /// \param AllowDependent Whether unresolved using declarations (that might
11083 /// name templates) should be considered valid results.
11085 bool AllowFunctionTemplates = true,
11086 bool AllowDependent = true);
11087
11089 /// Whether and why a template name is required in this lookup.
11091 public:
11092 /// Template name is required if TemplateKWLoc is valid.
11094 : TemplateKW(TemplateKWLoc) {}
11095 /// Template name is unconditionally required.
11097
11099 return TemplateKW.value_or(SourceLocation());
11100 }
11101 bool hasTemplateKeyword() const {
11102 return getTemplateKeywordLoc().isValid();
11103 }
11104 bool isRequired() const { return TemplateKW != SourceLocation(); }
11105 explicit operator bool() const { return isRequired(); }
11106
11107 private:
11108 std::optional<SourceLocation> TemplateKW;
11109 };
11110
11112 /// This is not assumed to be a template name.
11113 None,
11114 /// This is assumed to be a template name because lookup found nothing.
11116 /// This is assumed to be a template name because lookup found one or more
11117 /// functions (but no function templates).
11119 };
11120
11121 bool
11123 QualType ObjectType, bool EnteringContext,
11124 RequiredTemplateKind RequiredTemplate = SourceLocation(),
11125 AssumedTemplateKind *ATK = nullptr,
11126 bool AllowTypoCorrection = true);
11127
11129 bool hasTemplateKeyword,
11130 const UnqualifiedId &Name,
11131 ParsedType ObjectType, bool EnteringContext,
11132 TemplateTy &Template,
11133 bool &MemberOfUnknownSpecialization,
11134 bool Disambiguation = false);
11135
11136 /// Try to resolve an undeclared template name as a type template.
11137 ///
11138 /// Sets II to the identifier corresponding to the template name, and updates
11139 /// Name to a corresponding (typo-corrected) type template name and TNK to
11140 /// the corresponding kind, if possible.
11142 TemplateNameKind &TNK,
11143 SourceLocation NameLoc,
11144 IdentifierInfo *&II);
11145
11147 SourceLocation NameLoc,
11148 bool Diagnose = true);
11149
11150 /// Determine whether a particular identifier might be the name in a C++1z
11151 /// deduction-guide declaration.
11152 bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name,
11153 SourceLocation NameLoc, CXXScopeSpec &SS,
11154 ParsedTemplateTy *Template = nullptr);
11155
11157 SourceLocation IILoc, Scope *S,
11158 const CXXScopeSpec *SS,
11159 TemplateTy &SuggestedTemplate,
11160 TemplateNameKind &SuggestedKind);
11161
11162 /// Determine whether we would be unable to instantiate this template (because
11163 /// it either has no definition, or is in the process of being instantiated).
11164 bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation,
11165 NamedDecl *Instantiation,
11166 bool InstantiatedFromMember,
11167 const NamedDecl *Pattern,
11168 const NamedDecl *PatternDef,
11170 bool Complain = true);
11171
11172 /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
11173 /// that the template parameter 'PrevDecl' is being shadowed by a new
11174 /// declaration at location Loc. Returns true to indicate that this is
11175 /// an error, and false otherwise.
11176 ///
11177 /// \param Loc The location of the declaration that shadows a template
11178 /// parameter.
11179 ///
11180 /// \param PrevDecl The template parameter that the declaration shadows.
11181 ///
11182 /// \param SupportedForCompatibility Whether to issue the diagnostic as
11183 /// a warning for compatibility with older versions of clang.
11184 /// Ignored when MSVC compatibility is enabled.
11186 bool SupportedForCompatibility = false);
11187
11188 /// AdjustDeclIfTemplate - If the given decl happens to be a template, reset
11189 /// the parameter D to reference the templated declaration and return a
11190 /// pointer to the template declaration. Otherwise, do nothing to D and return
11191 /// null.
11193
11194 /// ActOnTypeParameter - Called when a C++ template type parameter
11195 /// (e.g., "typename T") has been parsed. Typename specifies whether
11196 /// the keyword "typename" was used to declare the type parameter
11197 /// (otherwise, "class" was used), and KeyLoc is the location of the
11198 /// "class" or "typename" keyword. ParamName is the name of the
11199 /// parameter (NULL indicates an unnamed template parameter) and
11200 /// ParamNameLoc is the location of the parameter name (if any).
11201 /// If the type parameter has a default argument, it will be added
11202 /// later via ActOnTypeParameterDefault.
11204 SourceLocation EllipsisLoc,
11205 SourceLocation KeyLoc,
11206 IdentifierInfo *ParamName,
11207 SourceLocation ParamNameLoc, unsigned Depth,
11208 unsigned Position, SourceLocation EqualLoc,
11209 ParsedType DefaultArg, bool HasTypeConstraint);
11210
11212
11213 bool ActOnTypeConstraint(const CXXScopeSpec &SS,
11215 TemplateTypeParmDecl *ConstrainedParameter,
11216 SourceLocation EllipsisLoc);
11217 bool BuildTypeConstraint(const CXXScopeSpec &SS,
11219 TemplateTypeParmDecl *ConstrainedParameter,
11220 SourceLocation EllipsisLoc,
11221 bool AllowUnexpandedPack);
11222
11223 /// Attach a type-constraint to a template parameter.
11224 /// \returns true if an error occurred. This can happen if the
11225 /// immediately-declared constraint could not be formed (e.g. incorrect number
11226 /// of arguments for the named concept).
11228 DeclarationNameInfo NameInfo,
11229 ConceptDecl *NamedConcept, NamedDecl *FoundDecl,
11230 const TemplateArgumentListInfo *TemplateArgs,
11231 TemplateTypeParmDecl *ConstrainedParameter,
11232 QualType ConstrainedType,
11233 SourceLocation EllipsisLoc);
11234
11236 NonTypeTemplateParmDecl *NewConstrainedParm,
11237 NonTypeTemplateParmDecl *OrigConstrainedParm,
11238 SourceLocation EllipsisLoc);
11239
11240 /// Require the given type to be a structural type, and diagnose if it is not.
11241 ///
11242 /// \return \c true if an error was produced.
11244
11245 /// Check that the type of a non-type template parameter is
11246 /// well-formed.
11247 ///
11248 /// \returns the (possibly-promoted) parameter type if valid;
11249 /// otherwise, produces a diagnostic and returns a NULL type.
11253
11255 unsigned Depth, unsigned Position,
11256 SourceLocation EqualLoc,
11257 Expr *DefaultArg);
11258
11259 /// ActOnTemplateTemplateParameter - Called when a C++ template template
11260 /// parameter (e.g. T in template <template <typename> class T> class array)
11261 /// has been parsed. S is the current scope.
11263 Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params,
11264 bool Typename, SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
11265 SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
11266 SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
11267
11268 /// ActOnTemplateParameterList - Builds a TemplateParameterList, optionally
11269 /// constrained by RequiresClause, that contains the template parameters in
11270 /// Params.
11272 unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc,
11273 SourceLocation LAngleLoc, ArrayRef<NamedDecl *> Params,
11274 SourceLocation RAngleLoc, Expr *RequiresClause);
11275
11276 /// The context in which we are checking a template parameter list.
11287
11288 /// Checks the validity of a template parameter list, possibly
11289 /// considering the template parameter list from a previous
11290 /// declaration.
11291 ///
11292 /// If an "old" template parameter list is provided, it must be
11293 /// equivalent (per TemplateParameterListsAreEqual) to the "new"
11294 /// template parameter list.
11295 ///
11296 /// \param NewParams Template parameter list for a new template
11297 /// declaration. This template parameter list will be updated with any
11298 /// default arguments that are carried through from the previous
11299 /// template parameter list.
11300 ///
11301 /// \param OldParams If provided, template parameter list from a
11302 /// previous declaration of the same template. Default template
11303 /// arguments will be merged from the old template parameter list to
11304 /// the new template parameter list.
11305 ///
11306 /// \param TPC Describes the context in which we are checking the given
11307 /// template parameter list.
11308 ///
11309 /// \param SkipBody If we might have already made a prior merged definition
11310 /// of this template visible, the corresponding body-skipping information.
11311 /// Default argument redefinition is not an error when skipping such a body,
11312 /// because (under the ODR) we can assume the default arguments are the same
11313 /// as the prior merged definition.
11314 ///
11315 /// \returns true if an error occurred, false otherwise.
11317 TemplateParameterList *OldParams,
11319 SkipBodyInfo *SkipBody = nullptr);
11320
11321 /// Match the given template parameter lists to the given scope
11322 /// specifier, returning the template parameter list that applies to the
11323 /// name.
11324 ///
11325 /// \param DeclStartLoc the start of the declaration that has a scope
11326 /// specifier or a template parameter list.
11327 ///
11328 /// \param DeclLoc The location of the declaration itself.
11329 ///
11330 /// \param SS the scope specifier that will be matched to the given template
11331 /// parameter lists. This scope specifier precedes a qualified name that is
11332 /// being declared.
11333 ///
11334 /// \param TemplateId The template-id following the scope specifier, if there
11335 /// is one. Used to check for a missing 'template<>'.
11336 ///
11337 /// \param ParamLists the template parameter lists, from the outermost to the
11338 /// innermost template parameter lists.
11339 ///
11340 /// \param IsFriend Whether to apply the slightly different rules for
11341 /// matching template parameters to scope specifiers in friend
11342 /// declarations.
11343 ///
11344 /// \param IsMemberSpecialization will be set true if the scope specifier
11345 /// denotes a fully-specialized type, and therefore this is a declaration of
11346 /// a member specialization.
11347 ///
11348 /// \returns the template parameter list, if any, that corresponds to the
11349 /// name that is preceded by the scope specifier @p SS. This template
11350 /// parameter list may have template parameters (if we're declaring a
11351 /// template) or may have no template parameters (if we're declaring a
11352 /// template specialization), or may be NULL (if what we're declaring isn't
11353 /// itself a template).
11355 SourceLocation DeclStartLoc, SourceLocation DeclLoc,
11356 const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId,
11357 ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend,
11358 bool &IsMemberSpecialization, bool &Invalid,
11359 bool SuppressDiagnostic = false);
11360
11361 /// Returns the template parameter list with all default template argument
11362 /// information.
11364
11366 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11367 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
11368 const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams,
11369 AccessSpecifier AS, SourceLocation ModulePrivateLoc,
11370 SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists,
11371 TemplateParameterList **OuterTemplateParamLists,
11372 SkipBodyInfo *SkipBody = nullptr);
11373
11374 /// Translates template arguments as provided by the parser
11375 /// into template arguments used by semantic analysis.
11378
11379 /// Convert a parsed type into a parsed template argument. This is mostly
11380 /// trivial, except that we may have parsed a C++17 deduced class template
11381 /// specialization type, in which case we should form a template template
11382 /// argument instead of a type template argument.
11384
11386
11388 SourceLocation TemplateLoc,
11389 TemplateArgumentListInfo &TemplateArgs);
11390
11393 TemplateTy Template, const IdentifierInfo *TemplateII,
11394 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11395 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc,
11396 bool IsCtorOrDtorName = false, bool IsClassName = false,
11397 ImplicitTypenameContext AllowImplicitTypename =
11399
11400 /// Parsed an elaborated-type-specifier that refers to a template-id,
11401 /// such as \c class T::template apply<U>.
11403 TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc,
11404 CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD,
11405 SourceLocation TemplateLoc, SourceLocation LAngleLoc,
11406 ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc);
11407
11410 SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams,
11412
11413 /// Get the specialization of the given variable template corresponding to
11414 /// the specified argument list, or a null-but-valid result if the arguments
11415 /// are dependent.
11417 SourceLocation TemplateLoc,
11418 SourceLocation TemplateNameLoc,
11419 const TemplateArgumentListInfo &TemplateArgs);
11420
11421 /// Form a reference to the specialization of the given variable template
11422 /// corresponding to the specified argument list, or a null-but-valid result
11423 /// if the arguments are dependent.
11425 const DeclarationNameInfo &NameInfo,
11426 VarTemplateDecl *Template, NamedDecl *FoundD,
11427 SourceLocation TemplateLoc,
11428 const TemplateArgumentListInfo *TemplateArgs);
11429
11431 CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
11432 const DeclarationNameInfo &ConceptNameInfo,
11433 NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
11434 const TemplateArgumentListInfo *TemplateArgs);
11435
11438 bool TemplateKeyword, TemplateDecl *TD,
11440
11442 SourceLocation TemplateKWLoc, LookupResult &R,
11443 bool RequiresADL,
11444 const TemplateArgumentListInfo *TemplateArgs);
11445
11446 // We actually only call this from template instantiation.
11449 const DeclarationNameInfo &NameInfo,
11450 const TemplateArgumentListInfo *TemplateArgs,
11451 bool IsAddressOfOperand);
11452
11453 /// Form a template name from a name that is syntactically required to name a
11454 /// template, either due to use of the 'template' keyword or because a name in
11455 /// this syntactic context is assumed to name a template (C++
11456 /// [temp.names]p2-4).
11457 ///
11458 /// This action forms a template name given the name of the template and its
11459 /// optional scope specifier. This is used when the 'template' keyword is used
11460 /// or when the parsing context unambiguously treats a following '<' as
11461 /// introducing a template argument list. Note that this may produce a
11462 /// non-dependent template name if we can perform the lookup now and identify
11463 /// the named template.
11464 ///
11465 /// For example, given "x.MetaFun::template apply", the scope specifier
11466 /// \p SS will be "MetaFun::", \p TemplateKWLoc contains the location
11467 /// of the "template" keyword, and "apply" is the \p Name.
11469 SourceLocation TemplateKWLoc,
11470 const UnqualifiedId &Name,
11471 ParsedType ObjectType,
11472 bool EnteringContext, TemplateTy &Template,
11473 bool AllowInjectedClassName = false);
11474
11476 Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
11477 SourceLocation ModulePrivateLoc, CXXScopeSpec &SS,
11479 MultiTemplateParamsArg TemplateParameterLists,
11480 SkipBodyInfo *SkipBody = nullptr);
11481
11482 /// Check the non-type template arguments of a class template
11483 /// partial specialization according to C++ [temp.class.spec]p9.
11484 ///
11485 /// \param TemplateNameLoc the location of the template name.
11486 /// \param PrimaryTemplate the template parameters of the primary class
11487 /// template.
11488 /// \param NumExplicit the number of explicitly-specified template arguments.
11489 /// \param TemplateArgs the template arguments of the class template
11490 /// partial specialization.
11491 ///
11492 /// \returns \c true if there was an error, \c false otherwise.
11494 TemplateDecl *PrimaryTemplate,
11495 unsigned NumExplicitArgs,
11501
11503 MultiTemplateParamsArg TemplateParameterLists,
11504 Declarator &D);
11505
11506 /// Diagnose cases where we have an explicit template specialization
11507 /// before/after an explicit template instantiation, producing diagnostics
11508 /// for those cases where they are required and determining whether the
11509 /// new specialization/instantiation will have any effect.
11510 ///
11511 /// \param NewLoc the location of the new explicit specialization or
11512 /// instantiation.
11513 ///
11514 /// \param NewTSK the kind of the new explicit specialization or
11515 /// instantiation.
11516 ///
11517 /// \param PrevDecl the previous declaration of the entity.
11518 ///
11519 /// \param PrevTSK the kind of the old explicit specialization or
11520 /// instantiatin.
11521 ///
11522 /// \param PrevPointOfInstantiation if valid, indicates where the previous
11523 /// declaration was instantiated (either implicitly or explicitly).
11524 ///
11525 /// \param HasNoEffect will be set to true to indicate that the new
11526 /// specialization or instantiation has no effect and should be ignored.
11527 ///
11528 /// \returns true if there was an error that should prevent the introduction
11529 /// of the new declaration into the AST, false otherwise.
11531 SourceLocation NewLoc,
11532 TemplateSpecializationKind ActOnExplicitInstantiationNewTSK,
11533 NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK,
11534 SourceLocation PrevPtOfInstantiation, bool &SuppressNew);
11535
11536 /// Perform semantic analysis for the given dependent function
11537 /// template specialization.
11538 ///
11539 /// The only possible way to get a dependent function template specialization
11540 /// is with a friend declaration, like so:
11541 ///
11542 /// \code
11543 /// template <class T> void foo(T);
11544 /// template <class T> class A {
11545 /// friend void foo<>(T);
11546 /// };
11547 /// \endcode
11548 ///
11549 /// There really isn't any useful analysis we can do here, so we
11550 /// just store the information.
11552 FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs,
11554
11555 /// Perform semantic analysis for the given function template
11556 /// specialization.
11557 ///
11558 /// This routine performs all of the semantic analysis required for an
11559 /// explicit function template specialization. On successful completion,
11560 /// the function declaration \p FD will become a function template
11561 /// specialization.
11562 ///
11563 /// \param FD the function declaration, which will be updated to become a
11564 /// function template specialization.
11565 ///
11566 /// \param ExplicitTemplateArgs the explicitly-provided template arguments,
11567 /// if any. Note that this may be valid info even when 0 arguments are
11568 /// explicitly provided as in, e.g., \c void sort<>(char*, char*);
11569 /// as it anyway contains info on the angle brackets locations.
11570 ///
11571 /// \param Previous the set of declarations that may be specialized by
11572 /// this function specialization.
11573 ///
11574 /// \param QualifiedFriend whether this is a lookup for a qualified friend
11575 /// declaration with no explicit template argument list that might be
11576 /// befriending a function template specialization.
11578 FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs,
11579 LookupResult &Previous, bool QualifiedFriend = false);
11580
11581 /// Perform semantic analysis for the given non-template member
11582 /// specialization.
11583 ///
11584 /// This routine performs all of the semantic analysis required for an
11585 /// explicit member function specialization. On successful completion,
11586 /// the function declaration \p FD will become a member function
11587 /// specialization.
11588 ///
11589 /// \param Member the member declaration, which will be updated to become a
11590 /// specialization.
11591 ///
11592 /// \param Previous the set of declarations, one of which may be specialized
11593 /// by this function specialization; the set will be modified to contain the
11594 /// redeclared member.
11597
11598 // Explicit instantiation of a class template specialization
11600 Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc,
11601 unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS,
11602 TemplateTy Template, SourceLocation TemplateNameLoc,
11603 SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs,
11604 SourceLocation RAngleLoc, const ParsedAttributesView &Attr);
11605
11606 // Explicit instantiation of a member class of a class template.
11608 SourceLocation TemplateLoc,
11609 unsigned TagSpec, SourceLocation KWLoc,
11610 CXXScopeSpec &SS, IdentifierInfo *Name,
11611 SourceLocation NameLoc,
11612 const ParsedAttributesView &Attr);
11613
11615 SourceLocation TemplateLoc,
11616 Declarator &D);
11617
11618 /// If the given template parameter has a default template
11619 /// argument, substitute into that default template argument and
11620 /// return the corresponding template argument.
11622 TemplateDecl *Template, SourceLocation TemplateLoc,
11623 SourceLocation RAngleLoc, Decl *Param,
11624 ArrayRef<TemplateArgument> SugaredConverted,
11625 ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg);
11626
11627 /// Returns the top most location responsible for the definition of \p N.
11628 /// If \p N is a a template specialization, this is the location
11629 /// of the top of the instantiation stack.
11630 /// Otherwise, the location of \p N is returned.
11632
11633 /// Specifies the context in which a particular template
11634 /// argument is being checked.
11636 /// The template argument was specified in the code or was
11637 /// instantiated with some deduced template arguments.
11639
11640 /// The template argument was deduced via template argument
11641 /// deduction.
11643
11644 /// The template argument was deduced from an array bound
11645 /// via template argument deduction.
11648
11649 /// Check that the given template argument corresponds to the given
11650 /// template parameter.
11651 ///
11652 /// \param Param The template parameter against which the argument will be
11653 /// checked.
11654 ///
11655 /// \param Arg The template argument, which may be updated due to conversions.
11656 ///
11657 /// \param Template The template in which the template argument resides.
11658 ///
11659 /// \param TemplateLoc The location of the template name for the template
11660 /// whose argument list we're matching.
11661 ///
11662 /// \param RAngleLoc The location of the right angle bracket ('>') that closes
11663 /// the template argument list.
11664 ///
11665 /// \param ArgumentPackIndex The index into the argument pack where this
11666 /// argument will be placed. Only valid if the parameter is a parameter pack.
11667 ///
11668 /// \param Converted The checked, converted argument will be added to the
11669 /// end of this small vector.
11670 ///
11671 /// \param CTAK Describes how we arrived at this particular template argument:
11672 /// explicitly written, deduced, etc.
11673 ///
11674 /// \returns true on error, false otherwise.
11675 bool
11677 NamedDecl *Template, SourceLocation TemplateLoc,
11678 SourceLocation RAngleLoc, unsigned ArgumentPackIndex,
11679 SmallVectorImpl<TemplateArgument> &SugaredConverted,
11680 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
11682
11683 /// Check that the given template arguments can be provided to
11684 /// the given template, converting the arguments along the way.
11685 ///
11686 /// \param Template The template to which the template arguments are being
11687 /// provided.
11688 ///
11689 /// \param TemplateLoc The location of the template name in the source.
11690 ///
11691 /// \param TemplateArgs The list of template arguments. If the template is
11692 /// a template template parameter, this function may extend the set of
11693 /// template arguments to also include substituted, defaulted template
11694 /// arguments.
11695 ///
11696 /// \param PartialTemplateArgs True if the list of template arguments is
11697 /// intentionally partial, e.g., because we're checking just the initial
11698 /// set of template arguments.
11699 ///
11700 /// \param Converted Will receive the converted, canonicalized template
11701 /// arguments.
11702 ///
11703 /// \param UpdateArgsWithConversions If \c true, update \p TemplateArgs to
11704 /// contain the converted forms of the template arguments as written.
11705 /// Otherwise, \p TemplateArgs will not be modified.
11706 ///
11707 /// \param ConstraintsNotSatisfied If provided, and an error occurred, will
11708 /// receive true if the cause for the error is the associated constraints of
11709 /// the template not being satisfied by the template arguments.
11710 ///
11711 /// \param DefaultArgs any default arguments from template specialization
11712 /// deduction.
11713 ///
11714 /// \param PartialOrderingTTP If true, assume these template arguments are
11715 /// the injected template arguments for a template template parameter.
11716 /// This will relax the requirement that all its possible uses are valid:
11717 /// TTP checking is loose, and assumes that invalid uses will be diagnosed
11718 /// during instantiation.
11719 ///
11720 /// \returns true if an error occurred, false otherwise.
11722 TemplateDecl *Template, SourceLocation TemplateLoc,
11723 TemplateArgumentListInfo &TemplateArgs,
11724 const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
11725 SmallVectorImpl<TemplateArgument> &SugaredConverted,
11726 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
11727 bool UpdateArgsWithConversions = true,
11728 bool *ConstraintsNotSatisfied = nullptr, bool PartialOrderingTTP = false);
11729
11732 SmallVectorImpl<TemplateArgument> &SugaredConverted,
11733 SmallVectorImpl<TemplateArgument> &CanonicalConverted);
11734
11735 /// Check a template argument against its corresponding
11736 /// template type parameter.
11737 ///
11738 /// This routine implements the semantics of C++ [temp.arg.type]. It
11739 /// returns true if an error occurred, and false otherwise.
11741
11742 /// Check a template argument against its corresponding
11743 /// non-type template parameter.
11744 ///
11745 /// This routine implements the semantics of C++ [temp.arg.nontype].
11746 /// If an error occurred, it returns ExprError(); otherwise, it
11747 /// returns the converted template argument. \p ParamType is the
11748 /// type of the non-type template parameter after it has been instantiated.
11750 QualType InstantiatedParamType, Expr *Arg,
11751 TemplateArgument &SugaredConverted,
11752 TemplateArgument &CanonicalConverted,
11754
11755 /// Check a template argument against its corresponding
11756 /// template template parameter.
11757 ///
11758 /// This routine implements the semantics of C++ [temp.arg.template].
11759 /// It returns true if an error occurred, and false otherwise.
11761 TemplateParameterList *Params,
11762 TemplateArgumentLoc &Arg, bool IsDeduced);
11763
11765 std::optional<SourceRange> ParamRange = {});
11766 void NoteTemplateParameterLocation(const NamedDecl &Decl);
11767
11768 /// Given a non-type template argument that refers to a
11769 /// declaration and the type of its corresponding non-type template
11770 /// parameter, produce an expression that properly refers to that
11771 /// declaration.
11773 const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc,
11774 NamedDecl *TemplateParam = nullptr);
11776 BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg,
11777 SourceLocation Loc);
11778
11779 /// Enumeration describing how template parameter lists are compared
11780 /// for equality.
11782 /// We are matching the template parameter lists of two templates
11783 /// that might be redeclarations.
11784 ///
11785 /// \code
11786 /// template<typename T> struct X;
11787 /// template<typename T> struct X;
11788 /// \endcode
11790
11791 /// We are matching the template parameter lists of two template
11792 /// template parameters as part of matching the template parameter lists
11793 /// of two templates that might be redeclarations.
11794 ///
11795 /// \code
11796 /// template<template<int I> class TT> struct X;
11797 /// template<template<int Value> class Other> struct X;
11798 /// \endcode
11800
11801 /// We are matching the template parameter lists of a template
11802 /// template argument against the template parameter lists of a template
11803 /// template parameter.
11804 ///
11805 /// \code
11806 /// template<template<int Value> class Metafun> struct X;
11807 /// template<int Value> struct integer_c;
11808 /// X<integer_c> xic;
11809 /// \endcode
11811
11812 /// We are determining whether the template-parameters are equivalent
11813 /// according to C++ [temp.over.link]/6. This comparison does not consider
11814 /// constraints.
11815 ///
11816 /// \code
11817 /// template<C1 T> void f(T);
11818 /// template<C2 T> void f(T);
11819 /// \endcode
11821 };
11822
11823 // A struct to represent the 'new' declaration, which is either itself just
11824 // the named decl, or the important information we need about it in order to
11825 // do constraint comparisons.
11827 const NamedDecl *ND = nullptr;
11828 const DeclContext *DC = nullptr;
11829 const DeclContext *LexicalDC = nullptr;
11831
11832 public:
11835 const DeclContext *LexicalDeclCtx,
11837
11838 : DC(DeclCtx), LexicalDC(LexicalDeclCtx), Loc(Loc) {
11839 assert(DC && LexicalDC &&
11840 "Constructor only for cases where we have the information to put "
11841 "in here");
11842 }
11843
11844 // If this was constructed with no information, we cannot do substitution
11845 // for constraint comparison, so make sure we can check that.
11846 bool isInvalid() const { return !ND && !DC; }
11847
11848 const NamedDecl *getDecl() const { return ND; }
11849
11850 bool ContainsDecl(const NamedDecl *ND) const { return this->ND == ND; }
11851
11853 return ND ? ND->getLexicalDeclContext() : LexicalDC;
11854 }
11855
11857 return ND ? ND->getDeclContext() : DC;
11858 }
11859
11860 SourceLocation getLocation() const { return ND ? ND->getLocation() : Loc; }
11861 };
11862
11863 /// Determine whether the given template parameter lists are
11864 /// equivalent.
11865 ///
11866 /// \param New The new template parameter list, typically written in the
11867 /// source code as part of a new template declaration.
11868 ///
11869 /// \param Old The old template parameter list, typically found via
11870 /// name lookup of the template declared with this template parameter
11871 /// list.
11872 ///
11873 /// \param Complain If true, this routine will produce a diagnostic if
11874 /// the template parameter lists are not equivalent.
11875 ///
11876 /// \param Kind describes how we are to match the template parameter lists.
11877 ///
11878 /// \param TemplateArgLoc If this source location is valid, then we
11879 /// are actually checking the template parameter list of a template
11880 /// argument (New) against the template parameter list of its
11881 /// corresponding template template parameter (Old). We produce
11882 /// slightly different diagnostics in this scenario.
11883 ///
11884 /// \returns True if the template parameter lists are equal, false
11885 /// otherwise.
11887 const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New,
11888 const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
11890 SourceLocation TemplateArgLoc = SourceLocation());
11891
11893 TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
11895 SourceLocation TemplateArgLoc = SourceLocation()) {
11896 return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
11897 Kind, TemplateArgLoc);
11898 }
11899
11900 /// Check whether a template can be declared within this scope.
11901 ///
11902 /// If the template declaration is valid in this scope, returns
11903 /// false. Otherwise, issues a diagnostic and returns true.
11904 bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
11905
11906 /// Called when the parser has parsed a C++ typename
11907 /// specifier, e.g., "typename T::type".
11908 ///
11909 /// \param S The scope in which this typename type occurs.
11910 /// \param TypenameLoc the location of the 'typename' keyword
11911 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
11912 /// \param II the identifier we're retrieving (e.g., 'type' in the example).
11913 /// \param IdLoc the location of the identifier.
11914 /// \param IsImplicitTypename context where T::type refers to a type.
11916 Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS,
11917 const IdentifierInfo &II, SourceLocation IdLoc,
11919
11920 /// Called when the parser has parsed a C++ typename
11921 /// specifier that ends in a template-id, e.g.,
11922 /// "typename MetaFun::template apply<T1, T2>".
11923 ///
11924 /// \param S The scope in which this typename type occurs.
11925 /// \param TypenameLoc the location of the 'typename' keyword
11926 /// \param SS the nested-name-specifier following the typename (e.g., 'T::').
11927 /// \param TemplateLoc the location of the 'template' keyword, if any.
11928 /// \param TemplateName The template name.
11929 /// \param TemplateII The identifier used to name the template.
11930 /// \param TemplateIILoc The location of the template name.
11931 /// \param LAngleLoc The location of the opening angle bracket ('<').
11932 /// \param TemplateArgs The template arguments.
11933 /// \param RAngleLoc The location of the closing angle bracket ('>').
11935 ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
11936 const CXXScopeSpec &SS, SourceLocation TemplateLoc,
11937 TemplateTy TemplateName, const IdentifierInfo *TemplateII,
11938 SourceLocation TemplateIILoc, SourceLocation LAngleLoc,
11939 ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc);
11940
11942 SourceLocation KeywordLoc,
11943 NestedNameSpecifierLoc QualifierLoc,
11944 const IdentifierInfo &II, SourceLocation IILoc,
11945 TypeSourceInfo **TSI, bool DeducedTSTContext);
11946
11948 SourceLocation KeywordLoc,
11949 NestedNameSpecifierLoc QualifierLoc,
11950 const IdentifierInfo &II, SourceLocation IILoc,
11951 bool DeducedTSTContext = true);
11952
11953 /// Rebuilds a type within the context of the current instantiation.
11954 ///
11955 /// The type \p T is part of the type of an out-of-line member definition of
11956 /// a class template (or class template partial specialization) that was
11957 /// parsed and constructed before we entered the scope of the class template
11958 /// (or partial specialization thereof). This routine will rebuild that type
11959 /// now that we have entered the declarator's scope, which may produce
11960 /// different canonical types, e.g.,
11961 ///
11962 /// \code
11963 /// template<typename T>
11964 /// struct X {
11965 /// typedef T* pointer;
11966 /// pointer data();
11967 /// };
11968 ///
11969 /// template<typename T>
11970 /// typename X<T>::pointer X<T>::data() { ... }
11971 /// \endcode
11972 ///
11973 /// Here, the type "typename X<T>::pointer" will be created as a
11974 /// DependentNameType, since we do not know that we can look into X<T> when we
11975 /// parsed the type. This function will rebuild the type, performing the
11976 /// lookup of "pointer" in X<T> and returning an ElaboratedType whose
11977 /// canonical type is the same as the canonical type of T*, allowing the
11978 /// return types of the out-of-line definition and the declaration to match.
11981 DeclarationName Name);
11983
11985
11986 /// Rebuild the template parameters now that we know we're in a current
11987 /// instantiation.
11988 bool
11990
11991 /// Produces a formatted string that describes the binding of
11992 /// template parameters to template arguments.
11993 std::string
11995 const TemplateArgumentList &Args);
11996
11997 std::string
11999 const TemplateArgument *Args,
12000 unsigned NumArgs);
12001
12005
12006 /// ActOnDependentIdExpression - Handle a dependent id-expression that
12007 /// was just parsed. This is only possible with an explicit scope
12008 /// specifier naming a dependent type.
12010 const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
12011 const DeclarationNameInfo &NameInfo, bool isAddressOfOperand,
12012 const TemplateArgumentListInfo *TemplateArgs);
12013
12016 SourceLocation TemplateKWLoc,
12017 const DeclarationNameInfo &NameInfo,
12018 const TemplateArgumentListInfo *TemplateArgs);
12019
12020 // Calculates whether the expression Constraint depends on an enclosing
12021 // template, for the purposes of [temp.friend] p9.
12022 // TemplateDepth is the 'depth' of the friend function, which is used to
12023 // compare whether a declaration reference is referring to a containing
12024 // template, or just the current friend function. A 'lower' TemplateDepth in
12025 // the AST refers to a 'containing' template. As the constraint is
12026 // uninstantiated, this is relative to the 'top' of the TU.
12027 bool
12029 unsigned TemplateDepth,
12030 const Expr *Constraint);
12031
12032 /// Find the failed Boolean condition within a given Boolean
12033 /// constant expression, and describe it with a string.
12034 std::pair<Expr *, std::string> findFailedBooleanCondition(Expr *Cond);
12035
12037
12039 Scope *S, MultiTemplateParamsArg TemplateParameterLists,
12040 const IdentifierInfo *Name, SourceLocation NameLoc);
12041
12043 Expr *ConstraintExpr,
12044 const ParsedAttributesView &Attrs);
12045
12047 bool &AddToScope);
12049
12050 TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
12051 const CXXScopeSpec &SS,
12052 const IdentifierInfo *Name,
12053 SourceLocation TagLoc, SourceLocation NameLoc);
12054
12056 CachedTokens &Toks);
12059
12060 /// We've found a use of a templated declaration that would trigger an
12061 /// implicit instantiation. Check that any relevant explicit specializations
12062 /// and partial specializations are visible/reachable, and diagnose if not.
12065
12066 ///@}
12067
12068 //
12069 //
12070 // -------------------------------------------------------------------------
12071 //
12072 //
12073
12074 /// \name C++ Template Argument Deduction
12075 /// Implementations are in SemaTemplateDeduction.cpp
12076 ///@{
12077
12078public:
12079 /// When true, access checking violations are treated as SFINAE
12080 /// failures rather than hard errors.
12082
12083 /// RAII class used to determine whether SFINAE has
12084 /// trapped any errors that occur during template argument
12085 /// deduction.
12087 Sema &SemaRef;
12088 unsigned PrevSFINAEErrors;
12089 bool PrevInNonInstantiationSFINAEContext;
12090 bool PrevAccessCheckingSFINAE;
12091 bool PrevLastDiagnosticIgnored;
12092
12093 public:
12094 explicit SFINAETrap(Sema &SemaRef, bool AccessCheckingSFINAE = false)
12095 : SemaRef(SemaRef), PrevSFINAEErrors(SemaRef.NumSFINAEErrors),
12096 PrevInNonInstantiationSFINAEContext(
12097 SemaRef.InNonInstantiationSFINAEContext),
12098 PrevAccessCheckingSFINAE(SemaRef.AccessCheckingSFINAE),
12099 PrevLastDiagnosticIgnored(
12100 SemaRef.getDiagnostics().isLastDiagnosticIgnored()) {
12101 if (!SemaRef.isSFINAEContext())
12102 SemaRef.InNonInstantiationSFINAEContext = true;
12103 SemaRef.AccessCheckingSFINAE = AccessCheckingSFINAE;
12104 }
12105
12107 SemaRef.NumSFINAEErrors = PrevSFINAEErrors;
12109 PrevInNonInstantiationSFINAEContext;
12110 SemaRef.AccessCheckingSFINAE = PrevAccessCheckingSFINAE;
12112 PrevLastDiagnosticIgnored);
12113 }
12114
12115 /// Determine whether any SFINAE errors have been trapped.
12116 bool hasErrorOccurred() const {
12117 return SemaRef.NumSFINAEErrors > PrevSFINAEErrors;
12118 }
12119 };
12120
12121 /// RAII class used to indicate that we are performing provisional
12122 /// semantic analysis to determine the validity of a construct, so
12123 /// typo-correction and diagnostics in the immediate context (not within
12124 /// implicitly-instantiated templates) should be suppressed.
12126 Sema &SemaRef;
12127 // FIXME: Using a SFINAETrap for this is a hack.
12128 SFINAETrap Trap;
12129 bool PrevDisableTypoCorrection;
12130
12131 public:
12132 explicit TentativeAnalysisScope(Sema &SemaRef)
12133 : SemaRef(SemaRef), Trap(SemaRef, true),
12134 PrevDisableTypoCorrection(SemaRef.DisableTypoCorrection) {
12135 SemaRef.DisableTypoCorrection = true;
12136 }
12138 SemaRef.DisableTypoCorrection = PrevDisableTypoCorrection;
12139 }
12140 };
12141
12142 /// For each declaration that involved template argument deduction, the
12143 /// set of diagnostics that were suppressed during that template argument
12144 /// deduction.
12145 ///
12146 /// FIXME: Serialize this structure to the AST file.
12147 typedef llvm::DenseMap<Decl *, SmallVector<PartialDiagnosticAt, 1>>
12150
12151 /// Compare types for equality with respect to possibly compatible
12152 /// function types (noreturn adjustment, implicit calling conventions). If any
12153 /// of parameter and argument is not a function, just perform type comparison.
12154 ///
12155 /// \param P the template parameter type.
12156 ///
12157 /// \param A the argument type.
12159
12160 /// Allocate a TemplateArgumentLoc where all locations have
12161 /// been initialized to the given location.
12162 ///
12163 /// \param Arg The template argument we are producing template argument
12164 /// location information for.
12165 ///
12166 /// \param NTTPType For a declaration template argument, the type of
12167 /// the non-type template parameter that corresponds to this template
12168 /// argument. Can be null if no type sugar is available to add to the
12169 /// type from the template argument.
12170 ///
12171 /// \param Loc The source location to use for the resulting template
12172 /// argument.
12176 NamedDecl *TemplateParam = nullptr);
12177
12178 /// Get a template argument mapping the given template parameter to itself,
12179 /// e.g. for X in \c template<int X>, this would return an expression template
12180 /// argument referencing X.
12182 SourceLocation Location);
12183
12184 /// Adjust the type \p ArgFunctionType to match the calling convention,
12185 /// noreturn, and optionally the exception specification of \p FunctionType.
12186 /// Deduction often wants to ignore these properties when matching function
12187 /// types.
12189 bool AdjustExceptionSpec = false);
12190
12193 ArrayRef<TemplateArgument> TemplateArgs,
12195
12198 ArrayRef<TemplateArgument> TemplateArgs,
12200
12201 /// Deduce the template arguments of the given template from \p FromType.
12202 /// Used to implement the IsDeducible constraint for alias CTAD per C++
12203 /// [over.match.class.deduct]p4.
12204 ///
12205 /// It only supports class or type alias templates.
12209
12214 bool NumberOfArgumentsMustMatch);
12215
12216 /// Substitute the explicitly-provided template arguments into the
12217 /// given function template according to C++ [temp.arg.explicit].
12218 ///
12219 /// \param FunctionTemplate the function template into which the explicit
12220 /// template arguments will be substituted.
12221 ///
12222 /// \param ExplicitTemplateArgs the explicitly-specified template
12223 /// arguments.
12224 ///
12225 /// \param Deduced the deduced template arguments, which will be populated
12226 /// with the converted and checked explicit template arguments.
12227 ///
12228 /// \param ParamTypes will be populated with the instantiated function
12229 /// parameters.
12230 ///
12231 /// \param FunctionType if non-NULL, the result type of the function template
12232 /// will also be instantiated and the pointed-to value will be updated with
12233 /// the instantiated function type.
12234 ///
12235 /// \param Info if substitution fails for any reason, this object will be
12236 /// populated with more information about the failure.
12237 ///
12238 /// \returns TemplateDeductionResult::Success if substitution was successful,
12239 /// or some failure condition.
12242 TemplateArgumentListInfo &ExplicitTemplateArgs,
12246
12247 /// brief A function argument from which we performed template argument
12248 // deduction for a call.
12250 OriginalCallArg(QualType OriginalParamType, bool DecomposedParam,
12251 unsigned ArgIdx, QualType OriginalArgType)
12252 : OriginalParamType(OriginalParamType),
12253 DecomposedParam(DecomposedParam), ArgIdx(ArgIdx),
12254 OriginalArgType(OriginalArgType) {}
12255
12258 unsigned ArgIdx;
12260 };
12261
12262 /// Finish template argument deduction for a function template,
12263 /// checking the deduced template arguments for completeness and forming
12264 /// the function template specialization.
12265 ///
12266 /// \param OriginalCallArgs If non-NULL, the original call arguments against
12267 /// which the deduced argument types should be compared.
12271 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
12273 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs = nullptr,
12274 bool PartialOverloading = false,
12275 llvm::function_ref<bool()> CheckNonDependent = [] { return false; });
12276
12277 /// Perform template argument deduction from a function call
12278 /// (C++ [temp.deduct.call]).
12279 ///
12280 /// \param FunctionTemplate the function template for which we are performing
12281 /// template argument deduction.
12282 ///
12283 /// \param ExplicitTemplateArgs the explicit template arguments provided
12284 /// for this call.
12285 ///
12286 /// \param Args the function call arguments
12287 ///
12288 /// \param Specialization if template argument deduction was successful,
12289 /// this will be set to the function template specialization produced by
12290 /// template argument deduction.
12291 ///
12292 /// \param Info the argument will be updated to provide additional information
12293 /// about template argument deduction.
12294 ///
12295 /// \param CheckNonDependent A callback to invoke to check conversions for
12296 /// non-dependent parameters, between deduction and substitution, per DR1391.
12297 /// If this returns true, substitution will be skipped and we return
12298 /// TemplateDeductionResult::NonDependentConversionFailure. The callback is
12299 /// passed the parameter types (after substituting explicit template
12300 /// arguments).
12301 ///
12302 /// \returns the result of template argument deduction.
12305 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
12307 bool PartialOverloading, bool AggregateDeductionCandidate,
12308 QualType ObjectType, Expr::Classification ObjectClassification,
12309 llvm::function_ref<bool(ArrayRef<QualType>)> CheckNonDependent);
12310
12311 /// Deduce template arguments when taking the address of a function
12312 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
12313 /// a template.
12314 ///
12315 /// \param FunctionTemplate the function template for which we are performing
12316 /// template argument deduction.
12317 ///
12318 /// \param ExplicitTemplateArgs the explicitly-specified template
12319 /// arguments.
12320 ///
12321 /// \param ArgFunctionType the function type that will be used as the
12322 /// "argument" type (A) when performing template argument deduction from the
12323 /// function template's function type. This type may be NULL, if there is no
12324 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
12325 ///
12326 /// \param Specialization if template argument deduction was successful,
12327 /// this will be set to the function template specialization produced by
12328 /// template argument deduction.
12329 ///
12330 /// \param Info the argument will be updated to provide additional information
12331 /// about template argument deduction.
12332 ///
12333 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12334 /// the address of a function template per [temp.deduct.funcaddr] and
12335 /// [over.over]. If \c false, we are looking up a function template
12336 /// specialization based on its signature, per [temp.deduct.decl].
12337 ///
12338 /// \returns the result of template argument deduction.
12341 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
12343 bool IsAddressOfFunction = false);
12344
12345 /// Deduce template arguments for a templated conversion
12346 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
12347 /// conversion function template specialization.
12350 Expr::Classification ObjectClassification, QualType ToType,
12352
12353 /// Deduce template arguments for a function template when there is
12354 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
12355 ///
12356 /// \param FunctionTemplate the function template for which we are performing
12357 /// template argument deduction.
12358 ///
12359 /// \param ExplicitTemplateArgs the explicitly-specified template
12360 /// arguments.
12361 ///
12362 /// \param Specialization if template argument deduction was successful,
12363 /// this will be set to the function template specialization produced by
12364 /// template argument deduction.
12365 ///
12366 /// \param Info the argument will be updated to provide additional information
12367 /// about template argument deduction.
12368 ///
12369 /// \param IsAddressOfFunction If \c true, we are deducing as part of taking
12370 /// the address of a function template in a context where we do not have a
12371 /// target type, per [over.over]. If \c false, we are looking up a function
12372 /// template specialization based on its signature, which only happens when
12373 /// deducing a function parameter type from an argument that is a template-id
12374 /// naming a function template specialization.
12375 ///
12376 /// \returns the result of template argument deduction.
12379 TemplateArgumentListInfo *ExplicitTemplateArgs,
12382 bool IsAddressOfFunction = false);
12383
12384 /// Substitute Replacement for \p auto in \p TypeWithAuto
12385 QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement);
12386 /// Substitute Replacement for auto in TypeWithAuto
12388 QualType Replacement);
12389
12390 // Substitute auto in TypeWithAuto for a Dependent auto type
12392
12393 // Substitute auto in TypeWithAuto for a Dependent auto type
12396
12397 /// Completely replace the \c auto in \p TypeWithAuto by
12398 /// \p Replacement. This does not retain any \c auto type sugar.
12399 QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement);
12401 QualType Replacement);
12402
12403 /// Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
12404 ///
12405 /// Note that this is done even if the initializer is dependent. (This is
12406 /// necessary to support partial ordering of templates using 'auto'.)
12407 /// A dependent type will be produced when deducing from a dependent type.
12408 ///
12409 /// \param Type the type pattern using the auto type-specifier.
12410 /// \param Init the initializer for the variable whose type is to be deduced.
12411 /// \param Result if type deduction was successful, this will be set to the
12412 /// deduced type.
12413 /// \param Info the argument will be updated to provide additional information
12414 /// about template argument deduction.
12415 /// \param DependentDeduction Set if we should permit deduction in
12416 /// dependent cases. This is necessary for template partial ordering
12417 /// with 'auto' template parameters. The template parameter depth to be
12418 /// used should be specified in the 'Info' parameter.
12419 /// \param IgnoreConstraints Set if we should not fail if the deduced type
12420 /// does not satisfy the type-constraint in the auto
12421 /// type.
12425 bool DependentDeduction = false,
12426 bool IgnoreConstraints = false,
12427 TemplateSpecCandidateSet *FailedTSC = nullptr);
12428 void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init);
12430 bool Diagnose = true);
12431
12434
12435 /// Returns the more specialized class template partial specialization
12436 /// according to the rules of partial ordering of class template partial
12437 /// specializations (C++ [temp.class.order]).
12438 ///
12439 /// \param PS1 the first class template partial specialization
12440 ///
12441 /// \param PS2 the second class template partial specialization
12442 ///
12443 /// \returns the more specialized class template partial specialization. If
12444 /// neither partial specialization is more specialized, returns NULL.
12449
12452
12456
12459
12461 TemplateParameterList *PParam, TemplateDecl *AArg,
12462 const DefaultArguments &DefaultArgs, SourceLocation Loc, bool IsDeduced);
12463
12464 /// Mark which template parameters are used in a given expression.
12465 ///
12466 /// \param E the expression from which template parameters will be deduced.
12467 ///
12468 /// \param Used a bit vector whose elements will be set to \c true
12469 /// to indicate when the corresponding template parameter will be
12470 /// deduced.
12471 void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
12472 unsigned Depth, llvm::SmallBitVector &Used);
12473
12474 /// Mark which template parameters can be deduced from a given
12475 /// template argument list.
12476 ///
12477 /// \param TemplateArgs the template argument list from which template
12478 /// parameters will be deduced.
12479 ///
12480 /// \param Used a bit vector whose elements will be set to \c true
12481 /// to indicate when the corresponding template parameter will be
12482 /// deduced.
12483 void MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,
12484 bool OnlyDeduced, unsigned Depth,
12485 llvm::SmallBitVector &Used);
12486 void
12488 llvm::SmallBitVector &Deduced) {
12490 }
12491
12492 /// Marks all of the template parameters that will be deduced by a
12493 /// call to the given function template.
12494 static void
12497 llvm::SmallBitVector &Deduced);
12498
12499 /// Returns the more specialized function template according
12500 /// to the rules of function template partial ordering (C++
12501 /// [temp.func.order]).
12502 ///
12503 /// \param FT1 the first function template
12504 ///
12505 /// \param FT2 the second function template
12506 ///
12507 /// \param TPOC the context in which we are performing partial ordering of
12508 /// function templates.
12509 ///
12510 /// \param NumCallArguments1 The number of arguments in the call to FT1, used
12511 /// only when \c TPOC is \c TPOC_Call. Does not include the object argument
12512 /// when calling a member function.
12513 ///
12514 /// \param RawObj1Ty The type of the object parameter of FT1 if a member
12515 /// function only used if \c TPOC is \c TPOC_Call and FT1 is a Function
12516 /// template from a member function
12517 ///
12518 /// \param RawObj2Ty The type of the object parameter of FT2 if a member
12519 /// function only used if \c TPOC is \c TPOC_Call and FT2 is a Function
12520 /// template from a member function
12521 ///
12522 /// \param Reversed If \c true, exactly one of FT1 and FT2 is an overload
12523 /// candidate with a reversed parameter order. In this case, the corresponding
12524 /// P/A pairs between FT1 and FT2 are reversed.
12525 ///
12526 /// \returns the more specialized function template. If neither
12527 /// template is more specialized, returns NULL.
12530 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
12531 QualType RawObj1Ty = {}, QualType RawObj2Ty = {}, bool Reversed = false);
12532
12533 /// Retrieve the most specialized of the given function template
12534 /// specializations.
12535 ///
12536 /// \param SpecBegin the start iterator of the function template
12537 /// specializations that we will be comparing.
12538 ///
12539 /// \param SpecEnd the end iterator of the function template
12540 /// specializations, paired with \p SpecBegin.
12541 ///
12542 /// \param Loc the location where the ambiguity or no-specializations
12543 /// diagnostic should occur.
12544 ///
12545 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
12546 /// no matching candidates.
12547 ///
12548 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
12549 /// occurs.
12550 ///
12551 /// \param CandidateDiag partial diagnostic used for each function template
12552 /// specialization that is a candidate in the ambiguous ordering. One
12553 /// parameter in this diagnostic should be unbound, which will correspond to
12554 /// the string describing the template arguments for the function template
12555 /// specialization.
12556 ///
12557 /// \returns the most specialized function template specialization, if
12558 /// found. Otherwise, returns SpecEnd.
12559 UnresolvedSetIterator
12560 getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd,
12561 TemplateSpecCandidateSet &FailedCandidates,
12562 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
12563 const PartialDiagnostic &AmbigDiag,
12564 const PartialDiagnostic &CandidateDiag,
12565 bool Complain = true, QualType TargetType = QualType());
12566
12567 /// Returns the more constrained function according to the rules of
12568 /// partial ordering by constraints (C++ [temp.constr.order]).
12569 ///
12570 /// \param FD1 the first function
12571 ///
12572 /// \param FD2 the second function
12573 ///
12574 /// \returns the more constrained function. If neither function is
12575 /// more constrained, returns NULL.
12576 FunctionDecl *getMoreConstrainedFunction(FunctionDecl *FD1,
12577 FunctionDecl *FD2);
12578
12579 ///@}
12580
12581 //
12582 //
12583 // -------------------------------------------------------------------------
12584 //
12585 //
12586
12587 /// \name C++ Template Deduction Guide
12588 /// Implementations are in SemaTemplateDeductionGuide.cpp
12589 ///@{
12590
12591 /// Declare implicit deduction guides for a class template if we've
12592 /// not already done so.
12593 void DeclareImplicitDeductionGuides(TemplateDecl *Template,
12594 SourceLocation Loc);
12595
12596 FunctionTemplateDecl *DeclareAggregateDeductionGuideFromInitList(
12597 TemplateDecl *Template, MutableArrayRef<QualType> ParamTypes,
12598 SourceLocation Loc);
12599
12600 ///@}
12601
12602 //
12603 //
12604 // -------------------------------------------------------------------------
12605 //
12606 //
12607
12608 /// \name C++ Template Instantiation
12609 /// Implementations are in SemaTemplateInstantiate.cpp
12610 ///@{
12611
12612public:
12613 /// A helper class for building up ExtParameterInfos.
12616 bool HasInteresting = false;
12617
12618 public:
12619 /// Set the ExtParameterInfo for the parameter at the given index,
12620 ///
12621 void set(unsigned index, FunctionProtoType::ExtParameterInfo info) {
12622 assert(Infos.size() <= index);
12623 Infos.resize(index);
12624 Infos.push_back(info);
12625
12626 if (!HasInteresting)
12627 HasInteresting = (info != FunctionProtoType::ExtParameterInfo());
12628 }
12629
12630 /// Return a pointer (suitable for setting in an ExtProtoInfo) to the
12631 /// ExtParameterInfo array we've built up.
12633 getPointerOrNull(unsigned numParams) {
12634 if (!HasInteresting)
12635 return nullptr;
12636 Infos.resize(numParams);
12637 return Infos.data();
12638 }
12639 };
12640
12641 /// The current instantiation scope used to store local
12642 /// variables.
12644
12645 typedef llvm::DenseMap<ParmVarDecl *, llvm::TinyPtrVector<ParmVarDecl *>>
12647
12648 /// A mapping from parameters with unparsed default arguments to the
12649 /// set of instantiations of each parameter.
12650 ///
12651 /// This mapping is a temporary data structure used when parsing
12652 /// nested class templates or nested classes of class templates,
12653 /// where we might end up instantiating an inner class before the
12654 /// default arguments of its methods have been parsed.
12656
12657 /// A context in which code is being synthesized (where a source location
12658 /// alone is not sufficient to identify the context). This covers template
12659 /// instantiation and various forms of implicitly-generated functions.
12661 /// The kind of template instantiation we are performing
12663 /// We are instantiating a template declaration. The entity is
12664 /// the declaration we're instantiating (e.g., a CXXRecordDecl).
12666
12667 /// We are instantiating a default argument for a template
12668 /// parameter. The Entity is the template parameter whose argument is
12669 /// being instantiated, the Template is the template, and the
12670 /// TemplateArgs/NumTemplateArguments provide the template arguments as
12671 /// specified.
12673
12674 /// We are instantiating a default argument for a function.
12675 /// The Entity is the ParmVarDecl, and TemplateArgs/NumTemplateArgs
12676 /// provides the template arguments as specified.
12678
12679 /// We are substituting explicit template arguments provided for
12680 /// a function template. The entity is a FunctionTemplateDecl.
12682
12683 /// We are substituting template argument determined as part of
12684 /// template argument deduction for either a class template
12685 /// partial specialization or a function template. The
12686 /// Entity is either a {Class|Var}TemplatePartialSpecializationDecl or
12687 /// a TemplateDecl.
12689
12690 /// We are substituting into a lambda expression.
12692
12693 /// We are substituting prior template arguments into a new
12694 /// template parameter. The template parameter itself is either a
12695 /// NonTypeTemplateParmDecl or a TemplateTemplateParmDecl.
12697
12698 /// We are checking the validity of a default template argument that
12699 /// has been used when naming a template-id.
12701
12702 /// We are computing the exception specification for a defaulted special
12703 /// member function.
12705
12706 /// We are instantiating the exception specification for a function
12707 /// template which was deferred until it was needed.
12709
12710 /// We are instantiating a requirement of a requires expression.
12712
12713 /// We are checking the satisfaction of a nested requirement of a requires
12714 /// expression.
12716
12717 /// We are declaring an implicit special member function.
12719
12720 /// We are declaring an implicit 'operator==' for a defaulted
12721 /// 'operator<=>'.
12723
12724 /// We are defining a synthesized function (such as a defaulted special
12725 /// member).
12727
12728 // We are checking the constraints associated with a constrained entity or
12729 // the constraint expression of a concept. This includes the checks that
12730 // atomic constraints have the type 'bool' and that they can be constant
12731 // evaluated.
12733
12734 // We are substituting template arguments into a constraint expression.
12736
12737 // We are normalizing a constraint expression.
12739
12740 // Instantiating a Requires Expression parameter clause.
12742
12743 // We are substituting into the parameter mapping of an atomic constraint
12744 // during normalization.
12746
12747 /// We are rewriting a comparison operator in terms of an operator<=>.
12749
12750 /// We are initializing a structured binding.
12752
12753 /// We are marking a class as __dllexport.
12755
12756 /// We are building an implied call from __builtin_dump_struct. The
12757 /// arguments are in CallArgs.
12759
12760 /// Added for Template instantiation observation.
12761 /// Memoization means we are _not_ instantiating a template because
12762 /// it is already instantiated (but we entered a context where we
12763 /// would have had to if it was not already instantiated).
12765
12766 /// We are building deduction guides for a class.
12768
12769 /// We are instantiating a type alias template declaration.
12772
12773 /// Was the enclosing context a non-instantiation SFINAE context?
12775
12776 /// The point of instantiation or synthesis within the source code.
12778
12779 /// The entity that is being synthesized.
12781
12782 /// The template (or partial specialization) in which we are
12783 /// performing the instantiation, for substitutions of prior template
12784 /// arguments.
12786
12787 union {
12788 /// The list of template arguments we are substituting, if they
12789 /// are not part of the entity.
12791
12792 /// The list of argument expressions in a synthesized call.
12793 const Expr *const *CallArgs;
12794 };
12795
12796 // FIXME: Wrap this union around more members, or perhaps store the
12797 // kind-specific members in the RAII object owning the context.
12798 union {
12799 /// The number of template arguments in TemplateArgs.
12801
12802 /// The number of expressions in CallArgs.
12803 unsigned NumCallArgs;
12804
12805 /// The special member being declared or defined.
12807 };
12808
12810 assert(Kind != DeclaringSpecialMember);
12811 return {TemplateArgs, NumTemplateArgs};
12812 }
12813
12814 /// The template deduction info object associated with the
12815 /// substitution or checking of explicit or deduced template arguments.
12817
12818 /// The source range that covers the construct that cause
12819 /// the instantiation, e.g., the template-id that causes a class
12820 /// template instantiation.
12822
12824 : Kind(TemplateInstantiation),
12825 SavedInNonInstantiationSFINAEContext(false), Entity(nullptr),
12826 Template(nullptr), TemplateArgs(nullptr), NumTemplateArgs(0),
12827 DeductionInfo(nullptr) {}
12828
12829 /// Determines whether this template is an actual instantiation
12830 /// that should be counted toward the maximum instantiation depth.
12831 bool isInstantiationRecord() const;
12832 };
12833
12834 /// A stack object to be created when performing template
12835 /// instantiation.
12836 ///
12837 /// Construction of an object of type \c InstantiatingTemplate
12838 /// pushes the current instantiation onto the stack of active
12839 /// instantiations. If the size of this stack exceeds the maximum
12840 /// number of recursive template instantiations, construction
12841 /// produces an error and evaluates true.
12842 ///
12843 /// Destruction of this object will pop the named instantiation off
12844 /// the stack.
12846 /// Note that we are instantiating a class template,
12847 /// function template, variable template, alias template,
12848 /// or a member thereof.
12849 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12850 Decl *Entity,
12851 SourceRange InstantiationRange = SourceRange());
12852
12854 /// Note that we are instantiating an exception specification
12855 /// of a function template.
12856 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12858 SourceRange InstantiationRange = SourceRange());
12859
12860 /// Note that we are instantiating a type alias template declaration.
12861 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12862 TypeAliasTemplateDecl *Entity,
12863 ArrayRef<TemplateArgument> TemplateArgs,
12864 SourceRange InstantiationRange = SourceRange());
12865
12866 /// Note that we are instantiating a default argument in a
12867 /// template-id.
12868 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12869 TemplateParameter Param, TemplateDecl *Template,
12870 ArrayRef<TemplateArgument> TemplateArgs,
12871 SourceRange InstantiationRange = SourceRange());
12872
12873 /// Note that we are substituting either explicitly-specified or
12874 /// deduced template arguments during function template argument deduction.
12875 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12876 FunctionTemplateDecl *FunctionTemplate,
12877 ArrayRef<TemplateArgument> TemplateArgs,
12879 sema::TemplateDeductionInfo &DeductionInfo,
12880 SourceRange InstantiationRange = SourceRange());
12881
12882 /// Note that we are instantiating as part of template
12883 /// argument deduction for a class template declaration.
12884 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12885 TemplateDecl *Template,
12886 ArrayRef<TemplateArgument> TemplateArgs,
12887 sema::TemplateDeductionInfo &DeductionInfo,
12888 SourceRange InstantiationRange = SourceRange());
12889
12890 /// Note that we are instantiating as part of template
12891 /// argument deduction for a class template partial
12892 /// specialization.
12893 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12895 ArrayRef<TemplateArgument> TemplateArgs,
12896 sema::TemplateDeductionInfo &DeductionInfo,
12897 SourceRange InstantiationRange = SourceRange());
12898
12899 /// Note that we are instantiating as part of template
12900 /// argument deduction for a variable template partial
12901 /// specialization.
12902 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12904 ArrayRef<TemplateArgument> TemplateArgs,
12905 sema::TemplateDeductionInfo &DeductionInfo,
12906 SourceRange InstantiationRange = SourceRange());
12907
12908 /// Note that we are instantiating a default argument for a function
12909 /// parameter.
12910 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12911 ParmVarDecl *Param,
12912 ArrayRef<TemplateArgument> TemplateArgs,
12913 SourceRange InstantiationRange = SourceRange());
12914
12915 /// Note that we are substituting prior template arguments into a
12916 /// non-type parameter.
12917 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12918 NamedDecl *Template, NonTypeTemplateParmDecl *Param,
12919 ArrayRef<TemplateArgument> TemplateArgs,
12920 SourceRange InstantiationRange);
12921
12922 /// Note that we are substituting prior template arguments into a
12923 /// template template parameter.
12924 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12925 NamedDecl *Template, TemplateTemplateParmDecl *Param,
12926 ArrayRef<TemplateArgument> TemplateArgs,
12927 SourceRange InstantiationRange);
12928
12929 /// Note that we are checking the default template argument
12930 /// against the template parameter for a given template-id.
12931 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12932 TemplateDecl *Template, NamedDecl *Param,
12933 ArrayRef<TemplateArgument> TemplateArgs,
12934 SourceRange InstantiationRange);
12935
12937 /// \brief Note that we are checking the constraints associated with some
12938 /// constrained entity (a concept declaration or a template with associated
12939 /// constraints).
12940 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12941 ConstraintsCheck, NamedDecl *Template,
12942 ArrayRef<TemplateArgument> TemplateArgs,
12943 SourceRange InstantiationRange);
12944
12946 /// \brief Note that we are checking a constraint expression associated
12947 /// with a template declaration or as part of the satisfaction check of a
12948 /// concept.
12949 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12951 sema::TemplateDeductionInfo &DeductionInfo,
12952 SourceRange InstantiationRange);
12953
12955 /// \brief Note that we are normalizing a constraint expression.
12956 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12958 SourceRange InstantiationRange);
12959
12961 /// \brief Note that we are subtituting into the parameter mapping of an
12962 /// atomic constraint during constraint normalization.
12963 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12965 SourceRange InstantiationRange);
12966
12967 /// \brief Note that we are substituting template arguments into a part of
12968 /// a requirement of a requires expression.
12969 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12971 sema::TemplateDeductionInfo &DeductionInfo,
12972 SourceRange InstantiationRange = SourceRange());
12973
12974 /// \brief Note that we are checking the satisfaction of the constraint
12975 /// expression inside of a nested requirement.
12976 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12978 SourceRange InstantiationRange = SourceRange());
12979
12980 /// \brief Note that we are checking a requires clause.
12981 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12982 const RequiresExpr *E,
12983 sema::TemplateDeductionInfo &DeductionInfo,
12984 SourceRange InstantiationRange);
12985
12987 /// \brief Note that we are building deduction guides.
12988 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
12990 SourceRange InstantiationRange = SourceRange());
12991
12992 /// Note that we have finished instantiating this template.
12993 void Clear();
12994
12996
12997 /// Determines whether we have exceeded the maximum
12998 /// recursive template instantiations.
12999 bool isInvalid() const { return Invalid; }
13000
13001 /// Determine whether we are already instantiating this
13002 /// specialization in some surrounding active instantiation.
13003 bool isAlreadyInstantiating() const { return AlreadyInstantiating; }
13004
13005 private:
13006 Sema &SemaRef;
13007 bool Invalid;
13008 bool AlreadyInstantiating;
13009 bool CheckInstantiationDepth(SourceLocation PointOfInstantiation,
13010 SourceRange InstantiationRange);
13011
13012 InstantiatingTemplate(Sema &SemaRef,
13014 SourceLocation PointOfInstantiation,
13015 SourceRange InstantiationRange, Decl *Entity,
13016 NamedDecl *Template = nullptr,
13017 ArrayRef<TemplateArgument> TemplateArgs = {},
13018 sema::TemplateDeductionInfo *DeductionInfo = nullptr);
13019
13020 InstantiatingTemplate(const InstantiatingTemplate &) = delete;
13021
13022 InstantiatingTemplate &operator=(const InstantiatingTemplate &) = delete;
13023 };
13024
13025 bool SubstTemplateArgument(const TemplateArgumentLoc &Input,
13026 const MultiLevelTemplateArgumentList &TemplateArgs,
13027 TemplateArgumentLoc &Output,
13028 SourceLocation Loc = {},
13029 const DeclarationName &Entity = {});
13030 bool
13031 SubstTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
13032 const MultiLevelTemplateArgumentList &TemplateArgs,
13033 TemplateArgumentListInfo &Outputs);
13034
13035 /// Retrieve the template argument list(s) that should be used to
13036 /// instantiate the definition of the given declaration.
13037 ///
13038 /// \param ND the declaration for which we are computing template
13039 /// instantiation arguments.
13040 ///
13041 /// \param DC In the event we don't HAVE a declaration yet, we instead provide
13042 /// the decl context where it will be created. In this case, the `Innermost`
13043 /// should likely be provided. If ND is non-null, this is ignored.
13044 ///
13045 /// \param Innermost if non-NULL, specifies a template argument list for the
13046 /// template declaration passed as ND.
13047 ///
13048 /// \param RelativeToPrimary true if we should get the template
13049 /// arguments relative to the primary template, even when we're
13050 /// dealing with a specialization. This is only relevant for function
13051 /// template specializations.
13052 ///
13053 /// \param Pattern If non-NULL, indicates the pattern from which we will be
13054 /// instantiating the definition of the given declaration, \p ND. This is
13055 /// used to determine the proper set of template instantiation arguments for
13056 /// friend function template specializations.
13057 ///
13058 /// \param ForConstraintInstantiation when collecting arguments,
13059 /// ForConstraintInstantiation indicates we should continue looking when
13060 /// encountering a lambda generic call operator, and continue looking for
13061 /// arguments on an enclosing class template.
13062 ///
13063 /// \param SkipForSpecialization when specified, any template specializations
13064 /// in a traversal would be ignored.
13065 ///
13066 /// \param ForDefaultArgumentSubstitution indicates we should continue looking
13067 /// when encountering a specialized member function template, rather than
13068 /// returning immediately.
13069 MultiLevelTemplateArgumentList getTemplateInstantiationArgs(
13070 const NamedDecl *D, const DeclContext *DC = nullptr, bool Final = false,
13071 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13072 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13073 bool ForConstraintInstantiation = false,
13074 bool SkipForSpecialization = false,
13075 bool ForDefaultArgumentSubstitution = false);
13076
13077 /// Apart from storing the result to \p Result, this behaves the same as
13078 /// another overload.
13080 MultiLevelTemplateArgumentList &Result, const NamedDecl *D,
13081 const DeclContext *DC = nullptr, bool Final = false,
13082 std::optional<ArrayRef<TemplateArgument>> Innermost = std::nullopt,
13083 bool RelativeToPrimary = false, const FunctionDecl *Pattern = nullptr,
13084 bool ForConstraintInstantiation = false,
13085 bool SkipForSpecialization = false,
13086 bool ForDefaultArgumentSubstitution = false);
13087
13088 /// RAII object to handle the state changes required to synthesize
13089 /// a function body.
13091 Sema &S;
13092 Sema::ContextRAII SavedContext;
13093 bool PushedCodeSynthesisContext = false;
13094
13095 public:
13097 : S(S), SavedContext(S, DC) {
13098 auto *FD = dyn_cast<FunctionDecl>(DC);
13099 S.PushFunctionScope();
13100 S.PushExpressionEvaluationContext(
13101 (FD && FD->isConsteval())
13102 ? ExpressionEvaluationContext::ImmediateFunctionContext
13103 : ExpressionEvaluationContext::PotentiallyEvaluated);
13104 if (FD) {
13105 FD->setWillHaveBody(true);
13106 S.ExprEvalContexts.back().InImmediateFunctionContext =
13107 FD->isImmediateFunction() ||
13108 S.ExprEvalContexts[S.ExprEvalContexts.size() - 2]
13109 .isConstantEvaluated() ||
13110 S.ExprEvalContexts[S.ExprEvalContexts.size() - 2]
13111 .isImmediateFunctionContext();
13112 S.ExprEvalContexts.back().InImmediateEscalatingFunctionContext =
13113 S.getLangOpts().CPlusPlus20 && FD->isImmediateEscalating();
13114 } else
13115 assert(isa<ObjCMethodDecl>(DC));
13116 }
13117
13119 assert(!PushedCodeSynthesisContext);
13120
13122 Ctx.Kind = Sema::CodeSynthesisContext::DefiningSynthesizedFunction;
13123 Ctx.PointOfInstantiation = UseLoc;
13124 Ctx.Entity = cast<Decl>(S.CurContext);
13125 S.pushCodeSynthesisContext(Ctx);
13126
13127 PushedCodeSynthesisContext = true;
13128 }
13129
13131 if (PushedCodeSynthesisContext)
13132 S.popCodeSynthesisContext();
13133 if (auto *FD = dyn_cast<FunctionDecl>(S.CurContext)) {
13134 FD->setWillHaveBody(false);
13135 S.CheckImmediateEscalatingFunctionDefinition(FD, S.getCurFunction());
13136 }
13137 S.PopExpressionEvaluationContext();
13138 S.PopFunctionScopeInfo();
13139 }
13140 };
13141
13142 /// List of active code synthesis contexts.
13143 ///
13144 /// This vector is treated as a stack. As synthesis of one entity requires
13145 /// synthesis of another, additional contexts are pushed onto the stack.
13147
13148 /// Specializations whose definitions are currently being instantiated.
13149 llvm::DenseSet<std::pair<Decl *, unsigned>> InstantiatingSpecializations;
13150
13151 /// Non-dependent types used in templates that have already been instantiated
13152 /// by some template instantiation.
13153 llvm::DenseSet<QualType> InstantiatedNonDependentTypes;
13154
13155 /// Extra modules inspected when performing a lookup during a template
13156 /// instantiation. Computed lazily.
13158
13159 /// Cache of additional modules that should be used for name lookup
13160 /// within the current template instantiation. Computed lazily; use
13161 /// getLookupModules() to get a complete set.
13162 llvm::DenseSet<Module *> LookupModulesCache;
13163
13164 /// Map from the most recent declaration of a namespace to the most
13165 /// recent visible declaration of that namespace.
13166 llvm::DenseMap<NamedDecl *, NamedDecl *> VisibleNamespaceCache;
13167
13168 /// Whether we are in a SFINAE context that is not associated with
13169 /// template instantiation.
13170 ///
13171 /// This is used when setting up a SFINAE trap (\c see SFINAETrap) outside
13172 /// of a template instantiation or template argument deduction.
13174
13175 /// The number of \p CodeSynthesisContexts that are not template
13176 /// instantiations and, therefore, should not be counted as part of the
13177 /// instantiation depth.
13178 ///
13179 /// When the instantiation depth reaches the user-configurable limit
13180 /// \p LangOptions::InstantiationDepth we will abort instantiation.
13181 // FIXME: Should we have a similar limit for other forms of synthesis?
13183
13184 /// The depth of the context stack at the point when the most recent
13185 /// error or warning was produced.
13186 ///
13187 /// This value is used to suppress printing of redundant context stacks
13188 /// when there are multiple errors or warnings in the same instantiation.
13189 // FIXME: Does this belong in Sema? It's tough to implement it anywhere else.
13191
13192 /// The template instantiation callbacks to trace or track
13193 /// instantiations (objects can be chained).
13194 ///
13195 /// This callbacks is used to print, trace or track template
13196 /// instantiations as they are being constructed.
13197 std::vector<std::unique_ptr<TemplateInstantiationCallback>>
13199
13200 /// The current index into pack expansion arguments that will be
13201 /// used for substitution of parameter packs.
13202 ///
13203 /// The pack expansion index will be -1 to indicate that parameter packs
13204 /// should be instantiated as themselves. Otherwise, the index specifies
13205 /// which argument within the parameter pack will be used for substitution.
13207
13208 /// RAII object used to change the argument pack substitution index
13209 /// within a \c Sema object.
13210 ///
13211 /// See \c ArgumentPackSubstitutionIndex for more information.
13213 Sema &Self;
13214 int OldSubstitutionIndex;
13215
13216 public:
13217 ArgumentPackSubstitutionIndexRAII(Sema &Self, int NewSubstitutionIndex)
13218 : Self(Self), OldSubstitutionIndex(Self.ArgumentPackSubstitutionIndex) {
13219 Self.ArgumentPackSubstitutionIndex = NewSubstitutionIndex;
13220 }
13221
13223 Self.ArgumentPackSubstitutionIndex = OldSubstitutionIndex;
13224 }
13225 };
13226
13228
13231
13233 if (!CodeSynthesisContexts.empty() &&
13237 }
13240 }
13241 /// Prints the current instantiation stack through a series of
13242 /// notes.
13244
13245 /// Determines whether we are currently in a context where
13246 /// template argument substitution failures are not considered
13247 /// errors.
13248 ///
13249 /// \returns An empty \c Optional if we're not in a SFINAE context.
13250 /// Otherwise, contains a pointer that, if non-NULL, contains the nearest
13251 /// template-deduction context object, which can be used to capture
13252 /// diagnostics that will be suppressed.
13253 std::optional<sema::TemplateDeductionInfo *> isSFINAEContext() const;
13254
13255 /// Perform substitution on the type T with a given set of template
13256 /// arguments.
13257 ///
13258 /// This routine substitutes the given template arguments into the
13259 /// type T and produces the instantiated type.
13260 ///
13261 /// \param T the type into which the template arguments will be
13262 /// substituted. If this type is not dependent, it will be returned
13263 /// immediately.
13264 ///
13265 /// \param Args the template arguments that will be
13266 /// substituted for the top-level template parameters within T.
13267 ///
13268 /// \param Loc the location in the source code where this substitution
13269 /// is being performed. It will typically be the location of the
13270 /// declarator (if we're instantiating the type of some declaration)
13271 /// or the location of the type in the source code (if, e.g., we're
13272 /// instantiating the type of a cast expression).
13273 ///
13274 /// \param Entity the name of the entity associated with a declaration
13275 /// being instantiated (if any). May be empty to indicate that there
13276 /// is no such entity (if, e.g., this is a type that occurs as part of
13277 /// a cast expression) or that the entity has no name (e.g., an
13278 /// unnamed function parameter).
13279 ///
13280 /// \param AllowDeducedTST Whether a DeducedTemplateSpecializationType is
13281 /// acceptable as the top level type of the result.
13282 ///
13283 /// \param IsIncompleteSubstitution If provided, the pointee will be set
13284 /// whenever substitution would perform a replacement with a null or
13285 /// non-existent template argument.
13286 ///
13287 /// \returns If the instantiation succeeds, the instantiated
13288 /// type. Otherwise, produces diagnostics and returns a NULL type.
13290 const MultiLevelTemplateArgumentList &TemplateArgs,
13292 bool AllowDeducedTST = false);
13293
13295 const MultiLevelTemplateArgumentList &TemplateArgs,
13297 bool *IsIncompleteSubstitution = nullptr);
13298
13300 const MultiLevelTemplateArgumentList &TemplateArgs,
13302
13303 /// A form of SubstType intended specifically for instantiating the
13304 /// type of a FunctionDecl. Its purpose is solely to force the
13305 /// instantiation of default-argument expressions and to avoid
13306 /// instantiating an exception-specification.
13308 TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs,
13309 SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext,
13310 Qualifiers ThisTypeQuals, bool EvaluateConstraints = true);
13311 void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto,
13312 const MultiLevelTemplateArgumentList &Args);
13315 SmallVectorImpl<QualType> &ExceptionStorage,
13316 const MultiLevelTemplateArgumentList &Args);
13317 ParmVarDecl *
13319 const MultiLevelTemplateArgumentList &TemplateArgs,
13320 int indexAdjustment, std::optional<unsigned> NumExpansions,
13321 bool ExpectParameterPack, bool EvaluateConstraints = true);
13322
13323 /// Substitute the given template arguments into the given set of
13324 /// parameters, producing the set of parameter types that would be generated
13325 /// from such a substitution.
13327 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
13328 const MultiLevelTemplateArgumentList &TemplateArgs,
13329 SmallVectorImpl<QualType> &ParamTypes,
13331 ExtParameterInfoBuilder &ParamInfos);
13332
13333 /// Substitute the given template arguments into the default argument.
13335 const MultiLevelTemplateArgumentList &TemplateArgs,
13336 bool ForCallExpr = false);
13338 const MultiLevelTemplateArgumentList &TemplateArgs);
13339
13340 // A RAII type used by the TemplateDeclInstantiator and TemplateInstantiator
13341 // to disable constraint evaluation, then restore the state.
13342 template <typename InstTy> struct ConstraintEvalRAII {
13343 InstTy &TI;
13345
13347 : TI(TI), OldValue(TI.getEvaluateConstraints()) {
13348 TI.setEvaluateConstraints(false);
13349 }
13350 ~ConstraintEvalRAII() { TI.setEvaluateConstraints(OldValue); }
13351 };
13352
13353 // Must be used instead of SubstExpr at 'constraint checking' time.
13356 const MultiLevelTemplateArgumentList &TemplateArgs);
13357 // Unlike the above, this does not evaluate constraints.
13359 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs);
13360
13361 /// Substitute the given template arguments into a list of
13362 /// expressions, expanding pack expansions if required.
13363 ///
13364 /// \param Exprs The list of expressions to substitute into.
13365 ///
13366 /// \param IsCall Whether this is some form of call, in which case
13367 /// default arguments will be dropped.
13368 ///
13369 /// \param TemplateArgs The set of template arguments to substitute.
13370 ///
13371 /// \param Outputs Will receive all of the substituted arguments.
13372 ///
13373 /// \returns true if an error occurred, false otherwise.
13374 bool SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
13375 const MultiLevelTemplateArgumentList &TemplateArgs,
13376 SmallVectorImpl<Expr *> &Outputs);
13377
13379 const MultiLevelTemplateArgumentList &TemplateArgs);
13380
13383 bool CXXDirectInit);
13384
13385 /// Perform substitution on the base class specifiers of the
13386 /// given class template specialization.
13387 ///
13388 /// Produces a diagnostic and returns true on error, returns false and
13389 /// attaches the instantiated base classes to the class template
13390 /// specialization if successful.
13391 bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13392 const MultiLevelTemplateArgumentList &TemplateArgs);
13393
13394 /// Instantiate the definition of a class from a given pattern.
13395 ///
13396 /// \param PointOfInstantiation The point of instantiation within the
13397 /// source code.
13398 ///
13399 /// \param Instantiation is the declaration whose definition is being
13400 /// instantiated. This will be either a class template specialization
13401 /// or a member class of a class template specialization.
13402 ///
13403 /// \param Pattern is the pattern from which the instantiation
13404 /// occurs. This will be either the declaration of a class template or
13405 /// the declaration of a member class of a class template.
13406 ///
13407 /// \param TemplateArgs The template arguments to be substituted into
13408 /// the pattern.
13409 ///
13410 /// \param TSK the kind of implicit or explicit instantiation to perform.
13411 ///
13412 /// \param Complain whether to complain if the class cannot be instantiated
13413 /// due to the lack of a definition.
13414 ///
13415 /// \returns true if an error occurred, false otherwise.
13416 bool InstantiateClass(SourceLocation PointOfInstantiation,
13417 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
13418 const MultiLevelTemplateArgumentList &TemplateArgs,
13419 TemplateSpecializationKind TSK, bool Complain = true);
13420
13421 /// Instantiate the definition of an enum from a given pattern.
13422 ///
13423 /// \param PointOfInstantiation The point of instantiation within the
13424 /// source code.
13425 /// \param Instantiation is the declaration whose definition is being
13426 /// instantiated. This will be a member enumeration of a class
13427 /// temploid specialization, or a local enumeration within a
13428 /// function temploid specialization.
13429 /// \param Pattern The templated declaration from which the instantiation
13430 /// occurs.
13431 /// \param TemplateArgs The template arguments to be substituted into
13432 /// the pattern.
13433 /// \param TSK The kind of implicit or explicit instantiation to perform.
13434 ///
13435 /// \return \c true if an error occurred, \c false otherwise.
13436 bool InstantiateEnum(SourceLocation PointOfInstantiation,
13437 EnumDecl *Instantiation, EnumDecl *Pattern,
13438 const MultiLevelTemplateArgumentList &TemplateArgs,
13440
13441 /// Instantiate the definition of a field from the given pattern.
13442 ///
13443 /// \param PointOfInstantiation The point of instantiation within the
13444 /// source code.
13445 /// \param Instantiation is the declaration whose definition is being
13446 /// instantiated. This will be a class of a class temploid
13447 /// specialization, or a local enumeration within a function temploid
13448 /// specialization.
13449 /// \param Pattern The templated declaration from which the instantiation
13450 /// occurs.
13451 /// \param TemplateArgs The template arguments to be substituted into
13452 /// the pattern.
13453 ///
13454 /// \return \c true if an error occurred, \c false otherwise.
13456 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
13457 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs);
13458
13461
13463 SourceLocation PointOfInstantiation,
13464 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13465 TemplateSpecializationKind TSK, bool Complain = true);
13466
13467 /// Instantiates the definitions of all of the member
13468 /// of the given class, which is an instantiation of a class template
13469 /// or a member class of a template.
13470 void
13471 InstantiateClassMembers(SourceLocation PointOfInstantiation,
13472 CXXRecordDecl *Instantiation,
13473 const MultiLevelTemplateArgumentList &TemplateArgs,
13475
13476 /// Instantiate the definitions of all of the members of the
13477 /// given class template specialization, which was named as part of an
13478 /// explicit instantiation.
13480 SourceLocation PointOfInstantiation,
13481 ClassTemplateSpecializationDecl *ClassTemplateSpec,
13483
13486 const MultiLevelTemplateArgumentList &TemplateArgs);
13487
13488 /// Do template substitution on declaration name info.
13491 const MultiLevelTemplateArgumentList &TemplateArgs);
13495 const MultiLevelTemplateArgumentList &TemplateArgs);
13496
13498 const MultiLevelTemplateArgumentList &TemplateArgs,
13499 bool EvaluateConstraint);
13500
13501 /// Determine whether we are currently performing template instantiation.
13504 }
13505
13506 using EntityPrinter = llvm::function_ref<void(llvm::raw_ostream &)>;
13507
13508 /// \brief create a Requirement::SubstitutionDiagnostic with only a
13509 /// SubstitutedEntity and DiagLoc using ASTContext's allocator.
13512
13513 ///@}
13514
13515 //
13516 //
13517 // -------------------------------------------------------------------------
13518 //
13519 //
13520
13521 /// \name C++ Template Declaration Instantiation
13522 /// Implementations are in SemaTemplateInstantiateDecl.cpp
13523 ///@{
13524
13525public:
13526 /// An entity for which implicit template instantiation is required.
13527 ///
13528 /// The source location associated with the declaration is the first place in
13529 /// the source code where the declaration was "used". It is not necessarily
13530 /// the point of instantiation (which will be either before or after the
13531 /// namespace-scope declaration that triggered this implicit instantiation),
13532 /// However, it is the location that diagnostics should generally refer to,
13533 /// because users will need to know what code triggered the instantiation.
13534 typedef std::pair<ValueDecl *, SourceLocation> PendingImplicitInstantiation;
13535
13536 /// The queue of implicit template instantiations that are required
13537 /// but have not yet been performed.
13538 std::deque<PendingImplicitInstantiation> PendingInstantiations;
13539
13540 /// Queue of implicit template instantiations that cannot be performed
13541 /// eagerly.
13543
13547
13548 /// The queue of implicit template instantiations that are required
13549 /// and must be performed within the current local scope.
13550 ///
13551 /// This queue is only used for member functions of local classes in
13552 /// templates, which must be instantiated in the same scope as their
13553 /// enclosing function, so that they can reference function-local
13554 /// types, static variables, enumerators, etc.
13555 std::deque<PendingImplicitInstantiation> PendingLocalImplicitInstantiations;
13556
13558 public:
13560 SavedPendingLocalImplicitInstantiations.swap(
13561 S.PendingLocalImplicitInstantiations);
13562 }
13563
13564 void perform() { S.PerformPendingInstantiations(/*LocalOnly=*/true); }
13565
13567 assert(S.PendingLocalImplicitInstantiations.empty() &&
13568 "there shouldn't be any pending local implicit instantiations");
13569 SavedPendingLocalImplicitInstantiations.swap(
13570 S.PendingLocalImplicitInstantiations);
13571 }
13572
13573 private:
13574 Sema &S;
13575 std::deque<PendingImplicitInstantiation>
13576 SavedPendingLocalImplicitInstantiations;
13577 };
13578
13579 /// Records and restores the CurFPFeatures state on entry/exit of compound
13580 /// statements.
13582 public:
13585 FPOptionsOverride getOverrides() { return OldOverrides; }
13586
13587 private:
13588 Sema &S;
13589 FPOptions OldFPFeaturesState;
13590 FPOptionsOverride OldOverrides;
13591 LangOptions::FPEvalMethodKind OldEvalMethod;
13592 SourceLocation OldFPPragmaLocation;
13593 };
13594
13596 public:
13598 : S(S), Enabled(Enabled) {
13599 if (!Enabled)
13600 return;
13601
13602 S.SavedPendingInstantiations.emplace_back();
13603 S.SavedPendingInstantiations.back().swap(S.PendingInstantiations);
13604
13605 S.SavedVTableUses.emplace_back();
13606 S.SavedVTableUses.back().swap(S.VTableUses);
13607 }
13608
13609 void perform() {
13610 if (Enabled) {
13611 S.DefineUsedVTables();
13612 S.PerformPendingInstantiations();
13613 }
13614 }
13615
13617 if (!Enabled)
13618 return;
13619
13620 // Restore the set of pending vtables.
13621 assert(S.VTableUses.empty() &&
13622 "VTableUses should be empty before it is discarded.");
13623 S.VTableUses.swap(S.SavedVTableUses.back());
13624 S.SavedVTableUses.pop_back();
13625
13626 // Restore the set of pending implicit instantiations.
13627 if (S.TUKind != TU_Prefix || !S.LangOpts.PCHInstantiateTemplates) {
13628 assert(S.PendingInstantiations.empty() &&
13629 "PendingInstantiations should be empty before it is discarded.");
13630 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
13631 S.SavedPendingInstantiations.pop_back();
13632 } else {
13633 // Template instantiations in the PCH may be delayed until the TU.
13634 S.PendingInstantiations.swap(S.SavedPendingInstantiations.back());
13635 S.PendingInstantiations.insert(
13636 S.PendingInstantiations.end(),
13637 S.SavedPendingInstantiations.back().begin(),
13638 S.SavedPendingInstantiations.back().end());
13639 S.SavedPendingInstantiations.pop_back();
13640 }
13641 }
13642
13643 private:
13644 Sema &S;
13645 bool Enabled;
13646 };
13647
13649 const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES);
13650
13655
13657 Decl *D)
13658 : TmplAttr(A), Scope(S), NewDecl(D) {}
13659 };
13661
13662 void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
13663 const Decl *Pattern, Decl *Inst,
13664 LateInstantiatedAttrVec *LateAttrs = nullptr,
13665 LocalInstantiationScope *OuterMostScope = nullptr);
13666
13667 /// Update instantiation attributes after template was late parsed.
13668 ///
13669 /// Some attributes are evaluated based on the body of template. If it is
13670 /// late parsed, such attributes cannot be evaluated when declaration is
13671 /// instantiated. This function is used to update instantiation attributes
13672 /// when template definition is ready.
13673 void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst);
13674
13675 void
13677 const Decl *Pattern, Decl *Inst,
13678 LateInstantiatedAttrVec *LateAttrs = nullptr,
13679 LocalInstantiationScope *OuterMostScope = nullptr);
13680
13681 /// In the MS ABI, we need to instantiate default arguments of dllexported
13682 /// default constructors along with the constructor definition. This allows IR
13683 /// gen to emit a constructor closure which calls the default constructor with
13684 /// its default arguments.
13686
13688 ParmVarDecl *Param);
13689 void InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
13691
13692 /// Instantiate (or find existing instantiation of) a function template with a
13693 /// given set of template arguments.
13694 ///
13695 /// Usually this should not be used, and template argument deduction should be
13696 /// used in its place.
13702
13703 /// Instantiate the definition of the given function from its
13704 /// template.
13705 ///
13706 /// \param PointOfInstantiation the point at which the instantiation was
13707 /// required. Note that this is not precisely a "point of instantiation"
13708 /// for the function, but it's close.
13709 ///
13710 /// \param Function the already-instantiated declaration of a
13711 /// function template specialization or member function of a class template
13712 /// specialization.
13713 ///
13714 /// \param Recursive if true, recursively instantiates any functions that
13715 /// are required by this instantiation.
13716 ///
13717 /// \param DefinitionRequired if true, then we are performing an explicit
13718 /// instantiation where the body of the function is required. Complain if
13719 /// there is no such body.
13720 void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
13722 bool Recursive = false,
13723 bool DefinitionRequired = false,
13724 bool AtEndOfTU = false);
13727 const TemplateArgumentList *PartialSpecArgs,
13728 const TemplateArgumentListInfo &TemplateArgsInfo,
13730 SourceLocation PointOfInstantiation,
13731 LateInstantiatedAttrVec *LateAttrs = nullptr,
13732 LocalInstantiationScope *StartingScope = nullptr);
13733
13734 /// Instantiates a variable template specialization by completing it
13735 /// with appropriate type information and initializer.
13737 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
13738 const MultiLevelTemplateArgumentList &TemplateArgs);
13739
13740 /// BuildVariableInstantiation - Used after a new variable has been created.
13741 /// Sets basic variable data and decides whether to postpone the
13742 /// variable instantiation.
13743 void
13745 const MultiLevelTemplateArgumentList &TemplateArgs,
13746 LateInstantiatedAttrVec *LateAttrs,
13747 DeclContext *Owner,
13748 LocalInstantiationScope *StartingScope,
13749 bool InstantiatingVarTemplate = false,
13750 VarTemplateSpecializationDecl *PrevVTSD = nullptr);
13751
13752 /// Instantiate the initializer of a variable.
13754 VarDecl *Var, VarDecl *OldVar,
13755 const MultiLevelTemplateArgumentList &TemplateArgs);
13756
13757 /// Instantiate the definition of the given variable from its
13758 /// template.
13759 ///
13760 /// \param PointOfInstantiation the point at which the instantiation was
13761 /// required. Note that this is not precisely a "point of instantiation"
13762 /// for the variable, but it's close.
13763 ///
13764 /// \param Var the already-instantiated declaration of a templated variable.
13765 ///
13766 /// \param Recursive if true, recursively instantiates any functions that
13767 /// are required by this instantiation.
13768 ///
13769 /// \param DefinitionRequired if true, then we are performing an explicit
13770 /// instantiation where a definition of the variable is required. Complain
13771 /// if there is no such definition.
13772 void InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
13773 VarDecl *Var, bool Recursive = false,
13774 bool DefinitionRequired = false,
13775 bool AtEndOfTU = false);
13776
13778 CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl,
13779 const MultiLevelTemplateArgumentList &TemplateArgs);
13780
13781 /// Find the instantiation of the given declaration within the
13782 /// current instantiation.
13783 ///
13784 /// This routine is intended to be used when \p D is a declaration
13785 /// referenced from within a template, that needs to mapped into the
13786 /// corresponding declaration within an instantiation. For example,
13787 /// given:
13788 ///
13789 /// \code
13790 /// template<typename T>
13791 /// struct X {
13792 /// enum Kind {
13793 /// KnownValue = sizeof(T)
13794 /// };
13795 ///
13796 /// bool getKind() const { return KnownValue; }
13797 /// };
13798 ///
13799 /// template struct X<int>;
13800 /// \endcode
13801 ///
13802 /// In the instantiation of X<int>::getKind(), we need to map the \p
13803 /// EnumConstantDecl for \p KnownValue (which refers to
13804 /// X<T>::<Kind>::KnownValue) to its instantiation
13805 /// (X<int>::<Kind>::KnownValue).
13806 /// \p FindInstantiatedDecl performs this mapping from within the
13807 /// instantiation of X<int>.
13808 NamedDecl *
13810 const MultiLevelTemplateArgumentList &TemplateArgs,
13811 bool FindingInstantiatedContext = false);
13812
13813 /// Finds the instantiation of the given declaration context
13814 /// within the current instantiation.
13815 ///
13816 /// \returns NULL if there was an error
13817 DeclContext *
13819 const MultiLevelTemplateArgumentList &TemplateArgs);
13820
13821 Decl *SubstDecl(Decl *D, DeclContext *Owner,
13822 const MultiLevelTemplateArgumentList &TemplateArgs);
13823
13824 /// Substitute the name and return type of a defaulted 'operator<=>' to form
13825 /// an implicit 'operator=='.
13827 FunctionDecl *Spaceship);
13828
13829 /// Performs template instantiation for all implicit template
13830 /// instantiations we have seen until this point.
13831 void PerformPendingInstantiations(bool LocalOnly = false);
13832
13835 const MultiLevelTemplateArgumentList &TemplateArgs,
13836 bool EvaluateConstraints = true);
13837
13839 const DeclContext *Pattern,
13840 const MultiLevelTemplateArgumentList &TemplateArgs);
13841
13842private:
13843 /// Introduce the instantiated local variables into the local
13844 /// instantiation scope.
13845 void addInstantiatedLocalVarsToScope(FunctionDecl *Function,
13846 const FunctionDecl *PatternDecl,
13848 /// Introduce the instantiated function parameters into the local
13849 /// instantiation scope, and set the parameter names to those used
13850 /// in the template.
13851 bool addInstantiatedParametersToScope(
13852 FunctionDecl *Function, const FunctionDecl *PatternDecl,
13854 const MultiLevelTemplateArgumentList &TemplateArgs);
13855
13856 int ParsingClassDepth = 0;
13857
13858 class SavePendingParsedClassStateRAII {
13859 public:
13860 SavePendingParsedClassStateRAII(Sema &S) : S(S) { swapSavedState(); }
13861
13862 ~SavePendingParsedClassStateRAII() {
13863 assert(S.DelayedOverridingExceptionSpecChecks.empty() &&
13864 "there shouldn't be any pending delayed exception spec checks");
13865 assert(S.DelayedEquivalentExceptionSpecChecks.empty() &&
13866 "there shouldn't be any pending delayed exception spec checks");
13867 swapSavedState();
13868 }
13869
13870 private:
13871 Sema &S;
13872 decltype(DelayedOverridingExceptionSpecChecks)
13873 SavedOverridingExceptionSpecChecks;
13874 decltype(DelayedEquivalentExceptionSpecChecks)
13875 SavedEquivalentExceptionSpecChecks;
13876
13877 void swapSavedState() {
13878 SavedOverridingExceptionSpecChecks.swap(
13879 S.DelayedOverridingExceptionSpecChecks);
13880 SavedEquivalentExceptionSpecChecks.swap(
13881 S.DelayedEquivalentExceptionSpecChecks);
13882 }
13883 };
13884
13885 ///@}
13886
13887 //
13888 //
13889 // -------------------------------------------------------------------------
13890 //
13891 //
13892
13893 /// \name C++ Variadic Templates
13894 /// Implementations are in SemaTemplateVariadic.cpp
13895 ///@{
13896
13897public:
13898 /// Determine whether an unexpanded parameter pack might be permitted in this
13899 /// location. Useful for error recovery.
13901
13902 /// The context in which an unexpanded parameter pack is
13903 /// being diagnosed.
13904 ///
13905 /// Note that the values of this enumeration line up with the first
13906 /// argument to the \c err_unexpanded_parameter_pack diagnostic.
13908 /// An arbitrary expression.
13910
13911 /// The base type of a class type.
13913
13914 /// The type of an arbitrary declaration.
13916
13917 /// The type of a data member.
13919
13920 /// The size of a bit-field.
13922
13923 /// The expression in a static assertion.
13925
13926 /// The fixed underlying type of an enumeration.
13928
13929 /// The enumerator value.
13931
13932 /// A using declaration.
13934
13935 /// A friend declaration.
13937
13938 /// A declaration qualifier.
13940
13941 /// An initializer.
13943
13944 /// A default argument.
13946
13947 /// The type of a non-type template parameter.
13949
13950 /// The type of an exception.
13952
13953 /// Explicit specialization.
13955
13956 /// Partial specialization.
13958
13959 /// Microsoft __if_exists.
13961
13962 /// Microsoft __if_not_exists.
13964
13965 /// Lambda expression.
13967
13968 /// Block expression.
13970
13971 /// A type constraint.
13973
13974 // A requirement in a requires-expression.
13976
13977 // A requires-clause.
13979 };
13980
13981 /// Diagnose unexpanded parameter packs.
13982 ///
13983 /// \param Loc The location at which we should emit the diagnostic.
13984 ///
13985 /// \param UPPC The context in which we are diagnosing unexpanded
13986 /// parameter packs.
13987 ///
13988 /// \param Unexpanded the set of unexpanded parameter packs.
13989 ///
13990 /// \returns true if an error occurred, false otherwise.
13994
13995 /// If the given type contains an unexpanded parameter pack,
13996 /// diagnose the error.
13997 ///
13998 /// \param Loc The source location where a diagnostc should be emitted.
13999 ///
14000 /// \param T The type that is being checked for unexpanded parameter
14001 /// packs.
14002 ///
14003 /// \returns true if an error occurred, false otherwise.
14006
14007 /// If the given expression contains an unexpanded parameter
14008 /// pack, diagnose the error.
14009 ///
14010 /// \param E The expression that is being checked for unexpanded
14011 /// parameter packs.
14012 ///
14013 /// \returns true if an error occurred, false otherwise.
14016
14017 /// If the given requirees-expression contains an unexpanded reference to one
14018 /// of its own parameter packs, diagnose the error.
14019 ///
14020 /// \param RE The requiress-expression that is being checked for unexpanded
14021 /// parameter packs.
14022 ///
14023 /// \returns true if an error occurred, false otherwise.
14025
14026 /// If the given nested-name-specifier contains an unexpanded
14027 /// parameter pack, diagnose the error.
14028 ///
14029 /// \param SS The nested-name-specifier that is being checked for
14030 /// unexpanded parameter packs.
14031 ///
14032 /// \returns true if an error occurred, false otherwise.
14035
14036 /// If the given name contains an unexpanded parameter pack,
14037 /// diagnose the error.
14038 ///
14039 /// \param NameInfo The name (with source location information) that
14040 /// is being checked for unexpanded parameter packs.
14041 ///
14042 /// \returns true if an error occurred, false otherwise.
14045
14046 /// If the given template name contains an unexpanded parameter pack,
14047 /// diagnose the error.
14048 ///
14049 /// \param Loc The location of the template name.
14050 ///
14051 /// \param Template The template name that is being checked for unexpanded
14052 /// parameter packs.
14053 ///
14054 /// \returns true if an error occurred, false otherwise.
14056 TemplateName Template,
14058
14059 /// If the given template argument contains an unexpanded parameter
14060 /// pack, diagnose the error.
14061 ///
14062 /// \param Arg The template argument that is being checked for unexpanded
14063 /// parameter packs.
14064 ///
14065 /// \returns true if an error occurred, false otherwise.
14068
14069 /// Collect the set of unexpanded parameter packs within the given
14070 /// template argument.
14071 ///
14072 /// \param Arg The template argument that will be traversed to find
14073 /// unexpanded parameter packs.
14075 TemplateArgument Arg,
14077
14078 /// Collect the set of unexpanded parameter packs within the given
14079 /// template argument.
14080 ///
14081 /// \param Arg The template argument that will be traversed to find
14082 /// unexpanded parameter packs.
14086
14087 /// Collect the set of unexpanded parameter packs within the given
14088 /// type.
14089 ///
14090 /// \param T The type that will be traversed to find
14091 /// unexpanded parameter packs.
14094
14095 /// Collect the set of unexpanded parameter packs within the given
14096 /// type.
14097 ///
14098 /// \param TL The type that will be traversed to find
14099 /// unexpanded parameter packs.
14102
14103 /// Collect the set of unexpanded parameter packs within the given
14104 /// nested-name-specifier.
14105 ///
14106 /// \param NNS The nested-name-specifier that will be traversed to find
14107 /// unexpanded parameter packs.
14111
14112 /// Collect the set of unexpanded parameter packs within the given
14113 /// name.
14114 ///
14115 /// \param NameInfo The name that will be traversed to find
14116 /// unexpanded parameter packs.
14118 const DeclarationNameInfo &NameInfo,
14120
14121 /// Collect the set of unexpanded parameter packs within the given
14122 /// expression.
14125
14126 /// Invoked when parsing a template argument followed by an
14127 /// ellipsis, which creates a pack expansion.
14128 ///
14129 /// \param Arg The template argument preceding the ellipsis, which
14130 /// may already be invalid.
14131 ///
14132 /// \param EllipsisLoc The location of the ellipsis.
14134 SourceLocation EllipsisLoc);
14135
14136 /// Invoked when parsing a type followed by an ellipsis, which
14137 /// creates a pack expansion.
14138 ///
14139 /// \param Type The type preceding the ellipsis, which will become
14140 /// the pattern of the pack expansion.
14141 ///
14142 /// \param EllipsisLoc The location of the ellipsis.
14144
14145 /// Construct a pack expansion type from the pattern of the pack
14146 /// expansion.
14148 SourceLocation EllipsisLoc,
14149 std::optional<unsigned> NumExpansions);
14150
14151 /// Construct a pack expansion type from the pattern of the pack
14152 /// expansion.
14153 QualType CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
14154 SourceLocation EllipsisLoc,
14155 std::optional<unsigned> NumExpansions);
14156
14157 /// Invoked when parsing an expression followed by an ellipsis, which
14158 /// creates a pack expansion.
14159 ///
14160 /// \param Pattern The expression preceding the ellipsis, which will become
14161 /// the pattern of the pack expansion.
14162 ///
14163 /// \param EllipsisLoc The location of the ellipsis.
14164 ExprResult ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc);
14165
14166 /// Invoked when parsing an expression followed by an ellipsis, which
14167 /// creates a pack expansion.
14168 ///
14169 /// \param Pattern The expression preceding the ellipsis, which will become
14170 /// the pattern of the pack expansion.
14171 ///
14172 /// \param EllipsisLoc The location of the ellipsis.
14173 ExprResult CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
14174 std::optional<unsigned> NumExpansions);
14175
14176 /// Determine whether we could expand a pack expansion with the
14177 /// given set of parameter packs into separate arguments by repeatedly
14178 /// transforming the pattern.
14179 ///
14180 /// \param EllipsisLoc The location of the ellipsis that identifies the
14181 /// pack expansion.
14182 ///
14183 /// \param PatternRange The source range that covers the entire pattern of
14184 /// the pack expansion.
14185 ///
14186 /// \param Unexpanded The set of unexpanded parameter packs within the
14187 /// pattern.
14188 ///
14189 /// \param ShouldExpand Will be set to \c true if the transformer should
14190 /// expand the corresponding pack expansions into separate arguments. When
14191 /// set, \c NumExpansions must also be set.
14192 ///
14193 /// \param RetainExpansion Whether the caller should add an unexpanded
14194 /// pack expansion after all of the expanded arguments. This is used
14195 /// when extending explicitly-specified template argument packs per
14196 /// C++0x [temp.arg.explicit]p9.
14197 ///
14198 /// \param NumExpansions The number of separate arguments that will be in
14199 /// the expanded form of the corresponding pack expansion. This is both an
14200 /// input and an output parameter, which can be set by the caller if the
14201 /// number of expansions is known a priori (e.g., due to a prior substitution)
14202 /// and will be set by the callee when the number of expansions is known.
14203 /// The callee must set this value when \c ShouldExpand is \c true; it may
14204 /// set this value in other cases.
14205 ///
14206 /// \returns true if an error occurred (e.g., because the parameter packs
14207 /// are to be instantiated with arguments of different lengths), false
14208 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
14209 /// must be set.
14211 SourceLocation EllipsisLoc, SourceRange PatternRange,
14213 const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand,
14214 bool &RetainExpansion, std::optional<unsigned> &NumExpansions);
14215
14216 /// Determine the number of arguments in the given pack expansion
14217 /// type.
14218 ///
14219 /// This routine assumes that the number of arguments in the expansion is
14220 /// consistent across all of the unexpanded parameter packs in its pattern.
14221 ///
14222 /// Returns an empty Optional if the type can't be expanded.
14223 std::optional<unsigned> getNumArgumentsInExpansion(
14224 QualType T, const MultiLevelTemplateArgumentList &TemplateArgs);
14225
14226 std::optional<unsigned> getNumArgumentsInExpansionFromUnexpanded(
14228 const MultiLevelTemplateArgumentList &TemplateArgs);
14229
14230 /// Determine whether the given declarator contains any unexpanded
14231 /// parameter packs.
14232 ///
14233 /// This routine is used by the parser to disambiguate function declarators
14234 /// with an ellipsis prior to the ')', e.g.,
14235 ///
14236 /// \code
14237 /// void f(T...);
14238 /// \endcode
14239 ///
14240 /// To determine whether we have an (unnamed) function parameter pack or
14241 /// a variadic function.
14242 ///
14243 /// \returns true if the declarator contains any unexpanded parameter packs,
14244 /// false otherwise.
14246
14247 /// Returns the pattern of the pack expansion for a template argument.
14248 ///
14249 /// \param OrigLoc The template argument to expand.
14250 ///
14251 /// \param Ellipsis Will be set to the location of the ellipsis.
14252 ///
14253 /// \param NumExpansions Will be set to the number of expansions that will
14254 /// be generated from this pack expansion, if known a priori.
14256 TemplateArgumentLoc OrigLoc, SourceLocation &Ellipsis,
14257 std::optional<unsigned> &NumExpansions) const;
14258
14259 /// Given a template argument that contains an unexpanded parameter pack, but
14260 /// which has already been substituted, attempt to determine the number of
14261 /// elements that will be produced once this argument is fully-expanded.
14262 ///
14263 /// This is intended for use when transforming 'sizeof...(Arg)' in order to
14264 /// avoid actually expanding the pack where possible.
14265 std::optional<unsigned> getFullyPackExpandedSize(TemplateArgument Arg);
14266
14267 /// Called when an expression computing the size of a parameter pack
14268 /// is parsed.
14269 ///
14270 /// \code
14271 /// template<typename ...Types> struct count {
14272 /// static const unsigned value = sizeof...(Types);
14273 /// };
14274 /// \endcode
14275 ///
14276 //
14277 /// \param OpLoc The location of the "sizeof" keyword.
14278 /// \param Name The name of the parameter pack whose size will be determined.
14279 /// \param NameLoc The source location of the name of the parameter pack.
14280 /// \param RParenLoc The location of the closing parentheses.
14282 IdentifierInfo &Name,
14283 SourceLocation NameLoc,
14284 SourceLocation RParenLoc);
14285
14286 ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression,
14287 SourceLocation EllipsisLoc,
14288 SourceLocation LSquareLoc, Expr *IndexExpr,
14289 SourceLocation RSquareLoc);
14290
14291 ExprResult BuildPackIndexingExpr(Expr *PackExpression,
14292 SourceLocation EllipsisLoc, Expr *IndexExpr,
14293 SourceLocation RSquareLoc,
14294 ArrayRef<Expr *> ExpandedExprs = {},
14295 bool FullySubstituted = false);
14296
14297 /// Handle a C++1z fold-expression: ( expr op ... op expr ).
14298 ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS,
14299 tok::TokenKind Operator,
14300 SourceLocation EllipsisLoc, Expr *RHS,
14301 SourceLocation RParenLoc);
14302 ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee,
14303 SourceLocation LParenLoc, Expr *LHS,
14304 BinaryOperatorKind Operator,
14305 SourceLocation EllipsisLoc, Expr *RHS,
14306 SourceLocation RParenLoc,
14307 std::optional<unsigned> NumExpansions);
14308 ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
14309 BinaryOperatorKind Operator);
14310
14311 ///@}
14312
14313 //
14314 //
14315 // -------------------------------------------------------------------------
14316 //
14317 //
14318
14319 /// \name Constraints and Concepts
14320 /// Implementations are in SemaConcept.cpp
14321 ///@{
14322
14323public:
14325 const llvm::FoldingSetNodeID &ID) {
14326 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14327 SatisfactionStack.emplace_back(Can, ID);
14328 }
14329
14330 void PopSatisfactionStackEntry() { SatisfactionStack.pop_back(); }
14331
14333 const llvm::FoldingSetNodeID &ID) const {
14334 const NamedDecl *Can = cast<NamedDecl>(D->getCanonicalDecl());
14335 return llvm::find(SatisfactionStack, SatisfactionStackEntryTy{Can, ID}) !=
14336 SatisfactionStack.end();
14337 }
14338
14340 std::pair<const NamedDecl *, llvm::FoldingSetNodeID>;
14341
14342 // Resets the current SatisfactionStack for cases where we are instantiating
14343 // constraints as a 'side effect' of normal instantiation in a way that is not
14344 // indicative of recursive definition.
14347 Sema &SemaRef;
14348
14349 public:
14351 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14352 }
14353
14355 SemaRef.SwapSatisfactionStack(BackupSatisfactionStack);
14356 }
14357 };
14358
14361 SatisfactionStack.swap(NewSS);
14362 }
14363
14364 /// Check whether the given expression is a valid constraint expression.
14365 /// A diagnostic is emitted if it is not, false is returned, and
14366 /// PossibleNonPrimary will be set to true if the failure might be due to a
14367 /// non-primary expression being used as an atomic constraint.
14368 bool CheckConstraintExpression(const Expr *CE, Token NextToken = Token(),
14369 bool *PossibleNonPrimary = nullptr,
14370 bool IsTrailingRequiresClause = false);
14371
14372 /// \brief Check whether the given list of constraint expressions are
14373 /// satisfied (as if in a 'conjunction') given template arguments.
14374 /// \param Template the template-like entity that triggered the constraints
14375 /// check (either a concept or a constrained entity).
14376 /// \param ConstraintExprs a list of constraint expressions, treated as if
14377 /// they were 'AND'ed together.
14378 /// \param TemplateArgLists the list of template arguments to substitute into
14379 /// the constraint expression.
14380 /// \param TemplateIDRange The source range of the template id that
14381 /// caused the constraints check.
14382 /// \param Satisfaction if true is returned, will contain details of the
14383 /// satisfaction, with enough information to diagnose an unsatisfied
14384 /// expression.
14385 /// \returns true if an error occurred and satisfaction could not be checked,
14386 /// false otherwise.
14388 const NamedDecl *Template, ArrayRef<const Expr *> ConstraintExprs,
14389 const MultiLevelTemplateArgumentList &TemplateArgLists,
14390 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction) {
14392 return CheckConstraintSatisfaction(Template, ConstraintExprs, Converted,
14393 TemplateArgLists, TemplateIDRange,
14394 Satisfaction);
14395 }
14396
14397 /// \brief Check whether the given list of constraint expressions are
14398 /// satisfied (as if in a 'conjunction') given template arguments.
14399 /// Additionally, takes an empty list of Expressions which is populated with
14400 /// the instantiated versions of the ConstraintExprs.
14401 /// \param Template the template-like entity that triggered the constraints
14402 /// check (either a concept or a constrained entity).
14403 /// \param ConstraintExprs a list of constraint expressions, treated as if
14404 /// they were 'AND'ed together.
14405 /// \param ConvertedConstraints a out parameter that will get populated with
14406 /// the instantiated version of the ConstraintExprs if we successfully checked
14407 /// satisfaction.
14408 /// \param TemplateArgList the multi-level list of template arguments to
14409 /// substitute into the constraint expression. This should be relative to the
14410 /// top-level (hence multi-level), since we need to instantiate fully at the
14411 /// time of checking.
14412 /// \param TemplateIDRange The source range of the template id that
14413 /// caused the constraints check.
14414 /// \param Satisfaction if true is returned, will contain details of the
14415 /// satisfaction, with enough information to diagnose an unsatisfied
14416 /// expression.
14417 /// \returns true if an error occurred and satisfaction could not be checked,
14418 /// false otherwise.
14420 const NamedDecl *Template, ArrayRef<const Expr *> ConstraintExprs,
14421 llvm::SmallVectorImpl<Expr *> &ConvertedConstraints,
14422 const MultiLevelTemplateArgumentList &TemplateArgList,
14423 SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction);
14424
14425 /// \brief Check whether the given non-dependent constraint expression is
14426 /// satisfied. Returns false and updates Satisfaction with the satisfaction
14427 /// verdict if successful, emits a diagnostic and returns true if an error
14428 /// occurred and satisfaction could not be determined.
14429 ///
14430 /// \returns true if an error occurred, false otherwise.
14431 bool CheckConstraintSatisfaction(const Expr *ConstraintExpr,
14432 ConstraintSatisfaction &Satisfaction);
14433
14434 /// Check whether the given function decl's trailing requires clause is
14435 /// satisfied, if any. Returns false and updates Satisfaction with the
14436 /// satisfaction verdict if successful, emits a diagnostic and returns true if
14437 /// an error occurred and satisfaction could not be determined.
14438 ///
14439 /// \returns true if an error occurred, false otherwise.
14441 ConstraintSatisfaction &Satisfaction,
14442 SourceLocation UsageLoc = SourceLocation(),
14443 bool ForOverloadResolution = false);
14444
14445 // Calculates whether two constraint expressions are equal irrespective of a
14446 // difference in 'depth'. This takes a pair of optional 'NamedDecl's 'Old' and
14447 // 'New', which are the "source" of the constraint, since this is necessary
14448 // for figuring out the relative 'depth' of the constraint. The depth of the
14449 // 'primary template' and the 'instantiated from' templates aren't necessarily
14450 // the same, such as a case when one is a 'friend' defined in a class.
14452 const Expr *OldConstr,
14453 const TemplateCompareNewDeclInfo &New,
14454 const Expr *NewConstr);
14455
14456 // Calculates whether the friend function depends on an enclosing template for
14457 // the purposes of [temp.friend] p9.
14459
14460 /// \brief Ensure that the given template arguments satisfy the constraints
14461 /// associated with the given template, emitting a diagnostic if they do not.
14462 ///
14463 /// \param Template The template to which the template arguments are being
14464 /// provided.
14465 ///
14466 /// \param TemplateArgs The converted, canonicalized template arguments.
14467 ///
14468 /// \param TemplateIDRange The source range of the template id that
14469 /// caused the constraints check.
14470 ///
14471 /// \returns true if the constrains are not satisfied or could not be checked
14472 /// for satisfaction, false if the constraints are satisfied.
14474 TemplateDecl *Template,
14475 const MultiLevelTemplateArgumentList &TemplateArgs,
14476 SourceRange TemplateIDRange);
14477
14478 bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation,
14480 ArrayRef<TemplateArgument> TemplateArgs,
14481 ConstraintSatisfaction &Satisfaction);
14482
14483 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14484 /// unsatisfied.
14485 /// \param First whether this is the first time an unsatisfied constraint is
14486 /// diagnosed for this error.
14488 bool First = true);
14489
14490 /// \brief Emit diagnostics explaining why a constraint expression was deemed
14491 /// unsatisfied.
14492 void
14494 bool First = true);
14495
14497 NamedDecl *ConstrainedDecl, ArrayRef<const Expr *> AssociatedConstraints);
14498
14499 /// \brief Check whether the given declaration's associated constraints are
14500 /// at least as constrained than another declaration's according to the
14501 /// partial ordering of constraints.
14502 ///
14503 /// \param Result If no error occurred, receives the result of true if D1 is
14504 /// at least constrained than D2, and false otherwise.
14505 ///
14506 /// \returns true if an error occurred, false otherwise.
14509 bool &Result);
14510
14511 /// If D1 was not at least as constrained as D2, but would've been if a pair
14512 /// of atomic constraints involved had been declared in a concept and not
14513 /// repeated in two separate places in code.
14514 /// \returns true if such a diagnostic was emitted, false otherwise.
14518
14519private:
14520 /// Caches pairs of template-like decls whose associated constraints were
14521 /// checked for subsumption and whether or not the first's constraints did in
14522 /// fact subsume the second's.
14523 llvm::DenseMap<std::pair<NamedDecl *, NamedDecl *>, bool> SubsumptionCache;
14524 /// Caches the normalized associated constraints of declarations (concepts or
14525 /// constrained declarations). If an error occurred while normalizing the
14526 /// associated constraints of the template or concept, nullptr will be cached
14527 /// here.
14528 llvm::DenseMap<NamedDecl *, NormalizedConstraint *> NormalizationCache;
14529
14530 llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
14531 SatisfactionCache;
14532
14533 // The current stack of constraint satisfactions, so we can exit-early.
14535
14536 /// Introduce the instantiated captures of the lambda into the local
14537 /// instantiation scope.
14538 bool addInstantiatedCapturesToScope(
14539 FunctionDecl *Function, const FunctionDecl *PatternDecl,
14541 const MultiLevelTemplateArgumentList &TemplateArgs);
14542
14543 /// Used by SetupConstraintCheckingTemplateArgumentsAndScope to recursively(in
14544 /// the case of lambdas) set up the LocalInstantiationScope of the current
14545 /// function.
14546 bool
14547 SetupConstraintScope(FunctionDecl *FD,
14548 std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
14549 const MultiLevelTemplateArgumentList &MLTAL,
14551
14552 /// Used during constraint checking, sets up the constraint template argument
14553 /// lists, and calls SetupConstraintScope to set up the
14554 /// LocalInstantiationScope to have the proper set of ParVarDecls configured.
14555 std::optional<MultiLevelTemplateArgumentList>
14556 SetupConstraintCheckingTemplateArgumentsAndScope(
14557 FunctionDecl *FD, std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
14559
14560 ///@}
14561
14562 //
14563 //
14564 // -------------------------------------------------------------------------
14565 //
14566 //
14567
14568 /// \name Types
14569 /// Implementations are in SemaType.cpp
14570 ///@{
14571
14572public:
14573 /// A mapping that describes the nullability we've seen in each header file.
14575
14576 static int getPrintable(int I) { return I; }
14577 static unsigned getPrintable(unsigned I) { return I; }
14578 static bool getPrintable(bool B) { return B; }
14579 static const char *getPrintable(const char *S) { return S; }
14580 static StringRef getPrintable(StringRef S) { return S; }
14581 static const std::string &getPrintable(const std::string &S) { return S; }
14582 static const IdentifierInfo *getPrintable(const IdentifierInfo *II) {
14583 return II;
14584 }
14586 static QualType getPrintable(QualType T) { return T; }
14587 static SourceRange getPrintable(SourceRange R) { return R; }
14589 static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); }
14591
14592 enum class CompleteTypeKind {
14593 /// Apply the normal rules for complete types. In particular,
14594 /// treat all sizeless types as incomplete.
14595 Normal,
14596
14597 /// Relax the normal rules for complete types so that they include
14598 /// sizeless built-in types.
14600
14601 // FIXME: Eventually we should flip the default to Normal and opt in
14602 // to AcceptSizeless rather than opt out of it.
14604 };
14605
14607 const DeclSpec *DS = nullptr);
14609 const DeclSpec *DS = nullptr);
14610
14611 /// Build a pointer type.
14612 ///
14613 /// \param T The type to which we'll be building a pointer.
14614 ///
14615 /// \param Loc The location of the entity whose type involves this
14616 /// pointer type or, if there is no such entity, the location of the
14617 /// type that will have pointer type.
14618 ///
14619 /// \param Entity The name of the entity that involves the pointer
14620 /// type, if known.
14621 ///
14622 /// \returns A suitable pointer type, if there are no
14623 /// errors. Otherwise, returns a NULL type.
14625 DeclarationName Entity);
14626
14627 /// Build a reference type.
14628 ///
14629 /// \param T The type to which we'll be building a reference.
14630 ///
14631 /// \param Loc The location of the entity whose type involves this
14632 /// reference type or, if there is no such entity, the location of the
14633 /// type that will have reference type.
14634 ///
14635 /// \param Entity The name of the entity that involves the reference
14636 /// type, if known.
14637 ///
14638 /// \returns A suitable reference type, if there are no
14639 /// errors. Otherwise, returns a NULL type.
14641 DeclarationName Entity);
14642
14643 /// Build an array type.
14644 ///
14645 /// \param T The type of each element in the array.
14646 ///
14647 /// \param ASM C99 array size modifier (e.g., '*', 'static').
14648 ///
14649 /// \param ArraySize Expression describing the size of the array.
14650 ///
14651 /// \param Brackets The range from the opening '[' to the closing ']'.
14652 ///
14653 /// \param Entity The name of the entity that involves the array
14654 /// type, if known.
14655 ///
14656 /// \returns A suitable array type, if there are no errors. Otherwise,
14657 /// returns a NULL type.
14659 unsigned Quals, SourceRange Brackets,
14660 DeclarationName Entity);
14662
14663 /// Build an ext-vector type.
14664 ///
14665 /// Run the required checks for the extended vector type.
14667 SourceLocation AttrLoc);
14668 QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns,
14669 SourceLocation AttrLoc);
14670
14672 Expr *CountExpr,
14673 bool CountInBytes,
14674 bool OrNull);
14675
14676 /// BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an
14677 /// expression is uninstantiated. If instantiated it will apply the
14678 /// appropriate address space to the type. This function allows dependent
14679 /// template variables to be used in conjunction with the address_space
14680 /// attribute
14681 QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace,
14682 SourceLocation AttrLoc);
14683
14684 /// Same as above, but constructs the AddressSpace index if not provided.
14686 SourceLocation AttrLoc);
14687
14689
14691
14692 /// Build a function type.
14693 ///
14694 /// This routine checks the function type according to C++ rules and
14695 /// under the assumption that the result type and parameter types have
14696 /// just been instantiated from a template. It therefore duplicates
14697 /// some of the behavior of GetTypeForDeclarator, but in a much
14698 /// simpler form that is only suitable for this narrow use case.
14699 ///
14700 /// \param T The return type of the function.
14701 ///
14702 /// \param ParamTypes The parameter types of the function. This array
14703 /// will be modified to account for adjustments to the types of the
14704 /// function parameters.
14705 ///
14706 /// \param Loc The location of the entity whose type involves this
14707 /// function type or, if there is no such entity, the location of the
14708 /// type that will have function type.
14709 ///
14710 /// \param Entity The name of the entity that involves the function
14711 /// type, if known.
14712 ///
14713 /// \param EPI Extra information about the function type. Usually this will
14714 /// be taken from an existing function with the same prototype.
14715 ///
14716 /// \returns A suitable function type, if there are no errors. The
14717 /// unqualified type will always be a FunctionProtoType.
14718 /// Otherwise, returns a NULL type.
14722
14723 /// Build a member pointer type \c T Class::*.
14724 ///
14725 /// \param T the type to which the member pointer refers.
14726 /// \param Class the class type into which the member pointer points.
14727 /// \param Loc the location where this type begins
14728 /// \param Entity the name of the entity that will have this member pointer
14729 /// type
14730 ///
14731 /// \returns a member pointer type, if successful, or a NULL type if there was
14732 /// an error.
14735
14736 /// Build a block pointer type.
14737 ///
14738 /// \param T The type to which we'll be building a block pointer.
14739 ///
14740 /// \param Loc The source location, used for diagnostics.
14741 ///
14742 /// \param Entity The name of the entity that involves the block pointer
14743 /// type, if known.
14744 ///
14745 /// \returns A suitable block pointer type, if there are no
14746 /// errors. Otherwise, returns a NULL type.
14748 DeclarationName Entity);
14749
14750 /// Build a paren type including \p T.
14753
14754 /// Build a Read-only Pipe type.
14755 ///
14756 /// \param T The type to which we'll be building a Pipe.
14757 ///
14758 /// \param Loc We do not use it for now.
14759 ///
14760 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
14761 /// a NULL type.
14763
14764 /// Build a Write-only Pipe type.
14765 ///
14766 /// \param T The type to which we'll be building a Pipe.
14767 ///
14768 /// \param Loc We do not use it for now.
14769 ///
14770 /// \returns A suitable pipe type, if there are no errors. Otherwise, returns
14771 /// a NULL type.
14773
14774 /// Build a bit-precise integer type.
14775 ///
14776 /// \param IsUnsigned Boolean representing the signedness of the type.
14777 ///
14778 /// \param BitWidth Size of this int type in bits, or an expression
14779 /// representing that.
14780 ///
14781 /// \param Loc Location of the keyword.
14782 QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc);
14783
14784 /// GetTypeForDeclarator - Convert the type for the specified
14785 /// declarator to Type instances.
14786 ///
14787 /// The result of this call will never be null, but the associated
14788 /// type may be a null type if there's an unrecoverable error.
14791
14792 /// Package the given type and TSI into a ParsedType.
14795 TypeSourceInfo **TInfo = nullptr);
14796
14798
14799 // Check whether the size of array element of type \p EltTy is a multiple of
14800 // its alignment and return false if it isn't.
14802
14803 void
14804 diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals,
14805 SourceLocation FallbackLoc,
14806 SourceLocation ConstQualLoc = SourceLocation(),
14807 SourceLocation VolatileQualLoc = SourceLocation(),
14808 SourceLocation RestrictQualLoc = SourceLocation(),
14809 SourceLocation AtomicQualLoc = SourceLocation(),
14810 SourceLocation UnalignedQualLoc = SourceLocation());
14811
14812 /// Retrieve the keyword associated
14814
14815 /// Adjust the calling convention of a method to be the ABI default if it
14816 /// wasn't specified explicitly. This handles method types formed from
14817 /// function type typedefs and typename template arguments.
14818 void adjustMemberFunctionCC(QualType &T, bool HasThisPointer,
14819 bool IsCtorOrDtor, SourceLocation Loc);
14820
14821 // Check if there is an explicit attribute, but only look through parens.
14822 // The intent is to look for an attribute on the current declarator, but not
14823 // one that came from a typedef.
14825
14826 /// Check whether a nullability type specifier can be added to the given
14827 /// type through some means not written in source (e.g. API notes).
14828 ///
14829 /// \param Type The type to which the nullability specifier will be
14830 /// added. On success, this type will be updated appropriately.
14831 ///
14832 /// \param Nullability The nullability specifier to add.
14833 ///
14834 /// \param DiagLoc The location to use for diagnostics.
14835 ///
14836 /// \param AllowArrayTypes Whether to accept nullability specifiers on an
14837 /// array type (e.g., because it will decay to a pointer).
14838 ///
14839 /// \param OverrideExisting Whether to override an existing, locally-specified
14840 /// nullability specifier rather than complaining about the conflict.
14841 ///
14842 /// \returns true if nullability cannot be applied, false otherwise.
14844 NullabilityKind Nullability,
14845 SourceLocation DiagLoc,
14846 bool AllowArrayTypes,
14847 bool OverrideExisting);
14848
14849 /// Get the type of expression E, triggering instantiation to complete the
14850 /// type if necessary -- that is, if the expression refers to a templated
14851 /// static data member of incomplete array type.
14852 ///
14853 /// May still return an incomplete type if instantiation was not possible or
14854 /// if the type is incomplete for a different reason. Use
14855 /// RequireCompleteExprType instead if a diagnostic is expected for an
14856 /// incomplete expression type.
14858
14860
14861 /// Ensure that the type of the given expression is complete.
14862 ///
14863 /// This routine checks whether the expression \p E has a complete type. If
14864 /// the expression refers to an instantiable construct, that instantiation is
14865 /// performed as needed to complete its type. Furthermore
14866 /// Sema::RequireCompleteType is called for the expression's type (or in the
14867 /// case of a reference type, the referred-to type).
14868 ///
14869 /// \param E The expression whose type is required to be complete.
14870 /// \param Kind Selects which completeness rules should be applied.
14871 /// \param Diagnoser The object that will emit a diagnostic if the type is
14872 /// incomplete.
14873 ///
14874 /// \returns \c true if the type of \p E is incomplete and diagnosed, \c false
14875 /// otherwise.
14877 TypeDiagnoser &Diagnoser);
14878 bool RequireCompleteExprType(Expr *E, unsigned DiagID);
14879
14880 template <typename... Ts>
14881 bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) {
14882 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
14884 }
14885
14886 /// Retrieve a version of the type 'T' that is elaborated by Keyword,
14887 /// qualified by the nested-name-specifier contained in SS, and that is
14888 /// (re)declared by OwnedTagDecl, which is nullptr if this is not a
14889 /// (re)declaration.
14891 const CXXScopeSpec &SS, QualType T,
14892 TagDecl *OwnedTagDecl = nullptr);
14893
14894 // Returns the underlying type of a decltype with the given expression.
14896
14898 /// If AsUnevaluated is false, E is treated as though it were an evaluated
14899 /// context, such as when building a type for decltype(auto).
14900 QualType BuildDecltypeType(Expr *E, bool AsUnevaluated = true);
14901
14902 QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr,
14904 SourceLocation EllipsisLoc);
14905 QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
14906 SourceLocation Loc, SourceLocation EllipsisLoc,
14907 bool FullySubstituted = false,
14908 ArrayRef<QualType> Expansions = {});
14909
14927
14928 /// Ensure that the type T is a literal type.
14929 ///
14930 /// This routine checks whether the type @p T is a literal type. If @p T is an
14931 /// incomplete type, an attempt is made to complete it. If @p T is a literal
14932 /// type, or @p AllowIncompleteType is true and @p T is an incomplete type,
14933 /// returns false. Otherwise, this routine issues the diagnostic @p PD (giving
14934 /// it the type @p T), along with notes explaining why the type is not a
14935 /// literal type, and returns true.
14936 ///
14937 /// @param Loc The location in the source that the non-literal type
14938 /// diagnostic should refer to.
14939 ///
14940 /// @param T The type that this routine is examining for literalness.
14941 ///
14942 /// @param Diagnoser Emits a diagnostic if T is not a literal type.
14943 ///
14944 /// @returns @c true if @p T is not a literal type and a diagnostic was
14945 /// emitted, @c false otherwise.
14947 TypeDiagnoser &Diagnoser);
14948 bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID);
14949
14950 template <typename... Ts>
14952 const Ts &...Args) {
14953 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
14954 return RequireLiteralType(Loc, T, Diagnoser);
14955 }
14956
14959 return !RequireCompleteTypeImpl(Loc, T, Kind, nullptr);
14960 }
14961
14962 /// Ensure that the type T is a complete type.
14963 ///
14964 /// This routine checks whether the type @p T is complete in any
14965 /// context where a complete type is required. If @p T is a complete
14966 /// type, returns false. If @p T is a class template specialization,
14967 /// this routine then attempts to perform class template
14968 /// instantiation. If instantiation fails, or if @p T is incomplete
14969 /// and cannot be completed, issues the diagnostic @p diag (giving it
14970 /// the type @p T) and returns true.
14971 ///
14972 /// @param Loc The location in the source that the incomplete type
14973 /// diagnostic should refer to.
14974 ///
14975 /// @param T The type that this routine is examining for completeness.
14976 ///
14977 /// @param Kind Selects which completeness rules should be applied.
14978 ///
14979 /// @returns @c true if @p T is incomplete and a diagnostic was emitted,
14980 /// @c false otherwise.
14982 CompleteTypeKind Kind, TypeDiagnoser &Diagnoser);
14984 CompleteTypeKind Kind, unsigned DiagID);
14985
14987 TypeDiagnoser &Diagnoser) {
14989 }
14992 }
14993
14994 template <typename... Ts>
14996 const Ts &...Args) {
14997 BoundTypeDiagnoser<Ts...> Diagnoser(DiagID, Args...);
14998 return RequireCompleteType(Loc, T, Diagnoser);
14999 }
15000
15001 /// Determine whether a declaration is visible to name lookup.
15002 bool isVisible(const NamedDecl *D) {
15003 return D->isUnconditionallyVisible() ||
15004 isAcceptableSlow(D, AcceptableKind::Visible);
15005 }
15006
15007 /// Determine whether a declaration is reachable.
15008 bool isReachable(const NamedDecl *D) {
15009 // All visible declarations are reachable.
15010 return D->isUnconditionallyVisible() ||
15011 isAcceptableSlow(D, AcceptableKind::Reachable);
15012 }
15013
15014 /// Determine whether a declaration is acceptable (visible/reachable).
15017 }
15018
15019 /// Determine if \p D and \p Suggested have a structurally compatible
15020 /// layout as described in C11 6.2.7/1.
15021 bool hasStructuralCompatLayout(Decl *D, Decl *Suggested);
15022
15023 /// Determine if \p D has a visible definition. If not, suggest a declaration
15024 /// that should be made visible to expose the definition.
15025 bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested,
15026 bool OnlyNeedComplete = false);
15028 NamedDecl *Hidden;
15029 return hasVisibleDefinition(const_cast<NamedDecl *>(D), &Hidden);
15030 }
15031
15032 /// Determine if \p D has a reachable definition. If not, suggest a
15033 /// declaration that should be made reachable to expose the definition.
15034 bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested,
15035 bool OnlyNeedComplete = false);
15037 NamedDecl *Hidden;
15038 return hasReachableDefinition(D, &Hidden);
15039 }
15040
15041 bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested,
15043 bool OnlyNeedComplete = false);
15045 NamedDecl *Hidden;
15046 return hasAcceptableDefinition(D, &Hidden, Kind);
15047 }
15048
15049 /// Try to parse the conditional expression attached to an effect attribute
15050 /// (e.g. 'nonblocking'). (c.f. Sema::ActOnNoexceptSpec). Return an empty
15051 /// optional on error.
15052 std::optional<FunctionEffectMode>
15053 ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
15054
15055private:
15056 /// The implementation of RequireCompleteType
15057 bool RequireCompleteTypeImpl(SourceLocation Loc, QualType T,
15058 CompleteTypeKind Kind, TypeDiagnoser *Diagnoser);
15059
15060 /// Nullability type specifiers.
15061 IdentifierInfo *Ident__Nonnull = nullptr;
15062 IdentifierInfo *Ident__Nullable = nullptr;
15063 IdentifierInfo *Ident__Nullable_result = nullptr;
15064 IdentifierInfo *Ident__Null_unspecified = nullptr;
15065
15066 ///@}
15067
15068 //
15069 //
15070 // -------------------------------------------------------------------------
15071 //
15072 //
15073
15074 /// \name FixIt Helpers
15075 /// Implementations are in SemaFixItUtils.cpp
15076 ///@{
15077
15078public:
15079 /// Get a string to suggest for zero-initialization of a type.
15081 SourceLocation Loc) const;
15083
15084 ///@}
15085
15086 //
15087 //
15088 // -------------------------------------------------------------------------
15089 //
15090 //
15091
15092 /// \name Function Effects
15093 /// Implementations are in SemaFunctionEffects.cpp
15094 ///@{
15095public:
15097 enum class Kind { Added, Removed, ConditionMismatch };
15098
15101 std::optional<FunctionEffectWithCondition>
15102 Old; // Invalid when 'Kind' is 'Added'.
15103 std::optional<FunctionEffectWithCondition>
15104 New; // Invalid when 'Kind' is 'Removed'.
15105
15106 StringRef effectName() const {
15107 if (Old)
15108 return Old.value().Effect.name();
15109 return New.value().Effect.name();
15110 }
15111
15112 /// Describes the result of effects differing between a base class's virtual
15113 /// method and an overriding method in a subclass.
15114 enum class OverrideResult {
15115 NoAction,
15116 Warn,
15117 Merge // Merge missing effect from base to derived.
15118 };
15119
15120 /// Return true if adding or removing the effect as part of a type
15121 /// conversion should generate a diagnostic.
15122 bool shouldDiagnoseConversion(QualType SrcType,
15123 const FunctionEffectsRef &SrcFX,
15124 QualType DstType,
15125 const FunctionEffectsRef &DstFX) const;
15126
15127 /// Return true if adding or removing the effect in a redeclaration should
15128 /// generate a diagnostic.
15129 bool shouldDiagnoseRedeclaration(const FunctionDecl &OldFunction,
15130 const FunctionEffectsRef &OldFX,
15131 const FunctionDecl &NewFunction,
15132 const FunctionEffectsRef &NewFX) const;
15133
15134 /// Return true if adding or removing the effect in a C++ virtual method
15135 /// override should generate a diagnostic.
15136 OverrideResult shouldDiagnoseMethodOverride(
15137 const CXXMethodDecl &OldMethod, const FunctionEffectsRef &OldFX,
15138 const CXXMethodDecl &NewMethod, const FunctionEffectsRef &NewFX) const;
15139 };
15140
15141 struct FunctionEffectDiffVector : public SmallVector<FunctionEffectDiff> {
15142 /// Caller should short-circuit by checking for equality first.
15144 const FunctionEffectsRef &New);
15145 };
15146
15147 /// All functions/lambdas/blocks which have bodies and which have a non-empty
15148 /// FunctionEffectsRef to be verified.
15150
15151 /// The union of all effects present on DeclsWithEffectsToVerify. Conditions
15152 /// are all null.
15154
15155public:
15156 /// Warn and return true if adding a function effect to a set would create a
15157 /// conflict.
15160 SourceLocation NewAttrLoc);
15161
15162 // Report a failure to merge function effects between declarations due to a
15163 // conflict.
15164 void
15166 SourceLocation NewLoc,
15167 SourceLocation OldLoc);
15168
15169 /// Inline checks from the start of maybeAddDeclWithEffects, to
15170 /// minimize performance impact on code not using effects.
15171 template <class FuncOrBlockDecl>
15172 void maybeAddDeclWithEffects(FuncOrBlockDecl *D) {
15174 if (FunctionEffectsRef FX = D->getFunctionEffects(); !FX.empty())
15176 }
15177
15178 /// Potentially add a FunctionDecl or BlockDecl to DeclsWithEffectsToVerify.
15179 void maybeAddDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15180
15181 /// Unconditionally add a Decl to DeclsWithEfffectsToVerify.
15182 void addDeclWithEffects(const Decl *D, const FunctionEffectsRef &FX);
15183
15185
15186 ///@}
15187};
15188
15189DeductionFailureInfo
15191 sema::TemplateDeductionInfo &Info);
15192
15193/// Contains a late templated function.
15194/// Will be parsed at the end of the translation unit, used by Sema & Parser.
15197 /// The template function declaration to be late parsed.
15199 /// Floating-point options in the point of definition.
15201};
15202
15203template <>
15205 PragmaMsStackAction Action,
15206 llvm::StringRef StackSlotLabel,
15208} // end namespace clang
15209
15210#endif
#define V(N, I)
Definition: ASTContext.h:3443
Forward declaration of all AST node types.
MatchType Type
StringRef P
static char ID
Definition: Arena.cpp:183
#define SM(sm)
Definition: Cuda.cpp:84
Defines enum values for all the target-independent builtin functions.
static void emit(Program &P, std::vector< std::byte > &Code, const T &Val, bool &Success)
Helper to write bytecode and bail out if 32-bit offsets become invalid.
const Decl * D
enum clang::sema::@1724::IndirectLocalPathEntry::EntryKind Kind
IndirectLocalPath & Path
const LambdaCapture * Capture
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:3055
StringRef Identifier
Definition: Format.cpp:3059
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.
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:1134
AccessResult
A copy of Sema's enum without AR_delayed.
Definition: SemaAccess.cpp:30
CastType
Definition: SemaCast.cpp:48
SourceRange Range
Definition: SemaObjC.cpp:758
SourceLocation Loc
Definition: SemaObjC.cpp:759
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:4547
C Language Family Type Representation.
SourceLocation Begin
StateNode * Previous
std::string Label
__device__ int
#define bool
Definition: amdgpuintrin.h:20
A class for storing results from argument-dependent lookup.
Definition: Lookup.h:869
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:1161
bool hasAnyFunctionEffects() const
Definition: ASTContext.h:3014
CanQualType IntTy
Definition: ASTContext.h:1169
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:383
Writes an AST file containing the contents of a translation unit.
Definition: ASTWriter.h:89
Represents an access specifier followed by colon ':'.
Definition: DeclCXX.h:86
PtrTy get() const
Definition: Ownership.h:170
bool isInvalid() const
Definition: Ownership.h:166
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition: Expr.h:2718
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3577
Attr - This represents one attribute.
Definition: Attr.h:43
An attributed type is a type to which a type attribute has been applied.
Definition: Type.h:6127
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Definition: Type.h:6556
Represents a C++ declaration that introduces decls from somewhere else.
Definition: DeclCXX.h:3435
A binding in a decomposition declaration.
Definition: DeclCXX.h:4125
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4474
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:2553
Represents a C++ conversion function within a class.
Definition: DeclCXX.h:2880
Represents a C++ base or member initializer.
Definition: DeclCXX.h:2318
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition: ExprCXX.h:2498
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2817
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2078
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
Represents a C++ nested-name-specifier or a global scope specifier.
Definition: DeclSpec.h:74
Represents the this expression in C++.
Definition: ExprCXX.h:1152
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:2874
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition: Decl.h:4673
CaseStmt - Represent a case statement.
Definition: Stmt.h:1828
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition: Expr.h:3547
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.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition: ASTConcept.h:35
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition: DeclCXX.h:3616
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Definition: Expr.h:4582
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:1368
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1435
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1265
Captures information about "declaration specifiers".
Definition: DeclSpec.h:247
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:835
SourceLocation getLocation() const
Definition: DeclBase.h:442
DeclContext * getDeclContext()
Definition: DeclBase.h:451
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:907
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition: Decl.h:735
Information about one declarator, including the parsed type information and the identifier.
Definition: DeclSpec.h:1903
A decomposition declaration.
Definition: DeclCXX.h:4184
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:1220
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:231
void setLastDiagnosticIgnored(bool Ignored)
Pretend that the last diagnostic issued was ignored, so any subsequent notes will be suppressed,...
Definition: Diagnostic.h:784
An instance of this object exists for each enum constant that is defined.
Definition: Decl.h:3277
Represents an enum.
Definition: Decl.h:3847
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Definition: Type.h:6098
Store information needed for an explicit specifier.
Definition: DeclCXX.h:1912
The return type of classify().
Definition: Expr.h:330
This represents one expression.
Definition: Expr.h:110
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition: Expr.h:192
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
Definition: Expr.h:797
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:277
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
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:978
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
Definition: LangOptions.h:1085
Represents a member of a struct/union/class.
Definition: Decl.h:3033
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:258
FileNullability & operator[](FileID file)
Definition: Sema.h:269
FileNullability Nullability
Definition: Sema.h:265
Represents a function declaration or definition.
Definition: Decl.h:1935
A mutable set of FunctionEffect::Kind.
Definition: Type.h:4957
Kind
Identifies the particular effect.
Definition: Type.h:4719
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition: Type.h:4903
Represents a reference to a function parameter pack or init-capture pack that has been substituted bu...
Definition: ExprCXX.h:4654
Represents a prototype with parameter type info, e.g.
Definition: Type.h:5102
Declaration of a template function.
Definition: DeclTemplate.h:959
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition: Type.h:4347
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4321
One of these records is kept for each identifier that is lexed.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Definition: Overload.h:567
Represents a field injected from an anonymous union/struct into the parent scope.
Definition: Decl.h:3321
Describes an C or C++ initializer list.
Definition: Expr.h:5088
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:503
ComplexRangeKind
Controls the various implementations for complex multiplication and.
Definition: LangOptions.h:441
FPEvalMethodKind
Possible float expression evaluation method choices.
Definition: LangOptions.h:299
FPExceptionModeKind
Possible floating point exception behavior.
Definition: LangOptions.h:287
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
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:46
A global _GUID constant.
Definition: DeclCXX.h:4307
An instance of this class represents the declaration of a property member.
Definition: DeclCXX.h:4253
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4734
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition: Expr.h:3236
Abstract interface for a module loader.
Definition: ModuleLoader.h:82
Describes a module or submodule.
Definition: Module.h:115
Module(ModuleConstructorTag, StringRef Name, SourceLocation DefinitionLoc, Module *Parent, bool IsFramework, bool IsExplicit, unsigned VisibilityID)
Construct a new module or submodule.
Definition: Module.cpp:37
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:253
bool isExternallyDeclarable() const
Determine whether this declaration can be redeclared in a different translation unit.
Definition: Decl.h:418
Represent a C++ namespace.
Definition: Decl.h:551
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:1153
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition: Type.h:7580
Wrapper for void* pointer.
Definition: Ownership.h:50
static OpaquePtr make(QualType P)
Definition: Ownership.h:60
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:1008
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition: Attr.h:255
ParenExpr - This represents a parenthesized expression, e.g.
Definition: Expr.h:2170
Represents a parameter to a function.
Definition: Decl.h:1725
ParsedAttr - Represents a syntactic attribute.
Definition: ParsedAttr.h:129
ParsedAttributes - A collection of parsed attributes.
Definition: ParsedAttr.h:956
Represents the parsed form of a C++ template argument.
Parser - This implements a parser for the C family of languages.
Definition: Parser.h:58
Tracks expected type during expression parsing, for use in code completion.
Definition: Sema.h:290
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)
PreferredTypeBuilder(bool Enabled)
Definition: Sema.h:292
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:138
Stores the type being destroyed by a pseudo-destructor expression.
Definition: ExprCXX.h:2566
A (possibly-)qualified type.
Definition: Type.h:929
The collection of all-type qualifiers we support.
Definition: Type.h:324
Represents a struct/union/class.
Definition: Decl.h:4148
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:6072
Represents the body of a requires-expression.
Definition: DeclCXX.h:2047
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Definition: ExprConcepts.h:502
Scope - A scope is a transient data structure that is used while parsing the program.
Definition: Scope.h:41
void incrementMSManglingNumber()
Definition: Scope.h:356
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:110
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
Definition: SemaBase.cpp:60
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition: SemaBase.cpp:32
AlignPackInfo(AlignPackInfo::Mode M, unsigned Num, bool IsXL)
Definition: Sema.h:1461
bool operator==(const AlignPackInfo &Info) const
Definition: Sema.h:1521
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition: Sema.h:1493
unsigned getPackNumber() const
Definition: Sema.h:1511
bool IsXLStack() const
Definition: Sema.h:1519
bool IsPackSet() const
Definition: Sema.h:1513
AlignPackInfo(AlignPackInfo::Mode M, bool IsXL)
Definition: Sema.h:1467
bool IsAlignAttr() const
Definition: Sema.h:1507
bool IsPackAttr() const
Definition: Sema.h:1505
bool operator!=(const AlignPackInfo &Info) const
Definition: Sema.h:1527
AlignPackInfo(bool IsXL)
Definition: Sema.h:1471
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Definition: Sema.h:1478
Mode getAlignMode() const
Definition: Sema.h:1509
RAII object used to change the argument pack substitution index within a Sema object.
Definition: Sema.h:13212
ArgumentPackSubstitutionIndexRAII(Sema &Self, int NewSubstitutionIndex)
Definition: Sema.h:13217
BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition: Sema.h:7879
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition: Sema.h:7884
void emit(const SemaDiagnosticBuilder &DB, std::index_sequence< Is... >) const
Definition: Sema.h:7871
std::tuple< const Ts &... > Args
Definition: Sema.h:7868
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
Definition: Sema.h:8048
A RAII object to enter scope of a compound statement.
Definition: Sema.h:916
CompoundScopeRAII(Sema &S, bool IsStmtExpr=false)
Definition: Sema.h:918
std::pair< VarDecl *, Expr * > get() const
Definition: Sema.h:7332
bool isInvalid() const
Definition: Sema.h:7331
std::optional< bool > getKnownValue() const
Definition: Sema.h:7336
A RAII object to temporarily push a declaration context.
Definition: Sema.h:3010
ContextRAII(Sema &S, DeclContext *ContextToPush, bool NewThisContext=true)
Definition: Sema.h:3020
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
Definition: Sema.h:10031
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:10036
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:5891
DefaultedComparisonKind asComparison() const
Definition: Sema.h:5923
DefaultedFunctionKind(CXXSpecialMemberKind CSM)
Definition: Sema.h:5900
unsigned getDiagnosticIndex() const
Get the index of this function kind for use in diagnostics.
Definition: Sema.h:5928
DefaultedFunctionKind(DefaultedComparisonKind Comp)
Definition: Sema.h:5903
CXXSpecialMemberKind asSpecialMember() const
Definition: Sema.h:5920
RAII class to control scope of DeferDiags.
Definition: Sema.h:9758
DeferDiagsRAII(Sema &S, bool DeferDiags)
Definition: Sema.h:9763
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
Definition: Sema.h:985
DelayedDiagnosticsState push(sema::DelayedDiagnosticPool &pool)
Enter a new scope.
Definition: Sema.h:1004
void popUndelayed(DelayedDiagnosticsState state)
Undo a previous pushUndelayed().
Definition: Sema.h:1028
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
Definition: Sema.h:997
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
Definition: Sema.h:1000
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:1014
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
Definition: Sema.h:1020
A helper class for building up ExtParameterInfos.
Definition: Sema.h:12614
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:12633
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Definition: Sema.h:12621
Records and restores the CurFPFeatures state on entry/exit of compound statements.
Definition: Sema.h:13581
FPOptionsOverride getOverrides()
Definition: Sema.h:13585
FullExprArg(Sema &actions)
Definition: Sema.h:7276
ExprResult release()
Definition: Sema.h:7278
Expr * get() const
Definition: Sema.h:7280
GlobalEagerInstantiationScope(Sema &S, bool Enabled)
Definition: Sema.h:13597
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:10095
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:10087
Helper class that collects exception specifications for implicitly-declared special member functions.
Definition: Sema.h:4995
unsigned size() const
The number of exceptions in the exception specification.
Definition: Sema.h:5028
ExceptionSpecificationType getExceptionSpecType() const
Get the computed exception specification type.
Definition: Sema.h:5021
const QualType * data() const
The set of exceptions in the exception specification.
Definition: Sema.h:5031
void CalledExpr(Expr *E)
Integrate an invoked expression into the collected data.
Definition: Sema.h:5037
FunctionProtoType::ExceptionSpecInfo getExceptionSpec() const
Overwrite an EPI's exception specification with this computed exception specification.
Definition: Sema.h:5044
static NameClassification DependentNonType()
Definition: Sema.h:3254
static NameClassification VarTemplate(TemplateName Name)
Definition: Sema.h:3264
ExprResult getExpression() const
Definition: Sema.h:3290
NameClassification(const IdentifierInfo *Keyword)
Definition: Sema.h:3230
static NameClassification Unknown()
Definition: Sema.h:3234
static NameClassification OverloadSet(ExprResult E)
Definition: Sema.h:3238
NameClassificationKind getKind() const
Definition: Sema.h:3288
static NameClassification UndeclaredTemplate(TemplateName Name)
Definition: Sema.h:3282
static NameClassification FunctionTemplate(TemplateName Name)
Definition: Sema.h:3270
NamedDecl * getNonTypeDecl() const
Definition: Sema.h:3300
NameClassification(ParsedType Type)
Definition: Sema.h:3228
TemplateName getTemplateName() const
Definition: Sema.h:3305
ParsedType getType() const
Definition: Sema.h:3295
TemplateNameKind getTemplateNameKind() const
Definition: Sema.h:3312
static NameClassification NonType(NamedDecl *D)
Definition: Sema.h:3244
static NameClassification Concept(TemplateName Name)
Definition: Sema.h:3276
static NameClassification UndeclaredNonType()
Definition: Sema.h:3250
static NameClassification TypeTemplate(TemplateName Name)
Definition: Sema.h:3258
static NameClassification Error()
Definition: Sema.h:3232
Custom deleter to allow FunctionScopeInfos to be kept alive for a short time after they've been poppe...
Definition: Sema.h:663
void operator()(sema::FunctionScopeInfo *Scope) const
Definition: Sema.cpp:2315
Whether and why a template name is required in this lookup.
Definition: Sema.h:11090
RequiredTemplateKind(TemplateNameIsRequiredTag)
Template name is unconditionally required.
Definition: Sema.h:11096
SourceLocation getTemplateKeywordLoc() const
Definition: Sema.h:11098
RequiredTemplateKind(SourceLocation TemplateKWLoc=SourceLocation())
Template name is required if TemplateKWLoc is valid.
Definition: Sema.h:11093
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition: Sema.h:12086
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition: Sema.h:12116
SFINAETrap(Sema &SemaRef, bool AccessCheckingSFINAE=false)
Definition: Sema.h:12094
A derivative of BoundTypeDiagnoser for which the diagnostic's type parameter is preceded by a 0/1 enu...
Definition: Sema.h:7896
void diagnose(Sema &S, SourceLocation Loc, QualType T) override
Definition: Sema.h:7901
SizelessTypeDiagnoser(unsigned DiagID, const Ts &...Args)
Definition: Sema.h:7898
SpecialMemberOverloadResultEntry(const llvm::FoldingSetNodeID &ID)
Definition: Sema.h:8964
SpecialMemberOverloadResult - The overloading result for a special member function.
Definition: Sema.h:8942
SpecialMemberOverloadResult(CXXMethodDecl *MD)
Definition: Sema.h:8951
CXXMethodDecl * getMethod() const
Definition: Sema.h:8954
void setMethod(CXXMethodDecl *MD)
Definition: Sema.h:8955
RAII object to handle the state changes required to synthesize a function body.
Definition: Sema.h:13090
void addContextNote(SourceLocation UseLoc)
Definition: Sema.h:13118
SynthesizedFunctionScope(Sema &S, DeclContext *DC)
Definition: Sema.h:13096
SourceLocation getLocation() const
Definition: Sema.h:11860
bool ContainsDecl(const NamedDecl *ND) const
Definition: Sema.h:11850
const DeclContext * getDeclContext() const
Definition: Sema.h:11856
TemplateCompareNewDeclInfo(const DeclContext *DeclCtx, const DeclContext *LexicalDeclCtx, SourceLocation Loc)
Definition: Sema.h:11834
const NamedDecl * getDecl() const
Definition: Sema.h:11848
TemplateCompareNewDeclInfo(const NamedDecl *ND)
Definition: Sema.h:11833
const DeclContext * getLexicalDeclContext() const
Definition: Sema.h:11852
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Definition: Sema.h:12125
TentativeAnalysisScope(Sema &SemaRef)
Definition: Sema.h:12132
Abstract base class used for diagnosing integer constant expression violations.
Definition: Sema.h:7229
virtual SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc)=0
VerifyICEDiagnoser(bool Suppress=false)
Definition: Sema.h:7233
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:464
FunctionDecl * FindUsualDeallocationFunction(SourceLocation StartLoc, bool CanProvideSize, bool Overaligned, DeclarationName Name)
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:14555
void DeclareGlobalNewDelete()
DeclareGlobalNewDelete - Declare the global forms of operator new and delete.
StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, IdentifierInfo *Ident, ParsedAttributes &Attrs)
Definition: SemaDecl.cpp:14284
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
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:9207
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 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:11006
ExprResult PerformImplicitObjectArgumentInitialization(Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl, CXXMethodDecl *Method)
PerformObjectArgumentInitialization - Perform initialization of the implicit object parameter for the...
QualType BuildParenType(QualType T)
Build a paren type including T.
Definition: SemaType.cpp:1674
SemaAMDGPU & AMDGPU()
Definition: Sema.h:1046
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:6394
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
Definition: Sema.h:3102
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
Definition: SemaDecl.cpp:6677
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:13162
void ActOnPragmaMSOptimize(SourceLocation Loc, bool IsOn)
#pragma optimize("[optimization-list]", on | off).
Definition: SemaAttr.cpp:1249
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 EvaluateStaticAssertMessageAsString(Expr *Message, std::string &Result, ASTContext &Ctx, bool ErrorOnInvalidMessage)
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:7801
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
Definition: SemaAttr.cpp:499
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition: Sema.h:13146
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:10657
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition: Sema.h:12643
void CheckFloatComparison(SourceLocation Loc, Expr *LHS, Expr *RHS, BinaryOperatorKind Opcode)
Check for comparisons of floating-point values using == and !=.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Definition: Sema.cpp:2388
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:732
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:2469
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:9082
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:6597
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
SmallVector< SmallVector< VTableUse, 16 >, 8 > SavedVTableUses
Definition: Sema.h:13544
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
Definition: SemaDecl.cpp:9776
void PopParsingClass(ParsingClassState state)
Definition: Sema.h:6085
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...
void DiagnoseDiscardedExprMarkedNodiscard(const Expr *E)
DiagnoseDiscardedExprMarkedNodiscard - Given an expression that is semantically a discarded-value exp...
Definition: SemaStmt.cpp:416
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
Definition: Sema.h:9774
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
Definition: Sema.cpp:996
bool containsUnexpandedParameterPacks(Declarator &D)
Determine whether the given declarator contains any unexpanded parameter packs.
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:6074
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:2030
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:15821
bool RequireCompleteSizedExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:7851
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:1559
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:15498
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:7769
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:870
bool isAttrContext() const
Definition: Sema.h:6469
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
Definition: SemaDecl.cpp:15177
StmtResult BuildMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, NestedNameSpecifierLoc QualifierLoc, DeclarationNameInfo NameInfo, Stmt *Nested)
Definition: SemaStmt.cpp:4433
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand, bool &RetainExpansion, std::optional< unsigned > &NumExpansions)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
void ActOnPragmaAttributeEmptyPush(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
Definition: SemaAttr.cpp:1148
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.
NamedDecl * FindFirstQualifierInScope(Scope *S, NestedNameSpecifier *NNS)
If the given nested-name-specifier begins with a bare identifier (e.g., Base::), perform name lookup ...
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:7844
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
Definition: Sema.cpp:2488
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition: Sema.h:5835
LookupNameKind
Describes the kind of name lookup to perform.
Definition: Sema.h:8986
@ LookupLabel
Label name lookup.
Definition: Sema.h:8995
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition: Sema.h:8990
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition: Sema.h:9017
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
Definition: Sema.h:9009
@ LookupOMPReductionName
Look up the name of an OpenMP user-defined reduction operation.
Definition: Sema.h:9031
@ LookupLocalFriendName
Look up a friend of a local class.
Definition: Sema.h:9025
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
Definition: Sema.h:9027
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Definition: Sema.h:9022
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
Definition: Sema.h:9002
@ LookupObjCImplicitSelfParam
Look up implicit 'self' parameter of an objective-c method.
Definition: Sema.h:9029
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition: Sema.h:9013
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition: Sema.h:8998
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition: Sema.h:9005
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition: Sema.h:8993
@ LookupOMPMapperName
Look up the name of an OpenMP user-defined mapper.
Definition: Sema.h:9033
@ LookupAnyName
Look up any declaration with any name.
Definition: Sema.h:9035
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:412
llvm::DenseMap< IdentifierInfo *, SrcLocSet > IdentifierSourceLocations
Definition: Sema.h:8930
LazyVector< TypedefNameDecl *, ExternalSemaSource, &ExternalSemaSource::ReadExtVectorDecls, 2, 2 > ExtVectorDeclsType
Definition: Sema.h:4467
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:6613
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
Definition: SemaType.cpp:6497
void ActOnPragmaAttributePop(SourceLocation PragmaLoc, const IdentifierInfo *Namespace)
Called on well-formed '#pragma clang attribute pop'.
Definition: SemaAttr.cpp:1155
void ActOnPopScope(SourceLocation Loc, Scope *S)
Definition: SemaDecl.cpp:2180
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
Definition: SemaDecl.cpp:5306
QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement)
Completely replace the auto in TypeWithAuto by Replacement.
ExprResult ActOnConstantExpression(ExprResult Res)
Definition: SemaExpr.cpp:19647
void ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name, StringRef Value)
ActOnPragmaDetectMismatch - Call on well-formed #pragma detect_mismatch.
Definition: SemaAttr.cpp:625
QualType CheckLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:13158
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, Expr *Operand, SourceLocation RParen)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
Definition: SemaDecl.cpp:15876
bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:5772
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, CXXScopeSpec *SS=nullptr)
VariadicCallType
Definition: Sema.h:2315
@ VariadicDoesNotApply
Definition: Sema.h:2320
@ VariadicFunction
Definition: Sema.h:2316
@ VariadicMethod
Definition: Sema.h:2318
@ VariadicConstructor
Definition: Sema.h:2319
@ VariadicBlock
Definition: Sema.h:2317
SemaM68k & M68k()
Definition: Sema.h:1091
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
Definition: SemaDecl.cpp:12931
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:768
TemplateName SubstTemplateName(NestedNameSpecifierLoc QualifierLoc, TemplateName Name, SourceLocation Loc, const MultiLevelTemplateArgumentList &TemplateArgs)
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)
ParmVarDecl * SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, std::optional< unsigned > NumExpansions, bool ExpectParameterPack, bool EvaluateConstraints=true)
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...
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr, TypoExpr **Out=nullptr)
Diagnose an empty lookup.
Definition: SemaExpr.cpp:2452
ExprResult ActOnCompoundLiteral(SourceLocation LParenLoc, ParsedType Ty, SourceLocation RParenLoc, Expr *InitExpr)
Definition: SemaExpr.cpp:7040
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:850
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:980
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
Definition: SemaAccess.cpp:36
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)
NonTrivialCUnionContext
Definition: Sema.h:3624
@ NTCUC_CopyInit
Definition: Sema.h:3634
@ NTCUC_AutoVar
Definition: Sema.h:3632
@ NTCUC_CompoundLiteral
Definition: Sema.h:3638
@ NTCUC_DefaultInitializedObject
Definition: Sema.h:3630
@ NTCUC_Assignment
Definition: Sema.h:3636
@ NTCUC_BlockCapture
Definition: Sema.h:3640
@ NTCUC_FunctionReturn
Definition: Sema.h:3628
@ NTCUC_LValueToRValueVolatile
Definition: Sema.h:3642
@ NTCUC_FunctionParam
Definition: Sema.h:3626
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:1726
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:3519
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.
bool hasReachableDeclarationSlow(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
MissingImportKind
Kinds of missing import.
Definition: Sema.h:9474
bool isValidPointerAttrType(QualType T, bool RefOkay=false)
Determine if type T is a valid subject for a nonnull and similar attributes.
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:7544
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:6090
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:4412
void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID)
Definition: SemaLookup.cpp:995
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:729
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:4611
OpaquePtr< QualType > TypeTy
Definition: Sema.h:902
void ActOnTagDefinitionError(Scope *S, Decl *TagDecl)
ActOnTagDefinitionError - Invoked when there was an unrecoverable error parsing the definition of a t...
Definition: SemaDecl.cpp:18275
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:165
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
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:305
void PrintContextStack()
Definition: Sema.h:13232
TypeResult ActOnTemplateIdType(Scope *S, 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 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:2338
bool ActOnCoroutineBodyStart(Scope *S, SourceLocation KwLoc, StringRef Keyword)
QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc)
Definition: SemaType.cpp:2326
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
StmtResult BuildAttributedStmt(SourceLocation AttrsLoc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Definition: SemaStmt.cpp:642
NamedDecl * ActOnTemplateTemplateParameter(Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params, bool Typename, SourceLocation EllipsisLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg)
ActOnTemplateTemplateParameter - Called when a C++ template template parameter (e....
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
Definition: SemaDecl.cpp:7430
SemaOpenMP & OpenMP()
Definition: Sema.h:1126
IfExistsResult
Describes the result of an "if-exists" condition check.
Definition: Sema.h:8460
@ IER_DoesNotExist
The symbol does not exist.
Definition: Sema.h:8465
@ IER_Dependent
The name is a dependent name, so the results will differ from one instantiation to the next.
Definition: Sema.h:8469
@ IER_Error
An error occurred.
Definition: Sema.h:8472
@ IER_Exists
The symbol exists.
Definition: Sema.h:8462
void CheckDelegatingCtorCycles()
llvm::SmallSet< SourceLocation, 2 > SrcLocSet
Definition: Sema.h:8929
void ActOnStartStmtExpr()
Definition: SemaExpr.cpp:15840
ExprResult BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc, sema::LambdaScopeInfo *LSI)
Complete a lambda-expression having processed and attached the lambda body.
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:5810
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
Definition: Sema.h:9300
bool FormatStringHasSArg(const StringLiteral *FExpr)
void WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec)
Emit a warning for all pending noderef expressions that we recorded.
Definition: SemaExpr.cpp:17452
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void ActOnStmtExprError()
Definition: SemaExpr.cpp:15846
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:20164
bool IsLastErrorImmediate
Is the last error level diagnostic immediate.
Definition: Sema.h:972
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope)
Definition: SemaStmt.cpp:4422
void ActOnPragmaFEnvRound(SourceLocation Loc, llvm::RoundingMode)
Called to set constant rounding mode for floating point operations.
Definition: SemaAttr.cpp:1427
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:6075
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:1557
static const IdentifierInfo * getPrintable(const IdentifierInfo *II)
Definition: Sema.h:14582
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:2267
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:867
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
Definition: SemaDecl.cpp:18207
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
Definition: Sema.h:4325
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Definition: Sema.h:3084
PragmaClangSection PragmaClangRodataSection
Definition: Sema.h:1433
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:7624
void CheckPtrComparisonWithNullChar(ExprResult &E, ExprResult &NullE)
Definition: SemaExpr.cpp:12167
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:249
bool hasVisibleDefinition(const NamedDecl *D)
Definition: Sema.h:15027
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:6051
void emitAndClearUnusedLocalTypedefWarnings()
Definition: Sema.cpp:1087
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:16415
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition: Sema.h:6032
static bool getFormatStringInfo(const FormatAttr *Format, bool IsCXXMember, bool IsVariadic, FormatStringInfo *FSI)
Given a FunctionDecl's FormatAttr, attempts to populate the FomatStringInfo parameter with the Format...
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl)
Definition: SemaStmt.cpp:86
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
Definition: SemaDecl.cpp:15043
void InstantiateExceptionSpec(SourceLocation PointOfInstantiation, FunctionDecl *Function)
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:856
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:1190
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:1071
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:17387
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:1561
PragmaClangSectionAction
Definition: Sema.h:1423
@ PCSA_Set
Definition: Sema.h:1423
@ PCSA_Clear
Definition: Sema.h:1423
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:20380
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:311
ConditionKind
Definition: Sema.h:7351
@ 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:949
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:1298
bool RequireCompleteType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Definition: Sema.h:14986
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
static SourceRange getPrintable(SourceLocation L)
Definition: Sema.h:14588
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
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:2676
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:7789
void CheckOverrideControl(NamedDecl *D)
CheckOverrideControl - Check C++11 override control semantics.
ModuleDeclKind
Definition: Sema.h:9605
@ PartitionImplementation
'module X:Y;'
@ Interface
'export module X;'
@ PartitionInterface
'export module X:Y;'
SourceLocation LocationOfExcessPrecisionNotSatisfied
Definition: Sema.h:7931
TemplateArgumentLoc SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template, SourceLocation TemplateLoc, 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...
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition: Sema.h:849
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:1455
bool ActOnDuplicateODRHashDefinition(T *Duplicate, T *Previous)
Check ODR hashes for C/ObjC when merging types from modules.
Definition: Sema.h:9247
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition: Sema.h:10114
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition: Sema.h:10117
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition: Sema.h:10123
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition: Sema.h:10121
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:272
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:1379
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:1267
@ AR_dependent
Definition: Sema.h:1270
@ AR_accessible
Definition: Sema.h:1268
@ AR_inaccessible
Definition: Sema.h:1269
@ AR_delayed
Definition: Sema.h:1271
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:2292
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:14592
@ 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:671
ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type, SourceLocation LParenLoc, Expr *CastExpr, SourceLocation RParenLoc)
Definition: SemaCast.cpp:3377
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:531
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition: Sema.h:6447
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition: Sema.cpp:2161
QualType GetSignedSizelessVectorType(QualType V)
Definition: SemaExpr.cpp:12726
llvm::DenseSet< std::pair< Decl *, unsigned > > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
Definition: Sema.h:13149
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:394
void AddTemplateParametersToLambdaCallOperator(CXXMethodDecl *CallOperator, CXXRecordDecl *Class, TemplateParameterList *TemplateParams)
Definition: SemaLambda.cpp:998
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:7920
void deduceOpenCLAddressSpace(ValueDecl *decl)
Definition: SemaDecl.cpp:6828
ExprResult ActOnCharacterConstant(const Token &Tok, Scope *UDLScope=nullptr)
Definition: SemaExpr.cpp:3538
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
Definition: SemaStmt.cpp:3171
PragmaStack< FPOptionsOverride > FpPragmaStack
Definition: Sema.h:1664
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:7832
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
static SourceRange getPrintable(const Expr *E)
Definition: Sema.h:14589
PragmaStack< StringLiteral * > CodeSegStack
Definition: Sema.h:1658
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:3782
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:1268
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:18430
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:15153
void setFunctionHasBranchIntoScope()
Definition: Sema.cpp:2341
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:4472
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
Definition: SemaStmt.cpp:500
SourceLocation getOptimizeOffPragmaLocation() const
Get the location for the currently active "\#pragma clang optimize off". If this location is invalid,...
Definition: Sema.h:1735
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
Definition: SemaDecl.cpp:6218
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=NoFold)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
Definition: SemaExpr.cpp:17145
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:617
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...
virtual void anchor()
This virtual key function only exists to limit the emission of debug info describing the Sema class.
Definition: Sema.cpp:303
QualType BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc)
Build an ext-vector type.
Definition: SemaType.cpp:2392
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
Definition: SemaDecl.cpp:4805
SmallVector< AlignPackIncludeState, 8 > AlignPackIncludeStack
Definition: Sema.h:1653
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:10817
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
Definition: SemaExpr.cpp:6682
void AddAlignmentAttributesForRecord(RecordDecl *RD)
AddAlignmentAttributesForRecord - Adds any needed alignment attributes to a the record decl,...
Definition: SemaAttr.cpp:53
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...
void CheckMain(FunctionDecl *FD, const DeclSpec &D)
Definition: SemaDecl.cpp:12345
void AddKnownFunctionAttributes(FunctionDecl *FD)
Adds any function attributes that we know a priori based on the declaration of this function.
Definition: SemaDecl.cpp:16616
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:2099
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:10143
void ActOnComment(SourceRange Comment)
Definition: Sema.cpp:2440
ExprResult ActOnDesignatedInitializer(Designation &Desig, SourceLocation EqualOrColonLoc, bool GNUSyntax, ExprResult Init)
Definition: SemaInit.cpp:3488
@ 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:18294
concepts::Requirement * ActOnSimpleRequirement(Expr *E)
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
Definition: Sema.h:13506
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
Definition: SemaStmt.cpp:49
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
Definition: SemaDecl.cpp:18390
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
Definition: Sema.cpp:1171
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:1665
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:1081
bool isValidSveBitcast(QualType srcType, QualType destType)
Are the two types SVE-bitcast-compatible types? I.e.
Definition: SemaExpr.cpp:7518
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:876
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:844
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:14657
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
Definition: SemaExpr.cpp:15859
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.
bool checkTargetVersionAttr(SourceLocation Loc, Decl *D, StringRef Str)
Check Target Version attrs.
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
Definition: Sema.cpp:149
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
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:1431
ExprResult BuildResolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, Expr *Awaiter, bool IsImplicit=false)
bool CheckConceptUseInDefinition(ConceptDecl *Concept, SourceLocation Loc)
SemaSYCL & SYCL()
Definition: Sema.h:1151
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:15512
ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16502
IdentifierInfo * getSuperIdentifier() const
Definition: Sema.cpp:2715
StmtResult BuildIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition: SemaStmt.cpp:1026
ExpressionEvaluationContextRecord & parentEvaluationContext()
Definition: Sema.h:6459
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:1570
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
void ActOnPragmaFloatControl(SourceLocation Loc, PragmaMsStackAction Action, PragmaFloatControlKind Value)
ActOnPragmaFloatControl - Call on well-formed #pragma float_control.
Definition: SemaAttr.cpp:660
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition: SemaExpr.cpp:784
bool checkPointerAuthEnabled(SourceLocation Loc, SourceRange Range)
LateParsedTemplateMapT LateParsedTemplateMap
Definition: Sema.h:11061
void UnmarkAsLateParsedTemplate(FunctionDecl *FD)
const AttributedType * getCallingConvAttributedType(QualType T) const
Get the outermost AttributedType node that sets a calling convention.
Definition: SemaDecl.cpp:3397
CheckTemplateArgumentKind
Specifies the context in which a particular template argument is being checked.
Definition: Sema.h:11635
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition: Sema.h:11646
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition: Sema.h:11638
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition: Sema.h:11642
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:641
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:714
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:1657
void DiagnosePrecisionLossInComplexDivision()
Definition: SemaAttr.cpp:1226
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:8924
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:1171
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
Definition: SemaExpr.cpp:1042
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:13879
DeclGroupPtrTy ActOnModuleDecl(SourceLocation StartLoc, SourceLocation ModuleLoc, ModuleDeclKind MDK, ModuleIdPath Path, ModuleIdPath Partition, ModuleImportState &ImportState)
The parser has processed a module-declaration that begins the definition of a module interface or imp...
Definition: SemaModule.cpp:258
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:13166
ExprResult tryConvertExprToType(Expr *E, QualType Ty)
Try to convert an expression E to type Ty.
Definition: SemaExpr.cpp:4998
Decl * ActOnFileScopeAsmDecl(Expr *expr, SourceLocation AsmLoc, SourceLocation RParenLoc)
Definition: SemaDecl.cpp:20259
bool hasMergedDefinitionInCurrentModule(const NamedDecl *Def)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
std::vector< Token > ExpandFunctionLocalPredefinedMacros(ArrayRef< Token > Toks)
Definition: SemaExpr.cpp:1999
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
bool CheckMatrixCast(SourceRange R, QualType DestTy, QualType SrcTy, CastKind &Kind)
Definition: SemaExpr.cpp:7628
QualType CheckAddressOfOperand(ExprResult &Operand, SourceLocation OpLoc)
CheckAddressOfOperand - The operand of & must be either a function designator or an lvalue designatin...
Definition: SemaExpr.cpp:14159
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:15164
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
Definition: SemaStmt.cpp:1102
bool DiagnoseUnknownTemplateName(const IdentifierInfo &II, SourceLocation IILoc, Scope *S, const CXXScopeSpec *SS, TemplateTy &SuggestedTemplate, TemplateNameKind &SuggestedKind)
ASTContext & Context
Definition: Sema.h:909
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:7756
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:616
bool ShouldSplatAltivecScalarInCast(const VectorType *VecTy)
Definition: SemaCast.cpp:2700
QualType CheckVectorLogicalOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:12962
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:9833
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:20175
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
Definition: SemaDecl.cpp:14677
ExprResult ActOnCoyieldExpr(Scope *S, SourceLocation KwLoc, Expr *E)
bool ConstraintExpressionDependsOnEnclosingTemplate(const FunctionDecl *Friend, unsigned TemplateDepth, const Expr *Constraint)
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:4614
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:8935
FullExprArg MakeFullExpr(Expr *Arg, SourceLocation CC)
Definition: Sema.h:7297
QualType BuildFunctionType(QualType T, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI)
Build a function type.
Definition: SemaType.cpp:2632
QualType CheckShiftOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, bool IsCompAssign=false)
Definition: SemaExpr.cpp:11504
void ActOnPragmaUnused(const Token &Identifier, Scope *curScope, SourceLocation PragmaLoc)
ActOnPragmaUnused - Called on well-formed '#pragma unused'.
Definition: SemaAttr.cpp:932
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
Definition: SemaDecl.cpp:5782
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:13173
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
Definition: Sema.h:529
static FormatStringType GetFormatStringType(const FormatAttr *Format)
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:7893
concepts::TypeRequirement * BuildTypeRequirement(TypeSourceInfo *Type)
void ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement)
Definition: SemaDecl.cpp:20280
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, std::optional< unsigned > NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
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:792
void CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC, bool *ICContext=nullptr, bool IsListInit=false)
void * SkippedDefinitionContext
Definition: Sema.h:3949
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:14951
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool CheckCaseExpression(Expr *E)
Definition: SemaExpr.cpp:21153
void resetFPOptions(FPOptions FPO)
Definition: Sema.h:11039
bool hasAcceptableDefinition(NamedDecl *D, AcceptableKind Kind)
Definition: Sema.h:15044
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:9593
DeclResult ActOnModuleImport(SourceLocation StartLoc, SourceLocation ExportLoc, SourceLocation ImportLoc, ModuleIdPath Path, bool IsPartition=false)
The parser has processed a module import declaration.
Definition: SemaModule.cpp:573
static bool getPrintable(bool B)
Definition: Sema.h:14578
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
Definition: SemaLookup.cpp:916
SemaObjC & ObjC()
Definition: Sema.h:1111
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...
void DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record)
Emit diagnostic warnings for placeholder members.
Definition: SemaDecl.cpp:5311
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
Definition: SemaDecl.cpp:4915
QualType CheckMatrixElementwiseOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Type checking for matrix binary operators.
Definition: SemaExpr.cpp:12997
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:2670
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:1041
void CheckDelayedMemberExceptionSpecs()
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition: SemaDecl.cpp:70
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
AllowFoldKind
Definition: Sema.h:7243
@ AllowFold
Definition: Sema.h:7245
@ NoFold
Definition: Sema.h:7244
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:1497
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:896
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
Definition: Sema.h:2683
PragmaStack< bool > StrictGuardStackCheckStack
Definition: Sema.h:1661
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, UnresolvedSetImpl &Functions)
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:3092
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:19660
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 DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
Definition: SemaExpr.cpp:752
bool isImmediateFunctionContext() const
Definition: Sema.h:7781
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:2331
ASTContext & getASTContext() const
Definition: Sema.h:532
ExprResult CallExprUnaryConversions(Expr *E)
CallExprUnaryConversions - a special case of an unary conversion performed on a function designator o...
Definition: SemaExpr.cpp:762
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...
ExprResult VerifyIntegerConstantExpression(Expr *E, AllowFoldKind CanFold=NoFold)
Definition: Sema.h:7260
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:15948
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:6058
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:15777
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
ParsingDeclState PushParsingDeclaration(sema::DelayedDiagnosticPool &pool)
Definition: Sema.h:1034
void ActOnPragmaAttributeAttribute(ParsedAttr &Attribute, SourceLocation PragmaLoc, attr::ParsedSubjectMatchRuleSet Rules)
Definition: SemaAttr.cpp:1015
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:18930
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:19908
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
Definition: SemaDecl.cpp:1713
Decl * ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc, SourceLocation LBraceLoc)
We have parsed the start of an export declaration, including the '{' (if present).
Definition: SemaModule.cpp:851
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:6136
void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, UnresolvedSetImpl &Functions)
Definition: SemaExpr.cpp:15295
NameClassificationKind
Describes the result of the name lookup and resolution performed by ClassifyName().
Definition: Sema.h:3177
@ NC_Unknown
This name is not a type or template in this context, but might be something else.
Definition: Sema.h:3180
@ NC_VarTemplate
The name was classified as a variable template name.
Definition: Sema.h:3207
@ NC_NonType
The name was classified as a specific non-type, non-template declaration.
Definition: Sema.h:3190
@ NC_TypeTemplate
The name was classified as a template whose specializations are types.
Definition: Sema.h:3205
@ NC_Error
Classification failed; an error has been produced.
Definition: Sema.h:3182
@ NC_FunctionTemplate
The name was classified as a function template name.
Definition: Sema.h:3209
@ NC_DependentNonType
The name denotes a member of a dependent type that could not be resolved.
Definition: Sema.h:3198
@ NC_UndeclaredNonType
The name was classified as an ADL-only function name.
Definition: Sema.h:3194
@ NC_UndeclaredTemplate
The name was classified as an ADL-only function template name.
Definition: Sema.h:3211
@ NC_Keyword
The name has been typo-corrected to a keyword.
Definition: Sema.h:3184
@ NC_Type
The name was classified as a type.
Definition: Sema.h:3186
@ NC_OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
Definition: Sema.h:3203
@ NC_Concept
The name was classified as a concept name.
Definition: Sema.h:3213
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:17820
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
Definition: SemaExpr.cpp:9576
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:1657
StmtResult ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
Definition: SemaStmt.cpp:4357
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:692
void ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, SourceLocation PragmaLoc)
ActOnPragmaOptionsAlign - Called on well formed #pragma options align.
Definition: SemaAttr.cpp:329
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:867
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:3486
void ActOnStartFunctionDeclarationDeclarator(Declarator &D, unsigned TemplateParameterDepth)
Called before parsing a function declarator belonging to a function declaration.
bool CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param, TemplateParameterList *Params, TemplateArgumentLoc &Arg, bool IsDeduced)
Check a template argument against its corresponding template template parameter.
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:665
bool isConstantEvaluatedOverride
Used to change context to isConstantEvaluated without pushing a heavy ExpressionEvaluationContextReco...
Definition: Sema.h:2149
ParsingClassState PushParsingClass()
Definition: Sema.h:6081
ForRangeStatus
Definition: Sema.h:10479
@ FRS_Success
Definition: Sema.h:10480
@ FRS_DiagnosticIssued
Definition: Sema.h:10482
@ FRS_NoViableFunction
Definition: Sema.h:10481
bool CheckArgsForPlaceholders(MultiExprArg args)
Check an argument list for placeholders that we won't try to handle later.
Definition: SemaExpr.cpp:6199
void ActOnPragmaCXLimitedRange(SourceLocation Loc, LangOptions::ComplexRangeKind Range)
ActOnPragmaCXLimitedRange - Called on well formed #pragma STDC CX_LIMITED_RANGE.
Definition: SemaAttr.cpp:1458
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
Definition: SemaExpr.cpp:3101
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:1466
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:111
ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr)
Definition: SemaExpr.cpp:7054
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
Definition: SemaExpr.cpp:15827
void MarkAsLateParsedTemplate(FunctionDecl *FD, Decl *FnD, CachedTokens &Toks)
llvm::SmallVector< DeleteExprLoc, 4 > DeleteLocs
Definition: Sema.h:574
TemplateArgumentLoc getTemplateArgumentPackExpansionPattern(TemplateArgumentLoc OrigLoc, SourceLocation &Ellipsis, std::optional< unsigned > &NumExpansions) const
Returns the pattern of the pack expansion for a template argument.
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
Definition: Sema.h:8983
AccessResult CheckAllocationAccess(SourceLocation OperatorLoc, SourceRange PlacementRange, CXXRecordDecl *NamingClass, DeclAccessPair FoundDecl, bool Diagnose=true)
Checks access to an overloaded operator new or delete.
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:8927
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:4762
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
Definition: Sema.h:5606
@ 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.
@ None
This is not a defaultable comparison operator.
@ 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)
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
Definition: SemaExpr.cpp:7909
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:8669
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:9435
SmallVector< const Decl * > DeclsWithEffectsToVerify
All functions/lambdas/blocks which have bodies and which have a non-empty FunctionEffectsRef to be ve...
Definition: Sema.h:15149
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
AllowedExplicit
Definition: Sema.h:9834
@ 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:9563
static const unsigned MaxAlignmentExponent
The maximum alignment, same as in llvm::Value.
Definition: Sema.h:839
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition: Sema.h:6069
QualType CheckMatrixMultiplyOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign)
Definition: SemaExpr.cpp:13043
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:20426
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:817
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:5464
void ActOnPragmaFPEvalMethod(SourceLocation Loc, LangOptions::FPEvalMethodKind Value)
Definition: SemaAttr.cpp:633
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
Definition: Sema.h:3115
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:1575
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:16951
ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr)
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Definition: Sema.cpp:2431
unsigned InventedParameterInfosStart
The index of the first InventedParameterInfo that refers to the current context.
Definition: Sema.h:3007
void MarkTypoCorrectedFunctionDefinition(const NamedDecl *F)
Definition: SemaDecl.cpp:9039
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
Definition: SemaExpr.cpp:2204
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:456
unsigned NumSFINAEErrors
The number of SFINAE diagnostics that have been trapped.
Definition: Sema.h:11051
void setFunctionHasIndirectGoto()
Definition: Sema.cpp:2351
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:1939
TemplateParameterListEqualKind
Enumeration describing how template parameter lists are compared for equality.
Definition: Sema.h:11781
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
Definition: Sema.h:11799
@ TPL_TemplateTemplateArgumentMatch
We are matching the template parameter lists of a template template argument against the template par...
Definition: Sema.h:11810
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition: Sema.h:11789
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition: Sema.h:11820
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16115
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:4463
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition: Sema.cpp:1589
QualType BuiltinRemoveReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9804
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:1671
ExprResult BuildCaptureInit(const sema::Capture &Capture, SourceLocation ImplicitCaptureLoc, bool IsOpenMPMapping=false)
Initialize the given capture with a suitable expression.
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
Definition: Sema.h:7962
void ActOnPragmaClangSection(SourceLocation PragmaLoc, PragmaClangSectionAction Action, PragmaClangSectionKind SecKind, StringRef SecName)
ActOnPragmaClangSection - Called on well formed #pragma clang section.
Definition: SemaAttr.cpp:384
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:11111
@ 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:792
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:4352
ExprResult ActOnUnevaluatedStringLiteral(ArrayRef< Token > StringToks)
Definition: SemaExpr.cpp:1969
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
Definition: SemaType.cpp:1580
std::optional< unsigned > getNumArgumentsInExpansionFromUnexpanded(llvm::ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs)
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain=true)
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:1290
AtomicArgumentOrder
Definition: Sema.h:2257
void PushFunctionScope()
Enter a new function scope.
Definition: Sema.cpp:2180
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:1247
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
ExprResult ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &Dcl, ExprResult Operand, SourceLocation RParenLoc)
Definition: SemaCast.cpp:382
SourceRange getExprRange(Expr *E) const
Definition: SemaExpr.cpp:507
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:3283
void setExceptionMode(SourceLocation Loc, LangOptions::FPExceptionModeKind)
Called to set exception behavior for floating point operations.
Definition: SemaAttr.cpp:1434
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 PrintPragmaAttributeInstantiationPoint()
Definition: SemaAttr.cpp:1220
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:2527
ArrayRef< InventedTemplateParameterInfo > getInventedParameterInfos() const
Definition: Sema.h:11044
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
Definition: SemaAttr.cpp:167
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition: Sema.h:672
bool CheckMemberPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
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:3088
std::optional< ExpressionEvaluationContextRecord::InitializationContext > OutermostDeclarationWithDelayedImmediateInvocations() const
Definition: Sema.h:7816
static DeclarationName getPrintable(DeclarationName N)
Definition: Sema.h:14585
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
Definition: Sema.h:4164
bool CheckEnumUnderlyingType(TypeSourceInfo *TI)
Check that this is a valid underlying type for an enum declaration.
Definition: SemaDecl.cpp:16850
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:420
FPOptions & getCurFPFeatures()
Definition: Sema.h:527
RecordDecl * StdSourceLocationImplDecl
The C++ "std::source_location::__impl" struct, defined in <source_location>.
Definition: Sema.h:7914
void SetLateTemplateParser(LateTemplateParserCB *LTP, LateTemplateParserCleanupCB *LTPCleanup, void *P)
Definition: Sema.h:955
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
Definition: SemaExpr.cpp:20411
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition: Sema.cpp:82
sema::LambdaScopeInfo * PushLambdaScope()
Definition: Sema.cpp:2198
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:2330
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:14995
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:19730
UnexpandedParameterPackContext
The context in which an unexpanded parameter pack is being diagnosed.
Definition: Sema.h:13907
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
Definition: Sema.h:13927
@ UPPC_RequiresClause
Definition: Sema.h:13978
@ UPPC_UsingDeclaration
A using declaration.
Definition: Sema.h:13933
@ UPPC_IfExists
Microsoft __if_exists.
Definition: Sema.h:13960
@ UPPC_Requirement
Definition: Sema.h:13975
@ UPPC_ExceptionType
The type of an exception.
Definition: Sema.h:13951
@ UPPC_EnumeratorValue
The enumerator value.
Definition: Sema.h:13930
@ UPPC_Lambda
Lambda expression.
Definition: Sema.h:13966
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition: Sema.h:13963
@ UPPC_PartialSpecialization
Partial specialization.
Definition: Sema.h:13957
@ UPPC_Initializer
An initializer.
Definition: Sema.h:13942
@ UPPC_BaseType
The base type of a class type.
Definition: Sema.h:13912
@ UPPC_FriendDeclaration
A friend declaration.
Definition: Sema.h:13936
@ UPPC_DefaultArgument
A default argument.
Definition: Sema.h:13945
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition: Sema.h:13915
@ UPPC_Expression
An arbitrary expression.
Definition: Sema.h:13909
@ UPPC_ExplicitSpecialization
Explicit specialization.
Definition: Sema.h:13954
@ UPPC_DeclarationQualifier
A declaration qualifier.
Definition: Sema.h:13939
@ UPPC_DataMemberType
The type of a data member.
Definition: Sema.h:13918
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition: Sema.h:13924
@ UPPC_Block
Block expression.
Definition: Sema.h:13969
@ UPPC_BitFieldWidth
The size of a bit-field.
Definition: Sema.h:13921
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
Definition: Sema.h:13948
@ UPPC_TypeConstraint
A type constraint.
Definition: Sema.h:13972
api_notes::APINotesManager APINotes
Definition: Sema.h:913
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:12148
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:523
const LangOptions & getLangOpts() const
Definition: Sema.h:525
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:9057
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?
void DiagnoseAbsenceOfOverrideControl(NamedDecl *D, bool Inconsistent)
DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was not used in the declaration of ...
StmtResult ActOnFinishFullStmt(Stmt *Stmt)
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, ConceptDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, QualType ConstrainedType, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
Definition: Sema.h:5396
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
TypoExpr * CorrectTypoDelayed(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, TypoDiagnosticGenerator TDG, TypoRecoveryCallback TRC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
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:1764
QualType CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:12194
SourceLocation CurInitSegLoc
Definition: Sema.h:1697
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:7292
void ActOnPragmaMSVtorDisp(PragmaMsStackAction Action, SourceLocation PragmaLoc, MSVtorDispMode Value)
Called on well formed #pragma vtordisp().
Definition: SemaAttr.cpp:721
SemaCodeCompletion & CodeCompletion()
Definition: Sema.h:1066
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:::lifetimebound]] attr for std:: functions and methods.
Definition: SemaAttr.cpp:219
bool currentModuleIsHeaderUnit() const
Is the module scope we are in a C++ Header Unit?
Definition: Sema.h:3109
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:1116
void SwapSatisfactionStack(llvm::SmallVectorImpl< SatisfactionStackEntryTy > &NewSS)
Definition: Sema.h:14359
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
Definition: SemaDecl.cpp:1388
ReuseLambdaContextDecl_t
Definition: Sema.h:6531
@ ReuseLambdaContextDecl
Definition: Sema.h:6531
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:6573
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:17483
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:6607
bool CheckRedeclarationModuleOwnership(NamedDecl *New, NamedDecl *Old)
We've determined that New is a redeclaration of Old.
Definition: SemaDecl.cpp:1598
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:533
NonOdrUseReason getNonOdrUseReasonInCurrentContext(ValueDecl *D)
If D cannot be odr-used in the current expression evaluation context, return a reason explaining why.
Definition: SemaExpr.cpp:2252
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:1061
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:20049
void * OpaqueParser
Definition: Sema.h:953
Preprocessor & PP
Definition: Sema.h:908
QualType CheckAdditionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc, QualType *CompLHSTy=nullptr)
Definition: SemaExpr.cpp:10939
VariadicCallType getVariadicCallType(FunctionDecl *FDecl, const FunctionProtoType *Proto, Expr *Fn)
Definition: SemaExpr.cpp:5710
ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, std::optional< unsigned > NumExpansions)
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:6475
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
QualType BuiltinEnumUnderlyingType(QualType BaseType, SourceLocation Loc)
Definition: SemaType.cpp:9729
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:14131
bool MSPragmaOptimizeIsOn
The "on" or "off" argument passed by #pragma optimize, that denotes whether the optimizations in the ...
Definition: Sema.h:1744
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:16776
bool ActOnAlignasTypeArgument(StringRef KWName, ParsedType Ty, SourceLocation OpLoc, SourceRange R)
ActOnAlignasTypeArgument - Handle alignas(type-id) and _Alignas(type-name) .
Definition: SemaExpr.cpp:4711
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:946
SmallVector< PragmaAttributeGroup, 2 > PragmaAttributeStack
Definition: Sema.h:1722
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
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:8239
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:1980
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:7533
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:3096
llvm::SmallSetVector< const NamedDecl *, 16 > NamedDeclSetType
Definition: Sema.h:6034
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:1101
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
bool hasCStrMethod(const Expr *E)
Check to see if a given expression could have '.c_str()' called on it.
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
bool CheckConstraintSatisfaction(const NamedDecl *Template, ArrayRef< const Expr * > ConstraintExprs, 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:14387
const LangOptions & LangOpts
Definition: Sema.h:907
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 ...
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 ...
bool FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope, QualType AllocType, bool IsArray, bool &PassAlignment, MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew, FunctionDecl *&OperatorDelete, bool Diagnose=true)
Finds the overloads of operator new and delete that are appropriate for the allocation.
ExprResult PerformQualificationConversion(Expr *E, QualType Ty, ExprValueKind VK=VK_PRValue, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
Definition: SemaInit.cpp:7560
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
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:15929
std::unique_ptr< sema::FunctionScopeInfo > CachedFunctionScope
Definition: Sema.h:845
ExprResult CorrectDelayedTyposInExpr(ExprResult ER, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})
Definition: Sema.h:8448
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition: Sema.cpp:2406
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:6732
static const uint64_t MaximumAlignment
Definition: Sema.h:840
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
llvm::DenseMap< unsigned, CXXDeductionGuideDecl * > AggregateDeductionCandidates
Definition: Sema.h:8672
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:17504
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
Definition: SemaInit.cpp:7542
bool ShouldEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS)
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition: SemaStmt.cpp:431
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Definition: Sema.h:15008
void PerformPendingInstantiations(bool LocalOnly=false)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
Decl * ActOnStartOfFunctionDef(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists, SkipBodyInfo *SkipBody=nullptr, FnBodyKind BodyKind=FnBodyKind::Other)
Definition: SemaDecl.cpp:15352
bool PrepareBuiltinElementwiseMathOneArgCall(CallExpr *TheCall)
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition: Sema.h:6036
SemaHLSL & HLSL()
Definition: Sema.h:1076
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:11060
bool CollectStats
Flag indicating whether or not to collect detailed statistics.
Definition: Sema.h:843
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
Definition: Sema.h:8982
bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange, const sema::Capture &From)
Diagnose if an explicit lambda capture is unused.
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
Definition: Sema.cpp:1106
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
Definition: SemaDecl.cpp:1830
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
Definition: SemaDecl.cpp:11912
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:18485
ExpressionEvaluationContextRecord & currentEvaluationContext()
Definition: Sema.h:6453
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
Definition: SemaExpr.cpp:17468
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:1434
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
SemaMIPS & MIPS()
Definition: Sema.h:1096
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
Definition: Sema.cpp:116
void InstantiateVariableInitializer(VarDecl *Var, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the initializer of a variable.
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
SemaRISCV & RISCV()
Definition: Sema.h:1141
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:15172
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
Definition: Sema.h:1411
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:5402
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:3671
QualType buildLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, std::optional< unsigned > NumExpansions, IdentifierInfo *Id, bool DirectInit, Expr *&Init)
Definition: SemaLambda.cpp:784
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
Definition: SemaExpr.cpp:205
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:4792
@ OperatorInExpression
The '<=>' operator was used in an expression and a builtin operator was selected.
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
Definition: Sema.h:13542
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition: Sema.h:6029
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:73
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:20059
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:9857
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:14580
SemaSwift & Swift()
Definition: Sema.h:1156
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:1312
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
Definition: SemaStmt.cpp:3664
PragmaStack< AlignPackInfo > AlignPackStack
Definition: Sema.h:1646
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:15834
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:6128
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition: Sema.h:6480
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
Definition: Sema.h:13198
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition: Sema.h:6062
StmtResult ActOnExprStmtError()
Definition: SemaStmt.cpp:66
AcceptableKind
Definition: Sema.h:8978
PragmaStack< StringLiteral * > BSSSegStack
Definition: Sema.h:1656
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:3361
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:8985
DeclContext * getCurLexicalContext() const
Definition: Sema.h:736
std::function< TypeResult(StringRef, StringRef, SourceLocation)> ParseTypeFromStringCallback
Callback to the parser to parse a type expressed as a string.
Definition: Sema.h:964
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:1700
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:1582
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, const CXXScopeSpec &SS, QualType T, TagDecl *OwnedTagDecl=nullptr)
Retrieve a version of the type 'T' that is elaborated by Keyword, qualified by the nested-name-specif...
Definition: SemaType.cpp:9531
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)
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.
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:8119
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:860
void PrintInstantiationStack()
Prints the current instantiation stack through a series of notes.
StmtResult ActOnNullStmt(SourceLocation SemiLoc, bool HasLeadingEmptyMacro=false)
Definition: SemaStmt.cpp:71
OpenCLOptions OpenCLFeatures
Definition: Sema.h:904
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:13546
VarArgKind isValidVarArgType(const QualType &Ty)
Determine the degree of POD-ness for an expression.
Definition: SemaExpr.cpp:936
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:16926
llvm::SmallSetVector< StringRef, 4 > MSFunctionNoBuiltins
Set of no-builtin functions listed by #pragma function.
Definition: Sema.h:1747
ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
void ExitDeclaratorContext(Scope *S)
Definition: SemaDecl.cpp:1375
bool isQualifiedMemberAccess(Expr *E)
Determine whether the given expression is a qualified member access expression, of a form that could ...
Definition: SemaExpr.cpp:15740
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:8386
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Definition: Sema.cpp:784
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
RecordDecl * CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc, unsigned NumParams)
Definition: SemaStmt.cpp:4457
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:3351
DeclGroupPtrTy ActOnGlobalModuleFragmentDecl(SourceLocation ModuleLoc)
The parser has processed a global-module-fragment declaration that begins the definition of the globa...
Definition: SemaModule.cpp:162
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:4525
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
void CheckMSVCRTEntryPoint(FunctionDecl *FD)
Definition: SemaDecl.cpp:12532
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
Definition: Sema.h:14574
ProcessingContextState ParsingClassState
Definition: Sema.h:6080
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.
Decl * ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant, SourceLocation IdLoc, IdentifierInfo *Id, const ParsedAttributesView &Attrs, SourceLocation EqualLoc, Expr *Val)
Definition: SemaDecl.cpp:19756
sema::FunctionScopeInfo * getCurFunction() const
Definition: Sema.h:940
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:2325
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef< Decl * > Group)
BuildDeclaratorGroup - convert a list of declarations into a declaration group, performing any necess...
Definition: SemaDecl.cpp:14909
FunctionDecl * CreateBuiltin(IdentifierInfo *II, QualType Type, unsigned ID, SourceLocation Loc)
Definition: SemaDecl.cpp:2287
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false)
Returns the more specialized function template according to the rules of function template partial or...
Scope * getNonFieldDeclScope(Scope *S)
getNonFieldDeclScope - Retrieves the innermost scope, starting from S, where a non-field would be dec...
Definition: SemaDecl.cpp:2262
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:2759
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
Definition: SemaExpr.cpp:3638
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
Definition: SemaType.cpp:1856
bool mightBeIntendedToBeTemplateName(ExprResult E, bool &Dependent)
Determine whether it's plausible that E was intended to be a template-name.
Definition: Sema.h:3389
std::pair< const IdentifierInfo *, uint64_t > TypeTagMagicValue
A pair of ArgumentKind identifier and magic value.
Definition: Sema.h:2235
void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc)
ActOnPragmaWeakID - Called on well formed #pragma weak ident.
Definition: SemaDecl.cpp:20314
std::optional< unsigned > getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
Definition: SemaExpr.cpp:10406
bool CheckNontrivialField(FieldDecl *FD)
Definition: SemaDecl.cpp:18683
void ProcessDeclAttributeDelayed(Decl *D, const ParsedAttributesView &AttrList)
Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr attribute.
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:9628
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:1708
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
Definition: Sema.h:6477
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
Definition: SemaAttr.cpp:1324
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...
CXXRecordDecl * getCurrentInstantiationOf(NestedNameSpecifier *NNS)
If the given nested name specifier refers to the current instantiation, return the declaration that c...
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
Definition: SemaDecl.cpp:18165
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:2144
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)
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:12655
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
Definition: SemaInit.cpp:9783
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:4423
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:8914
void LateTemplateParserCleanupCB(void *P)
Definition: Sema.h:950
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:5392
void MarkThisReferenced(CXXThisExpr *This)
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(NamedDecl *D1, ArrayRef< const Expr * > AC1, NamedDecl *D2, ArrayRef< const Expr * > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
std::optional< unsigned > getFullyPackExpandedSize(TemplateArgument Arg)
Given a template argument that contains an unexpanded parameter pack, but which has already been subs...
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:640
int ArgumentPackSubstitutionIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
Definition: Sema.h:13206
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:3189
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:15002
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition: Sema.h:7785
StringLiteral * CurInitSeg
Last section used with #pragma init_seg.
Definition: Sema.h:1696
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Definition: SemaDecl.cpp:20344
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition: Sema.h:9588
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:8934
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:7279
static bool isCast(CheckedConversionKind CCK)
Definition: Sema.h:2084
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:1639
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:16291
ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr)
Prepare SplattedExpr for a vector splat operation, adding implicit casts if necessary.
Definition: SemaExpr.cpp:7669
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:15458
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:2361
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
Definition: Sema.h:6492
IfExistsResult CheckMicrosoftIfExistsSymbol(Scope *S, CXXScopeSpec &SS, const DeclarationNameInfo &TargetNameInfo)
void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, ADLResult &Functions)
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
Definition: Sema.h:6043
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...
bool ActOnDuplicateDefinition(Decl *Prev, SkipBodyInfo &SkipBody)
Perform ODR-like check for C/ObjC when merging tag types from modules.
Definition: SemaDecl.cpp:18156
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
Definition: SemaDecl.cpp:15382
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:1044
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, bool Diagnose=true, bool WantSize=false, bool WantAligned=false)
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
Definition: SemaInit.cpp:7525
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.
std::function< void(const TypoCorrection &)> TypoDiagnosticGenerator
Definition: Sema.h:9065
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:20874
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:273
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:511
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
Definition: SemaDecl.cpp:14949
SuppressedDiagnosticsMap SuppressedDiagnostics
Definition: Sema.h:12149
@ VAK_Invalid
Definition: Sema.h:7540
@ VAK_Valid
Definition: Sema.h:7536
@ VAK_ValidInCXX11
Definition: Sema.h:7537
@ VAK_MSVCUndefined
Definition: Sema.h:7539
@ VAK_Undefined
Definition: Sema.h:7538
SemaOpenCL & OpenCL()
Definition: Sema.h:1121
void ActOnPragmaMSFunction(SourceLocation Loc, const llvm::SmallVectorImpl< StringRef > &NoBuiltins)
Call on well formed #pragma function.
Definition: SemaAttr.cpp:1258
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Definition: SemaDecl.cpp:5787
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
Definition: Sema.h:13555
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:9765
void ActOnPragmaMSStruct(PragmaMSStructKind Kind)
ActOnPragmaMSStruct - Called on well formed #pragma ms_struct [on|off].
Definition: SemaAttr.cpp:613
ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc)
Definition: SemaExpr.cpp:16658
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
bool isPreciseFPEnabled()
Are precise floating point semantics currently enabled?
Definition: Sema.h:1836
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
Definition: SemaDecl.cpp:15219
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the keyword associated.
Definition: SemaType.cpp:3773
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:887
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:14590
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:7915
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)
TrivialABIHandling
Definition: Sema.h:5875
@ TAH_IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
Definition: Sema.h:5877
@ TAH_ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
Definition: Sema.h:5880
FormatArgumentPassingKind
Definition: Sema.h:2159
@ FAPK_Fixed
Definition: Sema.h:2160
@ FAPK_Variadic
Definition: Sema.h:2161
@ FAPK_VAList
Definition: Sema.h:2162
void FillInlineAsmIdentifierInfo(Expr *Res, llvm::InlineAsmIdentifierInfo &Info)
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:20110
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:7777
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
llvm::DenseMap< ParmVarDecl *, llvm::TinyPtrVector< ParmVarDecl * > > UnparsedDefaultArgInstantiationsMap
Definition: Sema.h:12646
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition: Sema.cpp:1550
StmtResult ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, NamedReturnInfo &NRInfo, bool SupressSimplerImplicitMoves)
ActOnCapScopeReturnStmt - Utility routine to type-check return statements for capturing scopes.
Definition: SemaStmt.cpp:3458
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...
llvm::SmallVector< TypoExpr *, 2 > TypoExprs
Holds TypoExprs that are created from createDelayedTypo.
Definition: Sema.h:8976
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
Definition: Sema.h:7580
@ IncompatiblePointerDiscardsQualifiers
IncompatiblePointerDiscardsQualifiers - The assignment discards qualifiers that we don't permit to be...
Definition: Sema.h:7624
@ IntToPointer
IntToPointer - The assignment converts an int to a pointer, which we accept as an extension.
Definition: Sema.h:7590
@ IncompatibleBlockPointer
IncompatibleBlockPointer - The assignment is between two block pointers types that are not compatible...
Definition: Sema.h:7648
@ IncompatibleObjCQualifiedId
IncompatibleObjCQualifiedId - The assignment is between a qualified id type and something else (that ...
Definition: Sema.h:7653
@ IncompatibleVectors
IncompatibleVectors - The assignment is between two vector types that have the same size,...
Definition: Sema.h:7640
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
Definition: Sema.h:7619
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
Definition: Sema.h:7598
@ IncompatibleObjCWeakRef
IncompatibleObjCWeakRef - Assigning a weak-unavailable object to an object with __weak qualifier.
Definition: Sema.h:7657
@ Compatible
Compatible - the types are compatible according to the standard.
Definition: Sema.h:7582
@ IncompatibleFunctionPointerStrict
IncompatibleFunctionPointerStrict - The assignment is between two function pointer types that are not...
Definition: Sema.h:7609
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
Definition: Sema.h:7661
@ FunctionVoidPointer
FunctionVoidPointer - The assignment is between a function pointer and void*, which the standard does...
Definition: Sema.h:7594
@ IncompatibleFunctionPointer
IncompatibleFunctionPointer - The assignment is between two function pointers types that are not comp...
Definition: Sema.h:7603
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
Definition: Sema.h:7615
@ IncompatibleNestedPointerQualifiers
IncompatibleNestedPointerQualifiers - The assignment is between two nested pointer types,...
Definition: Sema.h:7636
@ IncompatibleNestedPointerAddressSpaceMismatch
IncompatibleNestedPointerAddressSpaceMismatch - The assignment changes address spaces in nested point...
Definition: Sema.h:7630
@ PointerToInt
PointerToInt - The assignment converts a pointer to an int, which we accept as an extension.
Definition: Sema.h:7586
@ IntToBlockPointer
IntToBlockPointer - The assignment converts an int to a block pointer.
Definition: Sema.h:7644
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).
void MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const RecordType * > *DirectVirtualBases=nullptr)
Mark destructors of virtual bases of this class referenced.
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:8427
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
Definition: SemaDecl.cpp:1289
StmtResult ActOnCapturedRegionEnd(Stmt *S)
Definition: SemaStmt.cpp:4629
ArithConvKind
Context in which we're performing a usual arithmetic conversion.
Definition: Sema.h:7399
@ ACK_Arithmetic
An arithmetic operation.
Definition: Sema.h:7401
@ ACK_CompAssign
A compound assignment expression.
Definition: Sema.h:7409
@ ACK_BitwiseOp
A bitwise operation.
Definition: Sema.h:7403
@ ACK_Conditional
A conditional (?:) operator.
Definition: Sema.h:7407
@ ACK_Comparison
A comparison.
Definition: Sema.h:7405
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
Definition: SemaDecl.cpp:4707
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
Definition: SemaExpr.cpp:20008
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
Definition: SemaDecl.cpp:15809
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:15015
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:9580
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:2896
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:2209
bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result)
BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr TheCall is a constant expression.
StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc, Expr *DestExp)
Definition: SemaStmt.cpp:3186
bool GlobalNewDeleteDeclared
A flag to remember whether the implicit forms of operator new and delete have been declared.
Definition: Sema.h:7973
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:4109
ExprResult ActOnSourceLocExpr(SourceLocIdentKind Kind, SourceLocation BuiltinLoc, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16743
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
Definition: Sema.h:3106
llvm::PointerIntPair< ConstantExpr *, 1 > ImmediateInvocationCandidate
Definition: Sema.h:6289
bool MSStructPragmaOn
Definition: Sema.h:1408
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
Definition: SemaExpr.cpp:20964
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
Definition: SemaType.cpp:9190
ExprResult TransformToPotentiallyEvaluated(Expr *E)
Definition: SemaExpr.cpp:17367
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
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:13182
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:15858
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:11018
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:13502
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
Definition: Sema.h:3842
@ NTK_Typedef
Definition: Sema.h:3847
@ NTK_NonUnion
Definition: Sema.h:3845
@ NTK_TypeAlias
Definition: Sema.h:3848
@ NTK_NonClass
Definition: Sema.h:3844
@ NTK_NonEnum
Definition: Sema.h:3846
@ NTK_NonStruct
Definition: Sema.h:3843
@ NTK_TemplateTemplateArgument
Definition: Sema.h:3851
@ NTK_TypeAliasTemplate
Definition: Sema.h:3850
@ NTK_Template
Definition: Sema.h:3849
bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID)
Definition: Sema.h:14990
SourceManager & getSourceManager() const
Definition: Sema.h:530
void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
Definition: SemaModule.cpp:734
TryCaptureKind
Definition: Sema.h:6593
@ TryCapture_Implicit
Definition: Sema.h:6594
@ TryCapture_ExplicitByVal
Definition: Sema.h:6595
@ TryCapture_ExplicitByRef
Definition: Sema.h:6596
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9781
QualType CXXThisTypeOverride
When non-NULL, the C++ 'this' expression is allowed despite the current context not being a non-stati...
Definition: Sema.h:8044
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
CallingConventionIgnoredReason
Describes the reason a calling convention specification was ignored, used for diagnostics.
Definition: Sema.h:4401
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:6710
bool CheckVecStepExpr(Expr *E)
Definition: SemaExpr.cpp:4390
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
Definition: Sema.cpp:569
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:3059
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:4277
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:881
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
Definition: SemaDecl.cpp:20011
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:1340
void diagnoseFunctionEffectConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn when implicitly changing function effects.
Definition: Sema.cpp:632
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:11892
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:11193
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:3418
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:8776
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:12738
ExprResult ActOnDependentMemberExpr(Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
bool BuiltinElementwiseTernaryMath(CallExpr *TheCall, bool CheckForFloatArgs=true)
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:545
QualType CheckMultiplyDivideOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool IsDivide)
Definition: SemaExpr.cpp:10581
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:8970
ExprResult CheckLValueToRValueConversionOperand(Expr *E)
Definition: SemaExpr.cpp:19624
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
Definition: SemaType.cpp:9685
QualType CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc)
Definition: SemaExpr.cpp:13718
void DiagnoseNonDefaultPragmaAlignPack(PragmaAlignPackDiagnoseKind Kind, SourceLocation IncludeLoc)
Definition: SemaAttr.cpp:547
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:18142
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.
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 AccessCheckingSFINAE
When true, access checking violations are treated as SFINAE failures rather than hard errors.
Definition: Sema.h:12081
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...
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:1435
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
CallExpr::ADLCallKind ADLCallKind
Definition: Sema.h:6985
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:3652
@ NTCUK_Destruct
Definition: Sema.h:3654
@ NTCUK_Init
Definition: Sema.h:3653
@ NTCUK_Copy
Definition: Sema.h:3655
QualType CheckNonTypeTemplateParameterType(TypeSourceInfo *&TSI, SourceLocation Loc)
Check that the type of a non-type template parameter is well-formed.
QualType CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation OpLoc, bool isIndirect)
DelayedDiagnosticsState ProcessingContextState
Definition: Sema.h:981
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:1391
QualType BuildAtomicType(QualType T, SourceLocation Loc)
Definition: SemaType.cpp:9968
std::vector< std::pair< QualType, unsigned > > ExcessPrecisionNotSatisfied
Definition: Sema.h:7930
QualType CheckTemplateIdType(TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)
PragmaClangSection PragmaClangDataSection
Definition: Sema.h:1432
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
Definition: SemaExpr.cpp:20245
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body)
Definition: SemaDecl.cpp:15886
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
Definition: SemaExpr.cpp:5487
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...
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:8766
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
Definition: SemaDecl.cpp:13903
bool anyAltivecTypes(QualType srcType, QualType destType)
Definition: SemaExpr.cpp:7563
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:7600
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
Definition: SemaAttr.cpp:1471
ExprResult LookupInlineAsmVarDeclField(Expr *RefExpr, StringRef Member, SourceLocation AsmLoc)
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:1228
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:2379
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
Definition: Sema.cpp:2192
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.
bool IsAtLeastAsConstrained(NamedDecl *D1, MutableArrayRef< const Expr * > AC1, NamedDecl *D2, MutableArrayRef< const Expr * > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
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:20287
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:1645
TypeSourceInfo * ReplaceAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
void AddMsStructLayoutForRecord(RecordDecl *RD)
AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
Definition: SemaAttr.cpp:89
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:6413
TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)
MaybeODRUseExprSet MaybeODRUseExprs
Definition: Sema.h:6287
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
ExternalSemaSource * getExternalSource() const
Definition: Sema.h:535
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:853
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
Definition: Sema.h:1703
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...
QualType FindCompositePointerType(SourceLocation Loc, ExprResult &E1, ExprResult &E2, bool ConvertArgs=true)
Definition: Sema.h:8403
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:216
static SourceRange getPrintable(SourceRange R)
Definition: Sema.h:14587
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:20271
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:8262
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:59
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:2048
bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
Perform semantic analysis for the given non-template member specialization.
void PushSatisfactionStackEntry(const NamedDecl *D, const llvm::FoldingSetNodeID &ID)
Definition: Sema.h:14324
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:3837
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition: Sema.h:14957
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, const PartialDiagnostic &PD, const FunctionDecl *FD=nullptr)
Definition: Sema.h:742
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:15271
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition: Sema.cpp:2721
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:1876
void setFunctionHasMustTail()
Definition: Sema.cpp:2356
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:7702
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition: Sema.h:7969
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
CorrectTypoKind
Definition: Sema.h:9382
@ CTK_NonError
Definition: Sema.h:9383
@ CTK_ErrorRecovery
Definition: Sema.h:9384
void CheckCompleteVariableDeclaration(VarDecl *VD)
Definition: SemaDecl.cpp:14313
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
Definition: SemaInit.cpp:3454
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
TUFragmentKind
Definition: Sema.h:613
@ Global
The global module fragment, between 'module;' and a module-declaration.
Definition: Sema.h:615
@ Private
The private module fragment, between 'module :private;' and the end of the translation unit.
Definition: Sema.h:622
@ Normal
A normal translation unit fragment.
Definition: Sema.h:619
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
void PopSatisfactionStackEntry()
Definition: Sema.h:14330
void checkClassLevelCodeSegAttribute(CXXRecordDecl *Class)
QualType BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a pointer type.
Definition: SemaType.cpp:1804
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:14834
void setFunctionHasBranchProtectedScope()
Definition: Sema.cpp:2346
RedeclarationKind forRedeclarationInCurContext() const
bool hasReachableDefinition(NamedDecl *D)
Definition: Sema.h:15036
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:4468
bool isConstantEvaluatedContext() const
Definition: Sema.h:2151
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition: Sema.h:6054
StmtResult ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block)
Definition: SemaStmt.cpp:4415
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:592
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:14340
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope)
Definition: SemaStmt.cpp:3227
QualType BuiltinAddPointer(QualType BaseType, SourceLocation Loc)
Definition: SemaType.cpp:9748
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
Definition: Sema.cpp:1100
CCEKind
Contexts in which a converted constant expression is required.
Definition: Sema.h:9998
@ CCEK_StaticAssertMessageSize
Call to size() in a static assert message.
Definition: Sema.h:10005
@ CCEK_ExplicitBool
Condition in an explicit(bool) specifier.
Definition: Sema.h:10003
@ CCEK_Noexcept
Condition in a noexcept(bool) specifier.
Definition: Sema.h:10004
@ CCEK_ArrayBound
Array bound in array declarator or new-expression.
Definition: Sema.h:10002
@ CCEK_CaseValue
Expression in a case label.
Definition: Sema.h:9999
@ CCEK_TemplateArg
Value of a non-type template parameter.
Definition: Sema.h:10001
@ CCEK_StaticAssertMessageData
Call to data() in a static assert message.
Definition: Sema.h:10007
@ CCEK_Enumerator
Enumerator value with fixed underlying type.
Definition: Sema.h:10000
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:2637
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:1785
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:18746
void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
std::pair< StringRef, QualType > CapturedParamNameType
Definition: Sema.h:10921
StmtResult ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc)
Definition: SemaStmt.cpp:1166
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AMK_Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
Definition: SemaDecl.cpp:3083
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:1893
llvm::DenseMap< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
Definition: Sema.h:3080
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:286
ExprResult SubstConstraintExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
Definition: SemaDecl.cpp:19542
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition: Sema.h:1177
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
Definition: SemaDecl.cpp:12567
ASTConsumer & Consumer
Definition: Sema.h:910
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:4227
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
OverloadKind
Definition: Sema.h:9776
@ Ovl_NonFunction
This is not an overload because the lookup results contain a non-function.
Definition: Sema.h:9787
@ Ovl_Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
Definition: Sema.h:9779
@ Ovl_Match
This is not an overload because the signature exactly matches an existing declaration.
Definition: Sema.h:9783
PragmaAlignPackDiagnoseKind
Definition: Sema.h:1814
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:6484
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition: SemaExpr.cpp:121
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
Definition: SemaDecl.cpp:2050
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition: Sema.h:945
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
Definition: Sema.cpp:1686
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
Definition: Sema.h:13538
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
Definition: SemaExpr.cpp:5120
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:7407
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:9615
@ 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:14586
ExprResult ActOnPredefinedExpr(SourceLocation Loc, tok::TokenKind Kind)
Definition: SemaExpr.cpp:3534
ExprResult ActOnEmbedExpr(SourceLocation EmbedKeywordLoc, StringLiteral *BinaryData)
Definition: SemaExpr.cpp:16784
QualType GetSignedVectorType(QualType V)
Return a signed ext_vector_type that is of identical size and number of elements.
Definition: SemaExpr.cpp:12683
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
Definition: Sema.cpp:86
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
Definition: SemaStmt.cpp:4445
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void incrementMSManglingNumber() const
Definition: Sema.h:874
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:8403
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
Definition: SemaDecl.cpp:16547
ExpressionEvaluationContext
Describes how the expressions currently being parsed are evaluated at run-time, if at all.
Definition: Sema.h:6231
@ 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:2050
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:9653
unsigned LastEmittedCodeSynthesisContextDepth
The depth of the context stack at the point when the most recent error or warning was produced.
Definition: Sema.h:13190
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:9912
AvailabilityPriority
Describes the kind of priority given to an availability attribute.
Definition: Sema.h:4386
@ AP_PragmaClangAttribute
The availability attribute was applied using '#pragma clang attribute'.
Definition: Sema.h:4392
@ AP_InferredFromOtherPlatform
The availability attribute for a specific platform was inferred from an availability attribute for an...
Definition: Sema.h:4396
@ AP_Explicit
The availability attribute was specified explicitly next to the declaration.
Definition: Sema.h:4389
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
Definition: Sema.h:4043
@ AMK_None
Don't merge availability attributes at all.
Definition: Sema.h:4045
@ AMK_Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition: Sema.h:4051
@ AMK_ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
Definition: Sema.h:4054
@ AMK_OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
Definition: Sema.h:4057
@ AMK_Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
Definition: Sema.h:4048
void ActOnDocumentableDecls(ArrayRef< Decl * > Group)
Definition: SemaDecl.cpp:14953
ExprResult ActOnAsTypeExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Parse a __builtin_astype expression.
Definition: SemaExpr.cpp:6703
StmtResult ActOnSEHExceptBlock(SourceLocation Loc, Expr *FilterExpr, Stmt *Block)
Definition: SemaStmt.cpp:4395
ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, SourceRange R)
Build a sizeof or alignof expression given a type operand.
Definition: SemaExpr.cpp:4617
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
Definition: SemaType.cpp:5703
void CheckStaticLocalForDllExport(VarDecl *VD)
Check if VD needs to be dllexport/dllimport due to being in a dllexport/import function.
Definition: SemaDecl.cpp:14620
ExprResult BuildOperatorCoawaitLookupExpr(Scope *S, SourceLocation Loc)
std::pair< SourceLocation, bool > DeleteExprLoc
Definition: Sema.h:573
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:20252
bool CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind)
Check the constraints on expression operands to unary type expression and type traits.
Definition: SemaExpr.cpp:4227
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:17135
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:4785
bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, SmallVectorImpl< TemplateArgument > &SugaredConverted, SmallVectorImpl< TemplateArgument > &CanonicalConverted, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
SemaPPC & PPC()
Definition: Sema.h:1131
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:2205
ExprResult ActOnVAArg(SourceLocation BuiltinLoc, Expr *E, ParsedType Ty, SourceLocation RPLoc)
Definition: SemaExpr.cpp:16495
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:435
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
Definition: SemaType.cpp:5816
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
Definition: SemaStmt.cpp:76
SmallVector< Decl *, 2 > WeakTopLevelDecl
WeakTopLevelDecl - Translation-unit scoped declarations generated by #pragma weak during processing o...
Definition: Sema.h:4460
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Definition: SemaType.cpp:9068
void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls)
Definition: SemaDecl.cpp:15304
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:872
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:1336
void DiagnoseUnterminatedPragmaAttribute()
Definition: SemaAttr.cpp:1236
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
Definition: SemaAttr.cpp:1343
bool SatisfactionStackContains(const NamedDecl *D, const llvm::FoldingSetNodeID &ID) const
Definition: Sema.h:14332
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
Definition: SemaExpr.cpp:20894
LateTemplateParserCB * LateTemplateParser
Definition: Sema.h:951
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:18992
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:19256
ExprResult ActOnCastExpr(Scope *S, SourceLocation LParenLoc, Declarator &D, ParsedType &Ty, SourceLocation RParenLoc, Expr *CastExpr)
Definition: SemaExpr.cpp:7737
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC #pragma optimize in scope,...
Definition: SemaAttr.cpp:1291
bool CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, const DefaultArguments &DefaultArgs, bool PartialTemplateArgs, SmallVectorImpl< TemplateArgument > &SugaredConverted, SmallVectorImpl< TemplateArgument > &CanonicalConverted, bool UpdateArgsWithConversions=true, bool *ConstraintsNotSatisfied=nullptr, bool PartialOrderingTTP=false)
Check that the given template arguments can be provided to the given template, converting the argumen...
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
Definition: SemaAttr.cpp:1480
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
Delete-expressions to be analyzed at the end of translation unit.
Definition: Sema.h:7980
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:11042
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Definition: Sema.h:3099
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
bool DeferDiags
Whether deferrable diagnostics should be deferred.
Definition: Sema.h:9755
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:7398
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:7767
SemaSystemZ & SystemZ()
Definition: Sema.h:1161
DarwinSDKInfo * getDarwinSDKInfoForAvailabilityChecking()
Definition: Sema.cpp:100
void DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr)
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:2743
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:17897
QualType BuiltinRemoveExtent(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9793
bool NeedToCaptureVariable(ValueDecl *Var, SourceLocation Loc)
Checks if the variable must be captured.
Definition: SemaExpr.cpp:19248
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition: Sema.h:7917
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
Definition: SemaDecl.cpp:1308
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
bool CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty, CastKind &Kind)
Definition: SemaExpr.cpp:7649
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:9601
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
Definition: SemaType.cpp:9043
StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList, Stmt *SubStmt)
Definition: SemaStmt.cpp:659
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
QualType BuiltinChangeCVRQualifiers(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9819
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
Definition: Sema.h:912
TemplateNameIsRequiredTag
Definition: Sema.h:11088
@ TemplateNameIsRequired
Definition: Sema.h:11088
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:4703
ExprResult BuildVectorLiteral(SourceLocation LParenLoc, SourceLocation RParenLoc, Expr *E, TypeSourceInfo *TInfo)
Build an altivec or OpenCL literal.
Definition: SemaExpr.cpp:7810
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.
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:5740
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:433
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
Definition: SemaDecl.cpp:15943
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:6047
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:2393
std::function< ExprResult(Sema &, TypoExpr *, TypoCorrection)> TypoRecoveryCallback
Definition: Sema.h:9067
DiagnosticsEngine & Diags
Definition: Sema.h:911
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
Definition: SemaLambda.cpp:973
void DiagnoseUnterminatedPragmaAlignPack()
Definition: SemaAttr.cpp:586
StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope)
Definition: SemaStmt.cpp:3254
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition: Sema.h:7301
OpenCLOptions & getOpenCLOptions()
Definition: Sema.h:526
FPOptions CurFPFeatures
Definition: Sema.h:905
void ActOnStartSEHFinallyBlock()
Definition: SemaStmt.cpp:4407
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
static bool CanBeGetReturnObject(const FunctionDecl *FD)
Definition: SemaDecl.cpp:15939
NamespaceDecl * getStdNamespace() const
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
Definition: SemaType.cpp:9757
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition: Sema.h:6038
ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, BinaryOperatorKind Operator)
void DeclareImplicitEqualityComparison(CXXRecordDecl *RD, FunctionDecl *Spaceship)
ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex, bool IsThrownVarInScope)
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:6630
QualType BuildArrayType(QualType T, ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity)
Build an array type.
Definition: SemaType.cpp:2047
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
Definition: SemaExpr.cpp:516
PragmaStack< StringLiteral * > DataSegStack
Definition: Sema.h:1655
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:691
LateTemplateParserCleanupCB * LateTemplateParserCleanup
Definition: Sema.h:952
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:7586
NamedDecl * ActOnNonTypeTemplateParameter(Scope *S, Declarator &D, unsigned Depth, unsigned Position, SourceLocation EqualLoc, Expr *DefaultArg)
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Definition: SemaInit.cpp:9713
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
Definition: SemaDecl.cpp:7253
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:2782
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:14984
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:11277
@ TPC_ClassTemplate
Definition: Sema.h:11278
@ TPC_FriendFunctionTemplate
Definition: Sema.h:11283
@ TPC_ClassTemplateMember
Definition: Sema.h:11281
@ TPC_FunctionTemplate
Definition: Sema.h:11280
@ TPC_FriendClassTemplate
Definition: Sema.h:11282
@ TPC_FriendFunctionTemplateDefinition
Definition: Sema.h:11284
@ TPC_TypeAliasTemplate
Definition: Sema.h:11285
@ TPC_VarTemplate
Definition: Sema.h:11279
void ActOnPragmaVisibility(const IdentifierInfo *VisType, SourceLocation PragmaLoc)
ActOnPragmaVisibility - Called on well formed #pragma GCC visibility... .
Definition: SemaAttr.cpp:1357
void ActOnAbortSEHFinallyBlock()
Definition: SemaStmt.cpp:4411
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:6714
void ActOnFinishDelayedAttribute(Scope *S, Decl *D, ParsedAttributes &Attrs)
ActOnFinishDelayedAttribute - Invoked when we have finished parsing an attribute for which parsing is...
Definition: SemaDecl.cpp:16402
bool CheckQualifiedFunctionForTypeId(QualType T, SourceLocation Loc)
Definition: SemaType.cpp:1783
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
Definition: SemaExpr.cpp:3598
SemaAVR & AVR()
Definition: Sema.h:1056
SmallVector< LateInstantiatedAttribute, 16 > LateInstantiatedAttrVec
Definition: Sema.h:13660
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
Definition: SemaExpr.cpp:5581
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
bool checkTargetClonesAttrString(SourceLocation LiteralLoc, StringRef Str, const StringLiteral *Literal, Decl *D, bool &HasDefault, bool &HasCommas, bool &HasNotDefault, SmallVectorImpl< SmallString< 64 > > &StringsBuffer)
void DiagnoseAssignmentAsCondition(Expr *E)
DiagnoseAssignmentAsCondition - Given that an expression is being used as a boolean condition,...
Definition: SemaExpr.cpp:20295
SourceLocation OptimizeOffPragmaLocation
This represents the last location of a "#pragma clang optimize off" directive if such a directive has...
Definition: Sema.h:1731
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:2068
void handleDelayedAvailabilityCheck(sema::DelayedDiagnostic &DD, Decl *Ctx)
friend class ArgumentPackSubstitutionRAII
Definition: Sema.h:13227
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:1931
void PopDeclContext()
Definition: SemaDecl.cpp:1315
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)
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:2870
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:13094
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:6066
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition: Sema.h:13157
void PrintStats() const
Print out statistics about the semantic analysis.
Definition: Sema.cpp:608
ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc)
Definition: SemaExpr.cpp:15854
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:14577
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:997
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:6074
FormatStringType
Definition: Sema.h:2188
@ FST_NSString
Definition: Sema.h:2191
@ FST_Syslog
Definition: Sema.h:2198
@ FST_Unknown
Definition: Sema.h:2199
@ FST_Strftime
Definition: Sema.h:2192
@ FST_Printf
Definition: Sema.h:2190
@ FST_FreeBSDKPrintf
Definition: Sema.h:2195
@ FST_Scanf
Definition: Sema.h:2189
@ FST_Strfmon
Definition: Sema.h:2193
@ FST_OSLog
Definition: Sema.h:2197
@ FST_Kprintf
Definition: Sema.h:2194
@ FST_OSTrace
Definition: Sema.h:2196
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
Definition: Sema.h:1406
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:1579
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:12799
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD)
llvm::BumpPtrAllocator BumpAlloc
Definition: Sema.h:858
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:1935
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...
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:10752
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition: Sema.h:10760
@ BFRK_Build
Initial building of a for-range statement.
Definition: Sema.h:10754
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition: Sema.h:10757
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
Definition: SemaExpr.cpp:8879
SemaNVPTX & NVPTX()
Definition: Sema.h:1106
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:4124
void ActOnPragmaMSStrictGuardStackCheck(SourceLocation PragmaLocation, PragmaMsStackAction Action, bool Value)
ActOnPragmaMSStrictGuardStackCheck - Called on well formed #pragma strict_gs_check.
Definition: SemaAttr.cpp:871
void ActOnUninitializedDecl(Decl *dcl)
Definition: SemaDecl.cpp:13945
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:13113
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:1564
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:16794
bool BuiltinVectorMath(CallExpr *TheCall, QualType &Res, bool FPOnly=false)
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:9667
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:583
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:16301
OffsetOfKind
Definition: Sema.h:3866
@ OOK_Outside
Definition: Sema.h:3868
@ OOK_Macro
Definition: Sema.h:3873
@ OOK_Builtin
Definition: Sema.h:3870
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
Definition: SemaDecl.cpp:13386
QualType BuildTypeofExprType(Expr *E, TypeOfKind Kind)
Definition: SemaType.cpp:9540
bool isUsualDeallocationFunction(const CXXMethodDecl *FD)
PragmaSectionKind
Definition: Sema.h:1675
@ PSK_ConstSeg
Definition: Sema.h:1678
@ PSK_DataSeg
Definition: Sema.h:1676
@ PSK_CodeSeg
Definition: Sema.h:1679
@ PSK_BSSSeg
Definition: Sema.h:1677
TemplateDeductionResult FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned NumExplicitlySpecified, FunctionDecl *&Specialization, sema::TemplateDeductionInfo &Info, SmallVectorImpl< OriginalCallArg > const *OriginalCallArgs=nullptr, bool PartialOverloading=false, llvm::function_ref< bool()> CheckNonDependent=[] { return false;})
Finish template argument deduction for a function template, checking the deduced template arguments f...
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)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition: Sema.cpp:564
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
Definition: SemaExpr.cpp:20030
void addExternalSource(ExternalSemaSource *E)
Registers an external source.
Definition: Sema.cpp:594
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
Definition: SemaCast.cpp:296
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:16812
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:5809
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:18382
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:18078
CodeAlignAttr * BuildCodeAlignAttr(const AttributeCommonInfo &CI, Expr *E)
ExprResult ActOnStmtExprResult(ExprResult E)
Definition: SemaExpr.cpp:15898
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:4756
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
Definition: SemaDecl.cpp:4313
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:14230
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicDoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
Definition: SemaExpr.cpp:5953
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
Definition: SemaLambda.cpp:282
QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns, SourceLocation AttrLoc)
Definition: SemaType.cpp:2446
void DiagnoseEqualityWithExtraParens(ParenExpr *ParenE)
Redundant parentheses over an equality comparison can indicate that the user intended an assignment u...
Definition: SemaExpr.cpp:20351
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:3074
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition: Sema.cpp:1963
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:21161
bool checkFunctionOrMethodParameterIndex(const Decl *D, const AttrInfo &AI, unsigned AttrArgNum, const Expr *IdxExpr, ParamIdx &Idx, bool CanIndexImplicitThis=false)
Check if IdxExpr is a valid parameter index for a function or instance method D.
Definition: Sema.h:4703
void CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc, SourceLocation CallOperatorLoc, Expr *TrailingRequiresClause, TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind, StorageClass SC, ArrayRef< ParmVarDecl * > Params, bool HasExplicitResultType)
bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested, AcceptableKind Kind, bool OnlyNeedComplete=false)
Definition: SemaType.cpp:9097
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
Definition: SemaExpr.cpp:15345
PragmaClangSection PragmaClangBSSSection
Definition: Sema.h:1431
Decl * ActOnDeclarator(Scope *S, Declarator &D)
Definition: SemaDecl.cpp:6049
ExprResult ActOnNumericConstant(const Token &Tok, Scope *UDLScope=nullptr)
Definition: SemaExpr.cpp:3672
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
Definition: Sema.h:968
bool isTemplateTemplateParameterAtLeastAsSpecializedAs(TemplateParameterList *PParam, TemplateDecl *AArg, const DefaultArguments &DefaultArgs, SourceLocation Loc, bool IsDeduced)
AbstractDiagSelID
Definition: Sema.h:5755
@ AbstractSynthesizedIvarType
Definition: Sema.h:5762
@ AbstractVariableType
Definition: Sema.h:5759
@ AbstractReturnType
Definition: Sema.h:5757
@ AbstractNone
Definition: Sema.h:5756
@ AbstractFieldType
Definition: Sema.h:5760
@ AbstractArrayType
Definition: Sema.h:5763
@ AbstractParamType
Definition: Sema.h:5758
@ AbstractIvarType
Definition: Sema.h:5761
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
Definition: SemaExpr.cpp:2969
StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition: SemaStmt.cpp:953
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:7254
PragmaOptionsAlignKind
Definition: Sema.h:1784
@ POAK_Power
Definition: Sema.h:1788
@ POAK_Reset
Definition: Sema.h:1790
@ POAK_Packed
Definition: Sema.h:1787
@ POAK_Mac68k
Definition: Sema.h:1789
@ POAK_Natural
Definition: Sema.h:1786
@ POAK_Native
Definition: Sema.h:1785
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
Definition: SemaExpr.cpp:16153
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
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:1146
ParsedType getConstructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, bool EnteringContext)
Definition: SemaExprCXX.cpp:93
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
Definition: SemaExpr.cpp:4829
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:1703
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
Definition: Sema.h:7966
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:1237
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
Definition: SemaExpr.cpp:14768
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:541
QualType BuiltinChangeSignedness(QualType BaseType, UTTKind UKind, SourceLocation Loc)
Definition: SemaType.cpp:9886
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
Definition: SemaExpr.cpp:9154
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:1372
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:8133
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base)
Determine whether the type Derived is a C++ class that is derived from the type Base.
void ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc)
Called on well formed #pragma clang optimize.
Definition: SemaAttr.cpp:1242
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:6437
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:4686
QualType PreferredConditionType(ConditionKind K) const
Definition: Sema.h:7497
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.
void clearDelayedTypo(TypoExpr *TE)
Clears the state of the given TypoExpr.
LiteralOperatorLookupResult
The possible outcomes of name lookup for a literal operator.
Definition: Sema.h:9039
@ LOLR_ErrorNoDiagnostic
The lookup found no match but no diagnostic was issued.
Definition: Sema.h:9043
@ LOLR_Raw
The lookup found a single 'raw' literal operator, which expects a string literal containing the spell...
Definition: Sema.h:9049
@ LOLR_Error
The lookup resulted in an error.
Definition: Sema.h:9041
@ LOLR_Cooked
The lookup found a single 'cooked' literal operator, which expects a normal literal to be built and p...
Definition: Sema.h:9046
@ LOLR_StringTemplatePack
The lookup found an overload set of literal operator templates, which expect the character type and c...
Definition: Sema.h:9057
@ LOLR_Template
The lookup found an overload set of literal operator templates, which expect the characters of the sp...
Definition: Sema.h:9053
void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaWeakAlias - Called on well formed #pragma weak ident = ident.
Definition: SemaDecl.cpp:20326
sema::FunctionScopeInfo * getEnclosingFunction() const
Definition: Sema.cpp:2376
const ExpressionEvaluationContextRecord & parentEvaluationContext() const
Definition: Sema.h:6465
SemaLoongArch & LoongArch()
Definition: Sema.h:1086
void ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, Scope *CurScope)
ActOnBlockArguments - This callback allows processing of block arguments.
Definition: SemaExpr.cpp:16182
QualType CheckRemainderOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign=false)
Definition: SemaExpr.cpp:10620
CheckConstexprKind
Definition: Sema.h:5951
@ 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:13534
void CheckVariableDeclarationType(VarDecl *NewVD)
Definition: SemaDecl.cpp:8598
sema::CompoundScopeInfo & getCurCompoundScope() const
Definition: SemaStmt.cpp:447
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:2735
OpaquePtr< TemplateName > TemplateTy
Definition: Sema.h:901
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
Definition: SemaInit.cpp:9698
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:393
SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD)
Invoked when we enter a tag definition that we're skipping.
Definition: SemaDecl.cpp:1322
void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E)
Warn when implicitly casting 0 to nullptr.
Definition: Sema.cpp:644
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:13079
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:1442
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
Definition: SemaDecl.cpp:2435
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:2750
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:3055
void ActOnFinishOfCompoundStmt()
Definition: SemaStmt.cpp:443
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:1595
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:1275
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:15823
bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args)
Definition: Sema.h:14881
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
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:13365
QualType CheckSubtractionOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, QualType *CompLHSTy=nullptr)
Definition: SemaExpr.cpp:11062
static ConditionResult ConditionError()
Definition: Sema.h:7338
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
Definition: SemaStmt.cpp:451
void NoteTemplateParameterLocation(const NamedDecl &Decl)
SemaWasm & Wasm()
Definition: Sema.h:1166
ExprResult ActOnConvertVectorExpr(Expr *E, ParsedType ParsedDestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ActOnConvertVectorExpr - create a new convert-vector expression from the provided arguments.
Definition: SemaExpr.cpp:6724
bool CheckNonDependentConversions(FunctionTemplateDecl *FunctionTemplate, ArrayRef< QualType > ParamTypes, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, ConversionSequenceList &Conversions, bool SuppressUserConversions, 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 HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D)
const NormalizedConstraint * getNormalizedAssociatedConstraints(NamedDecl *ConstrainedDecl, ArrayRef< const Expr * > AssociatedConstraints)
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:3003
bool IsInvalidUnlessNestedName(Scope *S, CXXScopeSpec &SS, NestedNameSpecInfo &IdInfo, bool EnteringContext)
IsInvalidUnlessNestedName - This method is used for error recovery purposes to determine whether the ...
const TypoExprState & getTypoExprState(TypoExpr *TE) const
llvm::DenseSet< QualType > InstantiatedNonDependentTypes
Non-dependent types used in templates that have already been instantiated by some template instantiat...
Definition: Sema.h:13153
ExprResult checkUnknownAnyArg(SourceLocation callLoc, Expr *result, QualType &paramType)
Type-check an expression that's being passed to an __unknown_anytype parameter.
Definition: SemaExpr.cpp:20898
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:19982
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:5813
ExprResult ActOnBuiltinOffsetOf(Scope *S, SourceLocation BuiltinLoc, SourceLocation TypeLoc, ParsedType ParsedArgTy, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
Definition: SemaExpr.cpp:16096
SemaPseudoObject & PseudoObject()
Definition: Sema.h:1136
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
Definition: Sema.cpp:2337
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition: SemaStmt.cpp:608
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
Definition: Sema.h:11053
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:4244
FullExprArg MakeFullExpr(Expr *Arg)
Definition: Sema.h:7294
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:681
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:15193
void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
bool IsFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy)
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
Definition: Sema.h:7925
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition: Sema.h:900
static int getPrintable(int I)
Definition: Sema.h:14576
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:882
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
Definition: Sema.h:9309
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition: Sema.h:12487
StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, Stmt *SubStmt, Scope *CurScope)
Definition: SemaStmt.cpp:588
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TAH_IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
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:3375
bool CheckAltivecInitFromScalar(SourceRange R, QualType VecTy, QualType SrcTy)
Definition: SemaCast.cpp:2713
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:17905
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:14581
PragmaClangSectionKind
pragma clang section kind
Definition: Sema.h:1414
@ PCSK_Invalid
Definition: Sema.h:1415
@ PCSK_BSS
Definition: Sema.h:1416
@ PCSK_Data
Definition: Sema.h:1417
@ PCSK_Text
Definition: Sema.h:1419
@ PCSK_Relro
Definition: Sema.h:1420
@ PCSK_Rodata
Definition: Sema.h:1418
ExprResult ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
Definition: SemaExpr.cpp:7186
void warnOnReservedIdentifier(const NamedDecl *D)
Definition: SemaDecl.cpp:6036
StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprResult LHS, SourceLocation DotDotDotLoc, ExprResult RHS, SourceLocation ColonLoc)
Definition: SemaStmt.cpp:552
bool isCheckingDefaultArgumentOrInitializer() const
Definition: Sema.h:7793
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:16867
SemaARM & ARM()
Definition: Sema.h:1051
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:317
bool CheckQualifiedMemberReference(Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, const LookupResult &R)
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
static const char * getPrintable(const char *S)
Definition: Sema.h:14579
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.
QualType BuildMemberPointerType(QualType T, QualType Class, SourceLocation Loc, DeclarationName Entity)
Build a member pointer type T Class::*.
Definition: SemaType.cpp:2681
AllocationFunctionScope
The scope in which to find allocation functions.
Definition: Sema.h:8163
@ AFS_Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
Definition: Sema.h:8171
@ AFS_Class
Only look for allocation functions in the scope of the allocated class.
Definition: Sema.h:8168
@ AFS_Global
Only look for allocation functions in the global scope.
Definition: Sema.h:8165
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:5332
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
Definition: Sema.cpp:590
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
Definition: SemaType.cpp:2733
PragmaMsStackAction
Definition: Sema.h:1437
@ PSK_Push_Set
Definition: Sema.h:1443
@ PSK_Reset
Definition: Sema.h:1438
@ PSK_Pop_Set
Definition: Sema.h:1444
@ PSK_Show
Definition: Sema.h:1442
@ PSK_Pop
Definition: Sema.h:1441
@ PSK_Set
Definition: Sema.h:1439
@ PSK_Push
Definition: Sema.h:1440
StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body)
FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
Definition: SemaStmt.cpp:3153
ExprResult CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})
Process any TypoExprs in the given Expr and its children, generating diagnostics as appropriate and r...
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:8268
void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
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:5006
ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet)
Act on the result of classifying a name as an overload set.
Definition: SemaDecl.cpp:1264
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:832
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)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
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:84
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:333
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
Definition: Diagnostic.h:1102
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1778
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3564
Exposes information about the current target.
Definition: TargetInfo.h:220
A convenient class for passing around template argument information.
Definition: TemplateBase.h:632
A template argument list.
Definition: DeclTemplate.h:250
Location wrapper for a TemplateArgument.
Definition: TemplateBase.h:524
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:399
Represents a C++ template name within the type system.
Definition: TemplateName.h:220
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:73
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:4437
The top declaration context.
Definition: Decl.h:84
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition: ASTConcept.h:227
Represents a declaration of a type.
Definition: Decl.h:3370
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:153
A container of type source information.
Definition: Type.h:7902
The base class of the type hierarchy.
Definition: Type.h:1828
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:2511
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3514
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3413
Simple class containing the result of Sema::CorrectTypo.
TypoExpr - Internal placeholder for expressions where typo correction still needs to be performed and...
Definition: Expr.h:6837
Represents a C++ unqualified-id that has been parsed.
Definition: DeclSpec.h:1028
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition: ExprCXX.h:3203
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition: ExprCXX.h:3943
A set of unresolved declarations.
Definition: UnresolvedSet.h:62
Represents a C++ using-declaration.
Definition: DeclCXX.h:3530
Represents C++ using-directive.
Definition: DeclCXX.h:3033
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition: DeclCXX.h:3338
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:671
Represents a variable declaration or definition.
Definition: Decl.h:882
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: Type.h:4034
Represents a C++11 virt-specifier-seq.
Definition: DeclSpec.h:2783
Consumes visible declarations found when searching for all visible names within a given scope or cont...
Definition: Lookup.h:836
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:280
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
Definition: ExprConcepts.h:429
A static requirement that can be used in a requires-expression to check properties of types and expre...
Definition: ExprConcepts.h:168
A requires-expression requirement which queries the existence of a type name or type template special...
Definition: ExprConcepts.h:225
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 UINT_MAX
Definition: limits.h:64
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.
TypeSpecifierType
Specifies the kind of type.
Definition: Specifiers.h:55
ImplicitTypenameContext
Definition: DeclSpec.h:1886
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
Definition: OperatorKinds.h:21
PragmaFPKind
Definition: PragmaKinds.h:38
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:869
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
Definition: Sema.h:455
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
Definition: AttrIterator.h:30
CUDAFunctionTarget
Definition: Cuda.h:145
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...
PragmaMSCommentKind
Definition: PragmaKinds.h:14
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition: Specifiers.h:35
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
ArrayRef< std::pair< IdentifierInfo *, SourceLocation > > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
Definition: ModuleLoader.h:32
NullabilityKind
Describes the nullability of a particular type.
Definition: Specifiers.h:336
InClassInitStyle
In-class initialization styles for non-static data members.
Definition: Specifiers.h:271
CXXConstructionKind
Definition: ExprCXX.h:1538
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition: Specifiers.h:149
BinaryOperatorKind
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
Definition: Overload.h:84
TypeOfKind
The kind of 'typeof' expression we're after.
Definition: Type.h:910
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
Definition: CallGraph.h:204
CapturedRegionKind
The different kinds of captured statement.
Definition: CapturedStmt.h:16
StorageClass
Storage classes.
Definition: Specifiers.h:248
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
Definition: TypeTraits.h:51
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
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:2827
@ 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:1079
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition: Type.h:3574
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
bool isFunctionOrMethodVariadic(const Decl *D)
Definition: Attr.h:112
TagUseKind
Definition: Sema.h:447
MSVtorDispMode
In the Microsoft ABI, this controls the placement of virtual displacement members used to implement v...
Definition: LangOptions.h:36
UnaryOperatorKind
ActionResult< Expr * > ExprResult
Definition: Ownership.h:248
TagTypeKind
The kind of a tag type.
Definition: Type.h:6871
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
Definition: Ownership.h:262
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...
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
Definition: DeclTemplate.h:65
LangAS
Defines the address space values used by the address space qualifier of QualType.
Definition: AddressSpaces.h:25
CastKind
CastKind - The kind of operation required for a conversion.
TranslationUnitKind
Describes the kind of translation unit being processed.
Definition: LangOptions.h:1096
@ TU_Complete
The translation unit is a complete translation unit.
Definition: LangOptions.h:1098
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
Definition: LangOptions.h:1102
ComparisonCategoryType
An enumeration representing the different comparison categories types.
PragmaMSStructKind
Definition: PragmaKinds.h:23
AssignmentAction
Definition: Sema.h:211
ActionResult< Stmt * > StmtResult
Definition: Ownership.h:249
CXXSpecialMemberKind
Kinds of C++ special members.
Definition: Sema.h:423
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:250
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:229
const FunctionProtoType * T
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
Definition: Specifiers.h:398
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
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl * >, SourceLocation > UnexpandedParameterPack
Definition: Sema.h:236
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:365
@ 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.
@ Success
Template argument deduction was successful.
@ 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.
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.
SourceLocIdentKind
Definition: Expr.h:4797
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition: Type.h:6846
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
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:1975
CheckedConversionKind
The kind of conversion being performed.
Definition: Sema.h:434
@ 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.
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
MutableArrayRef< Expr * > MultiExprArg
Definition: Ownership.h:258
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
#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:89
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:240
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
Definition: Sema.h:247
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
Definition: Sema.h:243
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
Definition: Sema.h:253
uint8_t PointerKind
Which kind of pointer declarator we saw.
Definition: Sema.h:250
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Definition: Type.h:4840
Holds information about the various types of exception specification.
Definition: Type.h:5159
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition: Type.h:5161
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition: Type.h:5164
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition: Type.h:5167
Extra information about a function prototype.
Definition: Type.h:5187
Wraps an identifier and optional source location for the identifier.
Definition: ParsedAttr.h:103
Represents a complete lambda introducer.
Definition: DeclSpec.h:2835
Contains a late templated function.
Definition: Sema.h:15195
CachedTokens Toks
Definition: Sema.h:15196
FPOptions FPO
Floating-point options in the point of definition.
Definition: Sema.h:15200
Decl * D
The template function declaration to be late parsed.
Definition: Sema.h:15198
A normalized constraint, as defined in C++ [temp.constr.normal], is either an atomic constraint,...
Definition: SemaConcept.h:106
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
SourceLocation CurrentPragmaLocation
Definition: Sema.h:1650
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
Definition: Sema.h:12660
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition: Sema.h:12821
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
bool SavedInNonInstantiationSFINAEContext
Was the enclosing context a non-instantiation SFINAE context?
Definition: Sema.h:12774
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition: Sema.h:12790
sema::TemplateDeductionInfo * DeductionInfo
The template deduction info object associated with the substitution or checking of explicit or deduce...
Definition: Sema.h:12816
ArrayRef< TemplateArgument > template_arguments() const
Definition: Sema.h:12809
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
Definition: Sema.h:12785
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition: Sema.h:12777
unsigned NumCallArgs
The number of expressions in CallArgs.
Definition: Sema.h:12803
const Expr *const * CallArgs
The list of argument expressions in a synthesized call.
Definition: Sema.h:12793
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
Definition: Sema.h:12800
SynthesisKind
The kind of template instantiation we are performing.
Definition: Sema.h:12662
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition: Sema.h:12754
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition: Sema.h:12672
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition: Sema.h:12681
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition: Sema.h:12700
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition: Sema.h:12751
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition: Sema.h:12708
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition: Sema.h:12715
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition: Sema.h:12758
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition: Sema.h:12726
@ Memoization
Added for Template instantiation observation.
Definition: Sema.h:12764
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition: Sema.h:12691
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition: Sema.h:12770
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition: Sema.h:12767
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition: Sema.h:12688
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition: Sema.h:12696
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition: Sema.h:12704
@ TemplateInstantiation
We are instantiating a template declaration.
Definition: Sema.h:12665
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition: Sema.h:12718
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition: Sema.h:12722
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition: Sema.h:12677
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition: Sema.h:12748
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition: Sema.h:12711
Decl * Entity
The entity that is being synthesized.
Definition: Sema.h:12780
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition: Sema.h:12806
ConstraintEvalRAII(InstTy &TI)
Definition: Sema.h:13346
InitializationContext(SourceLocation Loc, ValueDecl *Decl, DeclContext *Context)
Definition: Sema.h:6383
Data structure used to record current or nested expression evaluation contexts.
Definition: Sema.h:6293
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:6325
llvm::SmallPtrSet< const Expr *, 8 > PossibleDerefs
Definition: Sema.h:6327
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition: Sema.h:6373
Decl * ManglingContextDecl
The declaration that provides context for lambda expressions and block literals if the normal declara...
Definition: Sema.h:6317
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:6321
SmallVector< Expr *, 2 > VolatileAssignmentLHSs
Expressions appearing as the LHS of a volatile assignment in this context.
Definition: Sema.h:6332
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:6340
llvm::SmallVector< ImmediateInvocationCandidate, 4 > ImmediateInvocationCandidates
Set of candidates for starting an immediate invocation.
Definition: Sema.h:6336
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition: Sema.h:6346
SmallVector< LambdaExpr *, 2 > Lambdas
The lambdas that are present within this context, if it is indeed an unevaluated context.
Definition: Sema.h:6312
ExpressionKind
Describes whether we are in an expression constext which we have to handle differently.
Definition: Sema.h:6350
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition: Sema.h:6376
CleanupInfo ParentCleanup
Whether the enclosing context needed a cleanup.
Definition: Sema.h:6298
unsigned NumTypos
The number of typos encountered during this expression evaluation context (i.e.
Definition: Sema.h:6306
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition: Sema.h:6393
ExpressionEvaluationContextRecord(ExpressionEvaluationContext Context, unsigned NumCleanupObjects, CleanupInfo ParentCleanup, Decl *ManglingContextDecl, ExpressionKind ExprContext)
Definition: Sema.h:6395
ExpressionEvaluationContext Context
The expression evaluation context.
Definition: Sema.h:6295
unsigned NumCleanupObjects
The number of active cleanup objects when we entered this expression evaluation context.
Definition: Sema.h:6302
FormatArgumentPassingKind ArgPassingKind
Definition: Sema.h:2170
std::optional< FunctionEffectWithCondition > Old
Definition: Sema.h:15102
StringRef effectName() const
Definition: Sema.h:15106
OverrideResult
Describes the result of effects differing between a base class's virtual method and an overriding met...
Definition: Sema.h:15114
std::optional< FunctionEffectWithCondition > New
Definition: Sema.h:15104
FunctionEffect::Kind EffectKind
Definition: Sema.h:15099
An RAII helper that pops function a function scope on exit.
Definition: Sema.h:929
A stack object to be created when performing template instantiation.
Definition: Sema.h:12845
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition: Sema.h:12999
bool isAlreadyInstantiating() const
Determine whether we are already instantiating this specialization in some surrounding active instant...
Definition: Sema.h:13003
LocalInstantiationScope * Scope
Definition: Sema.h:13653
LateInstantiatedAttribute(const Attr *A, LocalInstantiationScope *S, Decl *D)
Definition: Sema.h:13656
bool isMoveEligible() const
Definition: Sema.h:10814
bool isCopyElidable() const
Definition: Sema.h:10815
const VarDecl * Candidate
Definition: Sema.h:10809
Keeps information about an identifier in a nested-name-spec.
Definition: Sema.h:2810
IdentifierInfo * Identifier
The identifier preceding the '::'.
Definition: Sema.h:2816
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, ParsedType ObjectType=ParsedType())
Creates info object for the most typical case.
Definition: Sema.h:2825
SourceLocation IdentifierLoc
The location of the identifier.
Definition: Sema.h:2819
SourceLocation CCLoc
The location of the '::'.
Definition: Sema.h:2822
ParsedType ObjectType
The type of the object, if we're parsing nested-name-specifier in a member access expression.
Definition: Sema.h:2813
NestedNameSpecInfo(IdentifierInfo *II, SourceLocation IdLoc, SourceLocation ColonColonLoc, QualType ObjectType)
Definition: Sema.h:2831
SourceLocation LocEnd
Definition: Sema.h:7070
IdentifierInfo * IdentInfo
Definition: Sema.h:7073
brief A function argument from which we performed template argument
Definition: Sema.h:12249
OriginalCallArg(QualType OriginalParamType, bool DecomposedParam, unsigned ArgIdx, QualType OriginalArgType)
Definition: Sema.h:12250
This an attribute introduced by #pragma clang attribute.
Definition: Sema.h:1706
SmallVector< attr::SubjectMatchRule, 4 > MatchRules
Definition: Sema.h:1709
A push'd group of PragmaAttributeEntries.
Definition: Sema.h:1714
SourceLocation Loc
The location of the push attribute.
Definition: Sema.h:1716
SmallVector< PragmaAttributeEntry, 2 > Entries
Definition: Sema.h:1719
const IdentifierInfo * Namespace
The namespace of this push group.
Definition: Sema.h:1718
SourceLocation PragmaLocation
Definition: Sema.h:1428
PragmaMsStackAction Action
Definition: Sema.h:1448
Slot(llvm::StringRef StackSlotLabel, ValueType Value, SourceLocation PragmaLocation, SourceLocation PragmaPushLocation)
Definition: Sema.h:1561
llvm::StringRef StackSlotLabel
Definition: Sema.h:1557
SourceLocation PragmaLocation
Definition: Sema.h:1559
SourceLocation PragmaPushLocation
Definition: Sema.h:1560
ValueType CurrentValue
Definition: Sema.h:1631
void SentinelAction(PragmaMsStackAction Action, StringRef Label)
Definition: Sema.h:1617
bool hasValue() const
Definition: Sema.h:1627
SmallVector< Slot, 2 > Stack
Definition: Sema.h:1629
ValueType DefaultValue
Definition: Sema.h:1630
SourceLocation CurrentPragmaLocation
Definition: Sema.h:1632
PragmaStack(const ValueType &Default)
Definition: Sema.h:1624
void Act(SourceLocation PragmaLocation, PragmaMsStackAction Action, llvm::StringRef StackSlotLabel, ValueType Value)
Definition: Sema.h:1568
ProcessDeclAttributeOptions WithIgnoreTypeAttributes(bool Val)
Definition: Sema.h:4645
ProcessDeclAttributeOptions WithIncludeCXX11Attributes(bool Val)
Definition: Sema.h:4639
ReferenceConversions
The conversions that would be performed on an lvalue of type T2 when binding a reference of type T1 t...
Definition: Sema.h:10131
Abstract class used to diagnose incomplete types.
Definition: Sema.h:7858
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
virtual ~TypeDiagnoser()
Definition: Sema.h:7862
TypeTagData(QualType Type, bool LayoutCompatible, bool MustBeNull)
Definition: Sema.h:2219
unsigned LayoutCompatible
If true, Type should be compared with other expression's types for layout-compatibility.
Definition: Sema.h:2228
std::unique_ptr< TypoCorrectionConsumer > Consumer
Definition: Sema.h:9491
TypoDiagnosticGenerator DiagHandler
Definition: Sema.h:9492
TypoRecoveryCallback RecoveryHandler
Definition: Sema.h:9493
bool CheckSameAsPrevious
Definition: Sema.h:351
NamedDecl * Previous
Definition: Sema.h:352
SkipBodyInfo()=default
NamedDecl * New
Definition: Sema.h:353
Information about a template-id annotation token.