clang  7.0.0svn
Classes | Namespaces | Typedefs | Enumerations | Functions
SemaStmt.cpp File Reference
#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
 DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterators.
 

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 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 *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 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 void buildCapturedStmtCaptureList (SmallVectorImpl< CapturedStmt::Capture > &Captures, SmallVectorImpl< Expr *> &CaptureInits, ArrayRef< sema::Capture > Candidates)
 

Typedef Documentation

◆ EnumValsTy

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

Definition at line 724 of file SemaStmt.cpp.

Enumeration Type Documentation

◆ BeginEndFunction

Definition at line 1995 of file SemaStmt.cpp.

Function Documentation

◆ AdjustAPSInt()

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

Definition at line 699 of file SemaStmt.cpp.

◆ buildCapturedStmtCaptureList()

static void buildCapturedStmtCaptureList ( SmallVectorImpl< CapturedStmt::Capture > &  Captures,
SmallVectorImpl< Expr *> &  CaptureInits,
ArrayRef< sema::Capture Candidates 
)
static

◆ 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 2134 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_Success, clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::IdentifierTable::get(), clang::Type::getAsCXXRecordDecl(), clang::Sema::getCurScope(), clang::Preprocessor::getIdentifierTable(), clang::Decl::getLocation(), clang::Stmt::getLocStart(), clang::Expr::getType(), clang::SourceLocation::isInvalid(), clang::ActionResult< PtrTy, CompressInvalid >::isInvalid(), clang::Sema::LookupMemberName, clang::Sema::LookupQualifiedName(), 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 706 of file SemaStmt.cpp.

◆ checkEnumTypesInSwitchStmt()

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

Definition at line 760 of file SemaStmt.cpp.

◆ CheckJumpOutOfSEHFinally()

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

Definition at line 2819 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 589 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 603 of file SemaStmt.cpp.

◆ DiagnoseForRangeConstVariableCopies()

static void DiagnoseForRangeConstVariableCopies ( Sema SemaRef,
const VarDecl VD 
)
static

◆ DiagnoseForRangeReferenceVariableCopies()

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

◆ 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 2730 of file SemaStmt.cpp.

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

◆ 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 129 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 611 of file SemaStmt.cpp.

◆ FinishForRangeVarDecl()

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

◆ GetTypeBeforeIntegralPromotion()

static QualType GetTypeBeforeIntegralPromotion ( const Expr *&  E)
static

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

Definition at line 619 of file SemaStmt.cpp.

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 3136 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().

◆ ObjCEnumerationCollection()

static bool ObjCEnumerationCollection ( Expr Collection)
static

◆ RebuildForRangeWithDereference()

static StmtResult RebuildForRangeWithDereference ( Sema SemaRef,
Scope S,
SourceLocation  ForLoc,
SourceLocation  CoawaitLoc,
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 2222 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 728 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
ConvertingConstructorsOnlyIf 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.
ResWe 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 2950 of file SemaStmt.cpp.

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