clang  15.0.0git
SemaExprCXX.cpp File Reference
#include "TreeTransform.h"
#include "TypeLocBuilder.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTLambda.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/CharUnits.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/AlignedAllocation.h"
#include "clang/Basic/DiagnosticSema.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/TypeTraits.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/Initialization.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/ParsedTemplate.h"
#include "clang/Sema/Scope.h"
#include "clang/Sema/ScopeInfo.h"
#include "clang/Sema/SemaInternal.h"
#include "clang/Sema/SemaLambda.h"
#include "clang/Sema/Template.h"
#include "clang/Sema/TemplateDeduction.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/TypeSize.h"
Include dependency graph for SemaExprCXX.cpp:

Go to the source code of this file.


static void getUuidAttrOfType (Sema &SemaRef, QualType QT, llvm::SmallSetVector< const UuidAttr *, 1 > &UuidAttrs)
 Grabs __declspec(uuid()) off a type, or returns 0 if we cannot resolve to a single GUID. More...
static void collectPublicBases (CXXRecordDecl *RD, llvm::DenseMap< CXXRecordDecl *, unsigned > &SubobjectsSeen, llvm::SmallPtrSetImpl< CXXRecordDecl * > &VBases, llvm::SetVector< CXXRecordDecl * > &PublicSubobjectsSeen, bool ParentIsPublic)
static void getUnambiguousPublicSubobjects (CXXRecordDecl *RD, llvm::SmallVectorImpl< CXXRecordDecl * > &Objects)
static QualType adjustCVQualifiersForCXXThisWithinLambda (ArrayRef< FunctionScopeInfo * > FunctionScopes, QualType ThisTy, DeclContext *CurSemaContext, ASTContext &ASTCtx)
static void buildLambdaThisCaptureFixit (Sema &Sema, LambdaScopeInfo *LSI)
static bool isNonPlacementDeallocationFunction (Sema &S, FunctionDecl *FD)
 Determine whether the given function is a non-placement deallocation function. More...
static bool hasNewExtendedAlignment (Sema &S, QualType AllocType)
 Determine whether a type has new-extended alignment. More...
static UsualDeallocFnInfo resolveDeallocationOverload (Sema &S, LookupResult &R, bool WantSize, bool WantAlign, llvm::SmallVectorImpl< UsualDeallocFnInfo > *BestFns=nullptr)
 Select the correct "usual" deallocation function to use from a selection of deallocation functions (either global or class-scope). More...
static bool doesUsualArrayDeleteWantSize (Sema &S, SourceLocation loc, QualType allocType)
 Determine whether a given type is a class for which 'delete[]' would call a member 'operator delete[]' with a 'size_t' parameter. More...
static bool isLegalArrayNewInitializer (CXXNewExpr::InitializationStyle Style, Expr *Init)
static bool resolveAllocationOverload (Sema &S, LookupResult &R, SourceRange Range, SmallVectorImpl< Expr * > &Args, bool &PassAlignment, FunctionDecl *&Operator, OverloadCandidateSet *AlignedCandidates, Expr *AlignArg, bool Diagnose)
static void DiagnoseMismatchedNewDelete (Sema &SemaRef, SourceLocation DeleteLoc, const MismatchingNewDeleteDetector &Detector)
static bool resolveBuiltinNewDeleteOverload (Sema &S, CallExpr *TheCall, bool IsDelete, FunctionDecl *&Operator)
static ExprResult BuildCXXCastArgument (Sema &S, SourceLocation CastLoc, QualType Ty, CastKind Kind, CXXMethodDecl *Method, DeclAccessPair FoundDecl, bool HadMultipleCandidates, Expr *From)
static bool CheckUnaryTypeTraitTypeCompleteness (Sema &S, TypeTrait UTT, SourceLocation Loc, QualType ArgTy)
 Check the completeness of a type in a unary type trait. More...
static bool HasNoThrowOperator (const RecordType *RT, OverloadedOperatorKind Op, Sema &Self, SourceLocation KeyLoc, ASTContext &C, bool(CXXRecordDecl::*HasTrivial)() const, bool(CXXRecordDecl::*HasNonTrivial)() const, bool(CXXMethodDecl::*IsDesiredOp)() const)
static bool EvaluateUnaryTypeTrait (Sema &Self, TypeTrait UTT, SourceLocation KeyLoc, QualType T)
static bool EvaluateBinaryTypeTrait (Sema &Self, TypeTrait BTT, QualType LhsT, QualType RhsT, SourceLocation KeyLoc)
static bool evaluateTypeTrait (Sema &S, TypeTrait Kind, SourceLocation KWLoc, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc)
static uint64_t EvaluateArrayTypeTrait (Sema &Self, ArrayTypeTrait ATT, QualType T, Expr *DimExpr, SourceLocation KeyLoc)
static bool EvaluateExpressionTrait (ExpressionTrait ET, Expr *E)
static bool TryClassUnification (Sema &Self, Expr *From, Expr *To, SourceLocation QuestionLoc, bool &HaveConversion, QualType &ToType)
 Try to convert a type to another according to C++11 5.16p3. More...
static bool FindConditionalOverload (Sema &Self, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
 Try to find a common type for two according to C++0x 5.16p5. More...
static bool ConvertForConditional (Sema &Self, ExprResult &E, QualType T)
 Perform an "extended" implicit conversion as returned by TryClassUnification. More...
static bool isValidVectorForConditionalCondition (ASTContext &Ctx, QualType CondTy)
static bool isValidSizelessVectorForConditionalCondition (ASTContext &Ctx, QualType CondTy)
static FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs (Sema &S, FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage)
static void noteOperatorArrows (Sema &S, ArrayRef< FunctionDecl * > OperatorArrows)
 Note a set of 'operator->' functions that were used for a member access. More...
static bool CheckArrow (Sema &S, QualType &ObjectType, Expr *&Base, tok::TokenKind &OpKind, SourceLocation OpLoc)
static bool canRecoverDotPseudoDestructorCallsOnPointerObjects (Sema &SemaRef, QualType DestructedType)
 Check if it's ok to try and recover dot pseudo destructor calls on pointer objects. More...
static void MaybeDecrementCount (Expr *E, llvm::DenseMap< const VarDecl *, int > &RefsMinusAssignments)
static bool VariableCanNeverBeAConstantExpression (VarDecl *Var, ASTContext &Context)
static void CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures (Expr *const FE, LambdaScopeInfo *const CurrentLSI, Sema &S)
 Check if the current lambda has any potential captures that must be captured by any of its enclosing lambdas that are ready to capture. More...
static ExprResult attemptRecovery (Sema &SemaRef, const TypoCorrectionConsumer &Consumer, const TypoCorrection &TC)

Detailed Description

Implements semantic analysis for C++ expressions.

Definition in file SemaExprCXX.cpp.

Function Documentation

◆ adjustCVQualifiersForCXXThisWithinLambda()

static QualType adjustCVQualifiersForCXXThisWithinLambda ( ArrayRef< FunctionScopeInfo * >  FunctionScopes,
QualType  ThisTy,
DeclContext CurSemaContext,
ASTContext ASTCtx 

◆ attemptRecovery()

static ExprResult attemptRecovery ( Sema SemaRef,
const TypoCorrectionConsumer Consumer,
const TypoCorrection TC 

◆ BuildCXXCastArgument()

static ExprResult BuildCXXCastArgument ( Sema S,
SourceLocation  CastLoc,
QualType  Ty,
CastKind  Kind,
CXXMethodDecl Method,
DeclAccessPair  FoundDecl,
bool  HadMultipleCandidates,
Expr From 

Definition at line 4025 of file SemaExprCXX.cpp.

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

◆ buildLambdaThisCaptureFixit()

static void buildLambdaThisCaptureFixit ( Sema Sema,
LambdaScopeInfo LSI 

◆ canRecoverDotPseudoDestructorCallsOnPointerObjects()

static bool canRecoverDotPseudoDestructorCallsOnPointerObjects ( Sema SemaRef,
QualType  DestructedType 

◆ CheckArrow()

static bool CheckArrow ( Sema S,
QualType ObjectType,
Expr *&  Base,
tok::TokenKind OpKind,
SourceLocation  OpLoc 

Definition at line 7623 of file SemaExprCXX.cpp.

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

◆ CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures()

static void CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures ( Expr *const  FE,
LambdaScopeInfo *const  CurrentLSI,
Sema S 

Check if the current lambda has any potential captures that must be captured by any of its enclosing lambdas that are ready to capture.

If there is a lambda that can capture a nested potential-capture, go ahead and do so. Also, check to see if any variables are uncaptureable or do not involve an odr-use so do not need to be captured.

Definition at line 8238 of file SemaExprCXX.cpp.

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

◆ CheckUnaryTypeTraitTypeCompleteness()

static bool CheckUnaryTypeTraitTypeCompleteness ( Sema S,
TypeTrait  UTT,
SourceLocation  Loc,
QualType  ArgTy 

Check the completeness of a type in a unary type trait.

If the particular type trait requires a complete type, tries to complete it. If completing the type fails, a diagnostic is emitted and false returned. If completing the type succeeds or no completion was required, returns true.

Definition at line 4717 of file SemaExprCXX.cpp.

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

◆ collectPublicBases()

static void collectPublicBases ( CXXRecordDecl RD,
llvm::DenseMap< CXXRecordDecl *, unsigned > &  SubobjectsSeen,
llvm::SmallPtrSetImpl< CXXRecordDecl * > &  VBases,
llvm::SetVector< CXXRecordDecl * > &  PublicSubobjectsSeen,
bool  ParentIsPublic 

Definition at line 916 of file SemaExprCXX.cpp.

References clang::AS_public, and clang::CXXRecordDecl::bases().

Referenced by getUnambiguousPublicSubobjects().

◆ ConvertForConditional()

static bool ConvertForConditional ( Sema Self,
ExprResult E,
QualType  T 

◆ DiagnoseMismatchedNewDelete()

static void DiagnoseMismatchedNewDelete ( Sema SemaRef,
SourceLocation  DeleteLoc,
const MismatchingNewDeleteDetector &  Detector 

◆ doesUsualArrayDeleteWantSize()

static bool doesUsualArrayDeleteWantSize ( Sema S,
SourceLocation  loc,
QualType  allocType 

Determine whether a given type is a class for which 'delete[]' would call a member 'operator delete[]' with a 'size_t' parameter.

This implies that we need to store the array size (even if the type is trivially-destructible).

Definition at line 1782 of file SemaExprCXX.cpp.

◆ EvaluateArrayTypeTrait()

static uint64_t EvaluateArrayTypeTrait ( Sema Self,
ArrayTypeTrait  ATT,
QualType  T,
Expr DimExpr,
SourceLocation  KeyLoc 

◆ EvaluateBinaryTypeTrait()

static bool EvaluateBinaryTypeTrait ( Sema Self,
TypeTrait  BTT,
QualType  LhsT,
QualType  RhsT,
SourceLocation  KeyLoc 

◆ EvaluateExpressionTrait()

static bool EvaluateExpressionTrait ( ExpressionTrait  ET,
Expr E 

◆ evaluateTypeTrait()

static bool evaluateTypeTrait ( Sema S,
TypeTrait  Kind,
SourceLocation  KWLoc,
ArrayRef< TypeSourceInfo * >  Args,
SourceLocation  RParenLoc 

Definition at line 5277 of file SemaExprCXX.cpp.

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

◆ EvaluateUnaryTypeTrait()

static bool EvaluateUnaryTypeTrait ( Sema Self,
TypeTrait  UTT,
SourceLocation  KeyLoc,
QualType  T 

Definition at line 4871 of file SemaExprCXX.cpp.

References clang::AS_public, clang::Sema::Context, clang::Type::getAs(), clang::Type::getAsCXXRecordDecl(), clang::FunctionProtoType::getNumParams(), clang::QualType::getObjCLifetime(), clang::Decl::hasAttr(), clang::CXXRecordDecl::hasNonTrivialCopyAssignment(), clang::CXXRecordDecl::hasNonTrivialCopyConstructor(), clang::CXXRecordDecl::hasNonTrivialDefaultConstructor(), clang::CXXRecordDecl::hasNonTrivialMoveAssignment(), clang::CXXRecordDecl::hasNonTrivialMoveConstructor(), HasNoThrowOperator(), clang::CXXRecordDecl::hasTrivialCopyAssignment(), clang::CXXRecordDecl::hasTrivialCopyConstructor(), clang::CXXRecordDecl::hasTrivialDefaultConstructor(), clang::CXXRecordDecl::hasTrivialDestructor(), clang::CXXRecordDecl::hasTrivialMoveAssignment(), clang::CXXRecordDecl::hasTrivialMoveConstructor(), clang::CXXRecordDecl::isAbstract(), clang::Type::isAggregateType(), clang::Type::isAnyComplexType(), clang::Type::isAnyPointerType(), clang::Type::isArithmeticType(), clang::Type::isArrayType(), clang::Type::isClassType(), clang::Type::isCompoundType(), clang::QualType::isConstQualified(), clang::CXXMethodDecl::isCopyAssignmentOperator(), clang::Type::isDependentType(), clang::QualType::isDestructedType(), clang::CXXRecordDecl::isEmpty(), clang::Type::isEnumeralType(), clang::Type::isExtVectorType(), clang::Type::isFloatingType(), clang::Type::isFunctionType(), clang::Type::isFundamentalType(), clang::Type::isIncompleteType(), clang::Type::isIntegralType(), clang::Type::isInterfaceType(), clang::Type::isLiteralType(), clang::Type::isLValueReferenceType(), clang::Type::isMemberDataPointerType(), clang::Type::isMemberFunctionPointerType(), clang::Type::isMemberPointerType(), clang::CXXMethodDecl::isMoveAssignmentOperator(), clang::FunctionProtoType::isNothrow(), clang::Type::isObjCLifetimeType(), clang::Type::isObjectType(), clang::QualType::isPODType(), clang::CXXRecordDecl::isPolymorphic(), clang::Type::isReferenceType(), clang::Type::isRValueReferenceType(), clang::Type::isScalarType(), clang::Type::isSignedIntegerType(), clang::Type::isStandardLayoutType(), clang::Type::isStructureType(), clang::QualType::isTriviallyCopyableType(), clang::QualType::isTriviallyRelocatableType(), clang::QualType::isTrivialType(), clang::TagDecl::isUnion(), clang::Type::isUnionType(), clang::Type::isUnsignedIntegerType(), clang::Type::isVectorType(), clang::Type::isVoidType(), clang::QualType::isVolatileQualified(), clang::Sema::LookupConstructors(), clang::Sema::LookupDestructor(), clang::Qualifiers::OCL_Autoreleasing, clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_None, clang::Qualifiers::OCL_Strong, clang::Qualifiers::OCL_Weak, and clang::Sema::ResolveExceptionSpec().

◆ FindConditionalOverload()

static bool FindConditionalOverload ( Sema Self,
ExprResult LHS,
ExprResult RHS,
SourceLocation  QuestionLoc 

◆ getUnambiguousPublicSubobjects()

static void getUnambiguousPublicSubobjects ( CXXRecordDecl RD,
llvm::SmallVectorImpl< CXXRecordDecl * > &  Objects 

Definition at line 945 of file SemaExprCXX.cpp.

References collectPublicBases().

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

◆ getUuidAttrOfType()

static void getUuidAttrOfType ( Sema SemaRef,
QualType  QT,
llvm::SmallSetVector< const UuidAttr *, 1 > &  UuidAttrs 

◆ hasNewExtendedAlignment()

static bool hasNewExtendedAlignment ( Sema S,
QualType  AllocType 

Determine whether a type has new-extended alignment.

This may be called when the type is incomplete (for a delete-expression with an incomplete pointee type), in which case it will conservatively return false if the alignment is not known.

Definition at line 1736 of file SemaExprCXX.cpp.

◆ HasNoThrowOperator()

static bool HasNoThrowOperator ( const RecordType RT,
OverloadedOperatorKind  Op,
Sema Self,
SourceLocation  KeyLoc,
ASTContext C,
bool(CXXRecordDecl::*)() const  HasTrivial,
bool(CXXRecordDecl::*)() const  HasNonTrivial,
bool(CXXMethodDecl::*)() const  IsDesiredOp 

Definition at line 4836 of file SemaExprCXX.cpp.

References clang::RecordType::getDecl().

Referenced by EvaluateUnaryTypeTrait().

◆ isLegalArrayNewInitializer()

static bool isLegalArrayNewInitializer ( CXXNewExpr::InitializationStyle  Style,
Expr Init 

Definition at line 1902 of file SemaExprCXX.cpp.

◆ isNonPlacementDeallocationFunction()

static bool isNonPlacementDeallocationFunction ( Sema S,
FunctionDecl FD 

Determine whether the given function is a non-placement deallocation function.

Definition at line 1640 of file SemaExprCXX.cpp.

◆ isValidSizelessVectorForConditionalCondition()

static bool isValidSizelessVectorForConditionalCondition ( ASTContext Ctx,
QualType  CondTy 

◆ isValidVectorForConditionalCondition()

static bool isValidVectorForConditionalCondition ( ASTContext Ctx,
QualType  CondTy 

◆ MaybeDecrementCount()

static void MaybeDecrementCount ( Expr E,
llvm::DenseMap< const VarDecl *, int > &  RefsMinusAssignments 

◆ mergeExceptionSpecs()

static FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs ( Sema S,
FunctionProtoType::ExceptionSpecInfo  ESI1,
FunctionProtoType::ExceptionSpecInfo  ESI2,
SmallVectorImpl< QualType > &  ExceptionTypeStorage 

Definition at line 6673 of file SemaExprCXX.cpp.

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

◆ noteOperatorArrows()

static void noteOperatorArrows ( Sema S,
ArrayRef< FunctionDecl * >  OperatorArrows 

Note a set of 'operator->' functions that were used for a member access.

Definition at line 7454 of file SemaExprCXX.cpp.

◆ resolveAllocationOverload()

static bool resolveAllocationOverload ( Sema S,
LookupResult R,
SourceRange  Range,
SmallVectorImpl< Expr * > &  Args,
bool PassAlignment,
FunctionDecl *&  Operator,
OverloadCandidateSet AlignedCandidates,
Expr AlignArg,
bool  Diagnose 

Definition at line 2463 of file SemaExprCXX.cpp.

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

◆ resolveBuiltinNewDeleteOverload()

static bool resolveBuiltinNewDeleteOverload ( Sema S,
CallExpr TheCall,
bool  IsDelete,
FunctionDecl *&  Operator 

Definition at line 3733 of file SemaExprCXX.cpp.

◆ resolveDeallocationOverload()

static UsualDeallocFnInfo resolveDeallocationOverload ( Sema S,
LookupResult R,
bool  WantSize,
bool  WantAlign,
llvm::SmallVectorImpl< UsualDeallocFnInfo > *  BestFns = nullptr 

Select the correct "usual" deallocation function to use from a selection of deallocation functions (either global or class-scope).

Definition at line 1744 of file SemaExprCXX.cpp.

◆ TryClassUnification()

static bool TryClassUnification ( Sema Self,
Expr From,
Expr To,
SourceLocation  QuestionLoc,
bool HaveConversion,
QualType ToType 

Try to convert a type to another according to C++11 5.16p3.

This is part of the parameter validation for the ? operator. If either value operand is a class type, the two operands are attempted to be converted to each other. This function does the conversion in one direction. It returns true if the program is ill-formed and has already been diagnosed as such.

Definition at line 5973 of file SemaExprCXX.cpp.

References clang::Sema::Context, clang::InitializationKind::CreateCopy(), clang::InitializationSequence::Diagnose(), clang::InitializationSequence::Failed(), clang::Type::getAs(), clang::Stmt::getBeginLoc(), clang::QualType::getNonLValueExprType(), clang::ASTContext::getReferenceQualifiedType(), clang::Expr::getType(), clang::InitializedEntity::InitializeTemporary(), clang::InitializationSequence::isAmbiguous(), clang::QualType::isAtLeastAsQualifiedAs(), clang::Sema::IsDerivedFrom(), clang::InitializationSequence::isDirectReferenceBinding(), and clang::Expr::isGLValue().

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

◆ VariableCanNeverBeAConstantExpression()

static bool VariableCanNeverBeAConstantExpression ( VarDecl Var,
ASTContext Context