clang 22.0.0git
SemaChecking.cpp File Reference
#include "CheckExprLifetime.h"
#include "clang/AST/APValue.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTDiagnostic.h"
#include "clang/AST/Attr.h"
#include "clang/AST/AttrIterator.h"
#include "clang/AST/CharUnits.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclarationName.h"
#include "clang/AST/EvaluatedExprVisitor.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/FormatString.h"
#include "clang/AST/IgnoreExpr.h"
#include "clang/AST/NSAPI.h"
#include "clang/AST/NonTrivialTypeVisitor.h"
#include "clang/AST/OperationKinds.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/Type.h"
#include "clang/AST/TypeLoc.h"
#include "clang/AST/UnresolvedSet.h"
#include "clang/Basic/AddressSpaces.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/DiagnosticSema.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/OpenCLOptions.h"
#include "clang/Basic/OperatorKinds.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/Specifiers.h"
#include "clang/Basic/SyncScope.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/TypeTraits.h"
#include "clang/Lex/Lexer.h"
#include "clang/Sema/Initialization.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Ownership.h"
#include "clang/Sema/Scope.h"
#include "clang/Sema/ScopeInfo.h"
#include "clang/Sema/Sema.h"
#include "clang/Sema/SemaAMDGPU.h"
#include "clang/Sema/SemaARM.h"
#include "clang/Sema/SemaBPF.h"
#include "clang/Sema/SemaDirectX.h"
#include "clang/Sema/SemaHLSL.h"
#include "clang/Sema/SemaHexagon.h"
#include "clang/Sema/SemaLoongArch.h"
#include "clang/Sema/SemaMIPS.h"
#include "clang/Sema/SemaNVPTX.h"
#include "clang/Sema/SemaObjC.h"
#include "clang/Sema/SemaOpenCL.h"
#include "clang/Sema/SemaPPC.h"
#include "clang/Sema/SemaRISCV.h"
#include "clang/Sema/SemaSPIRV.h"
#include "clang/Sema/SemaSystemZ.h"
#include "clang/Sema/SemaWasm.h"
#include "clang/Sema/SemaX86.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/Locale.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/SaveAndRestore.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/RISCVTargetParser.h"
#include "llvm/TargetParser/Triple.h"
#include <algorithm>
#include <cassert>
#include <cctype>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <limits>
#include <optional>
#include <string>
#include <tuple>
#include <utility>
#include "clang/Basic/Builtins.inc"

Go to the source code of this file.

Macros

#define ATOMIC_BUILTIN(ID, TYPE, ATTRS)
#define BUILTIN_ROW(x)

Enumerations

enum  AbsoluteValueKind { AVK_Integer , AVK_Floating , AVK_Complex }
enum class  MathCheck { NaN , Inf }
enum  CFIUncheckedCalleeChange { None , Adding , Discarding }

Functions

static constexpr unsigned short combineFAPK (Sema::FormatArgumentPassingKind A, Sema::FormatArgumentPassingKind B)
static bool checkBuiltinVerboseTrap (CallExpr *Call, Sema &S)
static bool convertArgumentToType (Sema &S, Expr *&Value, QualType Ty)
static bool BuiltinAnnotation (Sema &S, CallExpr *TheCall)
 Check that the first argument to __builtin_annotation is an integer and the second argument is a non-wide string literal.
static bool BuiltinMSVCAnnotation (Sema &S, CallExpr *TheCall)
static bool BuiltinAddressof (Sema &S, CallExpr *TheCall)
 Check that the argument to __builtin_addressof is a glvalue, and set the result type to the corresponding pointer type.
static bool BuiltinFunctionStart (Sema &S, CallExpr *TheCall)
 Check that the argument to __builtin_function_start is a function.
static bool BuiltinPreserveAI (Sema &S, CallExpr *TheCall)
 Check the number of arguments and set the result type to the argument type.
static bool BuiltinAlignment (Sema &S, CallExpr *TheCall, unsigned ID)
 Check that the value argument for __builtin_is_aligned(value, alignment) and __builtin_aligned_{up,down}(value, alignment) is an integer or a pointer type (but not a function pointer) and that the alignment is a power-of-two.
static bool BuiltinOverflow (Sema &S, CallExpr *TheCall, unsigned BuiltinID)
static ExprResult BuiltinDumpStruct (Sema &S, CallExpr *TheCall)
static bool BuiltinCallWithStaticChain (Sema &S, CallExpr *BuiltinCall)
static bool ProcessFormatStringLiteral (const Expr *FormatExpr, StringRef &FormatStrRef, size_t &StrLen, ASTContext &Context)
static bool BuiltinSEHScopeCheck (Sema &SemaRef, CallExpr *TheCall, Scope::ScopeFlags NeededScopeFlags, unsigned DiagID)
static void builtinAllocaAddrSpace (Sema &S, CallExpr *TheCall)
static bool checkPointerAuthEnabled (Sema &S, Expr *E)
static bool checkPointerAuthKey (Sema &S, Expr *&Arg)
static std::pair< const ValueDecl *, CharUnitsfindConstantBaseAndOffset (Sema &S, Expr *E)
static bool checkPointerAuthValue (Sema &S, Expr *&Arg, PointerAuthOpKind OpKind, bool RequireConstant=false)
static ExprResult PointerAuthStrip (Sema &S, CallExpr *Call)
static ExprResult PointerAuthBlendDiscriminator (Sema &S, CallExpr *Call)
static ExprResult PointerAuthSignGenericData (Sema &S, CallExpr *Call)
static ExprResult PointerAuthSignOrAuth (Sema &S, CallExpr *Call, PointerAuthOpKind OpKind, bool RequireConstant)
static ExprResult PointerAuthAuthAndResign (Sema &S, CallExpr *Call)
static ExprResult PointerAuthStringDiscriminator (Sema &S, CallExpr *Call)
static ExprResult GetVTablePointer (Sema &S, CallExpr *Call)
static ExprResult BuiltinLaunder (Sema &S, CallExpr *TheCall)
static ExprResult BuiltinIsWithinLifetime (Sema &S, CallExpr *TheCall)
static ExprResult BuiltinTriviallyRelocate (Sema &S, CallExpr *TheCall)
static bool CheckBuiltinTargetNotInUnsupported (Sema &S, unsigned BuiltinID, CallExpr *TheCall, ArrayRef< llvm::Triple::ObjectFormatType > UnsupportedObjectFormatTypes)
static bool CheckBuiltinTargetInSupported (Sema &S, CallExpr *TheCall, ArrayRef< llvm::Triple::ArchType > SupportedArchs)
static void CheckNonNullArgument (Sema &S, const Expr *ArgExpr, SourceLocation CallSiteLoc)
static bool checkMathBuiltinElementType (Sema &S, SourceLocation Loc, QualType ArgTy, Sema::EltwiseBuiltinArgTyRestriction ArgTyRestr, int ArgOrdinal)
static bool BuiltinCpu (Sema &S, const TargetInfo &TI, CallExpr *TheCall, const TargetInfo *AuxTI, unsigned BuiltinID)
 BuiltinCpu{Supports|Is} - Handle __builtin_cpu_{supports|is}(char *).
static bool BuiltinPopcountg (Sema &S, CallExpr *TheCall)
 Checks that __builtin_popcountg was called with a single argument, which is an unsigned integer.
static bool BuiltinCountZeroBitsGeneric (Sema &S, CallExpr *TheCall)
 Checks that __builtin_{clzg,ctzg} was called with a first argument, which is an unsigned integer, and an optional second argument, which is promoted to an 'int'.
static bool CheckMaskedBuiltinArgs (Sema &S, Expr *MaskArg, Expr *PtrArg, unsigned Pos)
static ExprResult BuiltinMaskedLoad (Sema &S, CallExpr *TheCall)
static ExprResult BuiltinMaskedStore (Sema &S, CallExpr *TheCall)
static ExprResult BuiltinInvoke (Sema &S, CallExpr *TheCall)
static bool CheckNonNullExpr (Sema &S, const Expr *Expr)
 Checks if a the given expression evaluates to null.
static bool isNonNullType (QualType type)
 Determine whether the given type has a non-null nullability annotation.
static void CheckNonNullArguments (Sema &S, const NamedDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< const Expr * > Args, SourceLocation CallSiteLoc)
static bool isValidOrderingForOp (int64_t Ordering, AtomicExpr::AtomicOp Op)
static bool checkBuiltinArgument (Sema &S, CallExpr *E, unsigned ArgIndex)
 checkBuiltinArgument - Given a call to a builtin function, perform normal type-checking on the given argument, updating the call in place.
static bool checkVAStartABI (Sema &S, unsigned BuiltinID, Expr *Fn)
 Check that the user is calling the appropriate va_start builtin for the target and calling convention.
static bool checkVAStartIsInVariadicFunction (Sema &S, Expr *Fn, ParmVarDecl **LastParam=nullptr)
static bool IsShiftedByte (llvm::APSInt Value)
static void sumOffsets (llvm::APSInt &Offset, llvm::APSInt Addend, BinaryOperatorKind BinOpKind, bool AddendIsRight)
static void CheckFormatString (Sema &S, const FormatStringLiteral *FExpr, const StringLiteral *ReferenceFormatString, const Expr *OrigFormatExpr, ArrayRef< const Expr * > Args, Sema::FormatArgumentPassingKind APK, unsigned format_idx, unsigned firstDataArg, FormatStringType Type, bool inFunctionCall, VariadicCallType CallType, llvm::SmallBitVector &CheckedVarArgs, UncoveredArgHandler &UncoveredArg, bool IgnoreStringsWithoutSpecifiers)
static const ExprmaybeConstEvalStringLiteral (ASTContext &Context, const Expr *E)
static StringLiteralCheckType checkFormatStringExpr (Sema &S, const StringLiteral *ReferenceFormatString, const Expr *E, ArrayRef< const Expr * > Args, Sema::FormatArgumentPassingKind APK, unsigned format_idx, unsigned firstDataArg, FormatStringType Type, VariadicCallType CallType, bool InFunctionCall, llvm::SmallBitVector &CheckedVarArgs, UncoveredArgHandler &UncoveredArg, llvm::APSInt Offset, bool IgnoreStringsWithoutSpecifiers=false)
template<typename MemberKind>
static llvm::SmallPtrSet< MemberKind *, 1 > CXXRecordMembersNamed (StringRef Name, Sema &S, QualType Ty)
static bool requiresParensToAddCast (const Expr *E)
static std::pair< QualType, StringRef > shouldNotPrintDirectly (const ASTContext &Context, QualType IntendedTy, const Expr *E)
static bool isArithmeticArgumentPromotion (Sema &S, const ImplicitCastExpr *ICE)
 Return true if ICE is an implicit argument promotion of an arithmetic type.
static analyze_format_string::ArgType::MatchKind handleFormatSignedness (analyze_format_string::ArgType::MatchKind Match, DiagnosticsEngine &Diags, SourceLocation Loc)
static bool CompareFormatSpecifiers (Sema &S, const StringLiteral *Ref, ArrayRef< EquatableFormatArgument > RefArgs, const StringLiteral *Fmt, ArrayRef< EquatableFormatArgument > FmtArgs, const Expr *FmtExpr, bool InFunctionCall)
static unsigned getLargerAbsoluteValueFunction (unsigned AbsFunction)
static QualType getAbsoluteValueArgumentType (ASTContext &Context, unsigned AbsType)
static unsigned getBestAbsFunction (ASTContext &Context, QualType ArgType, unsigned AbsFunctionKind)
static AbsoluteValueKind getAbsoluteValueKind (QualType T)
static unsigned changeAbsFunction (unsigned AbsKind, AbsoluteValueKind ValueKind)
static unsigned getAbsoluteValueFunctionKind (const FunctionDecl *FDecl)
static void emitReplacement (Sema &S, SourceLocation Loc, SourceRange Range, unsigned AbsKind, QualType ArgType)
template<std::size_t StrLen>
static bool IsStdFunction (const FunctionDecl *FDecl, const char(&Str)[StrLen])
static bool IsInfOrNanFunction (StringRef calleeName, MathCheck Check)
static bool IsInfinityFunction (const FunctionDecl *FDecl)
static bool CheckMemorySizeofForComparison (Sema &S, const Expr *E, const IdentifierInfo *FnName, SourceLocation FnLoc, SourceLocation RParenLoc)
 Takes the expression passed to the size_t parameter of functions such as memcmp, strncat, etc and warns if it's a comparison.
static const CXXRecordDeclgetContainedDynamicClass (QualType T, bool &IsContained)
 Determine whether the given type is or contains a dynamic class type (e.g., whether it has a vtable).
static const UnaryExprOrTypeTraitExprgetAsSizeOfExpr (const Expr *E)
static const ExprgetSizeOfExprArg (const Expr *E)
 If E is a sizeof expression, returns its argument expression, otherwise returns NULL.
static QualType getSizeOfArgType (const Expr *E)
 If E is a sizeof expression, returns its argument type.
static bool doesExprLikelyComputeSize (const Expr *SizeofExpr)
 Detect if SizeofExpr is likely to calculate the sizeof an object.
static bool isArgumentExpandedFromMacro (SourceManager &SM, SourceLocation CallLoc, SourceLocation ArgLoc)
 Check if the ArgLoc originated from a macro passed to the call at CallLoc.
static void CheckMemaccessSize (Sema &S, unsigned BId, const CallExpr *Call)
 Diagnose cases like 'memset(buf, sizeof(buf), 0)', which should have the last two arguments transposed.
static const ExprignoreLiteralAdditions (const Expr *Ex, ASTContext &Ctx)
static bool isConstantSizeArrayWithMoreThanOneElement (QualType Ty, ASTContext &Context)
static bool referToTheSameDecl (const Expr *E1, const Expr *E2)
 Check if two expressions refer to the same declaration.
static const ExprgetStrlenExprArg (const Expr *E)
static IntRange GetValueRange (llvm::APSInt &value, unsigned MaxWidth)
static IntRange GetValueRange (APValue &result, QualType Ty, unsigned MaxWidth)
static QualType GetExprType (const Expr *E)
static std::optional< IntRange > TryGetExprRange (ASTContext &C, const Expr *E, unsigned MaxWidth, bool InConstantContext, bool Approximate)
 Attempts to estimate an approximate range for the given integer expression.
static std::optional< IntRange > TryGetExprRange (ASTContext &C, const Expr *E, bool InConstantContext, bool Approximate)
static bool IsSameFloatAfterCast (const llvm::APFloat &value, const llvm::fltSemantics &Src, const llvm::fltSemantics &Tgt)
 Checks whether the given value, which currently has the given source semantics, has the same value when coerced through the target semantics.
static bool IsSameFloatAfterCast (const APValue &value, const llvm::fltSemantics &Src, const llvm::fltSemantics &Tgt)
 Checks whether the given value, which currently has the given source semantics, has the same value when coerced through the target semantics.
static void AnalyzeImplicitConversions (Sema &S, Expr *OrigE, SourceLocation CC, bool IsListInit)
 AnalyzeImplicitConversions - Find and report any interesting implicit conversions in the given expression.
static bool IsEnumConstOrFromMacro (Sema &S, const Expr *E)
static bool isKnownToHaveUnsignedValue (const Expr *E)
static bool HasEnumType (const Expr *E)
static int classifyConstantValue (Expr *Constant)
static bool CheckTautologicalComparison (Sema &S, BinaryOperator *E, Expr *Constant, Expr *Other, const llvm::APSInt &Value, bool RhsConstant)
static void AnalyzeImpConvsInComparison (Sema &S, BinaryOperator *E)
 Analyze the operands of the given comparison.
static void AnalyzeComparison (Sema &S, BinaryOperator *E)
 Implements -Wsign-compare.
static bool AnalyzeBitFieldAssignment (Sema &S, FieldDecl *Bitfield, Expr *Init, SourceLocation InitLoc)
 Analyzes an attempt to assign the given value to a bitfield.
static void AnalyzeAssignment (Sema &S, BinaryOperator *E)
 Analyze the given simple or compound assignment for warning-worthy operations.
static void DiagnoseImpCast (Sema &S, const Expr *E, QualType SourceType, QualType T, SourceLocation CContext, unsigned diag, bool PruneControlFlow=false)
 Diagnose an implicit cast; purely a helper for CheckImplicitConversion.
static void DiagnoseImpCast (Sema &S, const Expr *E, QualType T, SourceLocation CContext, unsigned diag, bool PruneControlFlow=false)
 Diagnose an implicit cast; purely a helper for CheckImplicitConversion.
static void DiagnoseFloatingImpCast (Sema &S, const Expr *E, QualType T, SourceLocation CContext)
 Diagnose an implicit cast from a floating point value to an integer value.
static void AnalyzeCompoundAssignment (Sema &S, BinaryOperator *E)
 Analyze the given compound assignment for the possible losing of floating-point precision.
static std::string PrettyPrintInRange (const llvm::APSInt &Value, IntRange Range)
static bool IsImplicitBoolFloatConversion (Sema &S, const Expr *Ex, bool ToBool)
static void CheckImplicitArgumentConversions (Sema &S, const CallExpr *TheCall, SourceLocation CC)
static void DiagnoseNullConversion (Sema &S, Expr *E, QualType T, SourceLocation CC)
static bool isSameWidthConstantConversion (Sema &S, Expr *E, QualType T, SourceLocation CC)
static const IntegerLiteralgetIntegerLiteral (Expr *E)
static void DiagnoseIntInBoolContext (Sema &S, Expr *E)
static void DiagnoseMixedUnicodeImplicitConversion (Sema &S, const Type *Source, const Type *Target, Expr *E, QualType T, SourceLocation CC)
static CFIUncheckedCalleeChange AdjustingCFIUncheckedCallee (QualType From, QualType To)
static void CheckConditionalOperator (Sema &S, AbstractConditionalOperator *E, SourceLocation CC, QualType T)
static void CheckConditionalOperand (Sema &S, Expr *E, QualType T, SourceLocation CC, bool &ICContext)
static void CheckBoolLikeConversion (Sema &S, Expr *E, SourceLocation CC)
 Check conversion of given expression to boolean.
static void CheckCommaOperand (Sema &S, Expr *E, QualType T, SourceLocation CC, bool ExtraCheckForImplicitConversion, llvm::SmallVectorImpl< AnalyzeImplicitConversionsWorkItem > &WorkList)
static void AnalyzeImplicitConversions (Sema &S, AnalyzeImplicitConversionsWorkItem Item, llvm::SmallVectorImpl< AnalyzeImplicitConversionsWorkItem > &WorkList)
 Data recursive variant of AnalyzeImplicitConversions.
static bool CheckForReference (Sema &SemaRef, const Expr *E, const PartialDiagnostic &PD)
static bool IsInAnyMacroBody (const SourceManager &SM, SourceLocation Loc)
static void diagnoseArrayStarInParamType (Sema &S, QualType PType, SourceLocation Loc)
static std::optional< std::pair< CharUnits, CharUnits > > getBaseAlignmentAndOffsetFromPtr (const Expr *E, ASTContext &Ctx)
 This helper function takes a pointer expression and returns the alignment of a VarDecl and a constant offset from the VarDecl.
static std::pair< CharUnits, CharUnitsgetDerivedToBaseAlignmentAndOffset (const CastExpr *CE, QualType DerivedType, CharUnits BaseAlignment, CharUnits Offset, ASTContext &Ctx)
 Compute the alignment and offset of the base class object given the derived-to-base cast expression and the alignment and offset of the derived class object.
static std::optional< std::pair< CharUnits, CharUnits > > getAlignmentAndOffsetFromBinAddOrSub (const Expr *PtrE, const Expr *IntE, bool IsSub, ASTContext &Ctx)
 Compute the alignment and offset of a binary additive operator.
static std::optional< std::pair< CharUnits, CharUnits > > getBaseAlignmentAndOffsetFromLValue (const Expr *E, ASTContext &Ctx)
 This helper function takes an lvalue expression and returns the alignment of a VarDecl and a constant offset from the VarDecl.
static CharUnits getPresumedAlignmentOfPointer (const Expr *E, Sema &S)
static bool checkUnsafeAssignLiteral (Sema &S, SourceLocation Loc, Expr *RHS, bool isProperty)
static bool checkUnsafeAssignObject (Sema &S, SourceLocation Loc, Qualifiers::ObjCLifetime LT, Expr *RHS, bool isProperty)
static bool ShouldDiagnoseEmptyStmtBody (const SourceManager &SourceMgr, SourceLocation StmtLoc, const NullStmt *Body)
static bool isLayoutCompatible (const ASTContext &C, QualType T1, QualType T2)
 Check if two types are layout-compatible in C++11 sense.
static bool isLayoutCompatible (const ASTContext &C, const EnumDecl *ED1, const EnumDecl *ED2)
 Check if two enumeration types are layout-compatible.
static bool isLayoutCompatible (const ASTContext &C, const FieldDecl *Field1, const FieldDecl *Field2, bool AreUnionMembers=false)
 Check if two fields are layout-compatible.
static bool isLayoutCompatibleStruct (const ASTContext &C, const RecordDecl *RD1, const RecordDecl *RD2)
 Check if two standard-layout structs are layout-compatible.
static bool isLayoutCompatibleUnion (const ASTContext &C, const RecordDecl *RD1, const RecordDecl *RD2)
 Check if two standard-layout unions are layout-compatible.
static bool isLayoutCompatible (const ASTContext &C, const RecordDecl *RD1, const RecordDecl *RD2)
static bool FindTypeTagExpr (const Expr *TypeExpr, const ASTContext &Ctx, const ValueDecl **VD, uint64_t *MagicValue, bool isConstantEvaluated)
 Given a type tag expression find the type tag itself.
static bool GetMatchingCType (const IdentifierInfo *ArgumentKind, const Expr *TypeExpr, const ASTContext &Ctx, const llvm::DenseMap< Sema::TypeTagMagicValue, Sema::TypeTagData > *MagicValues, bool &FoundWrongKind, Sema::TypeTagData &TypeInfo, bool isConstantEvaluated)
 Retrieve the C type corresponding to type tag TypeExpr.
static bool IsSameCharType (QualType T1, QualType T2)
static ExprResult BuiltinVectorMathConversions (Sema &S, Expr *E)
static bool checkBuiltinVectorMathMixedEnums (Sema &S, Expr *LHS, Expr *RHS, SourceLocation Loc)
static bool checkBuiltinVectorMathArgTypes (Sema &SemaRef, ArrayRef< Expr * > Args)
 Check if all arguments have the same type.
static std::optional< unsignedgetAndVerifyMatrixDimension (Expr *Expr, StringRef Name, Sema &S)

Macro Definition Documentation

◆ ATOMIC_BUILTIN

#define ATOMIC_BUILTIN ( ID,
TYPE,
ATTRS )
Value:
case Builtin::BI##ID: \
return AtomicOpsOverloaded(TheCallResult, AtomicExpr::AO##ID);

◆ BUILTIN_ROW

#define BUILTIN_ROW ( x)
Value:
{ Builtin::BI##x##_1, Builtin::BI##x##_2, Builtin::BI##x##_4, \
Builtin::BI##x##_8, Builtin::BI##x##_16 }
__inline void unsigned int _2

Enumeration Type Documentation

◆ AbsoluteValueKind

Enumerator
AVK_Integer 
AVK_Floating 
AVK_Complex 

Definition at line 9217 of file SemaChecking.cpp.

◆ CFIUncheckedCalleeChange

Enumerator
None 
Adding 
Discarding 

Definition at line 12170 of file SemaChecking.cpp.

◆ MathCheck

enum class MathCheck
strong
Enumerator
NaN 
Inf 

Definition at line 9428 of file SemaChecking.cpp.

Function Documentation

◆ AdjustingCFIUncheckedCallee()

CFIUncheckedCalleeChange AdjustingCFIUncheckedCallee ( QualType From,
QualType To )
static

◆ AnalyzeAssignment()

◆ AnalyzeBitFieldAssignment()

◆ AnalyzeComparison()

◆ AnalyzeCompoundAssignment()

◆ AnalyzeImpConvsInComparison()

void AnalyzeImpConvsInComparison ( Sema & S,
BinaryOperator * E )
static

Analyze the operands of the given comparison.

Implements the fallback case from AnalyzeComparison.

Definition at line 11462 of file SemaChecking.cpp.

References AnalyzeImplicitConversions(), clang::BinaryOperator::getLHS(), clang::BinaryOperator::getOperatorLoc(), and clang::BinaryOperator::getRHS().

Referenced by AnalyzeComparison().

◆ AnalyzeImplicitConversions() [1/2]

void AnalyzeImplicitConversions ( Sema & S,
AnalyzeImplicitConversionsWorkItem Item,
llvm::SmallVectorImpl< AnalyzeImplicitConversionsWorkItem > & WorkList )
static

Data recursive variant of AnalyzeImplicitConversions.

Subexpressions that should be visited are added to WorkList.

Analyze the given comma operator. The basic idea behind the analysis is to analyze the left and right operands slightly differently. The left operand needs to check whether the operand itself has an implicit conversion, but not whether the left operand induces an implicit conversion for the entire comma expression itself. This is similar to how CheckConditionalOperand behaves; it's as-if the correct operand were directly used for the implicit conversion check.

Definition at line 12802 of file SemaChecking.cpp.

References AnalyzeAssignment(), AnalyzeComparison(), AnalyzeCompoundAssignment(), clang::Call, CheckBoolLikeConversion(), CheckCommaOperand(), CheckConditionalOperator(), CheckImplicitArgumentConversions(), clang::Sema::CheckImplicitConversion(), clang::Stmt::children(), clang::Sema::Context, clang::FixItHint::CreateReplacement(), clang::SemaBase::Diag(), clang::Stmt::getBeginLoc(), clang::BinaryOperator::getExprLoc(), clang::Expr::getExprLoc(), clang::Sema::getLangOpts(), clang::BinaryOperator::getLHS(), clang::Lexer::getLocForEndOfToken(), clang::BinaryOperator::getOpcode(), clang::BinaryOperator::getRHS(), clang::Sema::getSourceManager(), clang::Stmt::getSourceRange(), clang::Lexer::getSourceText(), clang::CharSourceRange::getTokenRange(), clang::Expr::getType(), clang::Expr::IgnoreParenImpCasts(), clang::isa(), clang::Type::isAtomicType(), clang::BinaryOperator::isLogicalOp(), clang::Expr::isTypeDependent(), clang::Expr::isValueDependent(), clang::Type::isVoidType(), SM, and clang::T.

◆ AnalyzeImplicitConversions() [2/2]

void AnalyzeImplicitConversions ( Sema & S,
Expr * OrigE,
SourceLocation CC,
bool IsListInit )
static

AnalyzeImplicitConversions - Find and report any interesting implicit conversions in the given expression.

There are a couple of competing diagnostics here, -Wconversion and -Wsign-compare.

Definition at line 13001 of file SemaChecking.cpp.

References AnalyzeImplicitConversions().

Referenced by AnalyzeAssignment(), AnalyzeComparison(), AnalyzeCompoundAssignment(), AnalyzeImpConvsInComparison(), AnalyzeImplicitConversions(), CheckConditionalOperand(), and CheckConditionalOperator().

◆ BuiltinAddressof()

bool BuiltinAddressof ( Sema & S,
CallExpr * TheCall )
static

Check that the argument to __builtin_addressof is a glvalue, and set the result type to the corresponding pointer type.

Definition at line 268 of file SemaChecking.cpp.

References clang::Sema::CheckAddressOfOperand(), clang::Sema::checkArgCount(), clang::ActionResult< PtrTy, Compress >::get(), clang::CallExpr::getArg(), clang::CallExpr::getBeginLoc(), clang::QualType::isNull(), clang::CallExpr::setArg(), and clang::Expr::setType().

◆ BuiltinAlignment()

◆ builtinAllocaAddrSpace()

◆ BuiltinAnnotation()

bool BuiltinAnnotation ( Sema & S,
CallExpr * TheCall )
static

Check that the first argument to __builtin_annotation is an integer and the second argument is a non-wide string literal.

Definition at line 218 of file SemaChecking.cpp.

References clang::Sema::checkArgCount(), clang::SemaBase::Diag(), clang::CallExpr::getArg(), clang::Stmt::getBeginLoc(), clang::Stmt::getSourceRange(), clang::Expr::getType(), clang::Expr::IgnoreParenCasts(), clang::Type::isIntegerType(), and clang::Expr::setType().

◆ BuiltinCallWithStaticChain()

◆ BuiltinCountZeroBitsGeneric()

◆ BuiltinCpu()

bool BuiltinCpu ( Sema & S,
const TargetInfo & TI,
CallExpr * TheCall,
const TargetInfo * AuxTI,
unsigned BuiltinID )
static

◆ BuiltinDumpStruct()

◆ BuiltinFunctionStart()

◆ BuiltinInvoke()

◆ BuiltinIsWithinLifetime()

◆ BuiltinLaunder()

◆ BuiltinMaskedLoad()

◆ BuiltinMaskedStore()

◆ BuiltinMSVCAnnotation()

◆ BuiltinOverflow()

◆ BuiltinPopcountg()

◆ BuiltinPreserveAI()

bool BuiltinPreserveAI ( Sema & S,
CallExpr * TheCall )
static

Check the number of arguments and set the result type to the argument type.

Definition at line 310 of file SemaChecking.cpp.

References clang::Sema::checkArgCount(), clang::CallExpr::getArg(), clang::Expr::getType(), and clang::Expr::setType().

◆ BuiltinSEHScopeCheck()

◆ BuiltinTriviallyRelocate()

◆ BuiltinVectorMathConversions()

◆ changeAbsFunction()

unsigned changeAbsFunction ( unsigned AbsKind,
AbsoluteValueKind ValueKind )
static

Definition at line 9236 of file SemaChecking.cpp.

References AVK_Complex, AVK_Floating, and AVK_Integer.

◆ CheckBoolLikeConversion()

void CheckBoolLikeConversion ( Sema & S,
Expr * E,
SourceLocation CC )
static

Check conversion of given expression to boolean.

Input argument E is a logical expression.

Definition at line 12770 of file SemaChecking.cpp.

References clang::ASTContext::BoolTy, clang::Sema::CheckImplicitConversion(), clang::Sema::Context, clang::Sema::getLangOpts(), clang::Expr::getType(), clang::Expr::IgnoreParenImpCasts(), and clang::Type::isAtomicType().

Referenced by AnalyzeImplicitConversions().

◆ checkBuiltinArgument()

bool checkBuiltinArgument ( Sema & S,
CallExpr * E,
unsigned ArgIndex )
static

checkBuiltinArgument - Given a call to a builtin function, perform normal type-checking on the given argument, updating the call in place.

This is useful when a builtin function requires custom type-checking for some of its arguments but not necessarily all of them.

Returns true on error.

Definition at line 4655 of file SemaChecking.cpp.

References clang::Sema::Context, clang::ActionResult< PtrTy, Compress >::get(), clang::CallExpr::getArg(), clang::CallExpr::getDirectCallee(), clang::InitializedEntity::InitializeParameter(), clang::ActionResult< PtrTy, Compress >::isInvalid(), clang::Sema::PerformCopyInitialization(), and clang::CallExpr::setArg().

◆ CheckBuiltinTargetInSupported()

bool CheckBuiltinTargetInSupported ( Sema & S,
CallExpr * TheCall,
ArrayRef< llvm::Triple::ArchType > SupportedArchs )
static

◆ CheckBuiltinTargetNotInUnsupported()

bool CheckBuiltinTargetNotInUnsupported ( Sema & S,
unsigned BuiltinID,
CallExpr * TheCall,
ArrayRef< llvm::Triple::ObjectFormatType > UnsupportedObjectFormatTypes )
static

◆ checkBuiltinVectorMathArgTypes()

bool checkBuiltinVectorMathArgTypes ( Sema & SemaRef,
ArrayRef< Expr * > Args )
static

Check if all arguments have the same type.

If the types don't match, emit an error message and return true. Otherwise return false.

For scalars we directly compare their unqualified types. But even if we compare unqualified vector types, a difference in qualifiers in the element types can make the vector types be considered not equal. For example, vector of 4 'const float' values vs vector of 4 'float' values. So we compare unqualified types of their elements and number of elements.

Definition at line 15876 of file SemaChecking.cpp.

References clang::Type::castAs(), clang::Sema::Context, clang::SemaBase::Diag(), clang::Stmt::getBeginLoc(), clang::Expr::getType(), clang::ASTContext::hasSameUnqualifiedType(), and clang::Type::isVectorType().

Referenced by clang::Sema::BuiltinElementwiseTernaryMath(), and clang::Sema::BuiltinVectorMath().

◆ checkBuiltinVectorMathMixedEnums()

◆ checkBuiltinVerboseTrap()

bool checkBuiltinVerboseTrap ( CallExpr * Call,
Sema & S )
static

Definition at line 177 of file SemaChecking.cpp.

References clang::Call, clang::Sema::Context, and clang::SemaBase::Diag().

◆ CheckCommaOperand()

void CheckCommaOperand ( Sema & S,
Expr * E,
QualType T,
SourceLocation CC,
bool ExtraCheckForImplicitConversion,
llvm::SmallVectorImpl< AnalyzeImplicitConversionsWorkItem > & WorkList )
static

◆ CheckConditionalOperand()

◆ CheckConditionalOperator()

◆ CheckFormatString()

◆ checkFormatStringExpr()

StringLiteralCheckType checkFormatStringExpr ( Sema & S,
const StringLiteral * ReferenceFormatString,
const Expr * E,
ArrayRef< const Expr * > Args,
Sema::FormatArgumentPassingKind APK,
unsigned format_idx,
unsigned firstDataArg,
FormatStringType Type,
VariadicCallType CallType,
bool InFunctionCall,
llvm::SmallBitVector & CheckedVarArgs,
UncoveredArgHandler & UncoveredArg,
llvm::APSInt Offset,
bool IgnoreStringsWithoutSpecifiers = false )
static

Definition at line 6328 of file SemaChecking.cpp.

References clang::Sema::FormatStringInfo::ArgPassingKind, clang::C, clang::cast(), CheckFormatString(), checkFormatStringExpr(), combineFAPK(), clang::Cond, clang::Sema::Context, clang::SemaBase::Diag(), clang::Expr::EvaluateAsInt(), clang::Sema::FAPK_Fixed, clang::Sema::FAPK_VAList, clang::Sema::FAPK_Variadic, clang::Sema::FormatStringInfo::FormatIdx, clang::CallExpr::getArg(), clang::ASTContext::getAsArrayType(), clang::Sema::getASTContext(), clang::Stmt::getBeginLoc(), clang::FunctionDecl::getBuiltinID(), clang::CallExpr::getCalleeDecl(), clang::DeclRefExpr::getDecl(), clang::Sema::getFormatStringInfo(), clang::Sema::GetFormatStringType(), clang::Sema::GetFormatStringTypeName(), clang::NamedDecl::getIdentifier(), clang::APValue::getInt(), clang::StringLiteral::getLength(), clang::BinaryOperator::getLHS(), clang::BinaryOperator::getOpcode(), clang::UnaryOperator::getOpcode(), clang::BinaryOperator::getRHS(), clang::Stmt::getStmtClass(), clang::StringLiteral::getString(), clang::UnaryOperator::getSubExpr(), clang::Expr::getType(), clang::Expr::IgnoreParenCasts(), clang::Init, clang::BinaryOperator::isAdditiveOp(), clang::Sema::isConstantEvaluatedContext(), IsFirst, clang::Expr::isNullPointerConstant(), clang::IdentifierInfo::isStr(), clang::Expr::isTypeDependent(), clang::Expr::isValueDependent(), maybeConstEvalStringLiteral(), clang::Expr::NPC_ValueDependentIsNotNull, clang::Expr::SE_NoSideEffects, sumOffsets(), clang::T, and clang::Expr::EvalResult::Val.

Referenced by checkFormatStringExpr().

◆ CheckForReference()

◆ CheckImplicitArgumentConversions()

◆ CheckMaskedBuiltinArgs()

bool CheckMaskedBuiltinArgs ( Sema & S,
Expr * MaskArg,
Expr * PtrArg,
unsigned Pos )
static

◆ checkMathBuiltinElementType()

◆ CheckMemaccessSize()

void CheckMemaccessSize ( Sema & S,
unsigned BId,
const CallExpr * Call )
static

◆ CheckMemorySizeofForComparison()

bool CheckMemorySizeofForComparison ( Sema & S,
const Expr * E,
const IdentifierInfo * FnName,
SourceLocation FnLoc,
SourceLocation RParenLoc )
static

Takes the expression passed to the size_t parameter of functions such as memcmp, strncat, etc and warns if it's a comparison.

This is to catch typos like if (memcmp(&a, &b, sizeof(a) > 0)).

Definition at line 9633 of file SemaChecking.cpp.

References clang::FixItHint::CreateInsertion(), clang::FixItHint::CreateRemoval(), clang::SemaBase::Diag(), clang::SourceRange::getBegin(), clang::SourceRange::getEnd(), and clang::Sema::getLocForEndOfToken().

◆ CheckNonNullArgument()

void CheckNonNullArgument ( Sema & S,
const Expr * ArgExpr,
SourceLocation CallSiteLoc )
static

◆ CheckNonNullArguments()

◆ CheckNonNullExpr()

◆ checkPointerAuthEnabled()

◆ checkPointerAuthKey()

◆ checkPointerAuthValue()

◆ CheckTautologicalComparison()

◆ checkUnsafeAssignLiteral()

◆ checkUnsafeAssignObject()

◆ checkVAStartABI()

bool checkVAStartABI ( Sema & S,
unsigned BuiltinID,
Expr * Fn )
static

◆ checkVAStartIsInVariadicFunction()

bool checkVAStartIsInVariadicFunction ( Sema & S,
Expr * Fn,
ParmVarDecl ** LastParam = nullptr )
static

◆ classifyConstantValue()

int classifyConstantValue ( Expr * Constant)
static

Definition at line 11292 of file SemaChecking.cpp.

Referenced by CheckTautologicalComparison().

◆ combineFAPK()

constexpr unsigned short combineFAPK ( Sema::FormatArgumentPassingKind A,
Sema::FormatArgumentPassingKind B )
staticconstexpr

Definition at line 129 of file SemaChecking.cpp.

Referenced by checkFormatStringExpr().

◆ CompareFormatSpecifiers()

bool CompareFormatSpecifiers ( Sema & S,
const StringLiteral * Ref,
ArrayRef< EquatableFormatArgument > RefArgs,
const StringLiteral * Fmt,
ArrayRef< EquatableFormatArgument > FmtArgs,
const Expr * FmtExpr,
bool InFunctionCall )
static

◆ convertArgumentToType()

bool convertArgumentToType ( Sema & S,
Expr *& Value,
QualType Ty )
static

◆ CXXRecordMembersNamed()

◆ diagnoseArrayStarInParamType()

◆ DiagnoseFloatingImpCast()

◆ DiagnoseImpCast() [1/2]

◆ DiagnoseImpCast() [2/2]

void DiagnoseImpCast ( Sema & S,
const Expr * E,
QualType T,
SourceLocation CContext,
unsigned diag,
bool PruneControlFlow = false )
static

Diagnose an implicit cast; purely a helper for CheckImplicitConversion.

Definition at line 11796 of file SemaChecking.cpp.

References DiagnoseImpCast(), clang::Expr::getType(), and clang::T.

◆ DiagnoseIntInBoolContext()

◆ DiagnoseMixedUnicodeImplicitConversion()

◆ DiagnoseNullConversion()

◆ doesExprLikelyComputeSize()

bool doesExprLikelyComputeSize ( const Expr * SizeofExpr)
static

Detect if SizeofExpr is likely to calculate the sizeof an object.

Definition at line 9811 of file SemaChecking.cpp.

References doesExprLikelyComputeSize(), getAsSizeOfExpr(), and clang::Expr::IgnoreParenImpCasts().

Referenced by CheckMemaccessSize(), and doesExprLikelyComputeSize().

◆ emitReplacement()

◆ findConstantBaseAndOffset()

std::pair< const ValueDecl *, CharUnits > findConstantBaseAndOffset ( Sema & S,
Expr * E )
static

◆ FindTypeTagExpr()

bool FindTypeTagExpr ( const Expr * TypeExpr,
const ASTContext & Ctx,
const ValueDecl ** VD,
uint64_t * MagicValue,
bool isConstantEvaluated )
static

Given a type tag expression find the type tag itself.

Parameters
TypeExprType tag expression, as it appears in user's code.
VDDeclaration of an identifier that appears in a type tag.
MagicValueType tag magic value.
isConstantEvaluatedwhether the evalaution should be performed in constant context.

Definition at line 15394 of file SemaChecking.cpp.

References clang::cast(), clang::Expr::EvaluateAsBooleanCondition(), clang::AbstractConditionalOperator::getCond(), clang::DeclRefExpr::getDecl(), clang::AbstractConditionalOperator::getFalseExpr(), clang::BinaryOperator::getOpcode(), clang::UnaryOperator::getOpcode(), clang::BinaryOperator::getRHS(), clang::Stmt::getStmtClass(), clang::UnaryOperator::getSubExpr(), clang::AbstractConditionalOperator::getTrueExpr(), clang::APIntStorage::getValue(), clang::Expr::IgnoreParenCasts(), and clang::Expr::IgnoreParenImpCasts().

Referenced by GetMatchingCType().

◆ getAbsoluteValueArgumentType()

QualType getAbsoluteValueArgumentType ( ASTContext & Context,
unsigned AbsType )
static

◆ getAbsoluteValueFunctionKind()

unsigned getAbsoluteValueFunctionKind ( const FunctionDecl * FDecl)
static

◆ getAbsoluteValueKind()

AbsoluteValueKind getAbsoluteValueKind ( QualType T)
static

Definition at line 9223 of file SemaChecking.cpp.

References AVK_Complex, AVK_Floating, AVK_Integer, and clang::T.

Referenced by emitReplacement().

◆ getAlignmentAndOffsetFromBinAddOrSub()

std::optional< std::pair< CharUnits, CharUnits > > getAlignmentAndOffsetFromBinAddOrSub ( const Expr * PtrE,
const Expr * IntE,
bool IsSub,
ASTContext & Ctx )
static

◆ getAndVerifyMatrixDimension()

◆ getAsSizeOfExpr()

const UnaryExprOrTypeTraitExpr * getAsSizeOfExpr ( const Expr * E)
static

◆ getBaseAlignmentAndOffsetFromLValue()

◆ getBaseAlignmentAndOffsetFromPtr()

◆ getBestAbsFunction()

unsigned getBestAbsFunction ( ASTContext & Context,
QualType ArgType,
unsigned AbsFunctionKind )
static

◆ getContainedDynamicClass()

const CXXRecordDecl * getContainedDynamicClass ( QualType T,
bool & IsContained )
static

Determine whether the given type is or contains a dynamic class type (e.g., whether it has a vtable).

Definition at line 9663 of file SemaChecking.cpp.

References clang::RecordDecl::fields(), clang::Type::getAsCXXRecordDecl(), getContainedDynamicClass(), clang::CXXRecordDecl::getDefinition(), clang::ValueDecl::getType(), clang::CXXRecordDecl::isDynamicClass(), clang::Decl::isInvalidDecl(), and clang::T.

Referenced by getContainedDynamicClass().

◆ getDerivedToBaseAlignmentAndOffset()

std::pair< CharUnits, CharUnits > getDerivedToBaseAlignmentAndOffset ( const CastExpr * CE,
QualType DerivedType,
CharUnits BaseAlignment,
CharUnits Offset,
ASTContext & Ctx )
static

Compute the alignment and offset of the base class object given the derived-to-base cast expression and the alignment and offset of the derived class object.

Definition at line 14342 of file SemaChecking.cpp.

References clang::Type::getAsCXXRecordDecl(), clang::ASTContext::getASTRecordLayout(), clang::ASTRecordLayout::getBaseClassOffset(), clang::ASTRecordLayout::getNonVirtualAlignment(), clang::CastExpr::path_begin(), clang::CastExpr::path_end(), and clang::CharUnits::Zero().

Referenced by getBaseAlignmentAndOffsetFromLValue(), and getBaseAlignmentAndOffsetFromPtr().

◆ GetExprType()

QualType GetExprType ( const Expr * E)
static

Definition at line 10746 of file SemaChecking.cpp.

References clang::Type::getAs(), and clang::Expr::getType().

Referenced by TryGetExprRange(), and TryGetExprRange().

◆ getIntegerLiteral()

const IntegerLiteral * getIntegerLiteral ( Expr * E)
static

Definition at line 12077 of file SemaChecking.cpp.

Referenced by DiagnoseIntInBoolContext().

◆ getLargerAbsoluteValueFunction()

unsigned getLargerAbsoluteValueFunction ( unsigned AbsFunction)
static

Definition at line 9126 of file SemaChecking.cpp.

Referenced by getBestAbsFunction().

◆ GetMatchingCType()

bool GetMatchingCType ( const IdentifierInfo * ArgumentKind,
const Expr * TypeExpr,
const ASTContext & Ctx,
const llvm::DenseMap< Sema::TypeTagMagicValue, Sema::TypeTagData > * MagicValues,
bool & FoundWrongKind,
Sema::TypeTagData & TypeInfo,
bool isConstantEvaluated )
static

Retrieve the C type corresponding to type tag TypeExpr.

Parameters
TypeExprExpression that specifies a type tag.
MagicValuesRegistered magic values.
FoundWrongKindSet to true if a type tag was found, but of a wrong kind.
TypeInfoInformation about the corresponding C type.
isConstantEvaluatedwhether the evalaution should be performed in constant context.
Returns
true if the corresponding C type was found.

Definition at line 15475 of file SemaChecking.cpp.

References FindTypeTagExpr(), and clang::Decl::getAttr().

◆ getPresumedAlignmentOfPointer()

◆ getSizeOfArgType()

QualType getSizeOfArgType ( const Expr * E)
static

If E is a sizeof expression, returns its argument type.

Definition at line 9709 of file SemaChecking.cpp.

References getAsSizeOfExpr(), and SizeOf.

◆ getSizeOfExprArg()

const Expr * getSizeOfExprArg ( const Expr * E)
static

If E is a sizeof expression, returns its argument expression, otherwise returns NULL.

Definition at line 9701 of file SemaChecking.cpp.

References getAsSizeOfExpr(), and SizeOf.

◆ getStrlenExprArg()

◆ GetValueRange() [1/2]

◆ GetValueRange() [2/2]

IntRange GetValueRange ( llvm::APSInt & value,
unsigned MaxWidth )
static

Definition at line 10706 of file SemaChecking.cpp.

Referenced by GetValueRange(), and TryGetExprRange().

◆ GetVTablePointer()

◆ handleFormatSignedness()

◆ HasEnumType()

bool HasEnumType ( const Expr * E)
static

◆ ignoreLiteralAdditions()

◆ isArgumentExpandedFromMacro()

bool isArgumentExpandedFromMacro ( SourceManager & SM,
SourceLocation CallLoc,
SourceLocation ArgLoc )
static

Check if the ArgLoc originated from a macro passed to the call at CallLoc.

#define MACRO 0
foo(MACRO);
foo(0);

This should return true for the first call to foo, but not for the second (regardless of whether foo is a macro or function).

Definition at line 9835 of file SemaChecking.cpp.

References clang::SourceLocation::isMacroID(), and SM.

Referenced by CheckMemaccessSize().

◆ isArithmeticArgumentPromotion()

bool isArithmeticArgumentPromotion ( Sema & S,
const ImplicitCastExpr * ICE )
static

Return true if ICE is an implicit argument promotion of an arithmetic type.

Bit-field 'promotions' from a higher ranked type to a lower ranked type do not count.

Definition at line 8275 of file SemaChecking.cpp.

References clang::Sema::Context, clang::Type::getAs(), clang::CastExpr::getCastKind(), clang::ASTContext::getFloatingTypeOrder(), clang::ASTContext::getPromotedIntegerType(), clang::CastExpr::getSubExpr(), clang::Expr::getType(), and clang::ASTContext::isPromotableIntegerType().

◆ isConstantSizeArrayWithMoreThanOneElement()

bool isConstantSizeArrayWithMoreThanOneElement ( QualType Ty,
ASTContext & Context )
static

Definition at line 10132 of file SemaChecking.cpp.

References clang::Type::isVariableArrayType().

◆ IsEnumConstOrFromMacro()

◆ IsImplicitBoolFloatConversion()

◆ IsInAnyMacroBody()

bool IsInAnyMacroBody ( const SourceManager & SM,
SourceLocation Loc )
static

◆ IsInfinityFunction()

◆ IsInfOrNanFunction()

bool IsInfOrNanFunction ( StringRef calleeName,
MathCheck Check )
static

Definition at line 9429 of file SemaChecking.cpp.

References Inf, and NaN.

◆ isKnownToHaveUnsignedValue()

bool isKnownToHaveUnsignedValue ( const Expr * E)
static

◆ isLayoutCompatible() [1/4]

bool isLayoutCompatible ( const ASTContext & C,
const EnumDecl * ED1,
const EnumDecl * ED2 )
static

Check if two enumeration types are layout-compatible.

Definition at line 15213 of file SemaChecking.cpp.

References clang::C, clang::EnumDecl::getIntegerType(), and clang::EnumDecl::isComplete().

◆ isLayoutCompatible() [2/4]

bool isLayoutCompatible ( const ASTContext & C,
const FieldDecl * Field1,
const FieldDecl * Field2,
bool AreUnionMembers = false )
static

Check if two fields are layout-compatible.

Can be used on union members, which are exempt from alignment requirement of common initial sequence.

Definition at line 15225 of file SemaChecking.cpp.

References clang::C, clang::FieldDecl::getBitWidthValue(), clang::Decl::getMaxAlignment(), clang::FieldDecl::getParent(), clang::ValueDecl::getType(), clang::Decl::hasAttr(), clang::FieldDecl::isBitField(), and isLayoutCompatible().

◆ isLayoutCompatible() [3/4]

bool isLayoutCompatible ( const ASTContext & C,
const RecordDecl * RD1,
const RecordDecl * RD2 )
static

◆ isLayoutCompatible() [4/4]

◆ isLayoutCompatibleStruct()

bool isLayoutCompatibleStruct ( const ASTContext & C,
const RecordDecl * RD1,
const RecordDecl * RD2 )
static

Check if two standard-layout structs are layout-compatible.

(C++11 [class.mem] p17)

Definition at line 15269 of file SemaChecking.cpp.

References clang::C, and clang::RecordDecl::fields().

Referenced by isLayoutCompatible().

◆ isLayoutCompatibleUnion()

bool isLayoutCompatibleUnion ( const ASTContext & C,
const RecordDecl * RD1,
const RecordDecl * RD2 )
static

Check if two standard-layout unions are layout-compatible.

(C++11 [class.mem] p18)

Definition at line 15287 of file SemaChecking.cpp.

References clang::C, clang::RecordDecl::fields(), and isLayoutCompatible().

Referenced by isLayoutCompatible().

◆ isNonNullType()

bool isNonNullType ( QualType type)
static

Determine whether the given type has a non-null nullability annotation.

Definition at line 3464 of file SemaChecking.cpp.

References clang::NonNull, and clang::ast_matchers::type.

Referenced by CheckNonNullArguments().

◆ IsSameCharType()

bool IsSameCharType ( QualType T1,
QualType T2 )
static

Definition at line 15532 of file SemaChecking.cpp.

References clang::Type::getAs(), and clang::BuiltinType::getKind().

◆ IsSameFloatAfterCast() [1/2]

bool IsSameFloatAfterCast ( const APValue & value,
const llvm::fltSemantics & Src,
const llvm::fltSemantics & Tgt )
static

Checks whether the given value, which currently has the given source semantics, has the same value when coerced through the target semantics.

The value might be a vector of floats (or a complex number).

Definition at line 11108 of file SemaChecking.cpp.

References clang::APValue::getComplexFloatImag(), clang::APValue::getComplexFloatReal(), clang::APValue::getFloat(), clang::APValue::getVectorElt(), clang::APValue::getVectorLength(), clang::APValue::isComplexFloat(), clang::APValue::isFloat(), IsSameFloatAfterCast(), and clang::APValue::isVector().

◆ IsSameFloatAfterCast() [2/2]

bool IsSameFloatAfterCast ( const llvm::APFloat & value,
const llvm::fltSemantics & Src,
const llvm::fltSemantics & Tgt )
static

Checks whether the given value, which currently has the given source semantics, has the same value when coerced through the target semantics.

Definition at line 11091 of file SemaChecking.cpp.

Referenced by clang::Sema::CheckImplicitConversion(), and IsSameFloatAfterCast().

◆ isSameWidthConstantConversion()

◆ IsShiftedByte()

◆ IsStdFunction()

template<std::size_t StrLen>
bool IsStdFunction ( const FunctionDecl * FDecl,
const char(&) Str[StrLen] )
static

◆ isValidOrderingForOp()

bool isValidOrderingForOp ( int64_t Ordering,
AtomicExpr::AtomicOp Op )
static

Definition at line 3989 of file SemaChecking.cpp.

Referenced by clang::Sema::BuildAtomicExpr().

◆ maybeConstEvalStringLiteral()

const Expr * maybeConstEvalStringLiteral ( ASTContext & Context,
const Expr * E )
static

Definition at line 6728 of file SemaChecking.cpp.

References clang::Expr::EvaluateAsRValue().

Referenced by checkFormatStringExpr().

◆ PointerAuthAuthAndResign()

◆ PointerAuthBlendDiscriminator()

◆ PointerAuthSignGenericData()

◆ PointerAuthSignOrAuth()

ExprResult PointerAuthSignOrAuth ( Sema & S,
CallExpr * Call,
PointerAuthOpKind OpKind,
bool RequireConstant )
static

◆ PointerAuthStringDiscriminator()

ExprResult PointerAuthStringDiscriminator ( Sema & S,
CallExpr * Call )
static

◆ PointerAuthStrip()

◆ PrettyPrintInRange()

std::string PrettyPrintInRange ( const llvm::APSInt & Value,
IntRange Range )
static

Definition at line 11953 of file SemaChecking.cpp.

References toString().

Referenced by clang::Sema::CheckImplicitConversion().

◆ ProcessFormatStringLiteral()

bool ProcessFormatStringLiteral ( const Expr * FormatExpr,
StringRef & FormatStrRef,
size_t & StrLen,
ASTContext & Context )
static

Definition at line 1125 of file SemaChecking.cpp.

References clang::T.

◆ referToTheSameDecl()

bool referToTheSameDecl ( const Expr * E1,
const Expr * E2 )
static

Check if two expressions refer to the same declaration.

Definition at line 10213 of file SemaChecking.cpp.

◆ requiresParensToAddCast()

bool requiresParensToAddCast ( const Expr * E)
static

◆ ShouldDiagnoseEmptyStmtBody()

bool ShouldDiagnoseEmptyStmtBody ( const SourceManager & SourceMgr,
SourceLocation StmtLoc,
const NullStmt * Body )
static

◆ shouldNotPrintDirectly()

std::pair< QualType, StringRef > shouldNotPrintDirectly ( const ASTContext & Context,
QualType IntendedTy,
const Expr * E )
static

◆ sumOffsets()

void sumOffsets ( llvm::APSInt & Offset,
llvm::APSInt Addend,
BinaryOperatorKind BinOpKind,
bool AddendIsRight )
static

Definition at line 6219 of file SemaChecking.cpp.

References sumOffsets().

Referenced by checkFormatStringExpr(), and sumOffsets().

◆ TryGetExprRange() [1/2]

std::optional< IntRange > TryGetExprRange ( ASTContext & C,
const Expr * E,
bool InConstantContext,
bool Approximate )
static

Definition at line 11081 of file SemaChecking.cpp.

References clang::C, GetExprType(), and TryGetExprRange().

◆ TryGetExprRange() [2/2]

std::optional< IntRange > TryGetExprRange ( ASTContext & C,
const Expr * E,
unsigned MaxWidth,
bool InConstantContext,
bool Approximate )
static

Attempts to estimate an approximate range for the given integer expression.

Returns a range if successful, otherwise it returns std::nullopt if a reliable estimation cannot be determined.

Parameters
MaxWidthThe width to which the value will be truncated.
InConstantContextIf true, interpret the expression within a constant context.
ApproximateIf true, provide a likely range of values by assuming that arithmetic on narrower types remains within those types. If false, return a range that includes all possible values resulting from the expression.
Returns
A range of values that the expression might take, or std::nullopt if a reliable estimation cannot be determined.

Definition at line 10766 of file SemaChecking.cpp.

References clang::C, clang::Expr::EvaluateAsRValue(), GetExprType(), clang::Expr::getSourceBitField(), clang::Expr::getType(), GetValueRange(), clang::Expr::IgnoreParens(), clang::Type::isUnsignedIntegerType(), clang::Type::isVoidType(), log2, clang::T, TryGetExprRange(), and clang::Expr::EvalResult::Val.

Referenced by AnalyzeComparison(), clang::Sema::CheckImplicitConversion(), CheckTautologicalComparison(), TryGetExprRange(), and TryGetExprRange().