Changeset View
Changeset View
Standalone View
Standalone View
clang/lib/Sema/TreeTransform.h
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 3,808 Lines • ▼ Show 20 Lines | private: | ||||
TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, | TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, | ||||
NamedDecl *FirstQualifierInScope, | NamedDecl *FirstQualifierInScope, | ||||
CXXScopeSpec &SS); | CXXScopeSpec &SS); | ||||
QualType TransformDependentNameType(TypeLocBuilder &TLB, | QualType TransformDependentNameType(TypeLocBuilder &TLB, | ||||
DependentNameTypeLoc TL, | DependentNameTypeLoc TL, | ||||
bool DeducibleTSTContext); | bool DeducibleTSTContext); | ||||
/// Sets FP options in Sema for use in instantiation of the given expression. | |||||
/// | |||||
/// \tparam TExpr Subclass of \c Expr, which must be able to keep \c FPOption. | |||||
template <typename TExpr> void setFPOptions(const TExpr *E) { | |||||
const LangOptions &LO = getSema().getLangOpts(); | |||||
FPOptions &CurFPO = getSema().CurFPFeatures; | |||||
CurFPO = E->getFPFeatures().applyOverrides(CurFPO); | |||||
getSema().FpPragmaStack.CurrentValue = CurFPO.getChangesFrom(FPOptions(LO)); | |||||
if (CurFPO.isFPConstrained()) | |||||
getSema().getCurFunction()->setUsesFPIntrin(); | |||||
} | |||||
}; | }; | ||||
template <typename Derived> | template <typename Derived> | ||||
StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { | StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { | ||||
if (!S) | if (!S) | ||||
return S; | return S; | ||||
switch (S->getStmtClass()) { | switch (S->getStmtClass()) { | ||||
▲ Show 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, | ||||
} | } | ||||
if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) | if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) | ||||
Init = MTE->getSubExpr(); | Init = MTE->getSubExpr(); | ||||
while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) | while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) | ||||
Init = Binder->getSubExpr(); | Init = Binder->getSubExpr(); | ||||
if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) | |||||
Init = ICE->getSubExprAsWritten(); | |||||
if (CXXStdInitializerListExpr *ILE = | if (CXXStdInitializerListExpr *ILE = | ||||
dyn_cast<CXXStdInitializerListExpr>(Init)) | dyn_cast<CXXStdInitializerListExpr>(Init)) | ||||
return TransformInitializer(ILE->getSubExpr(), NotCopyInit); | return TransformInitializer(ILE->getSubExpr(), NotCopyInit); | ||||
// If this is copy-initialization, we only need to reconstruct | // If this is copy-initialization, we only need to reconstruct | ||||
// InitListExprs. Other forms of copy-initialization will be a no-op if | // InitListExprs. Other forms of copy-initialization will be a no-op if | ||||
// the initializer is already the right type. | // the initializer is already the right type. | ||||
CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); | CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); | ||||
▲ Show 20 Lines • Show All 3,371 Lines • ▼ Show 20 Lines | |||||
TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, | TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, | ||||
bool IsStmtExpr) { | bool IsStmtExpr) { | ||||
Sema::CompoundScopeRAII CompoundScope(getSema()); | Sema::CompoundScopeRAII CompoundScope(getSema()); | ||||
const Stmt *ExprResult = S->getStmtExprResult(); | const Stmt *ExprResult = S->getStmtExprResult(); | ||||
bool SubStmtInvalid = false; | bool SubStmtInvalid = false; | ||||
bool SubStmtChanged = false; | bool SubStmtChanged = false; | ||||
SmallVector<Stmt*, 8> Statements; | SmallVector<Stmt*, 8> Statements; | ||||
Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | |||||
setFPOptions(S); | |||||
for (auto *B : S->body()) { | for (auto *B : S->body()) { | ||||
StmtResult Result = getDerived().TransformStmt( | StmtResult Result = getDerived().TransformStmt( | ||||
B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); | B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); | ||||
if (Result.isInvalid()) { | if (Result.isInvalid()) { | ||||
// Immediately fail if this was a DeclStmt, since it's very | // Immediately fail if this was a DeclStmt, since it's very | ||||
// likely that this will cause problems for future statements. | // likely that this will cause problems for future statements. | ||||
if (isa<DeclStmt>(B)) | if (isa<DeclStmt>(B)) | ||||
return StmtError(); | return StmtError(); | ||||
// Otherwise, just keep processing substatements and fail later. | // Otherwise, just keep processing substatements and fail later. | ||||
SubStmtInvalid = true; | SubStmtInvalid = true; | ||||
continue; | continue; | ||||
} | } | ||||
SubStmtChanged = SubStmtChanged || Result.get() != B; | SubStmtChanged = SubStmtChanged || Result.get() != B; | ||||
Statements.push_back(Result.getAs<Stmt>()); | Statements.push_back(Result.getAs<Stmt>()); | ||||
} | } | ||||
if (SubStmtInvalid) | if (SubStmtInvalid) | ||||
return StmtError(); | return StmtError(); | ||||
if (!getDerived().AlwaysRebuild() && | if (!getDerived().AlwaysRebuild() && !SubStmtChanged && | ||||
!SubStmtChanged) | FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | ||||
return S; | return S; | ||||
return getDerived().RebuildCompoundStmt(S->getLBracLoc(), | return getDerived().RebuildCompoundStmt(S->getLBracLoc(), | ||||
Statements, | Statements, | ||||
S->getRBracLoc(), | S->getRBracLoc(), | ||||
IsStmtExpr); | IsStmtExpr); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 3,353 Lines • ▼ Show 20 Lines | TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { | ||||
ExprResult SubExpr; | ExprResult SubExpr; | ||||
if (E->getOpcode() == UO_AddrOf) | if (E->getOpcode() == UO_AddrOf) | ||||
SubExpr = TransformAddressOfOperand(E->getSubExpr()); | SubExpr = TransformAddressOfOperand(E->getSubExpr()); | ||||
else | else | ||||
SubExpr = TransformExpr(E->getSubExpr()); | SubExpr = TransformExpr(E->getSubExpr()); | ||||
if (SubExpr.isInvalid()) | if (SubExpr.isInvalid()) | ||||
return ExprError(); | return ExprError(); | ||||
if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
setFPOptions(E); | |||||
if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr() && | |||||
FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return E; | return E; | ||||
return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), | return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), | ||||
E->getOpcode(), | E->getOpcode(), | ||||
SubExpr.get()); | SubExpr.get()); | ||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
▲ Show 20 Lines • Show All 344 Lines • ▼ Show 20 Lines | TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { | ||||
// Transform arguments. | // Transform arguments. | ||||
bool ArgChanged = false; | bool ArgChanged = false; | ||||
SmallVector<Expr*, 8> Args; | SmallVector<Expr*, 8> Args; | ||||
if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, | if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, | ||||
&ArgChanged)) | &ArgChanged)) | ||||
return ExprError(); | return ExprError(); | ||||
if (!getDerived().AlwaysRebuild() && | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
Callee.get() == E->getCallee() && | setFPOptions(E); | ||||
!ArgChanged) | |||||
if (!getDerived().AlwaysRebuild() && Callee.get() == E->getCallee() && | |||||
!ArgChanged && FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return SemaRef.MaybeBindToTemporary(E); | return SemaRef.MaybeBindToTemporary(E); | ||||
// FIXME: Wrong source location information for the '('. | // FIXME: Wrong source location information for the '('. | ||||
SourceLocation FakeLParenLoc | SourceLocation FakeLParenLoc | ||||
= ((Expr *)Callee.get())->getSourceRange().getBegin(); | = ((Expr *)Callee.get())->getSourceRange().getBegin(); | ||||
Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | |||||
if (E->hasStoredFPFeatures()) { | |||||
FPOptionsOverride NewOverrides = E->getFPFeatures(); | |||||
getSema().CurFPFeatures = | |||||
NewOverrides.applyOverrides(getSema().getLangOpts()); | |||||
getSema().FpPragmaStack.CurrentValue = NewOverrides; | |||||
} | |||||
return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, | return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, | ||||
Args, | Args, | ||||
E->getRParenLoc()); | E->getRParenLoc()); | ||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
ExprResult | ExprResult | ||||
TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { | TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { | ||||
ExprResult LHS = getDerived().TransformExpr(E->getLHS()); | ExprResult LHS = getDerived().TransformExpr(E->getLHS()); | ||||
if (LHS.isInvalid()) | if (LHS.isInvalid()) | ||||
return ExprError(); | return ExprError(); | ||||
ExprResult RHS = getDerived().TransformExpr(E->getRHS()); | ExprResult RHS = getDerived().TransformExpr(E->getRHS()); | ||||
if (RHS.isInvalid()) | if (RHS.isInvalid()) | ||||
return ExprError(); | return ExprError(); | ||||
if (!getDerived().AlwaysRebuild() && | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
LHS.get() == E->getLHS() && | setFPOptions(E); | ||||
RHS.get() == E->getRHS()) | |||||
if (!getDerived().AlwaysRebuild() && LHS.get() == E->getLHS() && | |||||
RHS.get() == E->getRHS() && | |||||
FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return E; | return E; | ||||
if (E->isCompoundAssignmentOp()) | if (E->isCompoundAssignmentOp()) | ||||
// FPFeatures has already been established from trailing storage | // FPFeatures has already been established from trailing storage by | ||||
// TransformCompoundAssignOperator. | |||||
return getDerived().RebuildBinaryOperator( | return getDerived().RebuildBinaryOperator( | ||||
E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); | E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); | ||||
Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | |||||
FPOptionsOverride NewOverrides(E->getFPFeatures()); | |||||
getSema().CurFPFeatures = | |||||
NewOverrides.applyOverrides(getSema().getLangOpts()); | |||||
getSema().FpPragmaStack.CurrentValue = NewOverrides; | |||||
return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), | return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), | ||||
LHS.get(), RHS.get()); | LHS.get(), RHS.get()); | ||||
} | } | ||||
template <typename Derived> | template <typename Derived> | ||||
ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( | ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( | ||||
CXXRewrittenBinaryOperator *E) { | CXXRewrittenBinaryOperator *E) { | ||||
CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); | CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); | ||||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | return getDerived().RebuildCXXRewrittenBinaryOperator( | ||||
E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); | E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); | ||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
ExprResult | ExprResult | ||||
TreeTransform<Derived>::TransformCompoundAssignOperator( | TreeTransform<Derived>::TransformCompoundAssignOperator( | ||||
CompoundAssignOperator *E) { | CompoundAssignOperator *E) { | ||||
Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
FPOptionsOverride NewOverrides(E->getFPFeatures()); | setFPOptions(E); | ||||
getSema().CurFPFeatures = | |||||
NewOverrides.applyOverrides(getSema().getLangOpts()); | |||||
getSema().FpPragmaStack.CurrentValue = NewOverrides; | |||||
return getDerived().TransformBinaryOperator(E); | return getDerived().TransformBinaryOperator(E); | ||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
ExprResult TreeTransform<Derived>:: | ExprResult TreeTransform<Derived>:: | ||||
TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { | TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { | ||||
// Just rebuild the common and RHS expressions and see whether we | // Just rebuild the common and RHS expressions and see whether we | ||||
// get any changes. | // get any changes. | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | return getDerived().RebuildConditionalOperator(Cond.get(), | ||||
LHS.get(), | LHS.get(), | ||||
E->getColonLoc(), | E->getColonLoc(), | ||||
RHS.get()); | RHS.get()); | ||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
ExprResult | ExprResult | ||||
TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { | TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { | ||||
ExprResult SubExpr = getDerived().TransformExpr(E->getSubExprAsWritten()); | |||||
if (SubExpr.isInvalid()) | |||||
return ExprError(); | |||||
// Implicit casts are eliminated during transformation, since they | // Implicit casts are eliminated during transformation, since they | ||||
// will be recomputed by semantic analysis after transformation. | // will be recomputed by semantic analysis after transformation. | ||||
return getDerived().TransformExpr(E->getSubExprAsWritten()); | // If however the cast involves floating-point transformations, it may keep | ||||
// FP options with it. In this case the implicit cast must be processed here, | |||||
// because semantic actions made latter have no access to the FP options. | |||||
switch (E->getCastKind()) { | |||||
default: | |||||
return SubExpr; | |||||
case CastKind::CK_FloatingCast: | |||||
case CastKind::CK_FloatingComplexCast: | |||||
case CastKind::CK_FloatingComplexToIntegralComplex: | |||||
case CastKind::CK_IntegralComplexToFloatingComplex: | |||||
case CastKind::CK_IntegralToFloating: | |||||
case CastKind::CK_FloatingToIntegral: | |||||
case CastKind::CK_FloatingToBoolean: | |||||
case CastKind::CK_FloatingComplexToBoolean: | |||||
break; | |||||
} | |||||
Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | |||||
setFPOptions(E); | |||||
if (FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return SubExpr; | |||||
if (SubExpr.get()->isLValue()) | |||||
SubExpr = ImplicitCastExpr::Create( | |||||
getSema().getASTContext(), | |||||
SubExpr.get()->getType().getNonReferenceType(), CK_LValueToRValue, | |||||
SubExpr.get(), nullptr, VK_PRValue, getSema().CurFPFeatureOverrides()); | |||||
if (SubExpr.isInvalid()) | |||||
return ExprError(); | |||||
QualType T = getDerived().TransformType(E->getType()); | |||||
if (T.isNull()) | |||||
return ExprError(); | |||||
return ImplicitCastExpr::Create( | |||||
getSema().getASTContext(), T, E->getCastKind(), SubExpr.get(), nullptr, | |||||
VK_PRValue, getSema().CurFPFeatureOverrides()); | |||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
ExprResult | ExprResult | ||||
TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { | TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { | ||||
TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); | TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); | ||||
if (!Type) | if (!Type) | ||||
return ExprError(); | return ExprError(); | ||||
ExprResult SubExpr | ExprResult SubExpr | ||||
= getDerived().TransformExpr(E->getSubExprAsWritten()); | = getDerived().TransformExpr(E->getSubExprAsWritten()); | ||||
if (SubExpr.isInvalid()) | if (SubExpr.isInvalid()) | ||||
return ExprError(); | return ExprError(); | ||||
if (!getDerived().AlwaysRebuild() && | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
Type == E->getTypeInfoAsWritten() && | setFPOptions(E); | ||||
SubExpr.get() == E->getSubExpr()) | |||||
if (!getDerived().AlwaysRebuild() && Type == E->getTypeInfoAsWritten() && | |||||
SubExpr.get() == E->getSubExpr() && | |||||
FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return E; | return E; | ||||
return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), | return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), | ||||
Type, | Type, | ||||
E->getRParenLoc(), | E->getRParenLoc(), | ||||
SubExpr.get()); | SubExpr.get()); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 375 Lines • ▼ Show 20 Lines | #include "clang/Basic/OperatorKinds.def" | ||||
ExprResult Second; | ExprResult Second; | ||||
if (E->getNumArgs() == 2) { | if (E->getNumArgs() == 2) { | ||||
Second = getDerived().TransformExpr(E->getArg(1)); | Second = getDerived().TransformExpr(E->getArg(1)); | ||||
if (Second.isInvalid()) | if (Second.isInvalid()) | ||||
return ExprError(); | return ExprError(); | ||||
} | } | ||||
if (!getDerived().AlwaysRebuild() && | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
Callee.get() == E->getCallee() && | setFPOptions(E); | ||||
if (!getDerived().AlwaysRebuild() && Callee.get() == E->getCallee() && | |||||
First.get() == E->getArg(0) && | First.get() == E->getArg(0) && | ||||
(E->getNumArgs() != 2 || Second.get() == E->getArg(1))) | (E->getNumArgs() != 2 || Second.get() == E->getArg(1)) && | ||||
FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return SemaRef.MaybeBindToTemporary(E); | return SemaRef.MaybeBindToTemporary(E); | ||||
Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | |||||
FPOptionsOverride NewOverrides(E->getFPFeatures()); | |||||
getSema().CurFPFeatures = | |||||
NewOverrides.applyOverrides(getSema().getLangOpts()); | |||||
getSema().FpPragmaStack.CurrentValue = NewOverrides; | |||||
return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), | return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), | ||||
E->getOperatorLoc(), | E->getOperatorLoc(), | ||||
Callee.get(), | Callee.get(), | ||||
First.get(), | First.get(), | ||||
Second.get()); | Second.get()); | ||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { | ||||
if (!Type) | if (!Type) | ||||
return ExprError(); | return ExprError(); | ||||
ExprResult SubExpr | ExprResult SubExpr | ||||
= getDerived().TransformExpr(E->getSubExprAsWritten()); | = getDerived().TransformExpr(E->getSubExprAsWritten()); | ||||
if (SubExpr.isInvalid()) | if (SubExpr.isInvalid()) | ||||
return ExprError(); | return ExprError(); | ||||
if (!getDerived().AlwaysRebuild() && | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
Type == E->getTypeInfoAsWritten() && | setFPOptions(E); | ||||
SubExpr.get() == E->getSubExpr()) | |||||
if (!getDerived().AlwaysRebuild() && Type == E->getTypeInfoAsWritten() && | |||||
SubExpr.get() == E->getSubExpr() && | |||||
FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return E; | return E; | ||||
return getDerived().RebuildCXXNamedCastExpr( | return getDerived().RebuildCXXNamedCastExpr( | ||||
E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), | E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), | ||||
Type, E->getAngleBrackets().getEnd(), | Type, E->getAngleBrackets().getEnd(), | ||||
// FIXME. this should be '(' location | // FIXME. this should be '(' location | ||||
E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); | E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); | ||||
} | } | ||||
template<typename Derived> | template<typename Derived> | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | TreeTransform<Derived>::TransformCXXFunctionalCastExpr( | ||||
if (!Type) | if (!Type) | ||||
return ExprError(); | return ExprError(); | ||||
ExprResult SubExpr | ExprResult SubExpr | ||||
= getDerived().TransformExpr(E->getSubExprAsWritten()); | = getDerived().TransformExpr(E->getSubExprAsWritten()); | ||||
if (SubExpr.isInvalid()) | if (SubExpr.isInvalid()) | ||||
return ExprError(); | return ExprError(); | ||||
if (!getDerived().AlwaysRebuild() && | Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); | ||||
Type == E->getTypeInfoAsWritten() && | setFPOptions(E); | ||||
SubExpr.get() == E->getSubExpr()) | |||||
if (!getDerived().AlwaysRebuild() && Type == E->getTypeInfoAsWritten() && | |||||
SubExpr.get() == E->getSubExpr() && | |||||
FPFeaturesState.getFPFeatures() == getSema().CurFPFeatures) | |||||
return E; | return E; | ||||
return getDerived().RebuildCXXFunctionalCastExpr(Type, | return getDerived().RebuildCXXFunctionalCastExpr(Type, | ||||
E->getLParenLoc(), | E->getLParenLoc(), | ||||
SubExpr.get(), | SubExpr.get(), | ||||
E->getRParenLoc(), | E->getRParenLoc(), | ||||
E->isListInitialization()); | E->isListInitialization()); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 3,158 Lines • Show Last 20 Lines |