clang API Documentation

Functions
SemaExprCXX.cpp File Reference

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

#include "clang/Sema/SemaInternal.h"
#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/EvaluatedExprVisitor.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/PartialDiagnostic.h"
#include "clang/Basic/TargetInfo.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/SemaLambda.h"
#include "clang/Sema/TemplateDeduction.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/ErrorHandling.h"
Include dependency graph for SemaExprCXX.cpp:

Go to the source code of this file.

Functions

static ExprcaptureThis (ASTContext &Context, RecordDecl *RD, QualType ThisTy, SourceLocation Loc)
static bool doesUsualArrayDeleteWantSize (Sema &S, SourceLocation loc, QualType allocType)
static bool isLegalArrayNewInitializer (CXXNewExpr::InitializationStyle Style, Expr *Init)
static bool isNonPlacementDeallocationFunction (Sema &S, FunctionDecl *FD)
 Determine whether the given function is a non-placement deallocation function.
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.
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 hasNontrivialObjCLifetime (QualType T)
 Determine whether T has a non-trivial Objective-C lifetime in ARC mode.
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++0x 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 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 IsSpecialDiscardedValue (Expr *E)
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. 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.

Detailed Description

Implements semantic analysis for C++ expressions.

Definition in file SemaExprCXX.cpp.


Function Documentation

static ExprResult BuildCXXCastArgument ( Sema S,
SourceLocation  CastLoc,
QualType  Ty,
CastKind  Kind,
CXXMethodDecl Method,
DeclAccessPair  FoundDecl,
bool  HadMultipleCandidates,
Expr From 
) [static]
static Expr* captureThis ( ASTContext Context,
RecordDecl RD,
QualType  ThisTy,
SourceLocation  Loc 
) [static]
static bool CheckArrow ( Sema S,
QualType ObjectType,
Expr *&  Base,
tok::TokenKind OpKind,
SourceLocation  OpLoc 
) [static]
static void CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures ( Expr *const  FE,
LambdaScopeInfo *const  CurrentLSI,
Sema S 
) [static]
static bool CheckUnaryTypeTraitTypeCompleteness ( Sema S,
TypeTrait  UTT,
SourceLocation  Loc,
QualType  ArgTy 
) [static]

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

References clang::Sema::Context, clang::ASTContext::getAsArrayType(), clang::ArrayType::getElementType(), clang::Type::isIncompleteArrayType(), clang::Type::isVoidType(), clang::Sema::RequireCompleteType(), clang::UTT_HasNothrowAssign, clang::UTT_HasNothrowConstructor, clang::UTT_HasNothrowCopy, clang::UTT_HasNothrowMoveAssign, clang::UTT_HasTrivialAssign, clang::UTT_HasTrivialCopy, clang::UTT_HasTrivialDefaultConstructor, clang::UTT_HasTrivialDestructor, clang::UTT_HasTrivialMoveAssign, clang::UTT_HasTrivialMoveConstructor, clang::UTT_HasVirtualDestructor, clang::UTT_IsAbstract, clang::UTT_IsArithmetic, clang::UTT_IsArray, clang::UTT_IsClass, clang::UTT_IsCompleteType, clang::UTT_IsCompound, clang::UTT_IsConst, clang::UTT_IsDestructible, clang::UTT_IsEmpty, clang::UTT_IsEnum, clang::UTT_IsFinal, clang::UTT_IsFloatingPoint, clang::UTT_IsFunction, clang::UTT_IsFundamental, clang::UTT_IsIntegral, clang::UTT_IsInterfaceClass, clang::UTT_IsLiteral, clang::UTT_IsLvalueReference, clang::UTT_IsMemberFunctionPointer, clang::UTT_IsMemberObjectPointer, clang::UTT_IsMemberPointer, clang::UTT_IsNothrowDestructible, clang::UTT_IsObject, clang::UTT_IsPOD, clang::UTT_IsPointer, clang::UTT_IsPolymorphic, clang::UTT_IsReference, clang::UTT_IsRvalueReference, clang::UTT_IsScalar, clang::UTT_IsSealed, clang::UTT_IsSigned, clang::UTT_IsStandardLayout, clang::UTT_IsTrivial, clang::UTT_IsTriviallyCopyable, clang::UTT_IsUnion, clang::UTT_IsUnsigned, clang::UTT_IsVoid, and clang::UTT_IsVolatile.

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

static bool ConvertForConditional ( Sema Self,
ExprResult E,
QualType  T 
) [static]
static bool doesUsualArrayDeleteWantSize ( Sema S,
SourceLocation  loc,
QualType  allocType 
) [static]
static uint64_t EvaluateArrayTypeTrait ( Sema Self,
ArrayTypeTrait  ATT,
QualType  T,
Expr DimExpr,
SourceLocation  KeyLoc 
) [static]
static bool EvaluateBinaryTypeTrait ( Sema Self,
TypeTrait  BTT,
QualType  LhsT,
QualType  RhsT,
SourceLocation  KeyLoc 
) [static]
static bool EvaluateExpressionTrait ( ExpressionTrait  ET,
Expr E 
) [static]
static bool evaluateTypeTrait ( Sema S,
TypeTrait  Kind,
SourceLocation  KWLoc,
ArrayRef< TypeSourceInfo * >  Args,
SourceLocation  RParenLoc 
) [static]
static bool EvaluateUnaryTypeTrait ( Sema Self,
TypeTrait  UTT,
SourceLocation  KeyLoc,
QualType  T 
) [static]

Definition at line 3227 of file SemaExprCXX.cpp.

References clang::Sema::Context, clang::Type::getAs(), clang::Type::getAsCXXRecordDecl(), clang::FunctionProtoType::getNumParams(), clang::QualType::getObjCLifetime(), clang::ValueDecl::getType(), clang::CXXRecordDecl::hasNonTrivialCopyAssignment(), clang::CXXRecordDecl::hasNonTrivialMoveAssignment(), HasNoThrowOperator(), clang::CXXRecordDecl::hasTrivialCopyAssignment(), clang::CXXRecordDecl::hasTrivialMoveAssignment(), clang::Type::isArithmeticType(), clang::Type::isArrayType(), clang::Type::isClassType(), clang::Type::isCompoundType(), clang::QualType::isConstQualified(), clang::CXXMethodDecl::isCopyAssignmentOperator(), clang::CXXConstructorDecl::isCopyConstructor(), clang::CXXConstructorDecl::isDefaultConstructor(), clang::Type::isDependentType(), clang::Type::isEnumeralType(), 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::Type::isPointerType(), clang::Type::isReferenceType(), clang::Type::isRValueReferenceType(), clang::Type::isScalarType(), clang::Type::isSignedIntegerType(), clang::Type::isStandardLayoutType(), clang::Type::isStructureType(), clang::QualType::isTriviallyCopyableType(), clang::QualType::isTrivialType(), clang::Type::isUnionType(), clang::Type::isUnsignedIntegerType(), 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, clang::Sema::ResolveExceptionSpec(), clang::UTT_HasNothrowAssign, clang::UTT_HasNothrowConstructor, clang::UTT_HasNothrowCopy, clang::UTT_HasNothrowMoveAssign, clang::UTT_HasTrivialAssign, clang::UTT_HasTrivialCopy, clang::UTT_HasTrivialDefaultConstructor, clang::UTT_HasTrivialDestructor, clang::UTT_HasTrivialMoveAssign, clang::UTT_HasTrivialMoveConstructor, clang::UTT_HasVirtualDestructor, clang::UTT_IsAbstract, clang::UTT_IsArithmetic, clang::UTT_IsArray, clang::UTT_IsClass, clang::UTT_IsCompleteType, clang::UTT_IsCompound, clang::UTT_IsConst, clang::UTT_IsDestructible, clang::UTT_IsEmpty, clang::UTT_IsEnum, clang::UTT_IsFinal, clang::UTT_IsFloatingPoint, clang::UTT_IsFunction, clang::UTT_IsFundamental, clang::UTT_IsIntegral, clang::UTT_IsInterfaceClass, clang::UTT_IsLiteral, clang::UTT_IsLvalueReference, clang::UTT_IsMemberFunctionPointer, clang::UTT_IsMemberObjectPointer, clang::UTT_IsMemberPointer, clang::UTT_IsNothrowDestructible, clang::UTT_IsObject, clang::UTT_IsPOD, clang::UTT_IsPointer, clang::UTT_IsPolymorphic, clang::UTT_IsReference, clang::UTT_IsRvalueReference, clang::UTT_IsScalar, clang::UTT_IsSealed, clang::UTT_IsSigned, clang::UTT_IsStandardLayout, clang::UTT_IsTrivial, clang::UTT_IsTriviallyCopyable, clang::UTT_IsUnion, clang::UTT_IsUnsigned, clang::UTT_IsVoid, and clang::UTT_IsVolatile.

Referenced by evaluateTypeTrait().

static bool FindConditionalOverload ( Sema Self,
ExprResult LHS,
ExprResult RHS,
SourceLocation  QuestionLoc 
) [static]
static bool hasNontrivialObjCLifetime ( QualType  T) [static]
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 
) [static]
static bool isLegalArrayNewInitializer ( CXXNewExpr::InitializationStyle  Style,
Expr Init 
) [static]

Definition at line 1136 of file SemaExprCXX.cpp.

References clang::CXXNewExpr::ListInit.

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

static bool isNonPlacementDeallocationFunction ( Sema S,
FunctionDecl FD 
) [static]
static bool IsSpecialDiscardedValue ( Expr E) [static]
static void noteOperatorArrows ( Sema S,
ArrayRef< FunctionDecl * >  OperatorArrows 
) [static]

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

Definition at line 5140 of file SemaExprCXX.cpp.

References clang::Sema::Diag().

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

static 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++0x 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 4199 of file SemaExprCXX.cpp.

References clang::Sema::Context, clang::InitializationKind::CreateCopy(), clang::InitializationSequence::Diagnose(), clang::InitializationSequence::Failed(), clang::Type::getAs(), clang::Stmt::getLocStart(), clang::ASTContext::getLValueReferenceType(), clang::Expr::getType(), clang::QualType::getUnqualifiedType(), clang::InitializedEntity::InitializeTemporary(), clang::InitializationSequence::isAmbiguous(), clang::QualType::isAtLeastAsQualifiedAs(), clang::Sema::IsDerivedFrom(), clang::InitializationSequence::isDirectReferenceBinding(), and clang::Expr::isLValue().

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

static bool VariableCanNeverBeAConstantExpression ( VarDecl Var,
ASTContext Context 
) [inline, static]