clang  6.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/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 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< CapturingScopeInfo::Capture > Candidates)
 

Typedef Documentation

◆ EnumValsTy

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

Definition at line 710 of file SemaStmt.cpp.

Enumeration Type Documentation

◆ BeginEndFunction

Definition at line 1981 of file SemaStmt.cpp.

Function Documentation

◆ AdjustAPSInt()

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

Definition at line 685 of file SemaStmt.cpp.

◆ buildCapturedStmtCaptureList()

static void buildCapturedStmtCaptureList ( SmallVectorImpl< CapturedStmt::Capture > &  Captures,
SmallVectorImpl< Expr *> &  CaptureInits,
ArrayRef< CapturingScopeInfo::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 2118 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 692 of file SemaStmt.cpp.

◆ checkEnumTypesInSwitchStmt()

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

Definition at line 746 of file SemaStmt.cpp.

◆ CheckJumpOutOfSEHFinally()

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

Definition at line 2801 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 575 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 589 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 intialized 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 2712 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 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 597 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 605 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 3002 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 2206 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 714 of file SemaStmt.cpp.