diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Sema/TreeTransform.h')
-rw-r--r-- | contrib/llvm-project/clang/lib/Sema/TreeTransform.h | 212 |
1 files changed, 137 insertions, 75 deletions
diff --git a/contrib/llvm-project/clang/lib/Sema/TreeTransform.h b/contrib/llvm-project/clang/lib/Sema/TreeTransform.h index ae0e9f1119b4..3c68f9458e58 100644 --- a/contrib/llvm-project/clang/lib/Sema/TreeTransform.h +++ b/contrib/llvm-project/clang/lib/Sema/TreeTransform.h @@ -28,6 +28,7 @@ #include "clang/AST/StmtCXX.h" #include "clang/AST/StmtObjC.h" #include "clang/AST/StmtOpenMP.h" +#include "clang/Basic/DiagnosticParse.h" #include "clang/Basic/OpenMPKinds.h" #include "clang/Sema/Designator.h" #include "clang/Sema/Lookup.h" @@ -730,10 +731,11 @@ public: #define ABSTRACT_STMT(Stmt) #include "clang/AST/StmtNodes.inc" -#define OMP_CLAUSE_CLASS(Enum, Str, Class) \ - LLVM_ATTRIBUTE_NOINLINE \ - OMPClause *Transform ## Class(Class *S); -#include "llvm/Frontend/OpenMP/OMPKinds.def" +#define GEN_CLANG_CLAUSE_CLASS +#define CLAUSE_CLASS(Enum, Str, Class) \ + LLVM_ATTRIBUTE_NOINLINE \ + OMPClause *Transform##Class(Class *S); +#include "llvm/Frontend/OpenMP/OMP.inc" /// Build a new qualified type given its unqualified type and type location. /// @@ -1304,7 +1306,7 @@ public: return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); } - /// Build a new label statement. + /// Build a new attributed statement. /// /// By default, performs semantic analysis to build the new statement. /// Subclasses may override this routine to provide different behavior. @@ -1319,19 +1321,23 @@ public: /// By default, performs semantic analysis to build the new statement. /// Subclasses may override this routine to provide different behavior. StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, - Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, + SourceLocation LParenLoc, Sema::ConditionResult Cond, + SourceLocation RParenLoc, Stmt *Init, Stmt *Then, SourceLocation ElseLoc, Stmt *Else) { - return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, - ElseLoc, Else); + return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, + RParenLoc, Then, ElseLoc, Else); } /// Start building a new switch statement. /// /// By default, performs semantic analysis to build the new statement. /// Subclasses may override this routine to provide different behavior. - StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, - Sema::ConditionResult Cond) { - return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); + StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, + SourceLocation LParenLoc, Stmt *Init, + Sema::ConditionResult Cond, + SourceLocation RParenLoc) { + return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, + RParenLoc); } /// Attach the body to the switch statement. @@ -2006,26 +2012,32 @@ public: /// /// By default, performs semantic analysis to build the new statement. /// Subclasses may override this routine to provide different behavior. - OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, - CXXScopeSpec &MapperIdScopeSpec, - DeclarationNameInfo &MapperId, - const OMPVarListLocTy &Locs, - ArrayRef<Expr *> UnresolvedMappers) { - return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, - Locs, UnresolvedMappers); + OMPClause * + RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, + ArrayRef<SourceLocation> MotionModifiersLoc, + CXXScopeSpec &MapperIdScopeSpec, + DeclarationNameInfo &MapperId, SourceLocation ColonLoc, + ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, + ArrayRef<Expr *> UnresolvedMappers) { + return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, + MapperIdScopeSpec, MapperId, ColonLoc, + VarList, Locs, UnresolvedMappers); } /// Build a new OpenMP 'from' clause. /// /// By default, performs semantic analysis to build the new statement. /// Subclasses may override this routine to provide different behavior. - OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, - CXXScopeSpec &MapperIdScopeSpec, - DeclarationNameInfo &MapperId, - const OMPVarListLocTy &Locs, - ArrayRef<Expr *> UnresolvedMappers) { - return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, - Locs, UnresolvedMappers); + OMPClause * + RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, + ArrayRef<SourceLocation> MotionModifiersLoc, + CXXScopeSpec &MapperIdScopeSpec, + DeclarationNameInfo &MapperId, SourceLocation ColonLoc, + ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, + ArrayRef<Expr *> UnresolvedMappers) { + return getSema().ActOnOpenMPFromClause( + MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, + ColonLoc, VarList, Locs, UnresolvedMappers); } /// Build a new OpenMP 'use_device_ptr' clause. @@ -3500,7 +3512,8 @@ public: // Build the CallExpr ExprResult TheCall = CallExpr::Create( SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), - Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); + Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, + FPOptionsOverride()); // Type-check the __builtin_shufflevector expression. return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); @@ -3534,12 +3547,12 @@ public: } case TemplateArgument::Template: - return TemplateArgumentLoc(TemplateArgument( - Pattern.getArgument().getAsTemplate(), - NumExpansions), - Pattern.getTemplateQualifierLoc(), - Pattern.getTemplateNameLoc(), - EllipsisLoc); + return TemplateArgumentLoc( + SemaRef.Context, + TemplateArgument(Pattern.getArgument().getAsTemplate(), + NumExpansions), + Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), + EllipsisLoc); case TemplateArgument::Null: case TemplateArgument::Integral: @@ -3576,13 +3589,15 @@ public: /// /// By default, performs semantic analysis in order to build a new fold /// expression. - ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, + ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, + SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, Optional<unsigned> NumExpansions) { - return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, - RHS, RParenLoc, NumExpansions); + return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, + EllipsisLoc, RHS, RParenLoc, + NumExpansions); } /// Build an empty C++1z fold-expression with the given operator. @@ -3609,8 +3624,8 @@ public: } ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, - ArrayRef<Expr *> SubExprs) { - return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs); + ArrayRef<Expr *> SubExprs, QualType Type) { + return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); } private: @@ -3677,10 +3692,11 @@ OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { switch (S->getClauseKind()) { default: break; // Transform individual clause nodes -#define OMP_CLAUSE_CLASS(Enum, Str, Class) \ +#define GEN_CLANG_CLAUSE_CLASS +#define CLAUSE_CLASS(Enum, Str, Class) \ case Enum: \ - return getDerived().Transform ## Class(cast<Class>(S)); -#include "llvm/Frontend/OpenMP/OMPKinds.def" + return getDerived().Transform##Class(cast<Class>(S)); +#include "llvm/Frontend/OpenMP/OMP.inc" } return S; @@ -4275,8 +4291,8 @@ bool TreeTransform<Derived>::TransformTemplateArgument( if (Template.isNull()) return true; - Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, - Input.getTemplateNameLoc()); + Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), + QualifierLoc, Input.getTemplateNameLoc()); return false; } @@ -5162,7 +5178,7 @@ template <typename Derived> QualType TreeTransform<Derived>::TransformDependentVectorType( TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { const DependentVectorType *T = TL.getTypePtr(); - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); @@ -5203,7 +5219,7 @@ QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( const DependentSizedExtVectorType *T = TL.getTypePtr(); // FIXME: ext vector locs should be nested - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); @@ -5370,7 +5386,7 @@ template <typename Derived> QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, VectorTypeLoc TL) { const VectorType *T = TL.getTypePtr(); - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); @@ -5393,7 +5409,7 @@ template<typename Derived> QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, ExtVectorTypeLoc TL) { const VectorType *T = TL.getTypePtr(); - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); @@ -5465,6 +5481,7 @@ ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( /* DefArg */ nullptr); newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), OldParm->getFunctionScopeIndex() + indexAdjustment); + transformedLocalDecl(OldParm, {newParm}); return newParm; } @@ -7280,9 +7297,9 @@ TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { Else.get() == S->getElse()) return S; - return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, - Init.get(), Then.get(), S->getElseLoc(), - Else.get()); + return getDerived().RebuildIfStmt( + S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, + S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); } template<typename Derived> @@ -7301,8 +7318,9 @@ TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { return StmtError(); // Rebuild the switch statement. - StmtResult Switch - = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); + StmtResult Switch = + getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), + Init.get(), Cond, S->getRParenLoc()); if (Switch.isInvalid()) return StmtError(); @@ -8323,7 +8341,14 @@ StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( StmtResult Body; { Sema::CompoundScopeRAII CompoundScope(getSema()); - Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); + Stmt *CS; + if (D->getDirectiveKind() == OMPD_atomic || + D->getDirectiveKind() == OMPD_critical || + D->getDirectiveKind() == OMPD_section || + D->getDirectiveKind() == OMPD_master) + CS = D->getAssociatedStmt(); + else + CS = D->getInnermostCapturedStmt()->getCapturedStmt(); Body = getDerived().TransformStmt(CS); } AssociatedStmt = @@ -9737,8 +9762,9 @@ OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { if (transformOMPMappableExprListClause<Derived, OMPToClause>( *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) return nullptr; - return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, - Locs, UnresolvedMappers); + return getDerived().RebuildOMPToClause( + C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, + MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); } template <typename Derived> @@ -9752,7 +9778,8 @@ OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) return nullptr; return getDerived().RebuildOMPFromClause( - Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); + C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, + MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); } template <typename Derived> @@ -10198,7 +10225,7 @@ ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { if (!getDerived().AlwaysRebuild() && !Changed) return E; return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), - Children); + Children, E->getType()); } template<typename Derived> @@ -10466,6 +10493,15 @@ TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { // FIXME: Wrong source location information for the '('. SourceLocation FakeLParenLoc = ((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, Args, E->getRParenLoc()); @@ -10580,7 +10616,7 @@ TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); getSema().CurFPFeatures = NewOverrides.applyOverrides(getSema().getLangOpts()); - getSema().FpPragmaStack.CurrentValue = NewOverrides.getAsOpaqueInt(); + getSema().FpPragmaStack.CurrentValue = NewOverrides; return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); } @@ -10637,7 +10673,7 @@ TreeTransform<Derived>::TransformCompoundAssignOperator( FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); getSema().CurFPFeatures = NewOverrides.applyOverrides(getSema().getLangOpts()); - getSema().FpPragmaStack.CurrentValue = NewOverrides.getAsOpaqueInt(); + getSema().FpPragmaStack.CurrentValue = NewOverrides; return getDerived().TransformBinaryOperator(E); } @@ -11115,7 +11151,7 @@ TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { FPOptionsOverride NewOverrides(E->getFPFeatures()); getSema().CurFPFeatures = NewOverrides.applyOverrides(getSema().getLangOpts()); - getSema().FpPragmaStack.CurrentValue = NewOverrides.getAsOpaqueInt(); + getSema().FpPragmaStack.CurrentValue = NewOverrides; return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), E->getOperatorLoc(), @@ -12468,10 +12504,11 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { E->getCaptureDefault()); getDerived().transformedLocalDecl(OldClass, {Class}); - Optional<std::tuple<unsigned, bool, Decl *>> Mangling; + Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; if (getDerived().ReplacingOriginal()) - Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), - OldClass->hasKnownLambdaInternalLinkage(), + Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), + OldClass->getLambdaManglingNumber(), + OldClass->getDeviceLambdaManglingNumber(), OldClass->getLambdaContextDecl()); // Build the call operator. @@ -12711,12 +12748,12 @@ TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( bool ArgumentChanged = false; SmallVector<Expr*, 8> Args; - Args.reserve(E->arg_size()); + Args.reserve(E->getNumArgs()); { EnterExpressionEvaluationContext Context( getSema(), EnterExpressionEvaluationContext::InitList, E->isListInitialization()); - if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, + if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, &ArgumentChanged)) return ExprError(); } @@ -13110,6 +13147,14 @@ TreeTransform<Derived>::TransformMaterializeTemporaryExpr( template<typename Derived> ExprResult TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { + UnresolvedLookupExpr *Callee = nullptr; + if (Expr *OldCallee = E->getCallee()) { + ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); + if (CalleeResult.isInvalid()) + return ExprError(); + Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); + } + Expr *Pattern = E->getPattern(); SmallVector<UnexpandedParameterPack, 2> Unexpanded; @@ -13149,8 +13194,20 @@ TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { return E; return getDerived().RebuildCXXFoldExpr( - E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), - RHS.get(), E->getEndLoc(), NumExpansions); + Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), + E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); + } + + // Formally a fold expression expands to nested parenthesized expressions. + // Enforce this limit to avoid creating trees so deep we can't safely traverse + // them. + if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { + SemaRef.Diag(E->getEllipsisLoc(), + clang::diag::err_fold_expression_limit_exceeded) + << *NumExpansions << SemaRef.getLangOpts().BracketDepth + << E->getSourceRange(); + SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); + return ExprError(); } // The transform has determined that we should perform an elementwise @@ -13170,8 +13227,8 @@ TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { return true; Result = getDerived().RebuildCXXFoldExpr( - E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), - Result.get(), E->getEndLoc(), OrigNumExpansions); + Callee, E->getBeginLoc(), Out.get(), E->getOperator(), + E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); if (Result.isInvalid()) return true; } @@ -13186,16 +13243,21 @@ TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { if (Out.get()->containsUnexpandedParameterPack()) { // We still have a pack; retain a pack expansion for this slice. Result = getDerived().RebuildCXXFoldExpr( - E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), + Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), E->getOperator(), E->getEllipsisLoc(), LeftFold ? Out.get() : Result.get(), E->getEndLoc(), OrigNumExpansions); } else if (Result.isUsable()) { // We've got down to a single element; build a binary operator. - Result = getDerived().RebuildBinaryOperator( - E->getEllipsisLoc(), E->getOperator(), - LeftFold ? Result.get() : Out.get(), - LeftFold ? Out.get() : Result.get()); + Expr *LHS = LeftFold ? Result.get() : Out.get(); + Expr *RHS = LeftFold ? Out.get() : Result.get(); + if (Callee) + Result = getDerived().RebuildCXXOperatorCallExpr( + BinaryOperator::getOverloadedOperator(E->getOperator()), + E->getEllipsisLoc(), Callee, LHS, RHS); + else + Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), + E->getOperator(), LHS, RHS); } else Result = Out; @@ -13213,8 +13275,8 @@ TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { return true; Result = getDerived().RebuildCXXFoldExpr( - E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), - Out.get(), E->getEndLoc(), OrigNumExpansions); + Callee, E->getBeginLoc(), Result.get(), E->getOperator(), + E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); if (Result.isInvalid()) return true; } |