clang 10.0.0git

Classes | Namespaces | Typedefs | Enumerations | Functions
SemaStmt.cpp File Reference
`#include "clang/Sema/Ownership.h"`
`#include "clang/Sema/SemaInternal.h"`
`#include "clang/AST/ASTContext.h"`
`#include "clang/AST/ASTDiagnostic.h"`
`#include "clang/AST/ASTLambda.h"`
`#include "clang/AST/CharUnits.h"`
`#include "clang/AST/CXXInheritance.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/StmtCXX.h"`
`#include "clang/AST/StmtObjC.h"`
`#include "clang/AST/TypeLoc.h"`
`#include "clang/AST/TypeOrdering.h"`
`#include "clang/Basic/TargetInfo.h"`
`#include "clang/Lex/Preprocessor.h"`
`#include "clang/Sema/Initialization.h"`
`#include "clang/Sema/Lookup.h"`
`#include "clang/Sema/Scope.h"`
`#include "clang/Sema/ScopeInfo.h"`
`#include "llvm/ADT/ArrayRef.h"`
`#include "llvm/ADT/DenseMap.h"`
`#include "llvm/ADT/STLExtras.h"`
`#include "llvm/ADT/SmallPtrSet.h"`
`#include "llvm/ADT/SmallString.h"`
`#include "llvm/ADT/SmallVector.h"`
Include dependency graph for SemaStmt.cpp:

Go to the source code of this file.

## Classes
struct | llvm::DenseMapInfo< CatchHandlerType >

## Namespaces
| llvm
| Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be placed into a PointerUnion.

## Typedefs
typedef SmallVector< std::pair< llvm::APSInt, EnumConstantDecl * >, 64 > | EnumValsTy

## Enumerations
enum | BeginEndFunction

## Functions
static bool | DiagnoseUnusedComparison (Sema &S, const Expr *E)
| Diagnose unused comparisons, both builtin and overloaded operators. More...
static bool | DiagnoseNoDiscard (Sema &S, const WarnUnusedResultAttr *A, SourceLocation Loc, SourceRange R1, SourceRange R2, bool IsCtor)
static bool | CmpCaseVals (const std::pair< llvm::APSInt, CaseStmt *> &lhs, const std::pair< llvm::APSInt, CaseStmt *> &rhs)
| CmpCaseVals - Comparison predicate for sorting case values. More...
static bool | CmpEnumVals (const std::pair< llvm::APSInt, EnumConstantDecl *> &lhs, const std::pair< llvm::APSInt, EnumConstantDecl *> &rhs)
| CmpEnumVals - Comparison predicate for sorting enumeration values. More...
static bool | EqEnumVals (const std::pair< llvm::APSInt, EnumConstantDecl *> &lhs, const std::pair< llvm::APSInt, EnumConstantDecl *> &rhs)
| EqEnumVals - Comparison preficate for uniqing enumeration values. More...
static QualType | GetTypeBeforeIntegralPromotion (const Expr *&E)
| GetTypeBeforeIntegralPromotion - Returns the pre-promotion type of potentially integral-promoted expression `expr`. More...
static void | AdjustAPSInt (llvm::APSInt &Val, unsigned BitWidth, bool IsSigned)
static void | checkCaseValue (Sema &S, SourceLocation Loc, const llvm::APSInt &Val, unsigned UnpromotedWidth, bool UnpromotedSign)
| Check the specified case value is in range for the given unpromoted switch type. More...
static bool | ShouldDiagnoseSwitchCaseNotInEnum (const Sema &S, const EnumDecl *ED, const Expr *CaseExpr, EnumValsTy::iterator &EI, EnumValsTy::iterator &EIEnd, const llvm::APSInt &Val)
| Returns true if we should emit a diagnostic about this case expression not being a part of the enum used in the switch controlling expression. More...
static void | checkEnumTypesInSwitchStmt (Sema &S, const Expr *Cond, const Expr *Case)
static bool | FinishForRangeVarDecl (Sema &SemaRef, VarDecl *Decl, Expr *Init, SourceLocation Loc, int DiagID)
| Finish building a variable declaration for a for-range statement. More...
static bool | ObjCEnumerationCollection (Expr *Collection)
static Sema::ForRangeStatus | BuildNonArrayForRange (Sema &SemaRef, Expr *BeginRange, Expr *EndRange, QualType RangeType, VarDecl *BeginVar, VarDecl *EndVar, SourceLocation ColonLoc, SourceLocation CoawaitLoc, OverloadCandidateSet *CandidateSet, ExprResult *BeginExpr, ExprResult *EndExpr, BeginEndFunction *BEF)
| Create the initialization, compare, and increment steps for the range-based for loop expression. More...
static StmtResult | RebuildForRangeWithDereference (Sema &SemaRef, Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, Stmt *LoopVarDecl, SourceLocation ColonLoc, Expr *Range, SourceLocation RangeLoc, SourceLocation RParenLoc)
| Speculatively attempt to dereference an invalid range expression. More...
static void | DiagnoseForRangeReferenceVariableCopies (Sema &SemaRef, const VarDecl *VD, QualType RangeInitType)
static bool | hasTrivialABIAttr (QualType VariableType)
| Determines whether the `VariableType's` declaration is a record with the clang::trivial_abi attribute. More...
static void | DiagnoseForRangeConstVariableCopies (Sema &SemaRef, const VarDecl *VD)
static void | DiagnoseForRangeVariableCopies (Sema &SemaRef, const CXXForRangeStmt *ForStmt)
| DiagnoseForRangeVariableCopies - Diagnose three cases and fixes for them. More...
static void | CheckJumpOutOfSEHFinally (Sema &S, SourceLocation Loc, const Scope &DestScope)
static void | TryMoveInitialization (Sema &S, const InitializedEntity &Entity, const VarDecl *NRVOCandidate, QualType ResultType, Expr *&Value, bool ConvertingConstructorsOnly, ExprResult &Res)
| Try to perform the initialization of a potentially-movable value, which is the operand to a return or throw statement. More...
static bool | hasDeducedReturnType (FunctionDecl *FD)
| Determine whether the declared return type of the specified function contains 'auto'. More...
static bool | buildCapturedStmtCaptureList (Sema &S, CapturedRegionScopeInfo *RSI, SmallVectorImpl< CapturedStmt::Capture > &Captures, SmallVectorImpl< Expr *> &CaptureInits)

## Typedef Documentation

## ◆ EnumValsTy

typedef SmallVector<std::pair<llvm::APSInt, EnumConstantDecl*>, 64> EnumValsTy

Definition at line 784 of file SemaStmt.cpp.

## Enumeration Type Documentation

## ◆ BeginEndFunction

enum BeginEndFunction

Definition at line 2025 of file SemaStmt.cpp.

## Function Documentation

## ◆ AdjustAPSInt()

static void AdjustAPSInt | ( | llvm::APSInt & | Val,
|  | unsigned | BitWidth,
|  | bool | IsSigned
| ) |  |
| static

Definition at line 755 of file SemaStmt.cpp.

## ◆ buildCapturedStmtCaptureList()

static bool buildCapturedStmtCaptureList | ( | Sema & | S,
|  | CapturedRegionScopeInfo * | RSI,
|  | SmallVectorImpl< CapturedStmt::Capture > & | Captures,
|  | SmallVectorImpl< Expr *> & | CaptureInits
| ) |  |
| static

Definition at line 4297 of file SemaStmt.cpp.

## ◆ BuildNonArrayForRange()

static Sema::ForRangeStatus BuildNonArrayForRange | ( | Sema & | SemaRef,
|  | Expr * | BeginRange,
|  | Expr * | EndRange,
|  | QualType | RangeType,
|  | VarDecl * | BeginVar,
|  | VarDecl * | EndVar,
|  | SourceLocation | ColonLoc,
|  | SourceLocation | CoawaitLoc,
|  | OverloadCandidateSet * | CandidateSet,
|  | ExprResult * | BeginExpr,
|  | ExprResult * | EndExpr,
|  | BeginEndFunction * | BEF
| ) |  |
| static

Create the initialization, compare, and increment steps for the range-based for loop expression.

This function does not handle array-based for loops, which are created in Sema::BuildCXXForRangeStmt.

Returns
  a ForRangeStatus indicating success or what kind of error occurred. BeginExpr and EndExpr are set and FRS_Success is returned on success; CandidateSet and BEF are set and some non-success value is returned on failure.

Definition at line 2169 of file SemaStmt.cpp.

References clang::Sema::ActOnCoawaitExpr(), clang::Sema::BuildForRangeBeginEndCall(), ColonLoc, clang::Sema::Diag(), clang::LookupResult::empty(), FinishForRangeVarDecl(), clang::Sema::FRS_DiagnosticIssued, clang::Sema::FRS_NoViableFunction, clang::Sema::FRS_Success, clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::IdentifierTable::get(), clang::Type::getAsCXXRecordDecl(), clang::Stmt::getBeginLoc(), clang::Sema::getCurScope(), clang::Preprocessor::getIdentifierTable(), clang::Expr::getType(), clang::LookupResult::isAmbiguous(), clang::SourceLocation::isInvalid(), clang::ActionResult< PtrTy, CompressInvalid >::isInvalid(), clang::Sema::LookupMemberName, clang::Sema::LookupQualifiedName(), clang::OverloadCandidateSet::NoteCandidates(), clang::OCD_AllCandidates, clang::Sema::PDiag(), and clang::Sema::PP.

## ◆ checkCaseValue()

static void checkCaseValue | ( | Sema & | S,
|  | SourceLocation | Loc,
|  | const llvm::APSInt & | Val,
|  | unsigned | UnpromotedWidth,
|  | bool | UnpromotedSign
| ) |  |
| static

Check the specified case value is in range for the given unpromoted switch type.

Definition at line 762 of file SemaStmt.cpp.

## ◆ checkEnumTypesInSwitchStmt()

static void checkEnumTypesInSwitchStmt | ( | Sema & | S,
|  | const Expr * | Cond,
|  | const Expr * | Case
| ) |  |
| static

Definition at line 820 of file SemaStmt.cpp.

## ◆ CheckJumpOutOfSEHFinally()

static void CheckJumpOutOfSEHFinally | ( | Sema & | S,
|  | SourceLocation | Loc,
|  | const Scope & | DestScope
| ) |  |
| static

Definition at line 2934 of file SemaStmt.cpp.

Referenced by clang::Sema::ActOnReturnStmt(), and clang::Sema::ActOnSEHLeaveStmt().

## ◆ CmpCaseVals()

static bool CmpCaseVals | ( | const std::pair< llvm::APSInt, CaseStmt *> & | lhs,
|  | const std::pair< llvm::APSInt, CaseStmt *> & | rhs
| ) |  |
| static

CmpCaseVals - Comparison predicate for sorting case values.

Definition at line 622 of file SemaStmt.cpp.

## ◆ CmpEnumVals()

static bool CmpEnumVals | ( | const std::pair< llvm::APSInt, EnumConstantDecl *> & | lhs,
|  | const std::pair< llvm::APSInt, EnumConstantDecl *> & | rhs
| ) |  |
| static

CmpEnumVals - Comparison predicate for sorting enumeration values.

Definition at line 636 of file SemaStmt.cpp.

## ◆ DiagnoseForRangeConstVariableCopies()

static void DiagnoseForRangeConstVariableCopies | ( | Sema & | SemaRef,
|  | const VarDecl * | VD
| ) |  |
| static

Definition at line 2794 of file SemaStmt.cpp.

References clang::Sema::Context, clang::FixItHint::CreateInsertion(), clang::Sema::Diag(), clang::DeclaratorDecl::getBeginLoc(), clang::VarDecl::getInit(), clang::Decl::getLocation(), clang::ASTContext::getLValueReferenceType(), clang::VarDecl::getSourceRange(), clang::Expr::getType(), clang::ValueDecl::getType(), clang::ASTContext::getTypeSize(), hasTrivialABIAttr(), and clang::QualType::isTriviallyCopyableType().

Referenced by DiagnoseForRangeVariableCopies().

## ◆ DiagnoseForRangeReferenceVariableCopies()

static void DiagnoseForRangeReferenceVariableCopies | ( | Sema & | SemaRef,
|  | const VarDecl * | VD,
|  | QualType | RangeInitType
| ) |  |
| static

Definition at line 2707 of file SemaStmt.cpp.

References clang::Sema::Context, clang::FixItHint::CreateRemoval(), clang::Sema::Diag(), clang::MemberExpr::getBase(), clang::DeclaratorDecl::getBeginLoc(), clang::CallExpr::getDirectCallee(), clang::VarDecl::getInit(), clang::Decl::getLocation(), clang::ASTContext::getLValueReferenceType(), clang::QualType::getNonReferenceType(), clang::VarDecl::getSourceRange(), clang::MaterializeTemporaryExpr::getSubExpr(), clang::Expr::getType(), clang::ValueDecl::getType(), clang::DeclaratorDecl::getTypeSpecEndLoc(), clang::Expr::IgnoreImpCasts(), clang::Type::isReferenceType(), clang::Type::isRValueReferenceType(), clang::QualType::removeLocalConst(), and clang::QualType::withConst().

Referenced by DiagnoseForRangeVariableCopies().

## ◆ DiagnoseForRangeVariableCopies()

static void DiagnoseForRangeVariableCopies | ( | Sema & | SemaRef,
|  | const CXXForRangeStmt * | ForStmt
| ) |  |
| static

DiagnoseForRangeVariableCopies - Diagnose three cases and fixes for them.

1) for (const foo &x : foos) where foos only returns a copy. Suggest using "const foo x" to show that a copy is made 2) for (const bar &x : foos) where bar is a temporary initialized by bar. Suggest either "const bar x" to keep the copying or "const foo& x" to prevent the copy. 3) for (const foo x : foos) where x is constructed from a reference foo. Suggest "const foo &x" to prevent the copy.

Definition at line 2839 of file SemaStmt.cpp.

References DiagnoseForRangeConstVariableCopies(), DiagnoseForRangeReferenceVariableCopies(), clang::Sema::Diags, clang::CXXForRangeStmt::getBeginLoc(), clang::Expr::getExprLoc(), clang::VarDecl::getInit(), clang::CXXForRangeStmt::getLoopVariable(), clang::CXXForRangeStmt::getRangeInit(), clang::Expr::getType(), clang::ValueDecl::getType(), clang::Sema::inTemplateInstantiation(), clang::QualType::isConstQualified(), clang::DiagnosticsEngine::isIgnored(), clang::Type::isIncompleteType(), clang::SourceLocation::isMacroID(), and clang::Type::isReferenceType().

## ◆ DiagnoseNoDiscard()

static bool DiagnoseNoDiscard | ( | Sema & | S,
|  | const WarnUnusedResultAttr * | A,
|  | SourceLocation | Loc,
|  | SourceRange | R1,
|  | SourceRange | R2,
|  | bool | IsCtor
| ) |  |
| static

Definition at line 199 of file SemaStmt.cpp.

## ◆ DiagnoseUnusedComparison()

static bool DiagnoseUnusedComparison | ( | Sema & | S,
|  | const Expr * | E
| ) |  |
| static

Diagnose unused comparisons, both builtin and overloaded operators.

For '==' and '!=', suggest fixits for '=' or '|='.

Adding a cast to void (or other expression wrappers) will prevent the warning from firing.

Definition at line 128 of file SemaStmt.cpp.

## ◆ EqEnumVals()

static bool EqEnumVals | ( | const std::pair< llvm::APSInt, EnumConstantDecl *> & | lhs,
|  | const std::pair< llvm::APSInt, EnumConstantDecl *> & | rhs
| ) |  |
| static

EqEnumVals - Comparison preficate for uniqing enumeration values.

Definition at line 644 of file SemaStmt.cpp.

## ◆ FinishForRangeVarDecl()

static bool FinishForRangeVarDecl | ( | Sema & | SemaRef,
|  | VarDecl * | Decl,
|  | Expr * | Init,
|  | SourceLocation | Loc,
|  | int | DiagID
| ) |  |
| static

Finish building a variable declaration for a for-range statement.

Returns
  true if an error occurs.

Definition at line 1985 of file SemaStmt.cpp.

References clang::DeclContext::addHiddenDecl(), clang::Sema::AddInitializerToDecl(), clang::Sema::CorrectDelayedTyposInExpr(), clang::Sema::CurContext, clang::Sema::DAR_Failed, clang::Sema::DeduceAutoType(), clang::Sema::Diag(), clang::Sema::FinalizeDeclaration(), clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::Sema::getLangOpts(), clang::Expr::getType(), clang::ValueDecl::getType(), clang::DeclaratorDecl::getTypeSourceInfo(), clang::Sema::inferObjCARCLifetime(), clang::QualType::isNull(), clang::Type::isUndeducedType(), clang::ActionResult< PtrTy, CompressInvalid >::isUsable(), clang::Type::isVoidType(), clang::Decl::setInvalidDecl(), and clang::ValueDecl::setType().

Referenced by BuildNonArrayForRange().

## ◆ GetTypeBeforeIntegralPromotion()

static QualType GetTypeBeforeIntegralPromotion | ( | const Expr *& | E | ) |
| static

GetTypeBeforeIntegralPromotion - Returns the pre-promotion type of potentially integral-promoted expression `expr`.

Definition at line 652 of file SemaStmt.cpp.

References clang::Expr::getType().

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

## ◆ hasDeducedReturnType()

static bool hasDeducedReturnType | ( | FunctionDecl * | FD | ) |
| static

Determine whether the declared return type of the specified function contains 'auto'.

Definition at line 3251 of file SemaStmt.cpp.

References clang::Type::castAs(), clang::FunctionType::getReturnType(), clang::TypeSourceInfo::getType(), clang::DeclaratorDecl::getTypeSourceInfo(), and clang::Type::isUndeducedType().

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

## ◆ hasTrivialABIAttr()

static bool hasTrivialABIAttr | ( | QualType | VariableType | ) |
| static

Determines whether the `VariableType's` declaration is a record with the clang::trivial_abi attribute.

Definition at line 2784 of file SemaStmt.cpp.

References clang::Type::getAsCXXRecordDecl().

Referenced by DiagnoseForRangeConstVariableCopies().

## ◆ ObjCEnumerationCollection()

static bool ObjCEnumerationCollection | ( | Expr * | Collection | ) |
| static

Definition at line 2070 of file SemaStmt.cpp.

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

## ◆ RebuildForRangeWithDereference()

static StmtResult RebuildForRangeWithDereference | ( | Sema & | SemaRef,
|  | Scope * | S,
|  | SourceLocation | ForLoc,
|  | SourceLocation | CoawaitLoc,
|  | Stmt * | InitStmt,
|  | Stmt * | LoopVarDecl,
|  | SourceLocation | ColonLoc,
|  | Expr * | Range,
|  | SourceLocation | RangeLoc,
|  | SourceLocation | RParenLoc
| ) |  |
| static

Speculatively attempt to dereference an invalid range expression.

If the attempt fails, this function will return a valid, null StmtResult and emit no diagnostics.

Definition at line 2303 of file SemaStmt.cpp.

## ◆ ShouldDiagnoseSwitchCaseNotInEnum()

static bool ShouldDiagnoseSwitchCaseNotInEnum | ( | const Sema & | S,
|  | const EnumDecl * | ED,
|  | const Expr * | CaseExpr,
|  | EnumValsTy::iterator & | EI,
|  | EnumValsTy::iterator & | EIEnd,
|  | const llvm::APSInt & | Val
| ) |  |
| static

Returns true if we should emit a diagnostic about this case expression not being a part of the enum used in the switch controlling expression.

Definition at line 788 of file SemaStmt.cpp.

## ◆ TryMoveInitialization()

static void TryMoveInitialization | ( | Sema & | S,
|  | const InitializedEntity & | Entity,
|  | const VarDecl * | NRVOCandidate,
|  | QualType | ResultType,
|  | Expr *& | Value,
|  | bool | ConvertingConstructorsOnly,
|  | ExprResult & | Res
| ) |  |
| static

Try to perform the initialization of a potentially-movable value, which is the operand to a return or throw statement.

This routine implements C++14 [class.copy]p32, which attempts to treat returned lvalues as rvalues in certain cases (to prefer move construction), then falls back to treating them as lvalues if that failed.

Parameters

  ConvertingConstructorsOnly | If true, follow [class.copy]p32 and reject resolutions that find non-constructors, such as derived-to-base conversions or `operator T()&&` member functions. If false, do consider such conversion sequences.
  Res | We will fill this in if move-initialization was possible. If move-initialization is not possible, such that we must fall back to treating the operand as an lvalue, we will leave Res in its original invalid state.

Definition at line 3065 of file SemaStmt.cpp.

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