clang 22.0.0git
SemaExprCXX.cpp File Reference

Implements semantic analysis for C++ expressions. More...

#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/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DynamicRecursiveASTVisitor.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprConcepts.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/Type.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/TokenKinds.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/EnterExpressionEvaluationContext.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/SemaCUDA.h"
#include "clang/Sema/SemaHLSL.h"
#include "clang/Sema/SemaLambda.h"
#include "clang/Sema/SemaObjC.h"
#include "clang/Sema/SemaPPC.h"
#include "clang/Sema/Template.h"
#include "clang/Sema/TemplateDeduction.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/TypeSize.h"
#include <optional>

Go to the source code of this file.

Enumerations

enum class  ResolveMode { Typed , Untyped }
enum class  DeallocLookupMode { Untyped , OptionallyTyped }

Functions

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.
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.
static bool hasNewExtendedAlignment (Sema &S, QualType AllocType)
 Determine whether a type has new-extended alignment.
static bool CheckDeleteOperator (Sema &S, SourceLocation StartLoc, SourceRange Range, bool Diagnose, CXXRecordDecl *NamingClass, DeclAccessPair Decl, FunctionDecl *Operator)
static UsualDeallocFnInfo resolveDeallocationOverload (Sema &S, LookupResult &R, const ImplicitDeallocationParameters &IDP, SourceLocation Loc, llvm::SmallVectorImpl< UsualDeallocFnInfo > *BestFns=nullptr)
 Select the correct "usual" deallocation function to use from a selection of deallocation functions (either global or class-scope).
static bool doesUsualArrayDeleteWantSize (Sema &S, SourceLocation loc, TypeAwareAllocationMode PassType, QualType allocType)
 Determine whether a given type is a class for which 'delete[]' would call a member 'operator delete[]' with a 'size_t' parameter.
static bool isLegalArrayNewInitializer (CXXNewInitializationStyle Style, Expr *Init, bool IsCPlusPlus20)
static bool resolveAllocationOverloadInterior (Sema &S, LookupResult &R, SourceRange Range, ResolveMode Mode, SmallVectorImpl< Expr * > &Args, AlignedAllocationMode &PassAlignment, FunctionDecl *&Operator, OverloadCandidateSet *AlignedCandidates, Expr *AlignArg, bool Diagnose)
static void LookupGlobalDeallocationFunctions (Sema &S, SourceLocation Loc, LookupResult &FoundDelete, DeallocLookupMode Mode, DeclarationName Name)
static bool resolveAllocationOverload (Sema &S, LookupResult &R, SourceRange Range, SmallVectorImpl< Expr * > &Args, ImplicitAllocationParameters &IAP, 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 QualType adjustVectorType (ASTContext &Context, QualType FromTy, QualType ToType, QualType *ElTy=nullptr)
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.
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.
static bool ConvertForConditional (Sema &Self, ExprResult &E, QualType T)
 Perform an "extended" implicit conversion as returned by TryClassUnification.
static bool isValidVectorForConditionalCondition (ASTContext &Ctx, QualType CondTy)
static bool isValidSizelessVectorForConditionalCondition (ASTContext &Ctx, QualType CondTy)
static void noteOperatorArrows (Sema &S, ArrayRef< FunctionDecl * > OperatorArrows)
 Note a set of 'operator->' functions that were used for a member access.
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.
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.

Detailed Description

Implements semantic analysis for C++ expressions.

Definition in file SemaExprCXX.cpp.

Enumeration Type Documentation

◆ DeallocLookupMode

enum class DeallocLookupMode
strong
Enumerator
Untyped 
OptionallyTyped 

Definition at line 2842 of file SemaExprCXX.cpp.

◆ ResolveMode

enum class ResolveMode
strong
Enumerator
Typed 
Untyped 

Definition at line 2669 of file SemaExprCXX.cpp.

Function Documentation

◆ adjustCVQualifiersForCXXThisWithinLambda()

◆ adjustVectorType()

QualType adjustVectorType ( ASTContext & Context,
QualType FromTy,
QualType ToType,
QualType * ElTy = nullptr )
static

◆ BuildCXXCastArgument()

◆ buildLambdaThisCaptureFixit()

◆ canRecoverDotPseudoDestructorCallsOnPointerObjects()

bool canRecoverDotPseudoDestructorCallsOnPointerObjects ( Sema & SemaRef,
QualType DestructedType )
static

◆ CheckArrow()

◆ CheckDeleteOperator()

◆ CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures()

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

◆ collectPublicBases()

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

◆ ConvertForConditional()

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

◆ DiagnoseMismatchedNewDelete()

◆ doesUsualArrayDeleteWantSize()

◆ FindConditionalOverload()

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

Try to find a common type for two according to C++0x 5.16p5.

This is part of the parameter validation for the ? operator. If either value operand is a class type, overload resolution is used to find a conversion to a common type.

Definition at line 5575 of file SemaExprCXX.cpp.

References clang::OverloadCandidateSet::BestViableFunction(), clang::Converting, clang::OverloadCandidateSet::CSK_Operator, clang::ActionResult< PtrTy, Compress >::get(), clang::Stmt::getSourceRange(), clang::Expr::getType(), clang::ActionResult< PtrTy, Compress >::isInvalid(), clang::OR_Ambiguous, clang::OR_Deleted, clang::OR_No_Viable_Function, clang::OR_Success, and clang::Self.

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

◆ getUnambiguousPublicSubobjects()

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

Definition at line 944 of file SemaExprCXX.cpp.

References collectPublicBases().

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

◆ getUuidAttrOfType()

◆ hasNewExtendedAlignment()

bool hasNewExtendedAlignment ( Sema & S,
QualType AllocType )
static

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 1896 of file SemaExprCXX.cpp.

References clang::Sema::getASTContext(), clang::Sema::getLangOpts(), clang::TargetInfo::getNewAlign(), clang::ASTContext::getTargetInfo(), and clang::ASTContext::getTypeAlignIfKnown().

Referenced by clang::Sema::ActOnCXXDelete(), doesUsualArrayDeleteWantSize(), clang::Sema::FindAllocationFunctions(), clang::Sema::FindDeallocationFunction(), and clang::Sema::FindDeallocationFunctionForDestructor().

◆ isLegalArrayNewInitializer()

bool isLegalArrayNewInitializer ( CXXNewInitializationStyle Style,
Expr * Init,
bool IsCPlusPlus20 )
static

Definition at line 2080 of file SemaExprCXX.cpp.

References clang::Braces, clang::Init, and clang::isa().

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

◆ isNonPlacementDeallocationFunction()

◆ isValidSizelessVectorForConditionalCondition()

◆ isValidVectorForConditionalCondition()

◆ LookupGlobalDeallocationFunctions()

◆ MaybeDecrementCount()

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

◆ noteOperatorArrows()

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

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

Definition at line 6854 of file SemaExprCXX.cpp.

References clang::SemaBase::Diag().

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

◆ resolveAllocationOverload()

◆ resolveAllocationOverloadInterior()

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

Definition at line 2670 of file SemaExprCXX.cpp.

References clang::Sema::AddOverloadCandidate(), clang::Sema::AddTemplateOverloadCandidate(), clang::Sema::AR_inaccessible, clang::LookupResult::begin(), clang::OverloadCandidateSet::BestViableFunction(), clang::C, clang::cast(), clang::Sema::CheckAllocationAccess(), clang::LookupResult::clear(), clang::OverloadCandidateSet::CompleteCandidates(), clang::Sema::Context, clang::OverloadCandidateSet::CSK_Normal, clang::ASTContext::DeclarationNames, clang::SemaBase::Diag(), clang::Sema::Diagnose, clang::Sema::DiagnoseUseOfDeletedFunction(), clang::LookupResult::end(), clang::Decl::getAsFunction(), clang::ASTContext::getBaseElementType(), clang::DeclarationNameTable::getCXXOperatorName(), clang::DeclarationName::getCXXOverloadedOperator(), clang::ASTContext::getLangOpts(), clang::LookupResult::getLookupName(), clang::LookupResult::getNameLoc(), clang::LookupResult::getNamingClass(), clang::Type::getPointeeType(), clang::ASTContext::getTranslationUnitDecl(), clang::NamedDecl::getUnderlyingDecl(), clang::isAlignedAllocation(), clang::LookupResult::isClassLookup(), clang::QualType::isConstQualified(), clang::Type::isPointerType(), clang::FunctionDecl::isTypeAwareOperatorNewOrDelete(), clang::Sema::LookupQualifiedName(), clang::No, clang::OverloadCandidateSet::NoteCandidates(), clang::OCD_AllCandidates, clang::OCD_AmbiguousCandidates, clang::OR_Ambiguous, clang::OR_Deleted, clang::OR_No_Viable_Function, clang::OR_Success, clang::SemaBase::PDiag(), resolveAllocationOverloadInterior(), clang::LookupResult::setLookupName(), and Typed.

Referenced by resolveAllocationOverload(), and resolveAllocationOverloadInterior().

◆ resolveBuiltinNewDeleteOverload()

◆ resolveDeallocationOverload()

UsualDeallocFnInfo resolveDeallocationOverload ( Sema & S,
LookupResult & R,
const ImplicitDeallocationParameters & IDP,
SourceLocation Loc,
llvm::SmallVectorImpl< UsualDeallocFnInfo > * BestFns = nullptr )
static

◆ TryClassUnification()

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

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 5485 of file SemaExprCXX.cpp.

References clang::InitializationKind::CreateCopy(), clang::InitializationSequence::Diagnose(), clang::InitializationSequence::Failed(), clang::Type::getAsCanonical(), clang::Stmt::getBeginLoc(), clang::QualType::getNonLValueExprType(), clang::Expr::getType(), clang::InitializedEntity::InitializeTemporary(), clang::InitializationSequence::isAmbiguous(), clang::QualType::isAtLeastAsQualifiedAs(), clang::InitializationSequence::isDirectReferenceBinding(), clang::Expr::isGLValue(), clang::Self, and clang::T.

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

◆ VariableCanNeverBeAConstantExpression()