1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprCXX.h" 23 #include "clang/AST/ExprObjC.h" 24 #include "clang/AST/ExprOpenMP.h" 25 #include "clang/AST/Stmt.h" 26 #include "clang/AST/StmtCXX.h" 27 #include "clang/AST/StmtObjC.h" 28 #include "clang/AST/StmtOpenMP.h" 29 #include "clang/Sema/Designator.h" 30 #include "clang/Sema/Lookup.h" 31 #include "clang/Sema/Ownership.h" 32 #include "clang/Sema/ParsedTemplate.h" 33 #include "clang/Sema/ScopeInfo.h" 34 #include "clang/Sema/SemaDiagnostic.h" 35 #include "clang/Sema/SemaInternal.h" 36 #include "llvm/ADT/ArrayRef.h" 37 #include "llvm/Support/ErrorHandling.h" 38 #include <algorithm> 39 40 namespace clang { 41 using namespace sema; 42 43 /// A semantic tree transformation that allows one to transform one 44 /// abstract syntax tree into another. 45 /// 46 /// A new tree transformation is defined by creating a new subclass \c X of 47 /// \c TreeTransform<X> and then overriding certain operations to provide 48 /// behavior specific to that transformation. For example, template 49 /// instantiation is implemented as a tree transformation where the 50 /// transformation of TemplateTypeParmType nodes involves substituting the 51 /// template arguments for their corresponding template parameters; a similar 52 /// transformation is performed for non-type template parameters and 53 /// template template parameters. 54 /// 55 /// This tree-transformation template uses static polymorphism to allow 56 /// subclasses to customize any of its operations. Thus, a subclass can 57 /// override any of the transformation or rebuild operators by providing an 58 /// operation with the same signature as the default implementation. The 59 /// overriding function should not be virtual. 60 /// 61 /// Semantic tree transformations are split into two stages, either of which 62 /// can be replaced by a subclass. The "transform" step transforms an AST node 63 /// or the parts of an AST node using the various transformation functions, 64 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 65 /// node of the appropriate kind from the pieces. The default transformation 66 /// routines recursively transform the operands to composite AST nodes (e.g., 67 /// the pointee type of a PointerType node) and, if any of those operand nodes 68 /// were changed by the transformation, invokes the rebuild operation to create 69 /// a new AST node. 70 /// 71 /// Subclasses can customize the transformation at various levels. The 72 /// most coarse-grained transformations involve replacing TransformType(), 73 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 74 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 75 /// new implementations. 76 /// 77 /// For more fine-grained transformations, subclasses can replace any of the 78 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 79 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 80 /// replacing TransformTemplateTypeParmType() allows template instantiation 81 /// to substitute template arguments for their corresponding template 82 /// parameters. Additionally, subclasses can override the \c RebuildXXX 83 /// functions to control how AST nodes are rebuilt when their operands change. 84 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 85 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 86 /// be able to use more efficient rebuild steps. 87 /// 88 /// There are a handful of other functions that can be overridden, allowing one 89 /// to avoid traversing nodes that don't need any transformation 90 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 91 /// operands have not changed (\c AlwaysRebuild()), and customize the 92 /// default locations and entity names used for type-checking 93 /// (\c getBaseLocation(), \c getBaseEntity()). 94 template<typename Derived> 95 class TreeTransform { 96 /// Private RAII object that helps us forget and then re-remember 97 /// the template argument corresponding to a partially-substituted parameter 98 /// pack. 99 class ForgetPartiallySubstitutedPackRAII { 100 Derived &Self; 101 TemplateArgument Old; 102 103 public: 104 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 105 Old = Self.ForgetPartiallySubstitutedPack(); 106 } 107 108 ~ForgetPartiallySubstitutedPackRAII() { 109 Self.RememberPartiallySubstitutedPack(Old); 110 } 111 }; 112 113 protected: 114 Sema &SemaRef; 115 116 /// The set of local declarations that have been transformed, for 117 /// cases where we are forced to build new declarations within the transformer 118 /// rather than in the subclass (e.g., lambda closure types). 119 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 120 121 public: 122 /// Initializes a new tree transformer. 123 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 124 125 /// Retrieves a reference to the derived class. 126 Derived &getDerived() { return static_cast<Derived&>(*this); } 127 128 /// Retrieves a reference to the derived class. 129 const Derived &getDerived() const { 130 return static_cast<const Derived&>(*this); 131 } 132 133 static inline ExprResult Owned(Expr *E) { return E; } 134 static inline StmtResult Owned(Stmt *S) { return S; } 135 136 /// Retrieves a reference to the semantic analysis object used for 137 /// this tree transform. 138 Sema &getSema() const { return SemaRef; } 139 140 /// Whether the transformation should always rebuild AST nodes, even 141 /// if none of the children have changed. 142 /// 143 /// Subclasses may override this function to specify when the transformation 144 /// should rebuild all AST nodes. 145 /// 146 /// We must always rebuild all AST nodes when performing variadic template 147 /// pack expansion, in order to avoid violating the AST invariant that each 148 /// statement node appears at most once in its containing declaration. 149 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 150 151 /// Returns the location of the entity being transformed, if that 152 /// information was not available elsewhere in the AST. 153 /// 154 /// By default, returns no source-location information. Subclasses can 155 /// provide an alternative implementation that provides better location 156 /// information. 157 SourceLocation getBaseLocation() { return SourceLocation(); } 158 159 /// Returns the name of the entity being transformed, if that 160 /// information was not available elsewhere in the AST. 161 /// 162 /// By default, returns an empty name. Subclasses can provide an alternative 163 /// implementation with a more precise name. 164 DeclarationName getBaseEntity() { return DeclarationName(); } 165 166 /// Sets the "base" location and entity when that 167 /// information is known based on another transformation. 168 /// 169 /// By default, the source location and entity are ignored. Subclasses can 170 /// override this function to provide a customized implementation. 171 void setBase(SourceLocation Loc, DeclarationName Entity) { } 172 173 /// RAII object that temporarily sets the base location and entity 174 /// used for reporting diagnostics in types. 175 class TemporaryBase { 176 TreeTransform &Self; 177 SourceLocation OldLocation; 178 DeclarationName OldEntity; 179 180 public: 181 TemporaryBase(TreeTransform &Self, SourceLocation Location, 182 DeclarationName Entity) : Self(Self) { 183 OldLocation = Self.getDerived().getBaseLocation(); 184 OldEntity = Self.getDerived().getBaseEntity(); 185 186 if (Location.isValid()) 187 Self.getDerived().setBase(Location, Entity); 188 } 189 190 ~TemporaryBase() { 191 Self.getDerived().setBase(OldLocation, OldEntity); 192 } 193 }; 194 195 /// Determine whether the given type \p T has already been 196 /// transformed. 197 /// 198 /// Subclasses can provide an alternative implementation of this routine 199 /// to short-circuit evaluation when it is known that a given type will 200 /// not change. For example, template instantiation need not traverse 201 /// non-dependent types. 202 bool AlreadyTransformed(QualType T) { 203 return T.isNull(); 204 } 205 206 /// Determine whether the given call argument should be dropped, e.g., 207 /// because it is a default argument. 208 /// 209 /// Subclasses can provide an alternative implementation of this routine to 210 /// determine which kinds of call arguments get dropped. By default, 211 /// CXXDefaultArgument nodes are dropped (prior to transformation). 212 bool DropCallArgument(Expr *E) { 213 return E->isDefaultArgument(); 214 } 215 216 /// Determine whether we should expand a pack expansion with the 217 /// given set of parameter packs into separate arguments by repeatedly 218 /// transforming the pattern. 219 /// 220 /// By default, the transformer never tries to expand pack expansions. 221 /// Subclasses can override this routine to provide different behavior. 222 /// 223 /// \param EllipsisLoc The location of the ellipsis that identifies the 224 /// pack expansion. 225 /// 226 /// \param PatternRange The source range that covers the entire pattern of 227 /// the pack expansion. 228 /// 229 /// \param Unexpanded The set of unexpanded parameter packs within the 230 /// pattern. 231 /// 232 /// \param ShouldExpand Will be set to \c true if the transformer should 233 /// expand the corresponding pack expansions into separate arguments. When 234 /// set, \c NumExpansions must also be set. 235 /// 236 /// \param RetainExpansion Whether the caller should add an unexpanded 237 /// pack expansion after all of the expanded arguments. This is used 238 /// when extending explicitly-specified template argument packs per 239 /// C++0x [temp.arg.explicit]p9. 240 /// 241 /// \param NumExpansions The number of separate arguments that will be in 242 /// the expanded form of the corresponding pack expansion. This is both an 243 /// input and an output parameter, which can be set by the caller if the 244 /// number of expansions is known a priori (e.g., due to a prior substitution) 245 /// and will be set by the callee when the number of expansions is known. 246 /// The callee must set this value when \c ShouldExpand is \c true; it may 247 /// set this value in other cases. 248 /// 249 /// \returns true if an error occurred (e.g., because the parameter packs 250 /// are to be instantiated with arguments of different lengths), false 251 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 252 /// must be set. 253 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 254 SourceRange PatternRange, 255 ArrayRef<UnexpandedParameterPack> Unexpanded, 256 bool &ShouldExpand, 257 bool &RetainExpansion, 258 Optional<unsigned> &NumExpansions) { 259 ShouldExpand = false; 260 return false; 261 } 262 263 /// "Forget" about the partially-substituted pack template argument, 264 /// when performing an instantiation that must preserve the parameter pack 265 /// use. 266 /// 267 /// This routine is meant to be overridden by the template instantiator. 268 TemplateArgument ForgetPartiallySubstitutedPack() { 269 return TemplateArgument(); 270 } 271 272 /// "Remember" the partially-substituted pack template argument 273 /// after performing an instantiation that must preserve the parameter pack 274 /// use. 275 /// 276 /// This routine is meant to be overridden by the template instantiator. 277 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 278 279 /// Note to the derived class when a function parameter pack is 280 /// being expanded. 281 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 282 283 /// Transforms the given type into another type. 284 /// 285 /// By default, this routine transforms a type by creating a 286 /// TypeSourceInfo for it and delegating to the appropriate 287 /// function. This is expensive, but we don't mind, because 288 /// this method is deprecated anyway; all users should be 289 /// switched to storing TypeSourceInfos. 290 /// 291 /// \returns the transformed type. 292 QualType TransformType(QualType T); 293 294 /// Transforms the given type-with-location into a new 295 /// type-with-location. 296 /// 297 /// By default, this routine transforms a type by delegating to the 298 /// appropriate TransformXXXType to build a new type. Subclasses 299 /// may override this function (to take over all type 300 /// transformations) or some set of the TransformXXXType functions 301 /// to alter the transformation. 302 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 303 304 /// Transform the given type-with-location into a new 305 /// type, collecting location information in the given builder 306 /// as necessary. 307 /// 308 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 309 310 /// Transform a type that is permitted to produce a 311 /// DeducedTemplateSpecializationType. 312 /// 313 /// This is used in the (relatively rare) contexts where it is acceptable 314 /// for transformation to produce a class template type with deduced 315 /// template arguments. 316 /// @{ 317 QualType TransformTypeWithDeducedTST(QualType T); 318 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 319 /// @} 320 321 /// The reason why the value of a statement is not discarded, if any. 322 enum StmtDiscardKind { 323 SDK_Discarded, 324 SDK_NotDiscarded, 325 SDK_StmtExprResult, 326 }; 327 328 /// Transform the given statement. 329 /// 330 /// By default, this routine transforms a statement by delegating to the 331 /// appropriate TransformXXXStmt function to transform a specific kind of 332 /// statement or the TransformExpr() function to transform an expression. 333 /// Subclasses may override this function to transform statements using some 334 /// other mechanism. 335 /// 336 /// \returns the transformed statement. 337 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 338 339 /// Transform the given statement. 340 /// 341 /// By default, this routine transforms a statement by delegating to the 342 /// appropriate TransformOMPXXXClause function to transform a specific kind 343 /// of clause. Subclasses may override this function to transform statements 344 /// using some other mechanism. 345 /// 346 /// \returns the transformed OpenMP clause. 347 OMPClause *TransformOMPClause(OMPClause *S); 348 349 /// Transform the given attribute. 350 /// 351 /// By default, this routine transforms a statement by delegating to the 352 /// appropriate TransformXXXAttr function to transform a specific kind 353 /// of attribute. Subclasses may override this function to transform 354 /// attributed statements using some other mechanism. 355 /// 356 /// \returns the transformed attribute 357 const Attr *TransformAttr(const Attr *S); 358 359 /// Transform the specified attribute. 360 /// 361 /// Subclasses should override the transformation of attributes with a pragma 362 /// spelling to transform expressions stored within the attribute. 363 /// 364 /// \returns the transformed attribute. 365 #define ATTR(X) 366 #define PRAGMA_SPELLING_ATTR(X) \ 367 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 368 #include "clang/Basic/AttrList.inc" 369 370 /// Transform the given expression. 371 /// 372 /// By default, this routine transforms an expression by delegating to the 373 /// appropriate TransformXXXExpr function to build a new expression. 374 /// Subclasses may override this function to transform expressions using some 375 /// other mechanism. 376 /// 377 /// \returns the transformed expression. 378 ExprResult TransformExpr(Expr *E); 379 380 /// Transform the given initializer. 381 /// 382 /// By default, this routine transforms an initializer by stripping off the 383 /// semantic nodes added by initialization, then passing the result to 384 /// TransformExpr or TransformExprs. 385 /// 386 /// \returns the transformed initializer. 387 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 388 389 /// Transform the given list of expressions. 390 /// 391 /// This routine transforms a list of expressions by invoking 392 /// \c TransformExpr() for each subexpression. However, it also provides 393 /// support for variadic templates by expanding any pack expansions (if the 394 /// derived class permits such expansion) along the way. When pack expansions 395 /// are present, the number of outputs may not equal the number of inputs. 396 /// 397 /// \param Inputs The set of expressions to be transformed. 398 /// 399 /// \param NumInputs The number of expressions in \c Inputs. 400 /// 401 /// \param IsCall If \c true, then this transform is being performed on 402 /// function-call arguments, and any arguments that should be dropped, will 403 /// be. 404 /// 405 /// \param Outputs The transformed input expressions will be added to this 406 /// vector. 407 /// 408 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 409 /// due to transformation. 410 /// 411 /// \returns true if an error occurred, false otherwise. 412 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 413 SmallVectorImpl<Expr *> &Outputs, 414 bool *ArgChanged = nullptr); 415 416 /// Transform the given declaration, which is referenced from a type 417 /// or expression. 418 /// 419 /// By default, acts as the identity function on declarations, unless the 420 /// transformer has had to transform the declaration itself. Subclasses 421 /// may override this function to provide alternate behavior. 422 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 423 llvm::DenseMap<Decl *, Decl *>::iterator Known 424 = TransformedLocalDecls.find(D); 425 if (Known != TransformedLocalDecls.end()) 426 return Known->second; 427 428 return D; 429 } 430 431 /// Transform the specified condition. 432 /// 433 /// By default, this transforms the variable and expression and rebuilds 434 /// the condition. 435 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 436 Expr *Expr, 437 Sema::ConditionKind Kind); 438 439 /// Transform the attributes associated with the given declaration and 440 /// place them on the new declaration. 441 /// 442 /// By default, this operation does nothing. Subclasses may override this 443 /// behavior to transform attributes. 444 void transformAttrs(Decl *Old, Decl *New) { } 445 446 /// Note that a local declaration has been transformed by this 447 /// transformer. 448 /// 449 /// Local declarations are typically transformed via a call to 450 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 451 /// the transformer itself has to transform the declarations. This routine 452 /// can be overridden by a subclass that keeps track of such mappings. 453 void transformedLocalDecl(Decl *Old, Decl *New) { 454 TransformedLocalDecls[Old] = New; 455 } 456 457 /// Transform the definition of the given declaration. 458 /// 459 /// By default, invokes TransformDecl() to transform the declaration. 460 /// Subclasses may override this function to provide alternate behavior. 461 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 462 return getDerived().TransformDecl(Loc, D); 463 } 464 465 /// Transform the given declaration, which was the first part of a 466 /// nested-name-specifier in a member access expression. 467 /// 468 /// This specific declaration transformation only applies to the first 469 /// identifier in a nested-name-specifier of a member access expression, e.g., 470 /// the \c T in \c x->T::member 471 /// 472 /// By default, invokes TransformDecl() to transform the declaration. 473 /// Subclasses may override this function to provide alternate behavior. 474 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 475 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 476 } 477 478 /// Transform the set of declarations in an OverloadExpr. 479 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 480 LookupResult &R); 481 482 /// Transform the given nested-name-specifier with source-location 483 /// information. 484 /// 485 /// By default, transforms all of the types and declarations within the 486 /// nested-name-specifier. Subclasses may override this function to provide 487 /// alternate behavior. 488 NestedNameSpecifierLoc 489 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 490 QualType ObjectType = QualType(), 491 NamedDecl *FirstQualifierInScope = nullptr); 492 493 /// Transform the given declaration name. 494 /// 495 /// By default, transforms the types of conversion function, constructor, 496 /// and destructor names and then (if needed) rebuilds the declaration name. 497 /// Identifiers and selectors are returned unmodified. Sublcasses may 498 /// override this function to provide alternate behavior. 499 DeclarationNameInfo 500 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 501 502 /// Transform the given template name. 503 /// 504 /// \param SS The nested-name-specifier that qualifies the template 505 /// name. This nested-name-specifier must already have been transformed. 506 /// 507 /// \param Name The template name to transform. 508 /// 509 /// \param NameLoc The source location of the template name. 510 /// 511 /// \param ObjectType If we're translating a template name within a member 512 /// access expression, this is the type of the object whose member template 513 /// is being referenced. 514 /// 515 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 516 /// also refers to a name within the current (lexical) scope, this is the 517 /// declaration it refers to. 518 /// 519 /// By default, transforms the template name by transforming the declarations 520 /// and nested-name-specifiers that occur within the template name. 521 /// Subclasses may override this function to provide alternate behavior. 522 TemplateName 523 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 524 SourceLocation NameLoc, 525 QualType ObjectType = QualType(), 526 NamedDecl *FirstQualifierInScope = nullptr, 527 bool AllowInjectedClassName = false); 528 529 /// Transform the given template argument. 530 /// 531 /// By default, this operation transforms the type, expression, or 532 /// declaration stored within the template argument and constructs a 533 /// new template argument from the transformed result. Subclasses may 534 /// override this function to provide alternate behavior. 535 /// 536 /// Returns true if there was an error. 537 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 538 TemplateArgumentLoc &Output, 539 bool Uneval = false); 540 541 /// Transform the given set of template arguments. 542 /// 543 /// By default, this operation transforms all of the template arguments 544 /// in the input set using \c TransformTemplateArgument(), and appends 545 /// the transformed arguments to the output list. 546 /// 547 /// Note that this overload of \c TransformTemplateArguments() is merely 548 /// a convenience function. Subclasses that wish to override this behavior 549 /// should override the iterator-based member template version. 550 /// 551 /// \param Inputs The set of template arguments to be transformed. 552 /// 553 /// \param NumInputs The number of template arguments in \p Inputs. 554 /// 555 /// \param Outputs The set of transformed template arguments output by this 556 /// routine. 557 /// 558 /// Returns true if an error occurred. 559 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 560 unsigned NumInputs, 561 TemplateArgumentListInfo &Outputs, 562 bool Uneval = false) { 563 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 564 Uneval); 565 } 566 567 /// Transform the given set of template arguments. 568 /// 569 /// By default, this operation transforms all of the template arguments 570 /// in the input set using \c TransformTemplateArgument(), and appends 571 /// the transformed arguments to the output list. 572 /// 573 /// \param First An iterator to the first template argument. 574 /// 575 /// \param Last An iterator one step past the last template argument. 576 /// 577 /// \param Outputs The set of transformed template arguments output by this 578 /// routine. 579 /// 580 /// Returns true if an error occurred. 581 template<typename InputIterator> 582 bool TransformTemplateArguments(InputIterator First, 583 InputIterator Last, 584 TemplateArgumentListInfo &Outputs, 585 bool Uneval = false); 586 587 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 588 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 589 TemplateArgumentLoc &ArgLoc); 590 591 /// Fakes up a TypeSourceInfo for a type. 592 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 593 return SemaRef.Context.getTrivialTypeSourceInfo(T, 594 getDerived().getBaseLocation()); 595 } 596 597 #define ABSTRACT_TYPELOC(CLASS, PARENT) 598 #define TYPELOC(CLASS, PARENT) \ 599 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 600 #include "clang/AST/TypeLocNodes.def" 601 602 template<typename Fn> 603 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 604 FunctionProtoTypeLoc TL, 605 CXXRecordDecl *ThisContext, 606 Qualifiers ThisTypeQuals, 607 Fn TransformExceptionSpec); 608 609 bool TransformExceptionSpec(SourceLocation Loc, 610 FunctionProtoType::ExceptionSpecInfo &ESI, 611 SmallVectorImpl<QualType> &Exceptions, 612 bool &Changed); 613 614 StmtResult TransformSEHHandler(Stmt *Handler); 615 616 QualType 617 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 618 TemplateSpecializationTypeLoc TL, 619 TemplateName Template); 620 621 QualType 622 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 623 DependentTemplateSpecializationTypeLoc TL, 624 TemplateName Template, 625 CXXScopeSpec &SS); 626 627 QualType TransformDependentTemplateSpecializationType( 628 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 629 NestedNameSpecifierLoc QualifierLoc); 630 631 /// Transforms the parameters of a function type into the 632 /// given vectors. 633 /// 634 /// The result vectors should be kept in sync; null entries in the 635 /// variables vector are acceptable. 636 /// 637 /// Return true on error. 638 bool TransformFunctionTypeParams( 639 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 640 const QualType *ParamTypes, 641 const FunctionProtoType::ExtParameterInfo *ParamInfos, 642 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 643 Sema::ExtParameterInfoBuilder &PInfos); 644 645 /// Transforms a single function-type parameter. Return null 646 /// on error. 647 /// 648 /// \param indexAdjustment - A number to add to the parameter's 649 /// scope index; can be negative 650 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 651 int indexAdjustment, 652 Optional<unsigned> NumExpansions, 653 bool ExpectParameterPack); 654 655 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 656 657 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 658 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 659 660 TemplateParameterList *TransformTemplateParameterList( 661 TemplateParameterList *TPL) { 662 return TPL; 663 } 664 665 ExprResult TransformAddressOfOperand(Expr *E); 666 667 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 668 bool IsAddressOfOperand, 669 TypeSourceInfo **RecoveryTSI); 670 671 ExprResult TransformParenDependentScopeDeclRefExpr( 672 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 673 TypeSourceInfo **RecoveryTSI); 674 675 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 676 677 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 678 // amount of stack usage with clang. 679 #define STMT(Node, Parent) \ 680 LLVM_ATTRIBUTE_NOINLINE \ 681 StmtResult Transform##Node(Node *S); 682 #define VALUESTMT(Node, Parent) \ 683 LLVM_ATTRIBUTE_NOINLINE \ 684 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 685 #define EXPR(Node, Parent) \ 686 LLVM_ATTRIBUTE_NOINLINE \ 687 ExprResult Transform##Node(Node *E); 688 #define ABSTRACT_STMT(Stmt) 689 #include "clang/AST/StmtNodes.inc" 690 691 #define OPENMP_CLAUSE(Name, Class) \ 692 LLVM_ATTRIBUTE_NOINLINE \ 693 OMPClause *Transform ## Class(Class *S); 694 #include "clang/Basic/OpenMPKinds.def" 695 696 /// Build a new qualified type given its unqualified type and type location. 697 /// 698 /// By default, this routine adds type qualifiers only to types that can 699 /// have qualifiers, and silently suppresses those qualifiers that are not 700 /// permitted. Subclasses may override this routine to provide different 701 /// behavior. 702 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 703 704 /// Build a new pointer type given its pointee type. 705 /// 706 /// By default, performs semantic analysis when building the pointer type. 707 /// Subclasses may override this routine to provide different behavior. 708 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 709 710 /// Build a new block pointer type given its pointee type. 711 /// 712 /// By default, performs semantic analysis when building the block pointer 713 /// type. Subclasses may override this routine to provide different behavior. 714 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 715 716 /// Build a new reference type given the type it references. 717 /// 718 /// By default, performs semantic analysis when building the 719 /// reference type. Subclasses may override this routine to provide 720 /// different behavior. 721 /// 722 /// \param LValue whether the type was written with an lvalue sigil 723 /// or an rvalue sigil. 724 QualType RebuildReferenceType(QualType ReferentType, 725 bool LValue, 726 SourceLocation Sigil); 727 728 /// Build a new member pointer type given the pointee type and the 729 /// class type it refers into. 730 /// 731 /// By default, performs semantic analysis when building the member pointer 732 /// type. Subclasses may override this routine to provide different behavior. 733 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 734 SourceLocation Sigil); 735 736 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 737 SourceLocation ProtocolLAngleLoc, 738 ArrayRef<ObjCProtocolDecl *> Protocols, 739 ArrayRef<SourceLocation> ProtocolLocs, 740 SourceLocation ProtocolRAngleLoc); 741 742 /// Build an Objective-C object type. 743 /// 744 /// By default, performs semantic analysis when building the object type. 745 /// Subclasses may override this routine to provide different behavior. 746 QualType RebuildObjCObjectType(QualType BaseType, 747 SourceLocation Loc, 748 SourceLocation TypeArgsLAngleLoc, 749 ArrayRef<TypeSourceInfo *> TypeArgs, 750 SourceLocation TypeArgsRAngleLoc, 751 SourceLocation ProtocolLAngleLoc, 752 ArrayRef<ObjCProtocolDecl *> Protocols, 753 ArrayRef<SourceLocation> ProtocolLocs, 754 SourceLocation ProtocolRAngleLoc); 755 756 /// Build a new Objective-C object pointer type given the pointee type. 757 /// 758 /// By default, directly builds the pointer type, with no additional semantic 759 /// analysis. 760 QualType RebuildObjCObjectPointerType(QualType PointeeType, 761 SourceLocation Star); 762 763 /// Build a new array type given the element type, size 764 /// modifier, size of the array (if known), size expression, and index type 765 /// qualifiers. 766 /// 767 /// By default, performs semantic analysis when building the array type. 768 /// Subclasses may override this routine to provide different behavior. 769 /// Also by default, all of the other Rebuild*Array 770 QualType RebuildArrayType(QualType ElementType, 771 ArrayType::ArraySizeModifier SizeMod, 772 const llvm::APInt *Size, 773 Expr *SizeExpr, 774 unsigned IndexTypeQuals, 775 SourceRange BracketsRange); 776 777 /// Build a new constant array type given the element type, size 778 /// modifier, (known) size of the array, and index type qualifiers. 779 /// 780 /// By default, performs semantic analysis when building the array type. 781 /// Subclasses may override this routine to provide different behavior. 782 QualType RebuildConstantArrayType(QualType ElementType, 783 ArrayType::ArraySizeModifier SizeMod, 784 const llvm::APInt &Size, 785 unsigned IndexTypeQuals, 786 SourceRange BracketsRange); 787 788 /// Build a new incomplete array type given the element type, size 789 /// modifier, and index type qualifiers. 790 /// 791 /// By default, performs semantic analysis when building the array type. 792 /// Subclasses may override this routine to provide different behavior. 793 QualType RebuildIncompleteArrayType(QualType ElementType, 794 ArrayType::ArraySizeModifier SizeMod, 795 unsigned IndexTypeQuals, 796 SourceRange BracketsRange); 797 798 /// Build a new variable-length array type given the element type, 799 /// size modifier, size expression, and index type qualifiers. 800 /// 801 /// By default, performs semantic analysis when building the array type. 802 /// Subclasses may override this routine to provide different behavior. 803 QualType RebuildVariableArrayType(QualType ElementType, 804 ArrayType::ArraySizeModifier SizeMod, 805 Expr *SizeExpr, 806 unsigned IndexTypeQuals, 807 SourceRange BracketsRange); 808 809 /// Build a new dependent-sized array type given the element type, 810 /// size modifier, size expression, and index type qualifiers. 811 /// 812 /// By default, performs semantic analysis when building the array type. 813 /// Subclasses may override this routine to provide different behavior. 814 QualType RebuildDependentSizedArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 Expr *SizeExpr, 817 unsigned IndexTypeQuals, 818 SourceRange BracketsRange); 819 820 /// Build a new vector type given the element type and 821 /// number of elements. 822 /// 823 /// By default, performs semantic analysis when building the vector type. 824 /// Subclasses may override this routine to provide different behavior. 825 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 826 VectorType::VectorKind VecKind); 827 828 /// Build a new potentially dependently-sized extended vector type 829 /// given the element type and number of elements. 830 /// 831 /// By default, performs semantic analysis when building the vector type. 832 /// Subclasses may override this routine to provide different behavior. 833 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 834 SourceLocation AttributeLoc, 835 VectorType::VectorKind); 836 837 /// Build a new extended vector type given the element type and 838 /// number of elements. 839 /// 840 /// By default, performs semantic analysis when building the vector type. 841 /// Subclasses may override this routine to provide different behavior. 842 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 843 SourceLocation AttributeLoc); 844 845 /// Build a new potentially dependently-sized extended vector type 846 /// given the element type and number of elements. 847 /// 848 /// By default, performs semantic analysis when building the vector type. 849 /// Subclasses may override this routine to provide different behavior. 850 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 851 Expr *SizeExpr, 852 SourceLocation AttributeLoc); 853 854 /// Build a new DependentAddressSpaceType or return the pointee 855 /// type variable with the correct address space (retrieved from 856 /// AddrSpaceExpr) applied to it. The former will be returned in cases 857 /// where the address space remains dependent. 858 /// 859 /// By default, performs semantic analysis when building the type with address 860 /// space applied. Subclasses may override this routine to provide different 861 /// behavior. 862 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 863 Expr *AddrSpaceExpr, 864 SourceLocation AttributeLoc); 865 866 /// Build a new function type. 867 /// 868 /// By default, performs semantic analysis when building the function type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildFunctionProtoType(QualType T, 871 MutableArrayRef<QualType> ParamTypes, 872 const FunctionProtoType::ExtProtoInfo &EPI); 873 874 /// Build a new unprototyped function type. 875 QualType RebuildFunctionNoProtoType(QualType ResultType); 876 877 /// Rebuild an unresolved typename type, given the decl that 878 /// the UnresolvedUsingTypenameDecl was transformed to. 879 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 880 881 /// Build a new typedef type. 882 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 883 return SemaRef.Context.getTypeDeclType(Typedef); 884 } 885 886 /// Build a new class/struct/union type. 887 QualType RebuildRecordType(RecordDecl *Record) { 888 return SemaRef.Context.getTypeDeclType(Record); 889 } 890 891 /// Build a new Enum type. 892 QualType RebuildEnumType(EnumDecl *Enum) { 893 return SemaRef.Context.getTypeDeclType(Enum); 894 } 895 896 /// Build a new typeof(expr) type. 897 /// 898 /// By default, performs semantic analysis when building the typeof type. 899 /// Subclasses may override this routine to provide different behavior. 900 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 901 902 /// Build a new typeof(type) type. 903 /// 904 /// By default, builds a new TypeOfType with the given underlying type. 905 QualType RebuildTypeOfType(QualType Underlying); 906 907 /// Build a new unary transform type. 908 QualType RebuildUnaryTransformType(QualType BaseType, 909 UnaryTransformType::UTTKind UKind, 910 SourceLocation Loc); 911 912 /// Build a new C++11 decltype type. 913 /// 914 /// By default, performs semantic analysis when building the decltype type. 915 /// Subclasses may override this routine to provide different behavior. 916 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 917 918 /// Build a new C++11 auto type. 919 /// 920 /// By default, builds a new AutoType with the given deduced type. 921 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 922 // Note, IsDependent is always false here: we implicitly convert an 'auto' 923 // which has been deduced to a dependent type into an undeduced 'auto', so 924 // that we'll retry deduction after the transformation. 925 return SemaRef.Context.getAutoType(Deduced, Keyword, 926 /*IsDependent*/ false); 927 } 928 929 /// By default, builds a new DeducedTemplateSpecializationType with the given 930 /// deduced type. 931 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 932 QualType Deduced) { 933 return SemaRef.Context.getDeducedTemplateSpecializationType( 934 Template, Deduced, /*IsDependent*/ false); 935 } 936 937 /// Build a new template specialization type. 938 /// 939 /// By default, performs semantic analysis when building the template 940 /// specialization type. Subclasses may override this routine to provide 941 /// different behavior. 942 QualType RebuildTemplateSpecializationType(TemplateName Template, 943 SourceLocation TemplateLoc, 944 TemplateArgumentListInfo &Args); 945 946 /// Build a new parenthesized type. 947 /// 948 /// By default, builds a new ParenType type from the inner type. 949 /// Subclasses may override this routine to provide different behavior. 950 QualType RebuildParenType(QualType InnerType) { 951 return SemaRef.BuildParenType(InnerType); 952 } 953 954 /// Build a new qualified name type. 955 /// 956 /// By default, builds a new ElaboratedType type from the keyword, 957 /// the nested-name-specifier and the named type. 958 /// Subclasses may override this routine to provide different behavior. 959 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 960 ElaboratedTypeKeyword Keyword, 961 NestedNameSpecifierLoc QualifierLoc, 962 QualType Named) { 963 return SemaRef.Context.getElaboratedType(Keyword, 964 QualifierLoc.getNestedNameSpecifier(), 965 Named); 966 } 967 968 /// Build a new typename type that refers to a template-id. 969 /// 970 /// By default, builds a new DependentNameType type from the 971 /// nested-name-specifier and the given type. Subclasses may override 972 /// this routine to provide different behavior. 973 QualType RebuildDependentTemplateSpecializationType( 974 ElaboratedTypeKeyword Keyword, 975 NestedNameSpecifierLoc QualifierLoc, 976 SourceLocation TemplateKWLoc, 977 const IdentifierInfo *Name, 978 SourceLocation NameLoc, 979 TemplateArgumentListInfo &Args, 980 bool AllowInjectedClassName) { 981 // Rebuild the template name. 982 // TODO: avoid TemplateName abstraction 983 CXXScopeSpec SS; 984 SS.Adopt(QualifierLoc); 985 TemplateName InstName = getDerived().RebuildTemplateName( 986 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 987 AllowInjectedClassName); 988 989 if (InstName.isNull()) 990 return QualType(); 991 992 // If it's still dependent, make a dependent specialization. 993 if (InstName.getAsDependentTemplateName()) 994 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 995 QualifierLoc.getNestedNameSpecifier(), 996 Name, 997 Args); 998 999 // Otherwise, make an elaborated type wrapping a non-dependent 1000 // specialization. 1001 QualType T = 1002 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1003 if (T.isNull()) return QualType(); 1004 1005 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1006 return T; 1007 1008 return SemaRef.Context.getElaboratedType(Keyword, 1009 QualifierLoc.getNestedNameSpecifier(), 1010 T); 1011 } 1012 1013 /// Build a new typename type that refers to an identifier. 1014 /// 1015 /// By default, performs semantic analysis when building the typename type 1016 /// (or elaborated type). Subclasses may override this routine to provide 1017 /// different behavior. 1018 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1019 SourceLocation KeywordLoc, 1020 NestedNameSpecifierLoc QualifierLoc, 1021 const IdentifierInfo *Id, 1022 SourceLocation IdLoc, 1023 bool DeducedTSTContext) { 1024 CXXScopeSpec SS; 1025 SS.Adopt(QualifierLoc); 1026 1027 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1028 // If the name is still dependent, just build a new dependent name type. 1029 if (!SemaRef.computeDeclContext(SS)) 1030 return SemaRef.Context.getDependentNameType(Keyword, 1031 QualifierLoc.getNestedNameSpecifier(), 1032 Id); 1033 } 1034 1035 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1036 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1037 *Id, IdLoc); 1038 // If a dependent name resolves to a deduced template specialization type, 1039 // check that we're in one of the syntactic contexts permitting it. 1040 if (!DeducedTSTContext) { 1041 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1042 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1043 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1044 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1045 Deduced->getTemplateName()) 1046 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1047 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1048 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1049 return QualType(); 1050 } 1051 } 1052 return T; 1053 } 1054 1055 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1056 1057 // We had a dependent elaborated-type-specifier that has been transformed 1058 // into a non-dependent elaborated-type-specifier. Find the tag we're 1059 // referring to. 1060 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1061 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1062 if (!DC) 1063 return QualType(); 1064 1065 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1066 return QualType(); 1067 1068 TagDecl *Tag = nullptr; 1069 SemaRef.LookupQualifiedName(Result, DC); 1070 switch (Result.getResultKind()) { 1071 case LookupResult::NotFound: 1072 case LookupResult::NotFoundInCurrentInstantiation: 1073 break; 1074 1075 case LookupResult::Found: 1076 Tag = Result.getAsSingle<TagDecl>(); 1077 break; 1078 1079 case LookupResult::FoundOverloaded: 1080 case LookupResult::FoundUnresolvedValue: 1081 llvm_unreachable("Tag lookup cannot find non-tags"); 1082 1083 case LookupResult::Ambiguous: 1084 // Let the LookupResult structure handle ambiguities. 1085 return QualType(); 1086 } 1087 1088 if (!Tag) { 1089 // Check where the name exists but isn't a tag type and use that to emit 1090 // better diagnostics. 1091 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1092 SemaRef.LookupQualifiedName(Result, DC); 1093 switch (Result.getResultKind()) { 1094 case LookupResult::Found: 1095 case LookupResult::FoundOverloaded: 1096 case LookupResult::FoundUnresolvedValue: { 1097 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1098 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1099 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1100 << NTK << Kind; 1101 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1102 break; 1103 } 1104 default: 1105 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1106 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1107 break; 1108 } 1109 return QualType(); 1110 } 1111 1112 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1113 IdLoc, Id)) { 1114 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1115 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1116 return QualType(); 1117 } 1118 1119 // Build the elaborated-type-specifier type. 1120 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1121 return SemaRef.Context.getElaboratedType(Keyword, 1122 QualifierLoc.getNestedNameSpecifier(), 1123 T); 1124 } 1125 1126 /// Build a new pack expansion type. 1127 /// 1128 /// By default, builds a new PackExpansionType type from the given pattern. 1129 /// Subclasses may override this routine to provide different behavior. 1130 QualType RebuildPackExpansionType(QualType Pattern, 1131 SourceRange PatternRange, 1132 SourceLocation EllipsisLoc, 1133 Optional<unsigned> NumExpansions) { 1134 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1135 NumExpansions); 1136 } 1137 1138 /// Build a new atomic type given its value type. 1139 /// 1140 /// By default, performs semantic analysis when building the atomic type. 1141 /// Subclasses may override this routine to provide different behavior. 1142 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1143 1144 /// Build a new pipe type given its value type. 1145 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1146 bool isReadPipe); 1147 1148 /// Build a new template name given a nested name specifier, a flag 1149 /// indicating whether the "template" keyword was provided, and the template 1150 /// that the template name refers to. 1151 /// 1152 /// By default, builds the new template name directly. Subclasses may override 1153 /// this routine to provide different behavior. 1154 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1155 bool TemplateKW, 1156 TemplateDecl *Template); 1157 1158 /// Build a new template name given a nested name specifier and the 1159 /// name that is referred to as a template. 1160 /// 1161 /// By default, performs semantic analysis to determine whether the name can 1162 /// be resolved to a specific template, then builds the appropriate kind of 1163 /// template name. Subclasses may override this routine to provide different 1164 /// behavior. 1165 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1166 SourceLocation TemplateKWLoc, 1167 const IdentifierInfo &Name, 1168 SourceLocation NameLoc, QualType ObjectType, 1169 NamedDecl *FirstQualifierInScope, 1170 bool AllowInjectedClassName); 1171 1172 /// Build a new template name given a nested name specifier and the 1173 /// overloaded operator name that is referred to as a template. 1174 /// 1175 /// By default, performs semantic analysis to determine whether the name can 1176 /// be resolved to a specific template, then builds the appropriate kind of 1177 /// template name. Subclasses may override this routine to provide different 1178 /// behavior. 1179 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1180 SourceLocation TemplateKWLoc, 1181 OverloadedOperatorKind Operator, 1182 SourceLocation NameLoc, QualType ObjectType, 1183 bool AllowInjectedClassName); 1184 1185 /// Build a new template name given a template template parameter pack 1186 /// and the 1187 /// 1188 /// By default, performs semantic analysis to determine whether the name can 1189 /// be resolved to a specific template, then builds the appropriate kind of 1190 /// template name. Subclasses may override this routine to provide different 1191 /// behavior. 1192 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1193 const TemplateArgument &ArgPack) { 1194 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1195 } 1196 1197 /// Build a new compound statement. 1198 /// 1199 /// By default, performs semantic analysis to build the new statement. 1200 /// Subclasses may override this routine to provide different behavior. 1201 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1202 MultiStmtArg Statements, 1203 SourceLocation RBraceLoc, 1204 bool IsStmtExpr) { 1205 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1206 IsStmtExpr); 1207 } 1208 1209 /// Build a new case statement. 1210 /// 1211 /// By default, performs semantic analysis to build the new statement. 1212 /// Subclasses may override this routine to provide different behavior. 1213 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1214 Expr *LHS, 1215 SourceLocation EllipsisLoc, 1216 Expr *RHS, 1217 SourceLocation ColonLoc) { 1218 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1219 ColonLoc); 1220 } 1221 1222 /// Attach the body to a new case statement. 1223 /// 1224 /// By default, performs semantic analysis to build the new statement. 1225 /// Subclasses may override this routine to provide different behavior. 1226 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1227 getSema().ActOnCaseStmtBody(S, Body); 1228 return S; 1229 } 1230 1231 /// Build a new default statement. 1232 /// 1233 /// By default, performs semantic analysis to build the new statement. 1234 /// Subclasses may override this routine to provide different behavior. 1235 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1236 SourceLocation ColonLoc, 1237 Stmt *SubStmt) { 1238 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1239 /*CurScope=*/nullptr); 1240 } 1241 1242 /// Build a new label statement. 1243 /// 1244 /// By default, performs semantic analysis to build the new statement. 1245 /// Subclasses may override this routine to provide different behavior. 1246 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1247 SourceLocation ColonLoc, Stmt *SubStmt) { 1248 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1249 } 1250 1251 /// Build a new label statement. 1252 /// 1253 /// By default, performs semantic analysis to build the new statement. 1254 /// Subclasses may override this routine to provide different behavior. 1255 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1256 ArrayRef<const Attr*> Attrs, 1257 Stmt *SubStmt) { 1258 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1259 } 1260 1261 /// Build a new "if" statement. 1262 /// 1263 /// By default, performs semantic analysis to build the new statement. 1264 /// Subclasses may override this routine to provide different behavior. 1265 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1266 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1267 SourceLocation ElseLoc, Stmt *Else) { 1268 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1269 ElseLoc, Else); 1270 } 1271 1272 /// Start building a new switch statement. 1273 /// 1274 /// By default, performs semantic analysis to build the new statement. 1275 /// Subclasses may override this routine to provide different behavior. 1276 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1277 Sema::ConditionResult Cond) { 1278 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1279 } 1280 1281 /// Attach the body to the switch statement. 1282 /// 1283 /// By default, performs semantic analysis to build the new statement. 1284 /// Subclasses may override this routine to provide different behavior. 1285 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1286 Stmt *Switch, Stmt *Body) { 1287 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1288 } 1289 1290 /// Build a new while statement. 1291 /// 1292 /// By default, performs semantic analysis to build the new statement. 1293 /// Subclasses may override this routine to provide different behavior. 1294 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1295 Sema::ConditionResult Cond, Stmt *Body) { 1296 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1297 } 1298 1299 /// Build a new do-while statement. 1300 /// 1301 /// By default, performs semantic analysis to build the new statement. 1302 /// Subclasses may override this routine to provide different behavior. 1303 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1304 SourceLocation WhileLoc, SourceLocation LParenLoc, 1305 Expr *Cond, SourceLocation RParenLoc) { 1306 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1307 Cond, RParenLoc); 1308 } 1309 1310 /// Build a new for statement. 1311 /// 1312 /// By default, performs semantic analysis to build the new statement. 1313 /// Subclasses may override this routine to provide different behavior. 1314 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1315 Stmt *Init, Sema::ConditionResult Cond, 1316 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1317 Stmt *Body) { 1318 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1319 Inc, RParenLoc, Body); 1320 } 1321 1322 /// Build a new goto statement. 1323 /// 1324 /// By default, performs semantic analysis to build the new statement. 1325 /// Subclasses may override this routine to provide different behavior. 1326 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1327 LabelDecl *Label) { 1328 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1329 } 1330 1331 /// Build a new indirect goto statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1336 SourceLocation StarLoc, 1337 Expr *Target) { 1338 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1339 } 1340 1341 /// Build a new return statement. 1342 /// 1343 /// By default, performs semantic analysis to build the new statement. 1344 /// Subclasses may override this routine to provide different behavior. 1345 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1346 return getSema().BuildReturnStmt(ReturnLoc, Result); 1347 } 1348 1349 /// Build a new declaration statement. 1350 /// 1351 /// By default, performs semantic analysis to build the new statement. 1352 /// Subclasses may override this routine to provide different behavior. 1353 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1354 SourceLocation StartLoc, SourceLocation EndLoc) { 1355 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1356 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1357 } 1358 1359 /// Build a new inline asm statement. 1360 /// 1361 /// By default, performs semantic analysis to build the new statement. 1362 /// Subclasses may override this routine to provide different behavior. 1363 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1364 bool IsVolatile, unsigned NumOutputs, 1365 unsigned NumInputs, IdentifierInfo **Names, 1366 MultiExprArg Constraints, MultiExprArg Exprs, 1367 Expr *AsmString, MultiExprArg Clobbers, 1368 SourceLocation RParenLoc) { 1369 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1370 NumInputs, Names, Constraints, Exprs, 1371 AsmString, Clobbers, RParenLoc); 1372 } 1373 1374 /// Build a new MS style inline asm statement. 1375 /// 1376 /// By default, performs semantic analysis to build the new statement. 1377 /// Subclasses may override this routine to provide different behavior. 1378 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1379 ArrayRef<Token> AsmToks, 1380 StringRef AsmString, 1381 unsigned NumOutputs, unsigned NumInputs, 1382 ArrayRef<StringRef> Constraints, 1383 ArrayRef<StringRef> Clobbers, 1384 ArrayRef<Expr*> Exprs, 1385 SourceLocation EndLoc) { 1386 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1387 NumOutputs, NumInputs, 1388 Constraints, Clobbers, Exprs, EndLoc); 1389 } 1390 1391 /// Build a new co_return statement. 1392 /// 1393 /// By default, performs semantic analysis to build the new statement. 1394 /// Subclasses may override this routine to provide different behavior. 1395 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1396 bool IsImplicit) { 1397 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1398 } 1399 1400 /// Build a new co_await expression. 1401 /// 1402 /// By default, performs semantic analysis to build the new expression. 1403 /// Subclasses may override this routine to provide different behavior. 1404 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1405 bool IsImplicit) { 1406 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1407 } 1408 1409 /// Build a new co_await expression. 1410 /// 1411 /// By default, performs semantic analysis to build the new expression. 1412 /// Subclasses may override this routine to provide different behavior. 1413 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1414 Expr *Result, 1415 UnresolvedLookupExpr *Lookup) { 1416 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1417 } 1418 1419 /// Build a new co_yield expression. 1420 /// 1421 /// By default, performs semantic analysis to build the new expression. 1422 /// Subclasses may override this routine to provide different behavior. 1423 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1424 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1425 } 1426 1427 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1428 return getSema().BuildCoroutineBodyStmt(Args); 1429 } 1430 1431 /// Build a new Objective-C \@try statement. 1432 /// 1433 /// By default, performs semantic analysis to build the new statement. 1434 /// Subclasses may override this routine to provide different behavior. 1435 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1436 Stmt *TryBody, 1437 MultiStmtArg CatchStmts, 1438 Stmt *Finally) { 1439 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1440 Finally); 1441 } 1442 1443 /// Rebuild an Objective-C exception declaration. 1444 /// 1445 /// By default, performs semantic analysis to build the new declaration. 1446 /// Subclasses may override this routine to provide different behavior. 1447 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1448 TypeSourceInfo *TInfo, QualType T) { 1449 return getSema().BuildObjCExceptionDecl(TInfo, T, 1450 ExceptionDecl->getInnerLocStart(), 1451 ExceptionDecl->getLocation(), 1452 ExceptionDecl->getIdentifier()); 1453 } 1454 1455 /// Build a new Objective-C \@catch statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1460 SourceLocation RParenLoc, 1461 VarDecl *Var, 1462 Stmt *Body) { 1463 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1464 Var, Body); 1465 } 1466 1467 /// Build a new Objective-C \@finally statement. 1468 /// 1469 /// By default, performs semantic analysis to build the new statement. 1470 /// Subclasses may override this routine to provide different behavior. 1471 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1472 Stmt *Body) { 1473 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1474 } 1475 1476 /// Build a new Objective-C \@throw statement. 1477 /// 1478 /// By default, performs semantic analysis to build the new statement. 1479 /// Subclasses may override this routine to provide different behavior. 1480 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1481 Expr *Operand) { 1482 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1483 } 1484 1485 /// Build a new OpenMP executable directive. 1486 /// 1487 /// By default, performs semantic analysis to build the new statement. 1488 /// Subclasses may override this routine to provide different behavior. 1489 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1490 DeclarationNameInfo DirName, 1491 OpenMPDirectiveKind CancelRegion, 1492 ArrayRef<OMPClause *> Clauses, 1493 Stmt *AStmt, SourceLocation StartLoc, 1494 SourceLocation EndLoc) { 1495 return getSema().ActOnOpenMPExecutableDirective( 1496 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1497 } 1498 1499 /// Build a new OpenMP 'if' clause. 1500 /// 1501 /// By default, performs semantic analysis to build the new OpenMP clause. 1502 /// Subclasses may override this routine to provide different behavior. 1503 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1504 Expr *Condition, SourceLocation StartLoc, 1505 SourceLocation LParenLoc, 1506 SourceLocation NameModifierLoc, 1507 SourceLocation ColonLoc, 1508 SourceLocation EndLoc) { 1509 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1510 LParenLoc, NameModifierLoc, ColonLoc, 1511 EndLoc); 1512 } 1513 1514 /// Build a new OpenMP 'final' clause. 1515 /// 1516 /// By default, performs semantic analysis to build the new OpenMP clause. 1517 /// Subclasses may override this routine to provide different behavior. 1518 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1519 SourceLocation LParenLoc, 1520 SourceLocation EndLoc) { 1521 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1522 EndLoc); 1523 } 1524 1525 /// Build a new OpenMP 'num_threads' clause. 1526 /// 1527 /// By default, performs semantic analysis to build the new OpenMP clause. 1528 /// Subclasses may override this routine to provide different behavior. 1529 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1530 SourceLocation StartLoc, 1531 SourceLocation LParenLoc, 1532 SourceLocation EndLoc) { 1533 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1534 LParenLoc, EndLoc); 1535 } 1536 1537 /// Build a new OpenMP 'safelen' clause. 1538 /// 1539 /// By default, performs semantic analysis to build the new OpenMP clause. 1540 /// Subclasses may override this routine to provide different behavior. 1541 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1542 SourceLocation LParenLoc, 1543 SourceLocation EndLoc) { 1544 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1545 } 1546 1547 /// Build a new OpenMP 'simdlen' clause. 1548 /// 1549 /// By default, performs semantic analysis to build the new OpenMP clause. 1550 /// Subclasses may override this routine to provide different behavior. 1551 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1552 SourceLocation LParenLoc, 1553 SourceLocation EndLoc) { 1554 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1555 } 1556 1557 /// Build a new OpenMP 'allocator' clause. 1558 /// 1559 /// By default, performs semantic analysis to build the new OpenMP clause. 1560 /// Subclasses may override this routine to provide different behavior. 1561 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1562 SourceLocation LParenLoc, 1563 SourceLocation EndLoc) { 1564 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1565 } 1566 1567 /// Build a new OpenMP 'collapse' clause. 1568 /// 1569 /// By default, performs semantic analysis to build the new OpenMP clause. 1570 /// Subclasses may override this routine to provide different behavior. 1571 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1572 SourceLocation LParenLoc, 1573 SourceLocation EndLoc) { 1574 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1575 EndLoc); 1576 } 1577 1578 /// Build a new OpenMP 'default' clause. 1579 /// 1580 /// By default, performs semantic analysis to build the new OpenMP clause. 1581 /// Subclasses may override this routine to provide different behavior. 1582 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1583 SourceLocation KindKwLoc, 1584 SourceLocation StartLoc, 1585 SourceLocation LParenLoc, 1586 SourceLocation EndLoc) { 1587 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1588 StartLoc, LParenLoc, EndLoc); 1589 } 1590 1591 /// Build a new OpenMP 'proc_bind' clause. 1592 /// 1593 /// By default, performs semantic analysis to build the new OpenMP clause. 1594 /// Subclasses may override this routine to provide different behavior. 1595 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1596 SourceLocation KindKwLoc, 1597 SourceLocation StartLoc, 1598 SourceLocation LParenLoc, 1599 SourceLocation EndLoc) { 1600 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1601 StartLoc, LParenLoc, EndLoc); 1602 } 1603 1604 /// Build a new OpenMP 'schedule' clause. 1605 /// 1606 /// By default, performs semantic analysis to build the new OpenMP clause. 1607 /// Subclasses may override this routine to provide different behavior. 1608 OMPClause *RebuildOMPScheduleClause( 1609 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1610 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1611 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1612 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1613 return getSema().ActOnOpenMPScheduleClause( 1614 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1615 CommaLoc, EndLoc); 1616 } 1617 1618 /// Build a new OpenMP 'ordered' clause. 1619 /// 1620 /// By default, performs semantic analysis to build the new OpenMP clause. 1621 /// Subclasses may override this routine to provide different behavior. 1622 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1623 SourceLocation EndLoc, 1624 SourceLocation LParenLoc, Expr *Num) { 1625 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1626 } 1627 1628 /// Build a new OpenMP 'private' clause. 1629 /// 1630 /// By default, performs semantic analysis to build the new OpenMP clause. 1631 /// Subclasses may override this routine to provide different behavior. 1632 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1633 SourceLocation StartLoc, 1634 SourceLocation LParenLoc, 1635 SourceLocation EndLoc) { 1636 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1637 EndLoc); 1638 } 1639 1640 /// Build a new OpenMP 'firstprivate' clause. 1641 /// 1642 /// By default, performs semantic analysis to build the new OpenMP clause. 1643 /// Subclasses may override this routine to provide different behavior. 1644 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1645 SourceLocation StartLoc, 1646 SourceLocation LParenLoc, 1647 SourceLocation EndLoc) { 1648 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1649 EndLoc); 1650 } 1651 1652 /// Build a new OpenMP 'lastprivate' clause. 1653 /// 1654 /// By default, performs semantic analysis to build the new OpenMP clause. 1655 /// Subclasses may override this routine to provide different behavior. 1656 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1657 SourceLocation StartLoc, 1658 SourceLocation LParenLoc, 1659 SourceLocation EndLoc) { 1660 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1661 EndLoc); 1662 } 1663 1664 /// Build a new OpenMP 'shared' clause. 1665 /// 1666 /// By default, performs semantic analysis to build the new OpenMP clause. 1667 /// Subclasses may override this routine to provide different behavior. 1668 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1669 SourceLocation StartLoc, 1670 SourceLocation LParenLoc, 1671 SourceLocation EndLoc) { 1672 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1673 EndLoc); 1674 } 1675 1676 /// Build a new OpenMP 'reduction' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new statement. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1681 SourceLocation StartLoc, 1682 SourceLocation LParenLoc, 1683 SourceLocation ColonLoc, 1684 SourceLocation EndLoc, 1685 CXXScopeSpec &ReductionIdScopeSpec, 1686 const DeclarationNameInfo &ReductionId, 1687 ArrayRef<Expr *> UnresolvedReductions) { 1688 return getSema().ActOnOpenMPReductionClause( 1689 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1690 ReductionId, UnresolvedReductions); 1691 } 1692 1693 /// Build a new OpenMP 'task_reduction' clause. 1694 /// 1695 /// By default, performs semantic analysis to build the new statement. 1696 /// Subclasses may override this routine to provide different behavior. 1697 OMPClause *RebuildOMPTaskReductionClause( 1698 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1699 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1700 CXXScopeSpec &ReductionIdScopeSpec, 1701 const DeclarationNameInfo &ReductionId, 1702 ArrayRef<Expr *> UnresolvedReductions) { 1703 return getSema().ActOnOpenMPTaskReductionClause( 1704 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1705 ReductionId, UnresolvedReductions); 1706 } 1707 1708 /// Build a new OpenMP 'in_reduction' clause. 1709 /// 1710 /// By default, performs semantic analysis to build the new statement. 1711 /// Subclasses may override this routine to provide different behavior. 1712 OMPClause * 1713 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1714 SourceLocation LParenLoc, SourceLocation ColonLoc, 1715 SourceLocation EndLoc, 1716 CXXScopeSpec &ReductionIdScopeSpec, 1717 const DeclarationNameInfo &ReductionId, 1718 ArrayRef<Expr *> UnresolvedReductions) { 1719 return getSema().ActOnOpenMPInReductionClause( 1720 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1721 ReductionId, UnresolvedReductions); 1722 } 1723 1724 /// Build a new OpenMP 'linear' clause. 1725 /// 1726 /// By default, performs semantic analysis to build the new OpenMP clause. 1727 /// Subclasses may override this routine to provide different behavior. 1728 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1729 SourceLocation StartLoc, 1730 SourceLocation LParenLoc, 1731 OpenMPLinearClauseKind Modifier, 1732 SourceLocation ModifierLoc, 1733 SourceLocation ColonLoc, 1734 SourceLocation EndLoc) { 1735 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1736 Modifier, ModifierLoc, ColonLoc, 1737 EndLoc); 1738 } 1739 1740 /// Build a new OpenMP 'aligned' clause. 1741 /// 1742 /// By default, performs semantic analysis to build the new OpenMP clause. 1743 /// Subclasses may override this routine to provide different behavior. 1744 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1745 SourceLocation StartLoc, 1746 SourceLocation LParenLoc, 1747 SourceLocation ColonLoc, 1748 SourceLocation EndLoc) { 1749 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1750 LParenLoc, ColonLoc, EndLoc); 1751 } 1752 1753 /// Build a new OpenMP 'copyin' clause. 1754 /// 1755 /// By default, performs semantic analysis to build the new OpenMP clause. 1756 /// Subclasses may override this routine to provide different behavior. 1757 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1758 SourceLocation StartLoc, 1759 SourceLocation LParenLoc, 1760 SourceLocation EndLoc) { 1761 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1762 EndLoc); 1763 } 1764 1765 /// Build a new OpenMP 'copyprivate' clause. 1766 /// 1767 /// By default, performs semantic analysis to build the new OpenMP clause. 1768 /// Subclasses may override this routine to provide different behavior. 1769 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1770 SourceLocation StartLoc, 1771 SourceLocation LParenLoc, 1772 SourceLocation EndLoc) { 1773 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1774 EndLoc); 1775 } 1776 1777 /// Build a new OpenMP 'flush' pseudo clause. 1778 /// 1779 /// By default, performs semantic analysis to build the new OpenMP clause. 1780 /// Subclasses may override this routine to provide different behavior. 1781 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1782 SourceLocation StartLoc, 1783 SourceLocation LParenLoc, 1784 SourceLocation EndLoc) { 1785 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1786 EndLoc); 1787 } 1788 1789 /// Build a new OpenMP 'depend' pseudo clause. 1790 /// 1791 /// By default, performs semantic analysis to build the new OpenMP clause. 1792 /// Subclasses may override this routine to provide different behavior. 1793 OMPClause * 1794 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1795 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1796 SourceLocation StartLoc, SourceLocation LParenLoc, 1797 SourceLocation EndLoc) { 1798 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1799 StartLoc, LParenLoc, EndLoc); 1800 } 1801 1802 /// Build a new OpenMP 'device' clause. 1803 /// 1804 /// By default, performs semantic analysis to build the new statement. 1805 /// Subclasses may override this routine to provide different behavior. 1806 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1807 SourceLocation LParenLoc, 1808 SourceLocation EndLoc) { 1809 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1810 EndLoc); 1811 } 1812 1813 /// Build a new OpenMP 'map' clause. 1814 /// 1815 /// By default, performs semantic analysis to build the new OpenMP clause. 1816 /// Subclasses may override this routine to provide different behavior. 1817 OMPClause *RebuildOMPMapClause( 1818 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1819 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1820 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1821 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1822 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1823 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1824 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1825 MapperIdScopeSpec, MapperId, MapType, 1826 IsMapTypeImplicit, MapLoc, ColonLoc, 1827 VarList, Locs, UnresolvedMappers); 1828 } 1829 1830 /// Build a new OpenMP 'num_teams' clause. 1831 /// 1832 /// By default, performs semantic analysis to build the new statement. 1833 /// Subclasses may override this routine to provide different behavior. 1834 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1835 SourceLocation LParenLoc, 1836 SourceLocation EndLoc) { 1837 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1838 EndLoc); 1839 } 1840 1841 /// Build a new OpenMP 'thread_limit' clause. 1842 /// 1843 /// By default, performs semantic analysis to build the new statement. 1844 /// Subclasses may override this routine to provide different behavior. 1845 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1846 SourceLocation StartLoc, 1847 SourceLocation LParenLoc, 1848 SourceLocation EndLoc) { 1849 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1850 LParenLoc, EndLoc); 1851 } 1852 1853 /// Build a new OpenMP 'priority' clause. 1854 /// 1855 /// By default, performs semantic analysis to build the new statement. 1856 /// Subclasses may override this routine to provide different behavior. 1857 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1858 SourceLocation LParenLoc, 1859 SourceLocation EndLoc) { 1860 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1861 EndLoc); 1862 } 1863 1864 /// Build a new OpenMP 'grainsize' clause. 1865 /// 1866 /// By default, performs semantic analysis to build the new statement. 1867 /// Subclasses may override this routine to provide different behavior. 1868 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1869 SourceLocation LParenLoc, 1870 SourceLocation EndLoc) { 1871 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1872 EndLoc); 1873 } 1874 1875 /// Build a new OpenMP 'num_tasks' clause. 1876 /// 1877 /// By default, performs semantic analysis to build the new statement. 1878 /// Subclasses may override this routine to provide different behavior. 1879 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1880 SourceLocation LParenLoc, 1881 SourceLocation EndLoc) { 1882 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1883 EndLoc); 1884 } 1885 1886 /// Build a new OpenMP 'hint' clause. 1887 /// 1888 /// By default, performs semantic analysis to build the new statement. 1889 /// Subclasses may override this routine to provide different behavior. 1890 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1891 SourceLocation LParenLoc, 1892 SourceLocation EndLoc) { 1893 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1894 } 1895 1896 /// Build a new OpenMP 'dist_schedule' clause. 1897 /// 1898 /// By default, performs semantic analysis to build the new OpenMP clause. 1899 /// Subclasses may override this routine to provide different behavior. 1900 OMPClause * 1901 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1902 Expr *ChunkSize, SourceLocation StartLoc, 1903 SourceLocation LParenLoc, SourceLocation KindLoc, 1904 SourceLocation CommaLoc, SourceLocation EndLoc) { 1905 return getSema().ActOnOpenMPDistScheduleClause( 1906 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1907 } 1908 1909 /// Build a new OpenMP 'to' clause. 1910 /// 1911 /// By default, performs semantic analysis to build the new statement. 1912 /// Subclasses may override this routine to provide different behavior. 1913 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1914 CXXScopeSpec &MapperIdScopeSpec, 1915 DeclarationNameInfo &MapperId, 1916 const OMPVarListLocTy &Locs, 1917 ArrayRef<Expr *> UnresolvedMappers) { 1918 return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, 1919 Locs, UnresolvedMappers); 1920 } 1921 1922 /// Build a new OpenMP 'from' clause. 1923 /// 1924 /// By default, performs semantic analysis to build the new statement. 1925 /// Subclasses may override this routine to provide different behavior. 1926 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1927 CXXScopeSpec &MapperIdScopeSpec, 1928 DeclarationNameInfo &MapperId, 1929 const OMPVarListLocTy &Locs, 1930 ArrayRef<Expr *> UnresolvedMappers) { 1931 return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, 1932 Locs, UnresolvedMappers); 1933 } 1934 1935 /// Build a new OpenMP 'use_device_ptr' clause. 1936 /// 1937 /// By default, performs semantic analysis to build the new OpenMP clause. 1938 /// Subclasses may override this routine to provide different behavior. 1939 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1940 const OMPVarListLocTy &Locs) { 1941 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 1942 } 1943 1944 /// Build a new OpenMP 'is_device_ptr' clause. 1945 /// 1946 /// By default, performs semantic analysis to build the new OpenMP clause. 1947 /// Subclasses may override this routine to provide different behavior. 1948 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1949 const OMPVarListLocTy &Locs) { 1950 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 1951 } 1952 1953 /// Rebuild the operand to an Objective-C \@synchronized statement. 1954 /// 1955 /// By default, performs semantic analysis to build the new statement. 1956 /// Subclasses may override this routine to provide different behavior. 1957 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1958 Expr *object) { 1959 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1960 } 1961 1962 /// Build a new Objective-C \@synchronized statement. 1963 /// 1964 /// By default, performs semantic analysis to build the new statement. 1965 /// Subclasses may override this routine to provide different behavior. 1966 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1967 Expr *Object, Stmt *Body) { 1968 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1969 } 1970 1971 /// Build a new Objective-C \@autoreleasepool statement. 1972 /// 1973 /// By default, performs semantic analysis to build the new statement. 1974 /// Subclasses may override this routine to provide different behavior. 1975 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1976 Stmt *Body) { 1977 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1978 } 1979 1980 /// Build a new Objective-C fast enumeration statement. 1981 /// 1982 /// By default, performs semantic analysis to build the new statement. 1983 /// Subclasses may override this routine to provide different behavior. 1984 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1985 Stmt *Element, 1986 Expr *Collection, 1987 SourceLocation RParenLoc, 1988 Stmt *Body) { 1989 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1990 Element, 1991 Collection, 1992 RParenLoc); 1993 if (ForEachStmt.isInvalid()) 1994 return StmtError(); 1995 1996 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1997 } 1998 1999 /// Build a new C++ exception declaration. 2000 /// 2001 /// By default, performs semantic analysis to build the new decaration. 2002 /// Subclasses may override this routine to provide different behavior. 2003 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2004 TypeSourceInfo *Declarator, 2005 SourceLocation StartLoc, 2006 SourceLocation IdLoc, 2007 IdentifierInfo *Id) { 2008 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2009 StartLoc, IdLoc, Id); 2010 if (Var) 2011 getSema().CurContext->addDecl(Var); 2012 return Var; 2013 } 2014 2015 /// Build a new C++ catch statement. 2016 /// 2017 /// By default, performs semantic analysis to build the new statement. 2018 /// Subclasses may override this routine to provide different behavior. 2019 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2020 VarDecl *ExceptionDecl, 2021 Stmt *Handler) { 2022 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2023 Handler)); 2024 } 2025 2026 /// Build a new C++ try statement. 2027 /// 2028 /// By default, performs semantic analysis to build the new statement. 2029 /// Subclasses may override this routine to provide different behavior. 2030 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2031 ArrayRef<Stmt *> Handlers) { 2032 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2033 } 2034 2035 /// Build a new C++0x range-based for statement. 2036 /// 2037 /// By default, performs semantic analysis to build the new statement. 2038 /// Subclasses may override this routine to provide different behavior. 2039 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2040 SourceLocation CoawaitLoc, Stmt *Init, 2041 SourceLocation ColonLoc, Stmt *Range, 2042 Stmt *Begin, Stmt *End, Expr *Cond, 2043 Expr *Inc, Stmt *LoopVar, 2044 SourceLocation RParenLoc) { 2045 // If we've just learned that the range is actually an Objective-C 2046 // collection, treat this as an Objective-C fast enumeration loop. 2047 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2048 if (RangeStmt->isSingleDecl()) { 2049 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2050 if (RangeVar->isInvalidDecl()) 2051 return StmtError(); 2052 2053 Expr *RangeExpr = RangeVar->getInit(); 2054 if (!RangeExpr->isTypeDependent() && 2055 RangeExpr->getType()->isObjCObjectPointerType()) { 2056 // FIXME: Support init-statements in Objective-C++20 ranged for 2057 // statement. 2058 if (Init) { 2059 return SemaRef.Diag(Init->getBeginLoc(), 2060 diag::err_objc_for_range_init_stmt) 2061 << Init->getSourceRange(); 2062 } 2063 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2064 RangeExpr, RParenLoc); 2065 } 2066 } 2067 } 2068 } 2069 2070 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2071 Range, Begin, End, Cond, Inc, LoopVar, 2072 RParenLoc, Sema::BFRK_Rebuild); 2073 } 2074 2075 /// Build a new C++0x range-based for statement. 2076 /// 2077 /// By default, performs semantic analysis to build the new statement. 2078 /// Subclasses may override this routine to provide different behavior. 2079 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2080 bool IsIfExists, 2081 NestedNameSpecifierLoc QualifierLoc, 2082 DeclarationNameInfo NameInfo, 2083 Stmt *Nested) { 2084 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2085 QualifierLoc, NameInfo, Nested); 2086 } 2087 2088 /// Attach body to a C++0x range-based for statement. 2089 /// 2090 /// By default, performs semantic analysis to finish the new statement. 2091 /// Subclasses may override this routine to provide different behavior. 2092 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2093 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2094 } 2095 2096 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2097 Stmt *TryBlock, Stmt *Handler) { 2098 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2099 } 2100 2101 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2102 Stmt *Block) { 2103 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2104 } 2105 2106 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2107 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2108 } 2109 2110 /// Build a new predefined expression. 2111 /// 2112 /// By default, performs semantic analysis to build the new expression. 2113 /// Subclasses may override this routine to provide different behavior. 2114 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2115 PredefinedExpr::IdentKind IK) { 2116 return getSema().BuildPredefinedExpr(Loc, IK); 2117 } 2118 2119 /// Build a new expression that references a declaration. 2120 /// 2121 /// By default, performs semantic analysis to build the new expression. 2122 /// Subclasses may override this routine to provide different behavior. 2123 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2124 LookupResult &R, 2125 bool RequiresADL) { 2126 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2127 } 2128 2129 2130 /// Build a new expression that references a declaration. 2131 /// 2132 /// By default, performs semantic analysis to build the new expression. 2133 /// Subclasses may override this routine to provide different behavior. 2134 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2135 ValueDecl *VD, 2136 const DeclarationNameInfo &NameInfo, 2137 TemplateArgumentListInfo *TemplateArgs) { 2138 CXXScopeSpec SS; 2139 SS.Adopt(QualifierLoc); 2140 2141 // FIXME: loses template args. 2142 2143 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2144 } 2145 2146 /// Build a new expression in parentheses. 2147 /// 2148 /// By default, performs semantic analysis to build the new expression. 2149 /// Subclasses may override this routine to provide different behavior. 2150 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2151 SourceLocation RParen) { 2152 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2153 } 2154 2155 /// Build a new pseudo-destructor expression. 2156 /// 2157 /// By default, performs semantic analysis to build the new expression. 2158 /// Subclasses may override this routine to provide different behavior. 2159 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2160 SourceLocation OperatorLoc, 2161 bool isArrow, 2162 CXXScopeSpec &SS, 2163 TypeSourceInfo *ScopeType, 2164 SourceLocation CCLoc, 2165 SourceLocation TildeLoc, 2166 PseudoDestructorTypeStorage Destroyed); 2167 2168 /// Build a new unary operator expression. 2169 /// 2170 /// By default, performs semantic analysis to build the new expression. 2171 /// Subclasses may override this routine to provide different behavior. 2172 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2173 UnaryOperatorKind Opc, 2174 Expr *SubExpr) { 2175 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2176 } 2177 2178 /// Build a new builtin offsetof expression. 2179 /// 2180 /// By default, performs semantic analysis to build the new expression. 2181 /// Subclasses may override this routine to provide different behavior. 2182 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2183 TypeSourceInfo *Type, 2184 ArrayRef<Sema::OffsetOfComponent> Components, 2185 SourceLocation RParenLoc) { 2186 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2187 RParenLoc); 2188 } 2189 2190 /// Build a new sizeof, alignof or vec_step expression with a 2191 /// type argument. 2192 /// 2193 /// By default, performs semantic analysis to build the new expression. 2194 /// Subclasses may override this routine to provide different behavior. 2195 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2196 SourceLocation OpLoc, 2197 UnaryExprOrTypeTrait ExprKind, 2198 SourceRange R) { 2199 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2200 } 2201 2202 /// Build a new sizeof, alignof or vec step expression with an 2203 /// expression argument. 2204 /// 2205 /// By default, performs semantic analysis to build the new expression. 2206 /// Subclasses may override this routine to provide different behavior. 2207 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2208 UnaryExprOrTypeTrait ExprKind, 2209 SourceRange R) { 2210 ExprResult Result 2211 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2212 if (Result.isInvalid()) 2213 return ExprError(); 2214 2215 return Result; 2216 } 2217 2218 /// Build a new array subscript expression. 2219 /// 2220 /// By default, performs semantic analysis to build the new expression. 2221 /// Subclasses may override this routine to provide different behavior. 2222 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2223 SourceLocation LBracketLoc, 2224 Expr *RHS, 2225 SourceLocation RBracketLoc) { 2226 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2227 LBracketLoc, RHS, 2228 RBracketLoc); 2229 } 2230 2231 /// Build a new array section expression. 2232 /// 2233 /// By default, performs semantic analysis to build the new expression. 2234 /// Subclasses may override this routine to provide different behavior. 2235 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2236 Expr *LowerBound, 2237 SourceLocation ColonLoc, Expr *Length, 2238 SourceLocation RBracketLoc) { 2239 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2240 ColonLoc, Length, RBracketLoc); 2241 } 2242 2243 /// Build a new call expression. 2244 /// 2245 /// By default, performs semantic analysis to build the new expression. 2246 /// Subclasses may override this routine to provide different behavior. 2247 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2248 MultiExprArg Args, 2249 SourceLocation RParenLoc, 2250 Expr *ExecConfig = nullptr) { 2251 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2252 Args, RParenLoc, ExecConfig); 2253 } 2254 2255 /// Build a new member access expression. 2256 /// 2257 /// By default, performs semantic analysis to build the new expression. 2258 /// Subclasses may override this routine to provide different behavior. 2259 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2260 bool isArrow, 2261 NestedNameSpecifierLoc QualifierLoc, 2262 SourceLocation TemplateKWLoc, 2263 const DeclarationNameInfo &MemberNameInfo, 2264 ValueDecl *Member, 2265 NamedDecl *FoundDecl, 2266 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2267 NamedDecl *FirstQualifierInScope) { 2268 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2269 isArrow); 2270 if (!Member->getDeclName()) { 2271 // We have a reference to an unnamed field. This is always the 2272 // base of an anonymous struct/union member access, i.e. the 2273 // field is always of record type. 2274 assert(Member->getType()->isRecordType() && 2275 "unnamed member not of record type?"); 2276 2277 BaseResult = 2278 getSema().PerformObjectMemberConversion(BaseResult.get(), 2279 QualifierLoc.getNestedNameSpecifier(), 2280 FoundDecl, Member); 2281 if (BaseResult.isInvalid()) 2282 return ExprError(); 2283 Base = BaseResult.get(); 2284 2285 CXXScopeSpec EmptySS; 2286 return getSema().BuildFieldReferenceExpr( 2287 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2288 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2289 } 2290 2291 CXXScopeSpec SS; 2292 SS.Adopt(QualifierLoc); 2293 2294 Base = BaseResult.get(); 2295 QualType BaseType = Base->getType(); 2296 2297 if (isArrow && !BaseType->isPointerType()) 2298 return ExprError(); 2299 2300 // FIXME: this involves duplicating earlier analysis in a lot of 2301 // cases; we should avoid this when possible. 2302 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2303 R.addDecl(FoundDecl); 2304 R.resolveKind(); 2305 2306 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2307 SS, TemplateKWLoc, 2308 FirstQualifierInScope, 2309 R, ExplicitTemplateArgs, 2310 /*S*/nullptr); 2311 } 2312 2313 /// Build a new binary operator expression. 2314 /// 2315 /// By default, performs semantic analysis to build the new expression. 2316 /// Subclasses may override this routine to provide different behavior. 2317 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2318 BinaryOperatorKind Opc, 2319 Expr *LHS, Expr *RHS) { 2320 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2321 } 2322 2323 /// Build a new conditional operator expression. 2324 /// 2325 /// By default, performs semantic analysis to build the new expression. 2326 /// Subclasses may override this routine to provide different behavior. 2327 ExprResult RebuildConditionalOperator(Expr *Cond, 2328 SourceLocation QuestionLoc, 2329 Expr *LHS, 2330 SourceLocation ColonLoc, 2331 Expr *RHS) { 2332 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2333 LHS, RHS); 2334 } 2335 2336 /// Build a new C-style cast expression. 2337 /// 2338 /// By default, performs semantic analysis to build the new expression. 2339 /// Subclasses may override this routine to provide different behavior. 2340 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2341 TypeSourceInfo *TInfo, 2342 SourceLocation RParenLoc, 2343 Expr *SubExpr) { 2344 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2345 SubExpr); 2346 } 2347 2348 /// Build a new compound literal expression. 2349 /// 2350 /// By default, performs semantic analysis to build the new expression. 2351 /// Subclasses may override this routine to provide different behavior. 2352 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2353 TypeSourceInfo *TInfo, 2354 SourceLocation RParenLoc, 2355 Expr *Init) { 2356 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2357 Init); 2358 } 2359 2360 /// Build a new extended vector element access expression. 2361 /// 2362 /// By default, performs semantic analysis to build the new expression. 2363 /// Subclasses may override this routine to provide different behavior. 2364 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2365 SourceLocation OpLoc, 2366 SourceLocation AccessorLoc, 2367 IdentifierInfo &Accessor) { 2368 2369 CXXScopeSpec SS; 2370 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2371 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2372 OpLoc, /*IsArrow*/ false, 2373 SS, SourceLocation(), 2374 /*FirstQualifierInScope*/ nullptr, 2375 NameInfo, 2376 /* TemplateArgs */ nullptr, 2377 /*S*/ nullptr); 2378 } 2379 2380 /// Build a new initializer list expression. 2381 /// 2382 /// By default, performs semantic analysis to build the new expression. 2383 /// Subclasses may override this routine to provide different behavior. 2384 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2385 MultiExprArg Inits, 2386 SourceLocation RBraceLoc) { 2387 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2388 } 2389 2390 /// Build a new designated initializer expression. 2391 /// 2392 /// By default, performs semantic analysis to build the new expression. 2393 /// Subclasses may override this routine to provide different behavior. 2394 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2395 MultiExprArg ArrayExprs, 2396 SourceLocation EqualOrColonLoc, 2397 bool GNUSyntax, 2398 Expr *Init) { 2399 ExprResult Result 2400 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2401 Init); 2402 if (Result.isInvalid()) 2403 return ExprError(); 2404 2405 return Result; 2406 } 2407 2408 /// Build a new value-initialized expression. 2409 /// 2410 /// By default, builds the implicit value initialization without performing 2411 /// any semantic analysis. Subclasses may override this routine to provide 2412 /// different behavior. 2413 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2414 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2415 } 2416 2417 /// Build a new \c va_arg expression. 2418 /// 2419 /// By default, performs semantic analysis to build the new expression. 2420 /// Subclasses may override this routine to provide different behavior. 2421 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2422 Expr *SubExpr, TypeSourceInfo *TInfo, 2423 SourceLocation RParenLoc) { 2424 return getSema().BuildVAArgExpr(BuiltinLoc, 2425 SubExpr, TInfo, 2426 RParenLoc); 2427 } 2428 2429 /// Build a new expression list in parentheses. 2430 /// 2431 /// By default, performs semantic analysis to build the new expression. 2432 /// Subclasses may override this routine to provide different behavior. 2433 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2434 MultiExprArg SubExprs, 2435 SourceLocation RParenLoc) { 2436 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2437 } 2438 2439 /// Build a new address-of-label expression. 2440 /// 2441 /// By default, performs semantic analysis, using the name of the label 2442 /// rather than attempting to map the label statement itself. 2443 /// Subclasses may override this routine to provide different behavior. 2444 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2445 SourceLocation LabelLoc, LabelDecl *Label) { 2446 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2447 } 2448 2449 /// Build a new GNU statement expression. 2450 /// 2451 /// By default, performs semantic analysis to build the new expression. 2452 /// Subclasses may override this routine to provide different behavior. 2453 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2454 Stmt *SubStmt, 2455 SourceLocation RParenLoc) { 2456 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2457 } 2458 2459 /// Build a new __builtin_choose_expr expression. 2460 /// 2461 /// By default, performs semantic analysis to build the new expression. 2462 /// Subclasses may override this routine to provide different behavior. 2463 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2464 Expr *Cond, Expr *LHS, Expr *RHS, 2465 SourceLocation RParenLoc) { 2466 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2467 Cond, LHS, RHS, 2468 RParenLoc); 2469 } 2470 2471 /// Build a new generic selection expression. 2472 /// 2473 /// By default, performs semantic analysis to build the new expression. 2474 /// Subclasses may override this routine to provide different behavior. 2475 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2476 SourceLocation DefaultLoc, 2477 SourceLocation RParenLoc, 2478 Expr *ControllingExpr, 2479 ArrayRef<TypeSourceInfo *> Types, 2480 ArrayRef<Expr *> Exprs) { 2481 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2482 ControllingExpr, Types, Exprs); 2483 } 2484 2485 /// Build a new overloaded operator call expression. 2486 /// 2487 /// By default, performs semantic analysis to build the new expression. 2488 /// The semantic analysis provides the behavior of template instantiation, 2489 /// copying with transformations that turn what looks like an overloaded 2490 /// operator call into a use of a builtin operator, performing 2491 /// argument-dependent lookup, etc. Subclasses may override this routine to 2492 /// provide different behavior. 2493 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2494 SourceLocation OpLoc, 2495 Expr *Callee, 2496 Expr *First, 2497 Expr *Second); 2498 2499 /// Build a new C++ "named" cast expression, such as static_cast or 2500 /// reinterpret_cast. 2501 /// 2502 /// By default, this routine dispatches to one of the more-specific routines 2503 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2504 /// Subclasses may override this routine to provide different behavior. 2505 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2506 Stmt::StmtClass Class, 2507 SourceLocation LAngleLoc, 2508 TypeSourceInfo *TInfo, 2509 SourceLocation RAngleLoc, 2510 SourceLocation LParenLoc, 2511 Expr *SubExpr, 2512 SourceLocation RParenLoc) { 2513 switch (Class) { 2514 case Stmt::CXXStaticCastExprClass: 2515 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2516 RAngleLoc, LParenLoc, 2517 SubExpr, RParenLoc); 2518 2519 case Stmt::CXXDynamicCastExprClass: 2520 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2521 RAngleLoc, LParenLoc, 2522 SubExpr, RParenLoc); 2523 2524 case Stmt::CXXReinterpretCastExprClass: 2525 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2526 RAngleLoc, LParenLoc, 2527 SubExpr, 2528 RParenLoc); 2529 2530 case Stmt::CXXConstCastExprClass: 2531 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2532 RAngleLoc, LParenLoc, 2533 SubExpr, RParenLoc); 2534 2535 default: 2536 llvm_unreachable("Invalid C++ named cast"); 2537 } 2538 } 2539 2540 /// Build a new C++ static_cast expression. 2541 /// 2542 /// By default, performs semantic analysis to build the new expression. 2543 /// Subclasses may override this routine to provide different behavior. 2544 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2545 SourceLocation LAngleLoc, 2546 TypeSourceInfo *TInfo, 2547 SourceLocation RAngleLoc, 2548 SourceLocation LParenLoc, 2549 Expr *SubExpr, 2550 SourceLocation RParenLoc) { 2551 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2552 TInfo, SubExpr, 2553 SourceRange(LAngleLoc, RAngleLoc), 2554 SourceRange(LParenLoc, RParenLoc)); 2555 } 2556 2557 /// Build a new C++ dynamic_cast expression. 2558 /// 2559 /// By default, performs semantic analysis to build the new expression. 2560 /// Subclasses may override this routine to provide different behavior. 2561 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2562 SourceLocation LAngleLoc, 2563 TypeSourceInfo *TInfo, 2564 SourceLocation RAngleLoc, 2565 SourceLocation LParenLoc, 2566 Expr *SubExpr, 2567 SourceLocation RParenLoc) { 2568 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2569 TInfo, SubExpr, 2570 SourceRange(LAngleLoc, RAngleLoc), 2571 SourceRange(LParenLoc, RParenLoc)); 2572 } 2573 2574 /// Build a new C++ reinterpret_cast expression. 2575 /// 2576 /// By default, performs semantic analysis to build the new expression. 2577 /// Subclasses may override this routine to provide different behavior. 2578 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2579 SourceLocation LAngleLoc, 2580 TypeSourceInfo *TInfo, 2581 SourceLocation RAngleLoc, 2582 SourceLocation LParenLoc, 2583 Expr *SubExpr, 2584 SourceLocation RParenLoc) { 2585 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2586 TInfo, SubExpr, 2587 SourceRange(LAngleLoc, RAngleLoc), 2588 SourceRange(LParenLoc, RParenLoc)); 2589 } 2590 2591 /// Build a new C++ const_cast expression. 2592 /// 2593 /// By default, performs semantic analysis to build the new expression. 2594 /// Subclasses may override this routine to provide different behavior. 2595 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2596 SourceLocation LAngleLoc, 2597 TypeSourceInfo *TInfo, 2598 SourceLocation RAngleLoc, 2599 SourceLocation LParenLoc, 2600 Expr *SubExpr, 2601 SourceLocation RParenLoc) { 2602 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2603 TInfo, SubExpr, 2604 SourceRange(LAngleLoc, RAngleLoc), 2605 SourceRange(LParenLoc, RParenLoc)); 2606 } 2607 2608 /// Build a new C++ functional-style cast expression. 2609 /// 2610 /// By default, performs semantic analysis to build the new expression. 2611 /// Subclasses may override this routine to provide different behavior. 2612 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2613 SourceLocation LParenLoc, 2614 Expr *Sub, 2615 SourceLocation RParenLoc, 2616 bool ListInitialization) { 2617 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2618 MultiExprArg(&Sub, 1), RParenLoc, 2619 ListInitialization); 2620 } 2621 2622 /// Build a new C++ typeid(type) expression. 2623 /// 2624 /// By default, performs semantic analysis to build the new expression. 2625 /// Subclasses may override this routine to provide different behavior. 2626 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2627 SourceLocation TypeidLoc, 2628 TypeSourceInfo *Operand, 2629 SourceLocation RParenLoc) { 2630 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2631 RParenLoc); 2632 } 2633 2634 2635 /// Build a new C++ typeid(expr) expression. 2636 /// 2637 /// By default, performs semantic analysis to build the new expression. 2638 /// Subclasses may override this routine to provide different behavior. 2639 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2640 SourceLocation TypeidLoc, 2641 Expr *Operand, 2642 SourceLocation RParenLoc) { 2643 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2644 RParenLoc); 2645 } 2646 2647 /// Build a new C++ __uuidof(type) expression. 2648 /// 2649 /// By default, performs semantic analysis to build the new expression. 2650 /// Subclasses may override this routine to provide different behavior. 2651 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2652 SourceLocation TypeidLoc, 2653 TypeSourceInfo *Operand, 2654 SourceLocation RParenLoc) { 2655 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2656 RParenLoc); 2657 } 2658 2659 /// Build a new C++ __uuidof(expr) expression. 2660 /// 2661 /// By default, performs semantic analysis to build the new expression. 2662 /// Subclasses may override this routine to provide different behavior. 2663 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2664 SourceLocation TypeidLoc, 2665 Expr *Operand, 2666 SourceLocation RParenLoc) { 2667 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2668 RParenLoc); 2669 } 2670 2671 /// Build a new C++ "this" expression. 2672 /// 2673 /// By default, builds a new "this" expression without performing any 2674 /// semantic analysis. Subclasses may override this routine to provide 2675 /// different behavior. 2676 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2677 QualType ThisType, 2678 bool isImplicit) { 2679 getSema().CheckCXXThisCapture(ThisLoc); 2680 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2681 } 2682 2683 /// Build a new C++ throw expression. 2684 /// 2685 /// By default, performs semantic analysis to build the new expression. 2686 /// Subclasses may override this routine to provide different behavior. 2687 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2688 bool IsThrownVariableInScope) { 2689 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2690 } 2691 2692 /// Build a new C++ default-argument expression. 2693 /// 2694 /// By default, builds a new default-argument expression, which does not 2695 /// require any semantic analysis. Subclasses may override this routine to 2696 /// provide different behavior. 2697 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2698 ParmVarDecl *Param) { 2699 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2700 } 2701 2702 /// Build a new C++11 default-initialization expression. 2703 /// 2704 /// By default, builds a new default field initialization expression, which 2705 /// does not require any semantic analysis. Subclasses may override this 2706 /// routine to provide different behavior. 2707 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2708 FieldDecl *Field) { 2709 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2710 } 2711 2712 /// Build a new C++ zero-initialization expression. 2713 /// 2714 /// By default, performs semantic analysis to build the new expression. 2715 /// Subclasses may override this routine to provide different behavior. 2716 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2717 SourceLocation LParenLoc, 2718 SourceLocation RParenLoc) { 2719 return getSema().BuildCXXTypeConstructExpr( 2720 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2721 } 2722 2723 /// Build a new C++ "new" expression. 2724 /// 2725 /// By default, performs semantic analysis to build the new expression. 2726 /// Subclasses may override this routine to provide different behavior. 2727 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2728 bool UseGlobal, 2729 SourceLocation PlacementLParen, 2730 MultiExprArg PlacementArgs, 2731 SourceLocation PlacementRParen, 2732 SourceRange TypeIdParens, 2733 QualType AllocatedType, 2734 TypeSourceInfo *AllocatedTypeInfo, 2735 Expr *ArraySize, 2736 SourceRange DirectInitRange, 2737 Expr *Initializer) { 2738 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2739 PlacementLParen, 2740 PlacementArgs, 2741 PlacementRParen, 2742 TypeIdParens, 2743 AllocatedType, 2744 AllocatedTypeInfo, 2745 ArraySize, 2746 DirectInitRange, 2747 Initializer); 2748 } 2749 2750 /// Build a new C++ "delete" expression. 2751 /// 2752 /// By default, performs semantic analysis to build the new expression. 2753 /// Subclasses may override this routine to provide different behavior. 2754 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2755 bool IsGlobalDelete, 2756 bool IsArrayForm, 2757 Expr *Operand) { 2758 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2759 Operand); 2760 } 2761 2762 /// Build a new type trait expression. 2763 /// 2764 /// By default, performs semantic analysis to build the new expression. 2765 /// Subclasses may override this routine to provide different behavior. 2766 ExprResult RebuildTypeTrait(TypeTrait Trait, 2767 SourceLocation StartLoc, 2768 ArrayRef<TypeSourceInfo *> Args, 2769 SourceLocation RParenLoc) { 2770 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2771 } 2772 2773 /// Build a new array type trait expression. 2774 /// 2775 /// By default, performs semantic analysis to build the new expression. 2776 /// Subclasses may override this routine to provide different behavior. 2777 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2778 SourceLocation StartLoc, 2779 TypeSourceInfo *TSInfo, 2780 Expr *DimExpr, 2781 SourceLocation RParenLoc) { 2782 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2783 } 2784 2785 /// Build a new expression trait expression. 2786 /// 2787 /// By default, performs semantic analysis to build the new expression. 2788 /// Subclasses may override this routine to provide different behavior. 2789 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2790 SourceLocation StartLoc, 2791 Expr *Queried, 2792 SourceLocation RParenLoc) { 2793 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2794 } 2795 2796 /// Build a new (previously unresolved) declaration reference 2797 /// expression. 2798 /// 2799 /// By default, performs semantic analysis to build the new expression. 2800 /// Subclasses may override this routine to provide different behavior. 2801 ExprResult RebuildDependentScopeDeclRefExpr( 2802 NestedNameSpecifierLoc QualifierLoc, 2803 SourceLocation TemplateKWLoc, 2804 const DeclarationNameInfo &NameInfo, 2805 const TemplateArgumentListInfo *TemplateArgs, 2806 bool IsAddressOfOperand, 2807 TypeSourceInfo **RecoveryTSI) { 2808 CXXScopeSpec SS; 2809 SS.Adopt(QualifierLoc); 2810 2811 if (TemplateArgs || TemplateKWLoc.isValid()) 2812 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2813 TemplateArgs); 2814 2815 return getSema().BuildQualifiedDeclarationNameExpr( 2816 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2817 } 2818 2819 /// Build a new template-id expression. 2820 /// 2821 /// By default, performs semantic analysis to build the new expression. 2822 /// Subclasses may override this routine to provide different behavior. 2823 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2824 SourceLocation TemplateKWLoc, 2825 LookupResult &R, 2826 bool RequiresADL, 2827 const TemplateArgumentListInfo *TemplateArgs) { 2828 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2829 TemplateArgs); 2830 } 2831 2832 /// Build a new object-construction expression. 2833 /// 2834 /// By default, performs semantic analysis to build the new expression. 2835 /// Subclasses may override this routine to provide different behavior. 2836 ExprResult RebuildCXXConstructExpr(QualType T, 2837 SourceLocation Loc, 2838 CXXConstructorDecl *Constructor, 2839 bool IsElidable, 2840 MultiExprArg Args, 2841 bool HadMultipleCandidates, 2842 bool ListInitialization, 2843 bool StdInitListInitialization, 2844 bool RequiresZeroInit, 2845 CXXConstructExpr::ConstructionKind ConstructKind, 2846 SourceRange ParenRange) { 2847 SmallVector<Expr*, 8> ConvertedArgs; 2848 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2849 ConvertedArgs)) 2850 return ExprError(); 2851 2852 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2853 IsElidable, 2854 ConvertedArgs, 2855 HadMultipleCandidates, 2856 ListInitialization, 2857 StdInitListInitialization, 2858 RequiresZeroInit, ConstructKind, 2859 ParenRange); 2860 } 2861 2862 /// Build a new implicit construction via inherited constructor 2863 /// expression. 2864 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2865 CXXConstructorDecl *Constructor, 2866 bool ConstructsVBase, 2867 bool InheritedFromVBase) { 2868 return new (getSema().Context) CXXInheritedCtorInitExpr( 2869 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2870 } 2871 2872 /// Build a new object-construction expression. 2873 /// 2874 /// By default, performs semantic analysis to build the new expression. 2875 /// Subclasses may override this routine to provide different behavior. 2876 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2877 SourceLocation LParenOrBraceLoc, 2878 MultiExprArg Args, 2879 SourceLocation RParenOrBraceLoc, 2880 bool ListInitialization) { 2881 return getSema().BuildCXXTypeConstructExpr( 2882 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2883 } 2884 2885 /// Build a new object-construction expression. 2886 /// 2887 /// By default, performs semantic analysis to build the new expression. 2888 /// Subclasses may override this routine to provide different behavior. 2889 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2890 SourceLocation LParenLoc, 2891 MultiExprArg Args, 2892 SourceLocation RParenLoc, 2893 bool ListInitialization) { 2894 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2895 RParenLoc, ListInitialization); 2896 } 2897 2898 /// Build a new member reference expression. 2899 /// 2900 /// By default, performs semantic analysis to build the new expression. 2901 /// Subclasses may override this routine to provide different behavior. 2902 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2903 QualType BaseType, 2904 bool IsArrow, 2905 SourceLocation OperatorLoc, 2906 NestedNameSpecifierLoc QualifierLoc, 2907 SourceLocation TemplateKWLoc, 2908 NamedDecl *FirstQualifierInScope, 2909 const DeclarationNameInfo &MemberNameInfo, 2910 const TemplateArgumentListInfo *TemplateArgs) { 2911 CXXScopeSpec SS; 2912 SS.Adopt(QualifierLoc); 2913 2914 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2915 OperatorLoc, IsArrow, 2916 SS, TemplateKWLoc, 2917 FirstQualifierInScope, 2918 MemberNameInfo, 2919 TemplateArgs, /*S*/nullptr); 2920 } 2921 2922 /// Build a new member reference expression. 2923 /// 2924 /// By default, performs semantic analysis to build the new expression. 2925 /// Subclasses may override this routine to provide different behavior. 2926 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2927 SourceLocation OperatorLoc, 2928 bool IsArrow, 2929 NestedNameSpecifierLoc QualifierLoc, 2930 SourceLocation TemplateKWLoc, 2931 NamedDecl *FirstQualifierInScope, 2932 LookupResult &R, 2933 const TemplateArgumentListInfo *TemplateArgs) { 2934 CXXScopeSpec SS; 2935 SS.Adopt(QualifierLoc); 2936 2937 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2938 OperatorLoc, IsArrow, 2939 SS, TemplateKWLoc, 2940 FirstQualifierInScope, 2941 R, TemplateArgs, /*S*/nullptr); 2942 } 2943 2944 /// Build a new noexcept expression. 2945 /// 2946 /// By default, performs semantic analysis to build the new expression. 2947 /// Subclasses may override this routine to provide different behavior. 2948 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2949 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2950 } 2951 2952 /// Build a new expression to compute the length of a parameter pack. 2953 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2954 NamedDecl *Pack, 2955 SourceLocation PackLoc, 2956 SourceLocation RParenLoc, 2957 Optional<unsigned> Length, 2958 ArrayRef<TemplateArgument> PartialArgs) { 2959 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2960 RParenLoc, Length, PartialArgs); 2961 } 2962 2963 /// Build a new Objective-C boxed expression. 2964 /// 2965 /// By default, performs semantic analysis to build the new expression. 2966 /// Subclasses may override this routine to provide different behavior. 2967 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2968 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2969 } 2970 2971 /// Build a new Objective-C array literal. 2972 /// 2973 /// By default, performs semantic analysis to build the new expression. 2974 /// Subclasses may override this routine to provide different behavior. 2975 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2976 Expr **Elements, unsigned NumElements) { 2977 return getSema().BuildObjCArrayLiteral(Range, 2978 MultiExprArg(Elements, NumElements)); 2979 } 2980 2981 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2982 Expr *Base, Expr *Key, 2983 ObjCMethodDecl *getterMethod, 2984 ObjCMethodDecl *setterMethod) { 2985 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2986 getterMethod, setterMethod); 2987 } 2988 2989 /// Build a new Objective-C dictionary literal. 2990 /// 2991 /// By default, performs semantic analysis to build the new expression. 2992 /// Subclasses may override this routine to provide different behavior. 2993 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2994 MutableArrayRef<ObjCDictionaryElement> Elements) { 2995 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2996 } 2997 2998 /// Build a new Objective-C \@encode expression. 2999 /// 3000 /// By default, performs semantic analysis to build the new expression. 3001 /// Subclasses may override this routine to provide different behavior. 3002 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3003 TypeSourceInfo *EncodeTypeInfo, 3004 SourceLocation RParenLoc) { 3005 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3006 } 3007 3008 /// Build a new Objective-C class message. 3009 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3010 Selector Sel, 3011 ArrayRef<SourceLocation> SelectorLocs, 3012 ObjCMethodDecl *Method, 3013 SourceLocation LBracLoc, 3014 MultiExprArg Args, 3015 SourceLocation RBracLoc) { 3016 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3017 ReceiverTypeInfo->getType(), 3018 /*SuperLoc=*/SourceLocation(), 3019 Sel, Method, LBracLoc, SelectorLocs, 3020 RBracLoc, Args); 3021 } 3022 3023 /// Build a new Objective-C instance message. 3024 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3025 Selector Sel, 3026 ArrayRef<SourceLocation> SelectorLocs, 3027 ObjCMethodDecl *Method, 3028 SourceLocation LBracLoc, 3029 MultiExprArg Args, 3030 SourceLocation RBracLoc) { 3031 return SemaRef.BuildInstanceMessage(Receiver, 3032 Receiver->getType(), 3033 /*SuperLoc=*/SourceLocation(), 3034 Sel, Method, LBracLoc, SelectorLocs, 3035 RBracLoc, Args); 3036 } 3037 3038 /// Build a new Objective-C instance/class message to 'super'. 3039 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3040 Selector Sel, 3041 ArrayRef<SourceLocation> SelectorLocs, 3042 QualType SuperType, 3043 ObjCMethodDecl *Method, 3044 SourceLocation LBracLoc, 3045 MultiExprArg Args, 3046 SourceLocation RBracLoc) { 3047 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3048 SuperType, 3049 SuperLoc, 3050 Sel, Method, LBracLoc, SelectorLocs, 3051 RBracLoc, Args) 3052 : SemaRef.BuildClassMessage(nullptr, 3053 SuperType, 3054 SuperLoc, 3055 Sel, Method, LBracLoc, SelectorLocs, 3056 RBracLoc, Args); 3057 3058 3059 } 3060 3061 /// Build a new Objective-C ivar reference expression. 3062 /// 3063 /// By default, performs semantic analysis to build the new expression. 3064 /// Subclasses may override this routine to provide different behavior. 3065 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3066 SourceLocation IvarLoc, 3067 bool IsArrow, bool IsFreeIvar) { 3068 CXXScopeSpec SS; 3069 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3070 ExprResult Result = getSema().BuildMemberReferenceExpr( 3071 BaseArg, BaseArg->getType(), 3072 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3073 /*FirstQualifierInScope=*/nullptr, NameInfo, 3074 /*TemplateArgs=*/nullptr, 3075 /*S=*/nullptr); 3076 if (IsFreeIvar && Result.isUsable()) 3077 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3078 return Result; 3079 } 3080 3081 /// Build a new Objective-C property reference expression. 3082 /// 3083 /// By default, performs semantic analysis to build the new expression. 3084 /// Subclasses may override this routine to provide different behavior. 3085 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3086 ObjCPropertyDecl *Property, 3087 SourceLocation PropertyLoc) { 3088 CXXScopeSpec SS; 3089 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3090 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3091 /*FIXME:*/PropertyLoc, 3092 /*IsArrow=*/false, 3093 SS, SourceLocation(), 3094 /*FirstQualifierInScope=*/nullptr, 3095 NameInfo, 3096 /*TemplateArgs=*/nullptr, 3097 /*S=*/nullptr); 3098 } 3099 3100 /// Build a new Objective-C property reference expression. 3101 /// 3102 /// By default, performs semantic analysis to build the new expression. 3103 /// Subclasses may override this routine to provide different behavior. 3104 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3105 ObjCMethodDecl *Getter, 3106 ObjCMethodDecl *Setter, 3107 SourceLocation PropertyLoc) { 3108 // Since these expressions can only be value-dependent, we do not 3109 // need to perform semantic analysis again. 3110 return Owned( 3111 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3112 VK_LValue, OK_ObjCProperty, 3113 PropertyLoc, Base)); 3114 } 3115 3116 /// Build a new Objective-C "isa" expression. 3117 /// 3118 /// By default, performs semantic analysis to build the new expression. 3119 /// Subclasses may override this routine to provide different behavior. 3120 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3121 SourceLocation OpLoc, bool IsArrow) { 3122 CXXScopeSpec SS; 3123 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3124 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3125 OpLoc, IsArrow, 3126 SS, SourceLocation(), 3127 /*FirstQualifierInScope=*/nullptr, 3128 NameInfo, 3129 /*TemplateArgs=*/nullptr, 3130 /*S=*/nullptr); 3131 } 3132 3133 /// Build a new shuffle vector expression. 3134 /// 3135 /// By default, performs semantic analysis to build the new expression. 3136 /// Subclasses may override this routine to provide different behavior. 3137 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3138 MultiExprArg SubExprs, 3139 SourceLocation RParenLoc) { 3140 // Find the declaration for __builtin_shufflevector 3141 const IdentifierInfo &Name 3142 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3143 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3144 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3145 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3146 3147 // Build a reference to the __builtin_shufflevector builtin 3148 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3149 Expr *Callee = new (SemaRef.Context) 3150 DeclRefExpr(SemaRef.Context, Builtin, false, 3151 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3152 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3153 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3154 CK_BuiltinFnToFnPtr).get(); 3155 3156 // Build the CallExpr 3157 ExprResult TheCall = CallExpr::Create( 3158 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3159 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3160 3161 // Type-check the __builtin_shufflevector expression. 3162 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3163 } 3164 3165 /// Build a new convert vector expression. 3166 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3167 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3168 SourceLocation RParenLoc) { 3169 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3170 BuiltinLoc, RParenLoc); 3171 } 3172 3173 /// Build a new template argument pack expansion. 3174 /// 3175 /// By default, performs semantic analysis to build a new pack expansion 3176 /// for a template argument. Subclasses may override this routine to provide 3177 /// different behavior. 3178 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3179 SourceLocation EllipsisLoc, 3180 Optional<unsigned> NumExpansions) { 3181 switch (Pattern.getArgument().getKind()) { 3182 case TemplateArgument::Expression: { 3183 ExprResult Result 3184 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3185 EllipsisLoc, NumExpansions); 3186 if (Result.isInvalid()) 3187 return TemplateArgumentLoc(); 3188 3189 return TemplateArgumentLoc(Result.get(), Result.get()); 3190 } 3191 3192 case TemplateArgument::Template: 3193 return TemplateArgumentLoc(TemplateArgument( 3194 Pattern.getArgument().getAsTemplate(), 3195 NumExpansions), 3196 Pattern.getTemplateQualifierLoc(), 3197 Pattern.getTemplateNameLoc(), 3198 EllipsisLoc); 3199 3200 case TemplateArgument::Null: 3201 case TemplateArgument::Integral: 3202 case TemplateArgument::Declaration: 3203 case TemplateArgument::Pack: 3204 case TemplateArgument::TemplateExpansion: 3205 case TemplateArgument::NullPtr: 3206 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3207 3208 case TemplateArgument::Type: 3209 if (TypeSourceInfo *Expansion 3210 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3211 EllipsisLoc, 3212 NumExpansions)) 3213 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3214 Expansion); 3215 break; 3216 } 3217 3218 return TemplateArgumentLoc(); 3219 } 3220 3221 /// Build a new expression pack expansion. 3222 /// 3223 /// By default, performs semantic analysis to build a new pack expansion 3224 /// for an expression. Subclasses may override this routine to provide 3225 /// different behavior. 3226 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3227 Optional<unsigned> NumExpansions) { 3228 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3229 } 3230 3231 /// Build a new C++1z fold-expression. 3232 /// 3233 /// By default, performs semantic analysis in order to build a new fold 3234 /// expression. 3235 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3236 BinaryOperatorKind Operator, 3237 SourceLocation EllipsisLoc, Expr *RHS, 3238 SourceLocation RParenLoc) { 3239 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3240 RHS, RParenLoc); 3241 } 3242 3243 /// Build an empty C++1z fold-expression with the given operator. 3244 /// 3245 /// By default, produces the fallback value for the fold-expression, or 3246 /// produce an error if there is no fallback value. 3247 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3248 BinaryOperatorKind Operator) { 3249 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3250 } 3251 3252 /// Build a new atomic operation expression. 3253 /// 3254 /// By default, performs semantic analysis to build the new expression. 3255 /// Subclasses may override this routine to provide different behavior. 3256 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3257 MultiExprArg SubExprs, 3258 QualType RetTy, 3259 AtomicExpr::AtomicOp Op, 3260 SourceLocation RParenLoc) { 3261 // Just create the expression; there is not any interesting semantic 3262 // analysis here because we can't actually build an AtomicExpr until 3263 // we are sure it is semantically sound. 3264 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3265 RParenLoc); 3266 } 3267 3268 private: 3269 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3270 QualType ObjectType, 3271 NamedDecl *FirstQualifierInScope, 3272 CXXScopeSpec &SS); 3273 3274 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3275 QualType ObjectType, 3276 NamedDecl *FirstQualifierInScope, 3277 CXXScopeSpec &SS); 3278 3279 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3280 NamedDecl *FirstQualifierInScope, 3281 CXXScopeSpec &SS); 3282 3283 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3284 DependentNameTypeLoc TL, 3285 bool DeducibleTSTContext); 3286 }; 3287 3288 template <typename Derived> 3289 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3290 if (!S) 3291 return S; 3292 3293 switch (S->getStmtClass()) { 3294 case Stmt::NoStmtClass: break; 3295 3296 // Transform individual statement nodes 3297 // Pass SDK into statements that can produce a value 3298 #define STMT(Node, Parent) \ 3299 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3300 #define VALUESTMT(Node, Parent) \ 3301 case Stmt::Node##Class: \ 3302 return getDerived().Transform##Node(cast<Node>(S), SDK); 3303 #define ABSTRACT_STMT(Node) 3304 #define EXPR(Node, Parent) 3305 #include "clang/AST/StmtNodes.inc" 3306 3307 // Transform expressions by calling TransformExpr. 3308 #define STMT(Node, Parent) 3309 #define ABSTRACT_STMT(Stmt) 3310 #define EXPR(Node, Parent) case Stmt::Node##Class: 3311 #include "clang/AST/StmtNodes.inc" 3312 { 3313 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3314 3315 if (SDK == SDK_StmtExprResult) 3316 E = getSema().ActOnStmtExprResult(E); 3317 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3318 } 3319 } 3320 3321 return S; 3322 } 3323 3324 template<typename Derived> 3325 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3326 if (!S) 3327 return S; 3328 3329 switch (S->getClauseKind()) { 3330 default: break; 3331 // Transform individual clause nodes 3332 #define OPENMP_CLAUSE(Name, Class) \ 3333 case OMPC_ ## Name : \ 3334 return getDerived().Transform ## Class(cast<Class>(S)); 3335 #include "clang/Basic/OpenMPKinds.def" 3336 } 3337 3338 return S; 3339 } 3340 3341 3342 template<typename Derived> 3343 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3344 if (!E) 3345 return E; 3346 3347 switch (E->getStmtClass()) { 3348 case Stmt::NoStmtClass: break; 3349 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3350 #define ABSTRACT_STMT(Stmt) 3351 #define EXPR(Node, Parent) \ 3352 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3353 #include "clang/AST/StmtNodes.inc" 3354 } 3355 3356 return E; 3357 } 3358 3359 template<typename Derived> 3360 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3361 bool NotCopyInit) { 3362 // Initializers are instantiated like expressions, except that various outer 3363 // layers are stripped. 3364 if (!Init) 3365 return Init; 3366 3367 if (auto *FE = dyn_cast<FullExpr>(Init)) 3368 Init = FE->getSubExpr(); 3369 3370 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3371 Init = AIL->getCommonExpr(); 3372 3373 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3374 Init = MTE->GetTemporaryExpr(); 3375 3376 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3377 Init = Binder->getSubExpr(); 3378 3379 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3380 Init = ICE->getSubExprAsWritten(); 3381 3382 if (CXXStdInitializerListExpr *ILE = 3383 dyn_cast<CXXStdInitializerListExpr>(Init)) 3384 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3385 3386 // If this is copy-initialization, we only need to reconstruct 3387 // InitListExprs. Other forms of copy-initialization will be a no-op if 3388 // the initializer is already the right type. 3389 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3390 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3391 return getDerived().TransformExpr(Init); 3392 3393 // Revert value-initialization back to empty parens. 3394 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3395 SourceRange Parens = VIE->getSourceRange(); 3396 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3397 Parens.getEnd()); 3398 } 3399 3400 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3401 if (isa<ImplicitValueInitExpr>(Init)) 3402 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3403 SourceLocation()); 3404 3405 // Revert initialization by constructor back to a parenthesized or braced list 3406 // of expressions. Any other form of initializer can just be reused directly. 3407 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3408 return getDerived().TransformExpr(Init); 3409 3410 // If the initialization implicitly converted an initializer list to a 3411 // std::initializer_list object, unwrap the std::initializer_list too. 3412 if (Construct && Construct->isStdInitListInitialization()) 3413 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3414 3415 // Enter a list-init context if this was list initialization. 3416 EnterExpressionEvaluationContext Context( 3417 getSema(), EnterExpressionEvaluationContext::InitList, 3418 Construct->isListInitialization()); 3419 3420 SmallVector<Expr*, 8> NewArgs; 3421 bool ArgChanged = false; 3422 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3423 /*IsCall*/true, NewArgs, &ArgChanged)) 3424 return ExprError(); 3425 3426 // If this was list initialization, revert to syntactic list form. 3427 if (Construct->isListInitialization()) 3428 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3429 Construct->getEndLoc()); 3430 3431 // Build a ParenListExpr to represent anything else. 3432 SourceRange Parens = Construct->getParenOrBraceRange(); 3433 if (Parens.isInvalid()) { 3434 // This was a variable declaration's initialization for which no initializer 3435 // was specified. 3436 assert(NewArgs.empty() && 3437 "no parens or braces but have direct init with arguments?"); 3438 return ExprEmpty(); 3439 } 3440 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3441 Parens.getEnd()); 3442 } 3443 3444 template<typename Derived> 3445 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3446 unsigned NumInputs, 3447 bool IsCall, 3448 SmallVectorImpl<Expr *> &Outputs, 3449 bool *ArgChanged) { 3450 for (unsigned I = 0; I != NumInputs; ++I) { 3451 // If requested, drop call arguments that need to be dropped. 3452 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3453 if (ArgChanged) 3454 *ArgChanged = true; 3455 3456 break; 3457 } 3458 3459 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3460 Expr *Pattern = Expansion->getPattern(); 3461 3462 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3463 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3464 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3465 3466 // Determine whether the set of unexpanded parameter packs can and should 3467 // be expanded. 3468 bool Expand = true; 3469 bool RetainExpansion = false; 3470 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3471 Optional<unsigned> NumExpansions = OrigNumExpansions; 3472 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3473 Pattern->getSourceRange(), 3474 Unexpanded, 3475 Expand, RetainExpansion, 3476 NumExpansions)) 3477 return true; 3478 3479 if (!Expand) { 3480 // The transform has determined that we should perform a simple 3481 // transformation on the pack expansion, producing another pack 3482 // expansion. 3483 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3484 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3485 if (OutPattern.isInvalid()) 3486 return true; 3487 3488 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3489 Expansion->getEllipsisLoc(), 3490 NumExpansions); 3491 if (Out.isInvalid()) 3492 return true; 3493 3494 if (ArgChanged) 3495 *ArgChanged = true; 3496 Outputs.push_back(Out.get()); 3497 continue; 3498 } 3499 3500 // Record right away that the argument was changed. This needs 3501 // to happen even if the array expands to nothing. 3502 if (ArgChanged) *ArgChanged = true; 3503 3504 // The transform has determined that we should perform an elementwise 3505 // expansion of the pattern. Do so. 3506 for (unsigned I = 0; I != *NumExpansions; ++I) { 3507 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3508 ExprResult Out = getDerived().TransformExpr(Pattern); 3509 if (Out.isInvalid()) 3510 return true; 3511 3512 if (Out.get()->containsUnexpandedParameterPack()) { 3513 Out = getDerived().RebuildPackExpansion( 3514 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3515 if (Out.isInvalid()) 3516 return true; 3517 } 3518 3519 Outputs.push_back(Out.get()); 3520 } 3521 3522 // If we're supposed to retain a pack expansion, do so by temporarily 3523 // forgetting the partially-substituted parameter pack. 3524 if (RetainExpansion) { 3525 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3526 3527 ExprResult Out = getDerived().TransformExpr(Pattern); 3528 if (Out.isInvalid()) 3529 return true; 3530 3531 Out = getDerived().RebuildPackExpansion( 3532 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3533 if (Out.isInvalid()) 3534 return true; 3535 3536 Outputs.push_back(Out.get()); 3537 } 3538 3539 continue; 3540 } 3541 3542 ExprResult Result = 3543 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3544 : getDerived().TransformExpr(Inputs[I]); 3545 if (Result.isInvalid()) 3546 return true; 3547 3548 if (Result.get() != Inputs[I] && ArgChanged) 3549 *ArgChanged = true; 3550 3551 Outputs.push_back(Result.get()); 3552 } 3553 3554 return false; 3555 } 3556 3557 template <typename Derived> 3558 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3559 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3560 if (Var) { 3561 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3562 getDerived().TransformDefinition(Var->getLocation(), Var)); 3563 3564 if (!ConditionVar) 3565 return Sema::ConditionError(); 3566 3567 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3568 } 3569 3570 if (Expr) { 3571 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3572 3573 if (CondExpr.isInvalid()) 3574 return Sema::ConditionError(); 3575 3576 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3577 } 3578 3579 return Sema::ConditionResult(); 3580 } 3581 3582 template<typename Derived> 3583 NestedNameSpecifierLoc 3584 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3585 NestedNameSpecifierLoc NNS, 3586 QualType ObjectType, 3587 NamedDecl *FirstQualifierInScope) { 3588 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3589 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3590 Qualifier = Qualifier.getPrefix()) 3591 Qualifiers.push_back(Qualifier); 3592 3593 CXXScopeSpec SS; 3594 while (!Qualifiers.empty()) { 3595 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3596 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3597 3598 switch (QNNS->getKind()) { 3599 case NestedNameSpecifier::Identifier: { 3600 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3601 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3602 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3603 SS, FirstQualifierInScope, false)) 3604 return NestedNameSpecifierLoc(); 3605 } 3606 break; 3607 3608 case NestedNameSpecifier::Namespace: { 3609 NamespaceDecl *NS 3610 = cast_or_null<NamespaceDecl>( 3611 getDerived().TransformDecl( 3612 Q.getLocalBeginLoc(), 3613 QNNS->getAsNamespace())); 3614 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3615 break; 3616 } 3617 3618 case NestedNameSpecifier::NamespaceAlias: { 3619 NamespaceAliasDecl *Alias 3620 = cast_or_null<NamespaceAliasDecl>( 3621 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3622 QNNS->getAsNamespaceAlias())); 3623 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3624 Q.getLocalEndLoc()); 3625 break; 3626 } 3627 3628 case NestedNameSpecifier::Global: 3629 // There is no meaningful transformation that one could perform on the 3630 // global scope. 3631 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3632 break; 3633 3634 case NestedNameSpecifier::Super: { 3635 CXXRecordDecl *RD = 3636 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3637 SourceLocation(), QNNS->getAsRecordDecl())); 3638 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3639 break; 3640 } 3641 3642 case NestedNameSpecifier::TypeSpecWithTemplate: 3643 case NestedNameSpecifier::TypeSpec: { 3644 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3645 FirstQualifierInScope, SS); 3646 3647 if (!TL) 3648 return NestedNameSpecifierLoc(); 3649 3650 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3651 (SemaRef.getLangOpts().CPlusPlus11 && 3652 TL.getType()->isEnumeralType())) { 3653 assert(!TL.getType().hasLocalQualifiers() && 3654 "Can't get cv-qualifiers here"); 3655 if (TL.getType()->isEnumeralType()) 3656 SemaRef.Diag(TL.getBeginLoc(), 3657 diag::warn_cxx98_compat_enum_nested_name_spec); 3658 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3659 Q.getLocalEndLoc()); 3660 break; 3661 } 3662 // If the nested-name-specifier is an invalid type def, don't emit an 3663 // error because a previous error should have already been emitted. 3664 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3665 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3666 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3667 << TL.getType() << SS.getRange(); 3668 } 3669 return NestedNameSpecifierLoc(); 3670 } 3671 } 3672 3673 // The qualifier-in-scope and object type only apply to the leftmost entity. 3674 FirstQualifierInScope = nullptr; 3675 ObjectType = QualType(); 3676 } 3677 3678 // Don't rebuild the nested-name-specifier if we don't have to. 3679 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3680 !getDerived().AlwaysRebuild()) 3681 return NNS; 3682 3683 // If we can re-use the source-location data from the original 3684 // nested-name-specifier, do so. 3685 if (SS.location_size() == NNS.getDataLength() && 3686 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3687 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3688 3689 // Allocate new nested-name-specifier location information. 3690 return SS.getWithLocInContext(SemaRef.Context); 3691 } 3692 3693 template<typename Derived> 3694 DeclarationNameInfo 3695 TreeTransform<Derived> 3696 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3697 DeclarationName Name = NameInfo.getName(); 3698 if (!Name) 3699 return DeclarationNameInfo(); 3700 3701 switch (Name.getNameKind()) { 3702 case DeclarationName::Identifier: 3703 case DeclarationName::ObjCZeroArgSelector: 3704 case DeclarationName::ObjCOneArgSelector: 3705 case DeclarationName::ObjCMultiArgSelector: 3706 case DeclarationName::CXXOperatorName: 3707 case DeclarationName::CXXLiteralOperatorName: 3708 case DeclarationName::CXXUsingDirective: 3709 return NameInfo; 3710 3711 case DeclarationName::CXXDeductionGuideName: { 3712 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3713 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3714 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3715 if (!NewTemplate) 3716 return DeclarationNameInfo(); 3717 3718 DeclarationNameInfo NewNameInfo(NameInfo); 3719 NewNameInfo.setName( 3720 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3721 return NewNameInfo; 3722 } 3723 3724 case DeclarationName::CXXConstructorName: 3725 case DeclarationName::CXXDestructorName: 3726 case DeclarationName::CXXConversionFunctionName: { 3727 TypeSourceInfo *NewTInfo; 3728 CanQualType NewCanTy; 3729 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3730 NewTInfo = getDerived().TransformType(OldTInfo); 3731 if (!NewTInfo) 3732 return DeclarationNameInfo(); 3733 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3734 } 3735 else { 3736 NewTInfo = nullptr; 3737 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3738 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3739 if (NewT.isNull()) 3740 return DeclarationNameInfo(); 3741 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3742 } 3743 3744 DeclarationName NewName 3745 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3746 NewCanTy); 3747 DeclarationNameInfo NewNameInfo(NameInfo); 3748 NewNameInfo.setName(NewName); 3749 NewNameInfo.setNamedTypeInfo(NewTInfo); 3750 return NewNameInfo; 3751 } 3752 } 3753 3754 llvm_unreachable("Unknown name kind."); 3755 } 3756 3757 template<typename Derived> 3758 TemplateName 3759 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3760 TemplateName Name, 3761 SourceLocation NameLoc, 3762 QualType ObjectType, 3763 NamedDecl *FirstQualifierInScope, 3764 bool AllowInjectedClassName) { 3765 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3766 TemplateDecl *Template = QTN->getTemplateDecl(); 3767 assert(Template && "qualified template name must refer to a template"); 3768 3769 TemplateDecl *TransTemplate 3770 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3771 Template)); 3772 if (!TransTemplate) 3773 return TemplateName(); 3774 3775 if (!getDerived().AlwaysRebuild() && 3776 SS.getScopeRep() == QTN->getQualifier() && 3777 TransTemplate == Template) 3778 return Name; 3779 3780 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3781 TransTemplate); 3782 } 3783 3784 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3785 if (SS.getScopeRep()) { 3786 // These apply to the scope specifier, not the template. 3787 ObjectType = QualType(); 3788 FirstQualifierInScope = nullptr; 3789 } 3790 3791 if (!getDerived().AlwaysRebuild() && 3792 SS.getScopeRep() == DTN->getQualifier() && 3793 ObjectType.isNull()) 3794 return Name; 3795 3796 // FIXME: Preserve the location of the "template" keyword. 3797 SourceLocation TemplateKWLoc = NameLoc; 3798 3799 if (DTN->isIdentifier()) { 3800 return getDerived().RebuildTemplateName(SS, 3801 TemplateKWLoc, 3802 *DTN->getIdentifier(), 3803 NameLoc, 3804 ObjectType, 3805 FirstQualifierInScope, 3806 AllowInjectedClassName); 3807 } 3808 3809 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3810 DTN->getOperator(), NameLoc, 3811 ObjectType, AllowInjectedClassName); 3812 } 3813 3814 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3815 TemplateDecl *TransTemplate 3816 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3817 Template)); 3818 if (!TransTemplate) 3819 return TemplateName(); 3820 3821 if (!getDerived().AlwaysRebuild() && 3822 TransTemplate == Template) 3823 return Name; 3824 3825 return TemplateName(TransTemplate); 3826 } 3827 3828 if (SubstTemplateTemplateParmPackStorage *SubstPack 3829 = Name.getAsSubstTemplateTemplateParmPack()) { 3830 TemplateTemplateParmDecl *TransParam 3831 = cast_or_null<TemplateTemplateParmDecl>( 3832 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3833 if (!TransParam) 3834 return TemplateName(); 3835 3836 if (!getDerived().AlwaysRebuild() && 3837 TransParam == SubstPack->getParameterPack()) 3838 return Name; 3839 3840 return getDerived().RebuildTemplateName(TransParam, 3841 SubstPack->getArgumentPack()); 3842 } 3843 3844 // These should be getting filtered out before they reach the AST. 3845 llvm_unreachable("overloaded function decl survived to here"); 3846 } 3847 3848 template<typename Derived> 3849 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3850 const TemplateArgument &Arg, 3851 TemplateArgumentLoc &Output) { 3852 SourceLocation Loc = getDerived().getBaseLocation(); 3853 switch (Arg.getKind()) { 3854 case TemplateArgument::Null: 3855 llvm_unreachable("null template argument in TreeTransform"); 3856 break; 3857 3858 case TemplateArgument::Type: 3859 Output = TemplateArgumentLoc(Arg, 3860 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3861 3862 break; 3863 3864 case TemplateArgument::Template: 3865 case TemplateArgument::TemplateExpansion: { 3866 NestedNameSpecifierLocBuilder Builder; 3867 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3868 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3869 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3870 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3871 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3872 3873 if (Arg.getKind() == TemplateArgument::Template) 3874 Output = TemplateArgumentLoc(Arg, 3875 Builder.getWithLocInContext(SemaRef.Context), 3876 Loc); 3877 else 3878 Output = TemplateArgumentLoc(Arg, 3879 Builder.getWithLocInContext(SemaRef.Context), 3880 Loc, Loc); 3881 3882 break; 3883 } 3884 3885 case TemplateArgument::Expression: 3886 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3887 break; 3888 3889 case TemplateArgument::Declaration: 3890 case TemplateArgument::Integral: 3891 case TemplateArgument::Pack: 3892 case TemplateArgument::NullPtr: 3893 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3894 break; 3895 } 3896 } 3897 3898 template<typename Derived> 3899 bool TreeTransform<Derived>::TransformTemplateArgument( 3900 const TemplateArgumentLoc &Input, 3901 TemplateArgumentLoc &Output, bool Uneval) { 3902 EnterExpressionEvaluationContext EEEC( 3903 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated, 3904 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 3905 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 3906 const TemplateArgument &Arg = Input.getArgument(); 3907 switch (Arg.getKind()) { 3908 case TemplateArgument::Null: 3909 case TemplateArgument::Integral: 3910 case TemplateArgument::Pack: 3911 case TemplateArgument::Declaration: 3912 case TemplateArgument::NullPtr: 3913 llvm_unreachable("Unexpected TemplateArgument"); 3914 3915 case TemplateArgument::Type: { 3916 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3917 if (!DI) 3918 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3919 3920 DI = getDerived().TransformType(DI); 3921 if (!DI) return true; 3922 3923 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3924 return false; 3925 } 3926 3927 case TemplateArgument::Template: { 3928 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3929 if (QualifierLoc) { 3930 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3931 if (!QualifierLoc) 3932 return true; 3933 } 3934 3935 CXXScopeSpec SS; 3936 SS.Adopt(QualifierLoc); 3937 TemplateName Template 3938 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3939 Input.getTemplateNameLoc()); 3940 if (Template.isNull()) 3941 return true; 3942 3943 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3944 Input.getTemplateNameLoc()); 3945 return false; 3946 } 3947 3948 case TemplateArgument::TemplateExpansion: 3949 llvm_unreachable("Caller should expand pack expansions"); 3950 3951 case TemplateArgument::Expression: { 3952 // Template argument expressions are constant expressions. 3953 EnterExpressionEvaluationContext Unevaluated( 3954 getSema(), Uneval 3955 ? Sema::ExpressionEvaluationContext::Unevaluated 3956 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3957 3958 Expr *InputExpr = Input.getSourceExpression(); 3959 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3960 3961 ExprResult E = getDerived().TransformExpr(InputExpr); 3962 E = SemaRef.ActOnConstantExpression(E); 3963 if (E.isInvalid()) return true; 3964 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3965 return false; 3966 } 3967 } 3968 3969 // Work around bogus GCC warning 3970 return true; 3971 } 3972 3973 /// Iterator adaptor that invents template argument location information 3974 /// for each of the template arguments in its underlying iterator. 3975 template<typename Derived, typename InputIterator> 3976 class TemplateArgumentLocInventIterator { 3977 TreeTransform<Derived> &Self; 3978 InputIterator Iter; 3979 3980 public: 3981 typedef TemplateArgumentLoc value_type; 3982 typedef TemplateArgumentLoc reference; 3983 typedef typename std::iterator_traits<InputIterator>::difference_type 3984 difference_type; 3985 typedef std::input_iterator_tag iterator_category; 3986 3987 class pointer { 3988 TemplateArgumentLoc Arg; 3989 3990 public: 3991 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3992 3993 const TemplateArgumentLoc *operator->() const { return &Arg; } 3994 }; 3995 3996 TemplateArgumentLocInventIterator() { } 3997 3998 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3999 InputIterator Iter) 4000 : Self(Self), Iter(Iter) { } 4001 4002 TemplateArgumentLocInventIterator &operator++() { 4003 ++Iter; 4004 return *this; 4005 } 4006 4007 TemplateArgumentLocInventIterator operator++(int) { 4008 TemplateArgumentLocInventIterator Old(*this); 4009 ++(*this); 4010 return Old; 4011 } 4012 4013 reference operator*() const { 4014 TemplateArgumentLoc Result; 4015 Self.InventTemplateArgumentLoc(*Iter, Result); 4016 return Result; 4017 } 4018 4019 pointer operator->() const { return pointer(**this); } 4020 4021 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4022 const TemplateArgumentLocInventIterator &Y) { 4023 return X.Iter == Y.Iter; 4024 } 4025 4026 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4027 const TemplateArgumentLocInventIterator &Y) { 4028 return X.Iter != Y.Iter; 4029 } 4030 }; 4031 4032 template<typename Derived> 4033 template<typename InputIterator> 4034 bool TreeTransform<Derived>::TransformTemplateArguments( 4035 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4036 bool Uneval) { 4037 for (; First != Last; ++First) { 4038 TemplateArgumentLoc Out; 4039 TemplateArgumentLoc In = *First; 4040 4041 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4042 // Unpack argument packs, which we translate them into separate 4043 // arguments. 4044 // FIXME: We could do much better if we could guarantee that the 4045 // TemplateArgumentLocInfo for the pack expansion would be usable for 4046 // all of the template arguments in the argument pack. 4047 typedef TemplateArgumentLocInventIterator<Derived, 4048 TemplateArgument::pack_iterator> 4049 PackLocIterator; 4050 if (TransformTemplateArguments(PackLocIterator(*this, 4051 In.getArgument().pack_begin()), 4052 PackLocIterator(*this, 4053 In.getArgument().pack_end()), 4054 Outputs, Uneval)) 4055 return true; 4056 4057 continue; 4058 } 4059 4060 if (In.getArgument().isPackExpansion()) { 4061 // We have a pack expansion, for which we will be substituting into 4062 // the pattern. 4063 SourceLocation Ellipsis; 4064 Optional<unsigned> OrigNumExpansions; 4065 TemplateArgumentLoc Pattern 4066 = getSema().getTemplateArgumentPackExpansionPattern( 4067 In, Ellipsis, OrigNumExpansions); 4068 4069 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4070 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4071 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4072 4073 // Determine whether the set of unexpanded parameter packs can and should 4074 // be expanded. 4075 bool Expand = true; 4076 bool RetainExpansion = false; 4077 Optional<unsigned> NumExpansions = OrigNumExpansions; 4078 if (getDerived().TryExpandParameterPacks(Ellipsis, 4079 Pattern.getSourceRange(), 4080 Unexpanded, 4081 Expand, 4082 RetainExpansion, 4083 NumExpansions)) 4084 return true; 4085 4086 if (!Expand) { 4087 // The transform has determined that we should perform a simple 4088 // transformation on the pack expansion, producing another pack 4089 // expansion. 4090 TemplateArgumentLoc OutPattern; 4091 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4092 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4093 return true; 4094 4095 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4096 NumExpansions); 4097 if (Out.getArgument().isNull()) 4098 return true; 4099 4100 Outputs.addArgument(Out); 4101 continue; 4102 } 4103 4104 // The transform has determined that we should perform an elementwise 4105 // expansion of the pattern. Do so. 4106 for (unsigned I = 0; I != *NumExpansions; ++I) { 4107 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4108 4109 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4110 return true; 4111 4112 if (Out.getArgument().containsUnexpandedParameterPack()) { 4113 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4114 OrigNumExpansions); 4115 if (Out.getArgument().isNull()) 4116 return true; 4117 } 4118 4119 Outputs.addArgument(Out); 4120 } 4121 4122 // If we're supposed to retain a pack expansion, do so by temporarily 4123 // forgetting the partially-substituted parameter pack. 4124 if (RetainExpansion) { 4125 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4126 4127 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4128 return true; 4129 4130 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4131 OrigNumExpansions); 4132 if (Out.getArgument().isNull()) 4133 return true; 4134 4135 Outputs.addArgument(Out); 4136 } 4137 4138 continue; 4139 } 4140 4141 // The simple case: 4142 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4143 return true; 4144 4145 Outputs.addArgument(Out); 4146 } 4147 4148 return false; 4149 4150 } 4151 4152 //===----------------------------------------------------------------------===// 4153 // Type transformation 4154 //===----------------------------------------------------------------------===// 4155 4156 template<typename Derived> 4157 QualType TreeTransform<Derived>::TransformType(QualType T) { 4158 if (getDerived().AlreadyTransformed(T)) 4159 return T; 4160 4161 // Temporary workaround. All of these transformations should 4162 // eventually turn into transformations on TypeLocs. 4163 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4164 getDerived().getBaseLocation()); 4165 4166 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4167 4168 if (!NewDI) 4169 return QualType(); 4170 4171 return NewDI->getType(); 4172 } 4173 4174 template<typename Derived> 4175 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4176 // Refine the base location to the type's location. 4177 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4178 getDerived().getBaseEntity()); 4179 if (getDerived().AlreadyTransformed(DI->getType())) 4180 return DI; 4181 4182 TypeLocBuilder TLB; 4183 4184 TypeLoc TL = DI->getTypeLoc(); 4185 TLB.reserve(TL.getFullDataSize()); 4186 4187 QualType Result = getDerived().TransformType(TLB, TL); 4188 if (Result.isNull()) 4189 return nullptr; 4190 4191 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4192 } 4193 4194 template<typename Derived> 4195 QualType 4196 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4197 switch (T.getTypeLocClass()) { 4198 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4199 #define TYPELOC(CLASS, PARENT) \ 4200 case TypeLoc::CLASS: \ 4201 return getDerived().Transform##CLASS##Type(TLB, \ 4202 T.castAs<CLASS##TypeLoc>()); 4203 #include "clang/AST/TypeLocNodes.def" 4204 } 4205 4206 llvm_unreachable("unhandled type loc!"); 4207 } 4208 4209 template<typename Derived> 4210 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4211 if (!isa<DependentNameType>(T)) 4212 return TransformType(T); 4213 4214 if (getDerived().AlreadyTransformed(T)) 4215 return T; 4216 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4217 getDerived().getBaseLocation()); 4218 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4219 return NewDI ? NewDI->getType() : QualType(); 4220 } 4221 4222 template<typename Derived> 4223 TypeSourceInfo * 4224 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4225 if (!isa<DependentNameType>(DI->getType())) 4226 return TransformType(DI); 4227 4228 // Refine the base location to the type's location. 4229 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4230 getDerived().getBaseEntity()); 4231 if (getDerived().AlreadyTransformed(DI->getType())) 4232 return DI; 4233 4234 TypeLocBuilder TLB; 4235 4236 TypeLoc TL = DI->getTypeLoc(); 4237 TLB.reserve(TL.getFullDataSize()); 4238 4239 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4240 if (QTL) 4241 TL = QTL.getUnqualifiedLoc(); 4242 4243 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4244 4245 QualType Result = getDerived().TransformDependentNameType( 4246 TLB, DNTL, /*DeducedTSTContext*/true); 4247 if (Result.isNull()) 4248 return nullptr; 4249 4250 if (QTL) { 4251 Result = getDerived().RebuildQualifiedType(Result, QTL); 4252 if (Result.isNull()) 4253 return nullptr; 4254 TLB.TypeWasModifiedSafely(Result); 4255 } 4256 4257 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4258 } 4259 4260 template<typename Derived> 4261 QualType 4262 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4263 QualifiedTypeLoc T) { 4264 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4265 if (Result.isNull()) 4266 return QualType(); 4267 4268 Result = getDerived().RebuildQualifiedType(Result, T); 4269 4270 if (Result.isNull()) 4271 return QualType(); 4272 4273 // RebuildQualifiedType might have updated the type, but not in a way 4274 // that invalidates the TypeLoc. (There's no location information for 4275 // qualifiers.) 4276 TLB.TypeWasModifiedSafely(Result); 4277 4278 return Result; 4279 } 4280 4281 template <typename Derived> 4282 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4283 QualifiedTypeLoc TL) { 4284 4285 SourceLocation Loc = TL.getBeginLoc(); 4286 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4287 4288 if (((T.getAddressSpace() != LangAS::Default && 4289 Quals.getAddressSpace() != LangAS::Default)) && 4290 T.getAddressSpace() != Quals.getAddressSpace()) { 4291 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4292 << TL.getType() << T; 4293 return QualType(); 4294 } 4295 4296 // C++ [dcl.fct]p7: 4297 // [When] adding cv-qualifications on top of the function type [...] the 4298 // cv-qualifiers are ignored. 4299 if (T->isFunctionType()) { 4300 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4301 Quals.getAddressSpace()); 4302 return T; 4303 } 4304 4305 // C++ [dcl.ref]p1: 4306 // when the cv-qualifiers are introduced through the use of a typedef-name 4307 // or decltype-specifier [...] the cv-qualifiers are ignored. 4308 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4309 // applied to a reference type. 4310 if (T->isReferenceType()) { 4311 // The only qualifier that applies to a reference type is restrict. 4312 if (!Quals.hasRestrict()) 4313 return T; 4314 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4315 } 4316 4317 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4318 // resulting type. 4319 if (Quals.hasObjCLifetime()) { 4320 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4321 Quals.removeObjCLifetime(); 4322 else if (T.getObjCLifetime()) { 4323 // Objective-C ARC: 4324 // A lifetime qualifier applied to a substituted template parameter 4325 // overrides the lifetime qualifier from the template argument. 4326 const AutoType *AutoTy; 4327 if (const SubstTemplateTypeParmType *SubstTypeParam 4328 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4329 QualType Replacement = SubstTypeParam->getReplacementType(); 4330 Qualifiers Qs = Replacement.getQualifiers(); 4331 Qs.removeObjCLifetime(); 4332 Replacement = SemaRef.Context.getQualifiedType( 4333 Replacement.getUnqualifiedType(), Qs); 4334 T = SemaRef.Context.getSubstTemplateTypeParmType( 4335 SubstTypeParam->getReplacedParameter(), Replacement); 4336 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4337 // 'auto' types behave the same way as template parameters. 4338 QualType Deduced = AutoTy->getDeducedType(); 4339 Qualifiers Qs = Deduced.getQualifiers(); 4340 Qs.removeObjCLifetime(); 4341 Deduced = 4342 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4343 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4344 AutoTy->isDependentType()); 4345 } else { 4346 // Otherwise, complain about the addition of a qualifier to an 4347 // already-qualified type. 4348 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4349 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4350 Quals.removeObjCLifetime(); 4351 } 4352 } 4353 } 4354 4355 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4356 } 4357 4358 template<typename Derived> 4359 TypeLoc 4360 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4361 QualType ObjectType, 4362 NamedDecl *UnqualLookup, 4363 CXXScopeSpec &SS) { 4364 if (getDerived().AlreadyTransformed(TL.getType())) 4365 return TL; 4366 4367 TypeSourceInfo *TSI = 4368 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4369 if (TSI) 4370 return TSI->getTypeLoc(); 4371 return TypeLoc(); 4372 } 4373 4374 template<typename Derived> 4375 TypeSourceInfo * 4376 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4377 QualType ObjectType, 4378 NamedDecl *UnqualLookup, 4379 CXXScopeSpec &SS) { 4380 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4381 return TSInfo; 4382 4383 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4384 UnqualLookup, SS); 4385 } 4386 4387 template <typename Derived> 4388 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4389 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4390 CXXScopeSpec &SS) { 4391 QualType T = TL.getType(); 4392 assert(!getDerived().AlreadyTransformed(T)); 4393 4394 TypeLocBuilder TLB; 4395 QualType Result; 4396 4397 if (isa<TemplateSpecializationType>(T)) { 4398 TemplateSpecializationTypeLoc SpecTL = 4399 TL.castAs<TemplateSpecializationTypeLoc>(); 4400 4401 TemplateName Template = getDerived().TransformTemplateName( 4402 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4403 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4404 if (Template.isNull()) 4405 return nullptr; 4406 4407 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4408 Template); 4409 } else if (isa<DependentTemplateSpecializationType>(T)) { 4410 DependentTemplateSpecializationTypeLoc SpecTL = 4411 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4412 4413 TemplateName Template 4414 = getDerived().RebuildTemplateName(SS, 4415 SpecTL.getTemplateKeywordLoc(), 4416 *SpecTL.getTypePtr()->getIdentifier(), 4417 SpecTL.getTemplateNameLoc(), 4418 ObjectType, UnqualLookup, 4419 /*AllowInjectedClassName*/true); 4420 if (Template.isNull()) 4421 return nullptr; 4422 4423 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4424 SpecTL, 4425 Template, 4426 SS); 4427 } else { 4428 // Nothing special needs to be done for these. 4429 Result = getDerived().TransformType(TLB, TL); 4430 } 4431 4432 if (Result.isNull()) 4433 return nullptr; 4434 4435 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4436 } 4437 4438 template <class TyLoc> static inline 4439 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4440 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4441 NewT.setNameLoc(T.getNameLoc()); 4442 return T.getType(); 4443 } 4444 4445 template<typename Derived> 4446 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4447 BuiltinTypeLoc T) { 4448 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4449 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4450 if (T.needsExtraLocalData()) 4451 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4452 return T.getType(); 4453 } 4454 4455 template<typename Derived> 4456 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4457 ComplexTypeLoc T) { 4458 // FIXME: recurse? 4459 return TransformTypeSpecType(TLB, T); 4460 } 4461 4462 template <typename Derived> 4463 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4464 AdjustedTypeLoc TL) { 4465 // Adjustments applied during transformation are handled elsewhere. 4466 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4467 } 4468 4469 template<typename Derived> 4470 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4471 DecayedTypeLoc TL) { 4472 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4473 if (OriginalType.isNull()) 4474 return QualType(); 4475 4476 QualType Result = TL.getType(); 4477 if (getDerived().AlwaysRebuild() || 4478 OriginalType != TL.getOriginalLoc().getType()) 4479 Result = SemaRef.Context.getDecayedType(OriginalType); 4480 TLB.push<DecayedTypeLoc>(Result); 4481 // Nothing to set for DecayedTypeLoc. 4482 return Result; 4483 } 4484 4485 template<typename Derived> 4486 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4487 PointerTypeLoc TL) { 4488 QualType PointeeType 4489 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4490 if (PointeeType.isNull()) 4491 return QualType(); 4492 4493 QualType Result = TL.getType(); 4494 if (PointeeType->getAs<ObjCObjectType>()) { 4495 // A dependent pointer type 'T *' has is being transformed such 4496 // that an Objective-C class type is being replaced for 'T'. The 4497 // resulting pointer type is an ObjCObjectPointerType, not a 4498 // PointerType. 4499 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4500 4501 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4502 NewT.setStarLoc(TL.getStarLoc()); 4503 return Result; 4504 } 4505 4506 if (getDerived().AlwaysRebuild() || 4507 PointeeType != TL.getPointeeLoc().getType()) { 4508 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4509 if (Result.isNull()) 4510 return QualType(); 4511 } 4512 4513 // Objective-C ARC can add lifetime qualifiers to the type that we're 4514 // pointing to. 4515 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4516 4517 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4518 NewT.setSigilLoc(TL.getSigilLoc()); 4519 return Result; 4520 } 4521 4522 template<typename Derived> 4523 QualType 4524 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4525 BlockPointerTypeLoc TL) { 4526 QualType PointeeType 4527 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4528 if (PointeeType.isNull()) 4529 return QualType(); 4530 4531 QualType Result = TL.getType(); 4532 if (getDerived().AlwaysRebuild() || 4533 PointeeType != TL.getPointeeLoc().getType()) { 4534 Result = getDerived().RebuildBlockPointerType(PointeeType, 4535 TL.getSigilLoc()); 4536 if (Result.isNull()) 4537 return QualType(); 4538 } 4539 4540 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4541 NewT.setSigilLoc(TL.getSigilLoc()); 4542 return Result; 4543 } 4544 4545 /// Transforms a reference type. Note that somewhat paradoxically we 4546 /// don't care whether the type itself is an l-value type or an r-value 4547 /// type; we only care if the type was *written* as an l-value type 4548 /// or an r-value type. 4549 template<typename Derived> 4550 QualType 4551 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4552 ReferenceTypeLoc TL) { 4553 const ReferenceType *T = TL.getTypePtr(); 4554 4555 // Note that this works with the pointee-as-written. 4556 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4557 if (PointeeType.isNull()) 4558 return QualType(); 4559 4560 QualType Result = TL.getType(); 4561 if (getDerived().AlwaysRebuild() || 4562 PointeeType != T->getPointeeTypeAsWritten()) { 4563 Result = getDerived().RebuildReferenceType(PointeeType, 4564 T->isSpelledAsLValue(), 4565 TL.getSigilLoc()); 4566 if (Result.isNull()) 4567 return QualType(); 4568 } 4569 4570 // Objective-C ARC can add lifetime qualifiers to the type that we're 4571 // referring to. 4572 TLB.TypeWasModifiedSafely( 4573 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4574 4575 // r-value references can be rebuilt as l-value references. 4576 ReferenceTypeLoc NewTL; 4577 if (isa<LValueReferenceType>(Result)) 4578 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4579 else 4580 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4581 NewTL.setSigilLoc(TL.getSigilLoc()); 4582 4583 return Result; 4584 } 4585 4586 template<typename Derived> 4587 QualType 4588 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4589 LValueReferenceTypeLoc TL) { 4590 return TransformReferenceType(TLB, TL); 4591 } 4592 4593 template<typename Derived> 4594 QualType 4595 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4596 RValueReferenceTypeLoc TL) { 4597 return TransformReferenceType(TLB, TL); 4598 } 4599 4600 template<typename Derived> 4601 QualType 4602 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4603 MemberPointerTypeLoc TL) { 4604 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4605 if (PointeeType.isNull()) 4606 return QualType(); 4607 4608 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4609 TypeSourceInfo *NewClsTInfo = nullptr; 4610 if (OldClsTInfo) { 4611 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4612 if (!NewClsTInfo) 4613 return QualType(); 4614 } 4615 4616 const MemberPointerType *T = TL.getTypePtr(); 4617 QualType OldClsType = QualType(T->getClass(), 0); 4618 QualType NewClsType; 4619 if (NewClsTInfo) 4620 NewClsType = NewClsTInfo->getType(); 4621 else { 4622 NewClsType = getDerived().TransformType(OldClsType); 4623 if (NewClsType.isNull()) 4624 return QualType(); 4625 } 4626 4627 QualType Result = TL.getType(); 4628 if (getDerived().AlwaysRebuild() || 4629 PointeeType != T->getPointeeType() || 4630 NewClsType != OldClsType) { 4631 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4632 TL.getStarLoc()); 4633 if (Result.isNull()) 4634 return QualType(); 4635 } 4636 4637 // If we had to adjust the pointee type when building a member pointer, make 4638 // sure to push TypeLoc info for it. 4639 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4640 if (MPT && PointeeType != MPT->getPointeeType()) { 4641 assert(isa<AdjustedType>(MPT->getPointeeType())); 4642 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4643 } 4644 4645 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4646 NewTL.setSigilLoc(TL.getSigilLoc()); 4647 NewTL.setClassTInfo(NewClsTInfo); 4648 4649 return Result; 4650 } 4651 4652 template<typename Derived> 4653 QualType 4654 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4655 ConstantArrayTypeLoc TL) { 4656 const ConstantArrayType *T = TL.getTypePtr(); 4657 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4658 if (ElementType.isNull()) 4659 return QualType(); 4660 4661 QualType Result = TL.getType(); 4662 if (getDerived().AlwaysRebuild() || 4663 ElementType != T->getElementType()) { 4664 Result = getDerived().RebuildConstantArrayType(ElementType, 4665 T->getSizeModifier(), 4666 T->getSize(), 4667 T->getIndexTypeCVRQualifiers(), 4668 TL.getBracketsRange()); 4669 if (Result.isNull()) 4670 return QualType(); 4671 } 4672 4673 // We might have either a ConstantArrayType or a VariableArrayType now: 4674 // a ConstantArrayType is allowed to have an element type which is a 4675 // VariableArrayType if the type is dependent. Fortunately, all array 4676 // types have the same location layout. 4677 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4678 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4679 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4680 4681 Expr *Size = TL.getSizeExpr(); 4682 if (Size) { 4683 EnterExpressionEvaluationContext Unevaluated( 4684 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4685 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4686 Size = SemaRef.ActOnConstantExpression(Size).get(); 4687 } 4688 NewTL.setSizeExpr(Size); 4689 4690 return Result; 4691 } 4692 4693 template<typename Derived> 4694 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4695 TypeLocBuilder &TLB, 4696 IncompleteArrayTypeLoc TL) { 4697 const IncompleteArrayType *T = TL.getTypePtr(); 4698 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4699 if (ElementType.isNull()) 4700 return QualType(); 4701 4702 QualType Result = TL.getType(); 4703 if (getDerived().AlwaysRebuild() || 4704 ElementType != T->getElementType()) { 4705 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4706 T->getSizeModifier(), 4707 T->getIndexTypeCVRQualifiers(), 4708 TL.getBracketsRange()); 4709 if (Result.isNull()) 4710 return QualType(); 4711 } 4712 4713 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4714 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4715 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4716 NewTL.setSizeExpr(nullptr); 4717 4718 return Result; 4719 } 4720 4721 template<typename Derived> 4722 QualType 4723 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4724 VariableArrayTypeLoc TL) { 4725 const VariableArrayType *T = TL.getTypePtr(); 4726 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4727 if (ElementType.isNull()) 4728 return QualType(); 4729 4730 ExprResult SizeResult; 4731 { 4732 EnterExpressionEvaluationContext Context( 4733 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4734 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4735 } 4736 if (SizeResult.isInvalid()) 4737 return QualType(); 4738 SizeResult = 4739 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 4740 if (SizeResult.isInvalid()) 4741 return QualType(); 4742 4743 Expr *Size = SizeResult.get(); 4744 4745 QualType Result = TL.getType(); 4746 if (getDerived().AlwaysRebuild() || 4747 ElementType != T->getElementType() || 4748 Size != T->getSizeExpr()) { 4749 Result = getDerived().RebuildVariableArrayType(ElementType, 4750 T->getSizeModifier(), 4751 Size, 4752 T->getIndexTypeCVRQualifiers(), 4753 TL.getBracketsRange()); 4754 if (Result.isNull()) 4755 return QualType(); 4756 } 4757 4758 // We might have constant size array now, but fortunately it has the same 4759 // location layout. 4760 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4761 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4762 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4763 NewTL.setSizeExpr(Size); 4764 4765 return Result; 4766 } 4767 4768 template<typename Derived> 4769 QualType 4770 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4771 DependentSizedArrayTypeLoc TL) { 4772 const DependentSizedArrayType *T = TL.getTypePtr(); 4773 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4774 if (ElementType.isNull()) 4775 return QualType(); 4776 4777 // Array bounds are constant expressions. 4778 EnterExpressionEvaluationContext Unevaluated( 4779 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4780 4781 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4782 Expr *origSize = TL.getSizeExpr(); 4783 if (!origSize) origSize = T->getSizeExpr(); 4784 4785 ExprResult sizeResult 4786 = getDerived().TransformExpr(origSize); 4787 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4788 if (sizeResult.isInvalid()) 4789 return QualType(); 4790 4791 Expr *size = sizeResult.get(); 4792 4793 QualType Result = TL.getType(); 4794 if (getDerived().AlwaysRebuild() || 4795 ElementType != T->getElementType() || 4796 size != origSize) { 4797 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4798 T->getSizeModifier(), 4799 size, 4800 T->getIndexTypeCVRQualifiers(), 4801 TL.getBracketsRange()); 4802 if (Result.isNull()) 4803 return QualType(); 4804 } 4805 4806 // We might have any sort of array type now, but fortunately they 4807 // all have the same location layout. 4808 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4809 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4810 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4811 NewTL.setSizeExpr(size); 4812 4813 return Result; 4814 } 4815 4816 template <typename Derived> 4817 QualType TreeTransform<Derived>::TransformDependentVectorType( 4818 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 4819 const DependentVectorType *T = TL.getTypePtr(); 4820 QualType ElementType = getDerived().TransformType(T->getElementType()); 4821 if (ElementType.isNull()) 4822 return QualType(); 4823 4824 EnterExpressionEvaluationContext Unevaluated( 4825 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4826 4827 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4828 Size = SemaRef.ActOnConstantExpression(Size); 4829 if (Size.isInvalid()) 4830 return QualType(); 4831 4832 QualType Result = TL.getType(); 4833 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 4834 Size.get() != T->getSizeExpr()) { 4835 Result = getDerived().RebuildDependentVectorType( 4836 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 4837 if (Result.isNull()) 4838 return QualType(); 4839 } 4840 4841 // Result might be dependent or not. 4842 if (isa<DependentVectorType>(Result)) { 4843 DependentVectorTypeLoc NewTL = 4844 TLB.push<DependentVectorTypeLoc>(Result); 4845 NewTL.setNameLoc(TL.getNameLoc()); 4846 } else { 4847 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4848 NewTL.setNameLoc(TL.getNameLoc()); 4849 } 4850 4851 return Result; 4852 } 4853 4854 template<typename Derived> 4855 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4856 TypeLocBuilder &TLB, 4857 DependentSizedExtVectorTypeLoc TL) { 4858 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4859 4860 // FIXME: ext vector locs should be nested 4861 QualType ElementType = getDerived().TransformType(T->getElementType()); 4862 if (ElementType.isNull()) 4863 return QualType(); 4864 4865 // Vector sizes are constant expressions. 4866 EnterExpressionEvaluationContext Unevaluated( 4867 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4868 4869 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4870 Size = SemaRef.ActOnConstantExpression(Size); 4871 if (Size.isInvalid()) 4872 return QualType(); 4873 4874 QualType Result = TL.getType(); 4875 if (getDerived().AlwaysRebuild() || 4876 ElementType != T->getElementType() || 4877 Size.get() != T->getSizeExpr()) { 4878 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4879 Size.get(), 4880 T->getAttributeLoc()); 4881 if (Result.isNull()) 4882 return QualType(); 4883 } 4884 4885 // Result might be dependent or not. 4886 if (isa<DependentSizedExtVectorType>(Result)) { 4887 DependentSizedExtVectorTypeLoc NewTL 4888 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4889 NewTL.setNameLoc(TL.getNameLoc()); 4890 } else { 4891 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4892 NewTL.setNameLoc(TL.getNameLoc()); 4893 } 4894 4895 return Result; 4896 } 4897 4898 template <typename Derived> 4899 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4900 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4901 const DependentAddressSpaceType *T = TL.getTypePtr(); 4902 4903 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4904 4905 if (pointeeType.isNull()) 4906 return QualType(); 4907 4908 // Address spaces are constant expressions. 4909 EnterExpressionEvaluationContext Unevaluated( 4910 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4911 4912 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4913 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4914 if (AddrSpace.isInvalid()) 4915 return QualType(); 4916 4917 QualType Result = TL.getType(); 4918 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4919 AddrSpace.get() != T->getAddrSpaceExpr()) { 4920 Result = getDerived().RebuildDependentAddressSpaceType( 4921 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4922 if (Result.isNull()) 4923 return QualType(); 4924 } 4925 4926 // Result might be dependent or not. 4927 if (isa<DependentAddressSpaceType>(Result)) { 4928 DependentAddressSpaceTypeLoc NewTL = 4929 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4930 4931 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4932 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4933 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4934 4935 } else { 4936 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4937 Result, getDerived().getBaseLocation()); 4938 TransformType(TLB, DI->getTypeLoc()); 4939 } 4940 4941 return Result; 4942 } 4943 4944 template <typename Derived> 4945 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4946 VectorTypeLoc TL) { 4947 const VectorType *T = TL.getTypePtr(); 4948 QualType ElementType = getDerived().TransformType(T->getElementType()); 4949 if (ElementType.isNull()) 4950 return QualType(); 4951 4952 QualType Result = TL.getType(); 4953 if (getDerived().AlwaysRebuild() || 4954 ElementType != T->getElementType()) { 4955 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4956 T->getVectorKind()); 4957 if (Result.isNull()) 4958 return QualType(); 4959 } 4960 4961 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4962 NewTL.setNameLoc(TL.getNameLoc()); 4963 4964 return Result; 4965 } 4966 4967 template<typename Derived> 4968 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4969 ExtVectorTypeLoc TL) { 4970 const VectorType *T = TL.getTypePtr(); 4971 QualType ElementType = getDerived().TransformType(T->getElementType()); 4972 if (ElementType.isNull()) 4973 return QualType(); 4974 4975 QualType Result = TL.getType(); 4976 if (getDerived().AlwaysRebuild() || 4977 ElementType != T->getElementType()) { 4978 Result = getDerived().RebuildExtVectorType(ElementType, 4979 T->getNumElements(), 4980 /*FIXME*/ SourceLocation()); 4981 if (Result.isNull()) 4982 return QualType(); 4983 } 4984 4985 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4986 NewTL.setNameLoc(TL.getNameLoc()); 4987 4988 return Result; 4989 } 4990 4991 template <typename Derived> 4992 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4993 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4994 bool ExpectParameterPack) { 4995 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4996 TypeSourceInfo *NewDI = nullptr; 4997 4998 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4999 // If we're substituting into a pack expansion type and we know the 5000 // length we want to expand to, just substitute for the pattern. 5001 TypeLoc OldTL = OldDI->getTypeLoc(); 5002 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5003 5004 TypeLocBuilder TLB; 5005 TypeLoc NewTL = OldDI->getTypeLoc(); 5006 TLB.reserve(NewTL.getFullDataSize()); 5007 5008 QualType Result = getDerived().TransformType(TLB, 5009 OldExpansionTL.getPatternLoc()); 5010 if (Result.isNull()) 5011 return nullptr; 5012 5013 Result = RebuildPackExpansionType(Result, 5014 OldExpansionTL.getPatternLoc().getSourceRange(), 5015 OldExpansionTL.getEllipsisLoc(), 5016 NumExpansions); 5017 if (Result.isNull()) 5018 return nullptr; 5019 5020 PackExpansionTypeLoc NewExpansionTL 5021 = TLB.push<PackExpansionTypeLoc>(Result); 5022 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5023 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5024 } else 5025 NewDI = getDerived().TransformType(OldDI); 5026 if (!NewDI) 5027 return nullptr; 5028 5029 if (NewDI == OldDI && indexAdjustment == 0) 5030 return OldParm; 5031 5032 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5033 OldParm->getDeclContext(), 5034 OldParm->getInnerLocStart(), 5035 OldParm->getLocation(), 5036 OldParm->getIdentifier(), 5037 NewDI->getType(), 5038 NewDI, 5039 OldParm->getStorageClass(), 5040 /* DefArg */ nullptr); 5041 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5042 OldParm->getFunctionScopeIndex() + indexAdjustment); 5043 return newParm; 5044 } 5045 5046 template <typename Derived> 5047 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5048 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5049 const QualType *ParamTypes, 5050 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5051 SmallVectorImpl<QualType> &OutParamTypes, 5052 SmallVectorImpl<ParmVarDecl *> *PVars, 5053 Sema::ExtParameterInfoBuilder &PInfos) { 5054 int indexAdjustment = 0; 5055 5056 unsigned NumParams = Params.size(); 5057 for (unsigned i = 0; i != NumParams; ++i) { 5058 if (ParmVarDecl *OldParm = Params[i]) { 5059 assert(OldParm->getFunctionScopeIndex() == i); 5060 5061 Optional<unsigned> NumExpansions; 5062 ParmVarDecl *NewParm = nullptr; 5063 if (OldParm->isParameterPack()) { 5064 // We have a function parameter pack that may need to be expanded. 5065 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5066 5067 // Find the parameter packs that could be expanded. 5068 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5069 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5070 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5071 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5072 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 5073 5074 // Determine whether we should expand the parameter packs. 5075 bool ShouldExpand = false; 5076 bool RetainExpansion = false; 5077 Optional<unsigned> OrigNumExpansions = 5078 ExpansionTL.getTypePtr()->getNumExpansions(); 5079 NumExpansions = OrigNumExpansions; 5080 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5081 Pattern.getSourceRange(), 5082 Unexpanded, 5083 ShouldExpand, 5084 RetainExpansion, 5085 NumExpansions)) { 5086 return true; 5087 } 5088 5089 if (ShouldExpand) { 5090 // Expand the function parameter pack into multiple, separate 5091 // parameters. 5092 getDerived().ExpandingFunctionParameterPack(OldParm); 5093 for (unsigned I = 0; I != *NumExpansions; ++I) { 5094 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5095 ParmVarDecl *NewParm 5096 = getDerived().TransformFunctionTypeParam(OldParm, 5097 indexAdjustment++, 5098 OrigNumExpansions, 5099 /*ExpectParameterPack=*/false); 5100 if (!NewParm) 5101 return true; 5102 5103 if (ParamInfos) 5104 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5105 OutParamTypes.push_back(NewParm->getType()); 5106 if (PVars) 5107 PVars->push_back(NewParm); 5108 } 5109 5110 // If we're supposed to retain a pack expansion, do so by temporarily 5111 // forgetting the partially-substituted parameter pack. 5112 if (RetainExpansion) { 5113 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5114 ParmVarDecl *NewParm 5115 = getDerived().TransformFunctionTypeParam(OldParm, 5116 indexAdjustment++, 5117 OrigNumExpansions, 5118 /*ExpectParameterPack=*/false); 5119 if (!NewParm) 5120 return true; 5121 5122 if (ParamInfos) 5123 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5124 OutParamTypes.push_back(NewParm->getType()); 5125 if (PVars) 5126 PVars->push_back(NewParm); 5127 } 5128 5129 // The next parameter should have the same adjustment as the 5130 // last thing we pushed, but we post-incremented indexAdjustment 5131 // on every push. Also, if we push nothing, the adjustment should 5132 // go down by one. 5133 indexAdjustment--; 5134 5135 // We're done with the pack expansion. 5136 continue; 5137 } 5138 5139 // We'll substitute the parameter now without expanding the pack 5140 // expansion. 5141 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5142 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5143 indexAdjustment, 5144 NumExpansions, 5145 /*ExpectParameterPack=*/true); 5146 } else { 5147 NewParm = getDerived().TransformFunctionTypeParam( 5148 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5149 } 5150 5151 if (!NewParm) 5152 return true; 5153 5154 if (ParamInfos) 5155 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5156 OutParamTypes.push_back(NewParm->getType()); 5157 if (PVars) 5158 PVars->push_back(NewParm); 5159 continue; 5160 } 5161 5162 // Deal with the possibility that we don't have a parameter 5163 // declaration for this parameter. 5164 QualType OldType = ParamTypes[i]; 5165 bool IsPackExpansion = false; 5166 Optional<unsigned> NumExpansions; 5167 QualType NewType; 5168 if (const PackExpansionType *Expansion 5169 = dyn_cast<PackExpansionType>(OldType)) { 5170 // We have a function parameter pack that may need to be expanded. 5171 QualType Pattern = Expansion->getPattern(); 5172 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5173 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5174 5175 // Determine whether we should expand the parameter packs. 5176 bool ShouldExpand = false; 5177 bool RetainExpansion = false; 5178 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5179 Unexpanded, 5180 ShouldExpand, 5181 RetainExpansion, 5182 NumExpansions)) { 5183 return true; 5184 } 5185 5186 if (ShouldExpand) { 5187 // Expand the function parameter pack into multiple, separate 5188 // parameters. 5189 for (unsigned I = 0; I != *NumExpansions; ++I) { 5190 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5191 QualType NewType = getDerived().TransformType(Pattern); 5192 if (NewType.isNull()) 5193 return true; 5194 5195 if (NewType->containsUnexpandedParameterPack()) { 5196 NewType = 5197 getSema().getASTContext().getPackExpansionType(NewType, None); 5198 5199 if (NewType.isNull()) 5200 return true; 5201 } 5202 5203 if (ParamInfos) 5204 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5205 OutParamTypes.push_back(NewType); 5206 if (PVars) 5207 PVars->push_back(nullptr); 5208 } 5209 5210 // We're done with the pack expansion. 5211 continue; 5212 } 5213 5214 // If we're supposed to retain a pack expansion, do so by temporarily 5215 // forgetting the partially-substituted parameter pack. 5216 if (RetainExpansion) { 5217 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5218 QualType NewType = getDerived().TransformType(Pattern); 5219 if (NewType.isNull()) 5220 return true; 5221 5222 if (ParamInfos) 5223 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5224 OutParamTypes.push_back(NewType); 5225 if (PVars) 5226 PVars->push_back(nullptr); 5227 } 5228 5229 // We'll substitute the parameter now without expanding the pack 5230 // expansion. 5231 OldType = Expansion->getPattern(); 5232 IsPackExpansion = true; 5233 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5234 NewType = getDerived().TransformType(OldType); 5235 } else { 5236 NewType = getDerived().TransformType(OldType); 5237 } 5238 5239 if (NewType.isNull()) 5240 return true; 5241 5242 if (IsPackExpansion) 5243 NewType = getSema().Context.getPackExpansionType(NewType, 5244 NumExpansions); 5245 5246 if (ParamInfos) 5247 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5248 OutParamTypes.push_back(NewType); 5249 if (PVars) 5250 PVars->push_back(nullptr); 5251 } 5252 5253 #ifndef NDEBUG 5254 if (PVars) { 5255 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5256 if (ParmVarDecl *parm = (*PVars)[i]) 5257 assert(parm->getFunctionScopeIndex() == i); 5258 } 5259 #endif 5260 5261 return false; 5262 } 5263 5264 template<typename Derived> 5265 QualType 5266 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5267 FunctionProtoTypeLoc TL) { 5268 SmallVector<QualType, 4> ExceptionStorage; 5269 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5270 return getDerived().TransformFunctionProtoType( 5271 TLB, TL, nullptr, Qualifiers(), 5272 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5273 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5274 ExceptionStorage, Changed); 5275 }); 5276 } 5277 5278 template<typename Derived> template<typename Fn> 5279 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5280 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5281 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5282 5283 // Transform the parameters and return type. 5284 // 5285 // We are required to instantiate the params and return type in source order. 5286 // When the function has a trailing return type, we instantiate the 5287 // parameters before the return type, since the return type can then refer 5288 // to the parameters themselves (via decltype, sizeof, etc.). 5289 // 5290 SmallVector<QualType, 4> ParamTypes; 5291 SmallVector<ParmVarDecl*, 4> ParamDecls; 5292 Sema::ExtParameterInfoBuilder ExtParamInfos; 5293 const FunctionProtoType *T = TL.getTypePtr(); 5294 5295 QualType ResultType; 5296 5297 if (T->hasTrailingReturn()) { 5298 if (getDerived().TransformFunctionTypeParams( 5299 TL.getBeginLoc(), TL.getParams(), 5300 TL.getTypePtr()->param_type_begin(), 5301 T->getExtParameterInfosOrNull(), 5302 ParamTypes, &ParamDecls, ExtParamInfos)) 5303 return QualType(); 5304 5305 { 5306 // C++11 [expr.prim.general]p3: 5307 // If a declaration declares a member function or member function 5308 // template of a class X, the expression this is a prvalue of type 5309 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5310 // and the end of the function-definition, member-declarator, or 5311 // declarator. 5312 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5313 5314 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5315 if (ResultType.isNull()) 5316 return QualType(); 5317 } 5318 } 5319 else { 5320 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5321 if (ResultType.isNull()) 5322 return QualType(); 5323 5324 // Return type can not be qualified with an address space. 5325 if (ResultType.getAddressSpace() != LangAS::Default) { 5326 SemaRef.Diag(TL.getReturnLoc().getBeginLoc(), 5327 diag::err_attribute_address_function_type); 5328 return QualType(); 5329 } 5330 5331 if (getDerived().TransformFunctionTypeParams( 5332 TL.getBeginLoc(), TL.getParams(), 5333 TL.getTypePtr()->param_type_begin(), 5334 T->getExtParameterInfosOrNull(), 5335 ParamTypes, &ParamDecls, ExtParamInfos)) 5336 return QualType(); 5337 } 5338 5339 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5340 5341 bool EPIChanged = false; 5342 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5343 return QualType(); 5344 5345 // Handle extended parameter information. 5346 if (auto NewExtParamInfos = 5347 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5348 if (!EPI.ExtParameterInfos || 5349 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5350 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5351 EPIChanged = true; 5352 } 5353 EPI.ExtParameterInfos = NewExtParamInfos; 5354 } else if (EPI.ExtParameterInfos) { 5355 EPIChanged = true; 5356 EPI.ExtParameterInfos = nullptr; 5357 } 5358 5359 QualType Result = TL.getType(); 5360 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5361 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5362 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5363 if (Result.isNull()) 5364 return QualType(); 5365 } 5366 5367 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5368 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5369 NewTL.setLParenLoc(TL.getLParenLoc()); 5370 NewTL.setRParenLoc(TL.getRParenLoc()); 5371 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5372 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5373 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5374 NewTL.setParam(i, ParamDecls[i]); 5375 5376 return Result; 5377 } 5378 5379 template<typename Derived> 5380 bool TreeTransform<Derived>::TransformExceptionSpec( 5381 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5382 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5383 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5384 5385 // Instantiate a dynamic noexcept expression, if any. 5386 if (isComputedNoexcept(ESI.Type)) { 5387 EnterExpressionEvaluationContext Unevaluated( 5388 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5389 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5390 if (NoexceptExpr.isInvalid()) 5391 return true; 5392 5393 ExceptionSpecificationType EST = ESI.Type; 5394 NoexceptExpr = 5395 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5396 if (NoexceptExpr.isInvalid()) 5397 return true; 5398 5399 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5400 Changed = true; 5401 ESI.NoexceptExpr = NoexceptExpr.get(); 5402 ESI.Type = EST; 5403 } 5404 5405 if (ESI.Type != EST_Dynamic) 5406 return false; 5407 5408 // Instantiate a dynamic exception specification's type. 5409 for (QualType T : ESI.Exceptions) { 5410 if (const PackExpansionType *PackExpansion = 5411 T->getAs<PackExpansionType>()) { 5412 Changed = true; 5413 5414 // We have a pack expansion. Instantiate it. 5415 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5416 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5417 Unexpanded); 5418 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5419 5420 // Determine whether the set of unexpanded parameter packs can and 5421 // should 5422 // be expanded. 5423 bool Expand = false; 5424 bool RetainExpansion = false; 5425 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5426 // FIXME: Track the location of the ellipsis (and track source location 5427 // information for the types in the exception specification in general). 5428 if (getDerived().TryExpandParameterPacks( 5429 Loc, SourceRange(), Unexpanded, Expand, 5430 RetainExpansion, NumExpansions)) 5431 return true; 5432 5433 if (!Expand) { 5434 // We can't expand this pack expansion into separate arguments yet; 5435 // just substitute into the pattern and create a new pack expansion 5436 // type. 5437 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5438 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5439 if (U.isNull()) 5440 return true; 5441 5442 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5443 Exceptions.push_back(U); 5444 continue; 5445 } 5446 5447 // Substitute into the pack expansion pattern for each slice of the 5448 // pack. 5449 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5450 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5451 5452 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5453 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5454 return true; 5455 5456 Exceptions.push_back(U); 5457 } 5458 } else { 5459 QualType U = getDerived().TransformType(T); 5460 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5461 return true; 5462 if (T != U) 5463 Changed = true; 5464 5465 Exceptions.push_back(U); 5466 } 5467 } 5468 5469 ESI.Exceptions = Exceptions; 5470 if (ESI.Exceptions.empty()) 5471 ESI.Type = EST_DynamicNone; 5472 return false; 5473 } 5474 5475 template<typename Derived> 5476 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5477 TypeLocBuilder &TLB, 5478 FunctionNoProtoTypeLoc TL) { 5479 const FunctionNoProtoType *T = TL.getTypePtr(); 5480 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5481 if (ResultType.isNull()) 5482 return QualType(); 5483 5484 QualType Result = TL.getType(); 5485 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5486 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5487 5488 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5489 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5490 NewTL.setLParenLoc(TL.getLParenLoc()); 5491 NewTL.setRParenLoc(TL.getRParenLoc()); 5492 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5493 5494 return Result; 5495 } 5496 5497 template<typename Derived> QualType 5498 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5499 UnresolvedUsingTypeLoc TL) { 5500 const UnresolvedUsingType *T = TL.getTypePtr(); 5501 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5502 if (!D) 5503 return QualType(); 5504 5505 QualType Result = TL.getType(); 5506 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5507 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5508 if (Result.isNull()) 5509 return QualType(); 5510 } 5511 5512 // We might get an arbitrary type spec type back. We should at 5513 // least always get a type spec type, though. 5514 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5515 NewTL.setNameLoc(TL.getNameLoc()); 5516 5517 return Result; 5518 } 5519 5520 template<typename Derived> 5521 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5522 TypedefTypeLoc TL) { 5523 const TypedefType *T = TL.getTypePtr(); 5524 TypedefNameDecl *Typedef 5525 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5526 T->getDecl())); 5527 if (!Typedef) 5528 return QualType(); 5529 5530 QualType Result = TL.getType(); 5531 if (getDerived().AlwaysRebuild() || 5532 Typedef != T->getDecl()) { 5533 Result = getDerived().RebuildTypedefType(Typedef); 5534 if (Result.isNull()) 5535 return QualType(); 5536 } 5537 5538 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5539 NewTL.setNameLoc(TL.getNameLoc()); 5540 5541 return Result; 5542 } 5543 5544 template<typename Derived> 5545 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5546 TypeOfExprTypeLoc TL) { 5547 // typeof expressions are not potentially evaluated contexts 5548 EnterExpressionEvaluationContext Unevaluated( 5549 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5550 Sema::ReuseLambdaContextDecl); 5551 5552 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5553 if (E.isInvalid()) 5554 return QualType(); 5555 5556 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5557 if (E.isInvalid()) 5558 return QualType(); 5559 5560 QualType Result = TL.getType(); 5561 if (getDerived().AlwaysRebuild() || 5562 E.get() != TL.getUnderlyingExpr()) { 5563 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5564 if (Result.isNull()) 5565 return QualType(); 5566 } 5567 else E.get(); 5568 5569 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5570 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5571 NewTL.setLParenLoc(TL.getLParenLoc()); 5572 NewTL.setRParenLoc(TL.getRParenLoc()); 5573 5574 return Result; 5575 } 5576 5577 template<typename Derived> 5578 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5579 TypeOfTypeLoc TL) { 5580 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5581 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5582 if (!New_Under_TI) 5583 return QualType(); 5584 5585 QualType Result = TL.getType(); 5586 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5587 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5588 if (Result.isNull()) 5589 return QualType(); 5590 } 5591 5592 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5593 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5594 NewTL.setLParenLoc(TL.getLParenLoc()); 5595 NewTL.setRParenLoc(TL.getRParenLoc()); 5596 NewTL.setUnderlyingTInfo(New_Under_TI); 5597 5598 return Result; 5599 } 5600 5601 template<typename Derived> 5602 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5603 DecltypeTypeLoc TL) { 5604 const DecltypeType *T = TL.getTypePtr(); 5605 5606 // decltype expressions are not potentially evaluated contexts 5607 EnterExpressionEvaluationContext Unevaluated( 5608 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5609 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5610 5611 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5612 if (E.isInvalid()) 5613 return QualType(); 5614 5615 E = getSema().ActOnDecltypeExpression(E.get()); 5616 if (E.isInvalid()) 5617 return QualType(); 5618 5619 QualType Result = TL.getType(); 5620 if (getDerived().AlwaysRebuild() || 5621 E.get() != T->getUnderlyingExpr()) { 5622 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5623 if (Result.isNull()) 5624 return QualType(); 5625 } 5626 else E.get(); 5627 5628 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5629 NewTL.setNameLoc(TL.getNameLoc()); 5630 5631 return Result; 5632 } 5633 5634 template<typename Derived> 5635 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5636 TypeLocBuilder &TLB, 5637 UnaryTransformTypeLoc TL) { 5638 QualType Result = TL.getType(); 5639 if (Result->isDependentType()) { 5640 const UnaryTransformType *T = TL.getTypePtr(); 5641 QualType NewBase = 5642 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5643 Result = getDerived().RebuildUnaryTransformType(NewBase, 5644 T->getUTTKind(), 5645 TL.getKWLoc()); 5646 if (Result.isNull()) 5647 return QualType(); 5648 } 5649 5650 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5651 NewTL.setKWLoc(TL.getKWLoc()); 5652 NewTL.setParensRange(TL.getParensRange()); 5653 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5654 return Result; 5655 } 5656 5657 template<typename Derived> 5658 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5659 AutoTypeLoc TL) { 5660 const AutoType *T = TL.getTypePtr(); 5661 QualType OldDeduced = T->getDeducedType(); 5662 QualType NewDeduced; 5663 if (!OldDeduced.isNull()) { 5664 NewDeduced = getDerived().TransformType(OldDeduced); 5665 if (NewDeduced.isNull()) 5666 return QualType(); 5667 } 5668 5669 QualType Result = TL.getType(); 5670 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5671 T->isDependentType()) { 5672 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5673 if (Result.isNull()) 5674 return QualType(); 5675 } 5676 5677 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5678 NewTL.setNameLoc(TL.getNameLoc()); 5679 5680 return Result; 5681 } 5682 5683 template<typename Derived> 5684 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5685 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5686 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5687 5688 CXXScopeSpec SS; 5689 TemplateName TemplateName = getDerived().TransformTemplateName( 5690 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5691 if (TemplateName.isNull()) 5692 return QualType(); 5693 5694 QualType OldDeduced = T->getDeducedType(); 5695 QualType NewDeduced; 5696 if (!OldDeduced.isNull()) { 5697 NewDeduced = getDerived().TransformType(OldDeduced); 5698 if (NewDeduced.isNull()) 5699 return QualType(); 5700 } 5701 5702 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5703 TemplateName, NewDeduced); 5704 if (Result.isNull()) 5705 return QualType(); 5706 5707 DeducedTemplateSpecializationTypeLoc NewTL = 5708 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5709 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5710 5711 return Result; 5712 } 5713 5714 template<typename Derived> 5715 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5716 RecordTypeLoc TL) { 5717 const RecordType *T = TL.getTypePtr(); 5718 RecordDecl *Record 5719 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5720 T->getDecl())); 5721 if (!Record) 5722 return QualType(); 5723 5724 QualType Result = TL.getType(); 5725 if (getDerived().AlwaysRebuild() || 5726 Record != T->getDecl()) { 5727 Result = getDerived().RebuildRecordType(Record); 5728 if (Result.isNull()) 5729 return QualType(); 5730 } 5731 5732 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5733 NewTL.setNameLoc(TL.getNameLoc()); 5734 5735 return Result; 5736 } 5737 5738 template<typename Derived> 5739 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5740 EnumTypeLoc TL) { 5741 const EnumType *T = TL.getTypePtr(); 5742 EnumDecl *Enum 5743 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5744 T->getDecl())); 5745 if (!Enum) 5746 return QualType(); 5747 5748 QualType Result = TL.getType(); 5749 if (getDerived().AlwaysRebuild() || 5750 Enum != T->getDecl()) { 5751 Result = getDerived().RebuildEnumType(Enum); 5752 if (Result.isNull()) 5753 return QualType(); 5754 } 5755 5756 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5757 NewTL.setNameLoc(TL.getNameLoc()); 5758 5759 return Result; 5760 } 5761 5762 template<typename Derived> 5763 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5764 TypeLocBuilder &TLB, 5765 InjectedClassNameTypeLoc TL) { 5766 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5767 TL.getTypePtr()->getDecl()); 5768 if (!D) return QualType(); 5769 5770 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5771 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5772 return T; 5773 } 5774 5775 template<typename Derived> 5776 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5777 TypeLocBuilder &TLB, 5778 TemplateTypeParmTypeLoc TL) { 5779 return TransformTypeSpecType(TLB, TL); 5780 } 5781 5782 template<typename Derived> 5783 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5784 TypeLocBuilder &TLB, 5785 SubstTemplateTypeParmTypeLoc TL) { 5786 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5787 5788 // Substitute into the replacement type, which itself might involve something 5789 // that needs to be transformed. This only tends to occur with default 5790 // template arguments of template template parameters. 5791 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5792 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5793 if (Replacement.isNull()) 5794 return QualType(); 5795 5796 // Always canonicalize the replacement type. 5797 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5798 QualType Result 5799 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5800 Replacement); 5801 5802 // Propagate type-source information. 5803 SubstTemplateTypeParmTypeLoc NewTL 5804 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5805 NewTL.setNameLoc(TL.getNameLoc()); 5806 return Result; 5807 5808 } 5809 5810 template<typename Derived> 5811 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5812 TypeLocBuilder &TLB, 5813 SubstTemplateTypeParmPackTypeLoc TL) { 5814 return TransformTypeSpecType(TLB, TL); 5815 } 5816 5817 template<typename Derived> 5818 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5819 TypeLocBuilder &TLB, 5820 TemplateSpecializationTypeLoc TL) { 5821 const TemplateSpecializationType *T = TL.getTypePtr(); 5822 5823 // The nested-name-specifier never matters in a TemplateSpecializationType, 5824 // because we can't have a dependent nested-name-specifier anyway. 5825 CXXScopeSpec SS; 5826 TemplateName Template 5827 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5828 TL.getTemplateNameLoc()); 5829 if (Template.isNull()) 5830 return QualType(); 5831 5832 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5833 } 5834 5835 template<typename Derived> 5836 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5837 AtomicTypeLoc TL) { 5838 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5839 if (ValueType.isNull()) 5840 return QualType(); 5841 5842 QualType Result = TL.getType(); 5843 if (getDerived().AlwaysRebuild() || 5844 ValueType != TL.getValueLoc().getType()) { 5845 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5846 if (Result.isNull()) 5847 return QualType(); 5848 } 5849 5850 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5851 NewTL.setKWLoc(TL.getKWLoc()); 5852 NewTL.setLParenLoc(TL.getLParenLoc()); 5853 NewTL.setRParenLoc(TL.getRParenLoc()); 5854 5855 return Result; 5856 } 5857 5858 template <typename Derived> 5859 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5860 PipeTypeLoc TL) { 5861 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5862 if (ValueType.isNull()) 5863 return QualType(); 5864 5865 QualType Result = TL.getType(); 5866 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5867 const PipeType *PT = Result->getAs<PipeType>(); 5868 bool isReadPipe = PT->isReadOnly(); 5869 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5870 if (Result.isNull()) 5871 return QualType(); 5872 } 5873 5874 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5875 NewTL.setKWLoc(TL.getKWLoc()); 5876 5877 return Result; 5878 } 5879 5880 /// Simple iterator that traverses the template arguments in a 5881 /// container that provides a \c getArgLoc() member function. 5882 /// 5883 /// This iterator is intended to be used with the iterator form of 5884 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5885 template<typename ArgLocContainer> 5886 class TemplateArgumentLocContainerIterator { 5887 ArgLocContainer *Container; 5888 unsigned Index; 5889 5890 public: 5891 typedef TemplateArgumentLoc value_type; 5892 typedef TemplateArgumentLoc reference; 5893 typedef int difference_type; 5894 typedef std::input_iterator_tag iterator_category; 5895 5896 class pointer { 5897 TemplateArgumentLoc Arg; 5898 5899 public: 5900 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5901 5902 const TemplateArgumentLoc *operator->() const { 5903 return &Arg; 5904 } 5905 }; 5906 5907 5908 TemplateArgumentLocContainerIterator() {} 5909 5910 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5911 unsigned Index) 5912 : Container(&Container), Index(Index) { } 5913 5914 TemplateArgumentLocContainerIterator &operator++() { 5915 ++Index; 5916 return *this; 5917 } 5918 5919 TemplateArgumentLocContainerIterator operator++(int) { 5920 TemplateArgumentLocContainerIterator Old(*this); 5921 ++(*this); 5922 return Old; 5923 } 5924 5925 TemplateArgumentLoc operator*() const { 5926 return Container->getArgLoc(Index); 5927 } 5928 5929 pointer operator->() const { 5930 return pointer(Container->getArgLoc(Index)); 5931 } 5932 5933 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5934 const TemplateArgumentLocContainerIterator &Y) { 5935 return X.Container == Y.Container && X.Index == Y.Index; 5936 } 5937 5938 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5939 const TemplateArgumentLocContainerIterator &Y) { 5940 return !(X == Y); 5941 } 5942 }; 5943 5944 5945 template <typename Derived> 5946 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5947 TypeLocBuilder &TLB, 5948 TemplateSpecializationTypeLoc TL, 5949 TemplateName Template) { 5950 TemplateArgumentListInfo NewTemplateArgs; 5951 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5952 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5953 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5954 ArgIterator; 5955 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5956 ArgIterator(TL, TL.getNumArgs()), 5957 NewTemplateArgs)) 5958 return QualType(); 5959 5960 // FIXME: maybe don't rebuild if all the template arguments are the same. 5961 5962 QualType Result = 5963 getDerived().RebuildTemplateSpecializationType(Template, 5964 TL.getTemplateNameLoc(), 5965 NewTemplateArgs); 5966 5967 if (!Result.isNull()) { 5968 // Specializations of template template parameters are represented as 5969 // TemplateSpecializationTypes, and substitution of type alias templates 5970 // within a dependent context can transform them into 5971 // DependentTemplateSpecializationTypes. 5972 if (isa<DependentTemplateSpecializationType>(Result)) { 5973 DependentTemplateSpecializationTypeLoc NewTL 5974 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5975 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5976 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5977 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5978 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5979 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5980 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5981 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5982 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5983 return Result; 5984 } 5985 5986 TemplateSpecializationTypeLoc NewTL 5987 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5988 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5989 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5990 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5991 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5992 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5993 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5994 } 5995 5996 return Result; 5997 } 5998 5999 template <typename Derived> 6000 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6001 TypeLocBuilder &TLB, 6002 DependentTemplateSpecializationTypeLoc TL, 6003 TemplateName Template, 6004 CXXScopeSpec &SS) { 6005 TemplateArgumentListInfo NewTemplateArgs; 6006 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6007 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6008 typedef TemplateArgumentLocContainerIterator< 6009 DependentTemplateSpecializationTypeLoc> ArgIterator; 6010 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6011 ArgIterator(TL, TL.getNumArgs()), 6012 NewTemplateArgs)) 6013 return QualType(); 6014 6015 // FIXME: maybe don't rebuild if all the template arguments are the same. 6016 6017 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6018 QualType Result 6019 = getSema().Context.getDependentTemplateSpecializationType( 6020 TL.getTypePtr()->getKeyword(), 6021 DTN->getQualifier(), 6022 DTN->getIdentifier(), 6023 NewTemplateArgs); 6024 6025 DependentTemplateSpecializationTypeLoc NewTL 6026 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6027 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6028 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6029 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6030 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6031 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6032 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6033 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6034 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6035 return Result; 6036 } 6037 6038 QualType Result 6039 = getDerived().RebuildTemplateSpecializationType(Template, 6040 TL.getTemplateNameLoc(), 6041 NewTemplateArgs); 6042 6043 if (!Result.isNull()) { 6044 /// FIXME: Wrap this in an elaborated-type-specifier? 6045 TemplateSpecializationTypeLoc NewTL 6046 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6047 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6048 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6049 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6050 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6051 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6052 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6053 } 6054 6055 return Result; 6056 } 6057 6058 template<typename Derived> 6059 QualType 6060 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6061 ElaboratedTypeLoc TL) { 6062 const ElaboratedType *T = TL.getTypePtr(); 6063 6064 NestedNameSpecifierLoc QualifierLoc; 6065 // NOTE: the qualifier in an ElaboratedType is optional. 6066 if (TL.getQualifierLoc()) { 6067 QualifierLoc 6068 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6069 if (!QualifierLoc) 6070 return QualType(); 6071 } 6072 6073 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6074 if (NamedT.isNull()) 6075 return QualType(); 6076 6077 // C++0x [dcl.type.elab]p2: 6078 // If the identifier resolves to a typedef-name or the simple-template-id 6079 // resolves to an alias template specialization, the 6080 // elaborated-type-specifier is ill-formed. 6081 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6082 if (const TemplateSpecializationType *TST = 6083 NamedT->getAs<TemplateSpecializationType>()) { 6084 TemplateName Template = TST->getTemplateName(); 6085 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6086 Template.getAsTemplateDecl())) { 6087 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6088 diag::err_tag_reference_non_tag) 6089 << TAT << Sema::NTK_TypeAliasTemplate 6090 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6091 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6092 } 6093 } 6094 } 6095 6096 QualType Result = TL.getType(); 6097 if (getDerived().AlwaysRebuild() || 6098 QualifierLoc != TL.getQualifierLoc() || 6099 NamedT != T->getNamedType()) { 6100 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6101 T->getKeyword(), 6102 QualifierLoc, NamedT); 6103 if (Result.isNull()) 6104 return QualType(); 6105 } 6106 6107 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6108 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6109 NewTL.setQualifierLoc(QualifierLoc); 6110 return Result; 6111 } 6112 6113 template<typename Derived> 6114 QualType TreeTransform<Derived>::TransformAttributedType( 6115 TypeLocBuilder &TLB, 6116 AttributedTypeLoc TL) { 6117 const AttributedType *oldType = TL.getTypePtr(); 6118 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6119 if (modifiedType.isNull()) 6120 return QualType(); 6121 6122 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6123 const Attr *oldAttr = TL.getAttr(); 6124 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6125 if (oldAttr && !newAttr) 6126 return QualType(); 6127 6128 QualType result = TL.getType(); 6129 6130 // FIXME: dependent operand expressions? 6131 if (getDerived().AlwaysRebuild() || 6132 modifiedType != oldType->getModifiedType()) { 6133 // TODO: this is really lame; we should really be rebuilding the 6134 // equivalent type from first principles. 6135 QualType equivalentType 6136 = getDerived().TransformType(oldType->getEquivalentType()); 6137 if (equivalentType.isNull()) 6138 return QualType(); 6139 6140 // Check whether we can add nullability; it is only represented as 6141 // type sugar, and therefore cannot be diagnosed in any other way. 6142 if (auto nullability = oldType->getImmediateNullability()) { 6143 if (!modifiedType->canHaveNullability()) { 6144 SemaRef.Diag(TL.getAttr()->getLocation(), 6145 diag::err_nullability_nonpointer) 6146 << DiagNullabilityKind(*nullability, false) << modifiedType; 6147 return QualType(); 6148 } 6149 } 6150 6151 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6152 modifiedType, 6153 equivalentType); 6154 } 6155 6156 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6157 newTL.setAttr(newAttr); 6158 return result; 6159 } 6160 6161 template<typename Derived> 6162 QualType 6163 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6164 ParenTypeLoc TL) { 6165 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6166 if (Inner.isNull()) 6167 return QualType(); 6168 6169 QualType Result = TL.getType(); 6170 if (getDerived().AlwaysRebuild() || 6171 Inner != TL.getInnerLoc().getType()) { 6172 Result = getDerived().RebuildParenType(Inner); 6173 if (Result.isNull()) 6174 return QualType(); 6175 } 6176 6177 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6178 NewTL.setLParenLoc(TL.getLParenLoc()); 6179 NewTL.setRParenLoc(TL.getRParenLoc()); 6180 return Result; 6181 } 6182 6183 template<typename Derived> 6184 QualType TreeTransform<Derived>::TransformDependentNameType( 6185 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6186 return TransformDependentNameType(TLB, TL, false); 6187 } 6188 6189 template<typename Derived> 6190 QualType TreeTransform<Derived>::TransformDependentNameType( 6191 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6192 const DependentNameType *T = TL.getTypePtr(); 6193 6194 NestedNameSpecifierLoc QualifierLoc 6195 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6196 if (!QualifierLoc) 6197 return QualType(); 6198 6199 QualType Result 6200 = getDerived().RebuildDependentNameType(T->getKeyword(), 6201 TL.getElaboratedKeywordLoc(), 6202 QualifierLoc, 6203 T->getIdentifier(), 6204 TL.getNameLoc(), 6205 DeducedTSTContext); 6206 if (Result.isNull()) 6207 return QualType(); 6208 6209 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6210 QualType NamedT = ElabT->getNamedType(); 6211 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6212 6213 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6214 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6215 NewTL.setQualifierLoc(QualifierLoc); 6216 } else { 6217 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6218 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6219 NewTL.setQualifierLoc(QualifierLoc); 6220 NewTL.setNameLoc(TL.getNameLoc()); 6221 } 6222 return Result; 6223 } 6224 6225 template<typename Derived> 6226 QualType TreeTransform<Derived>:: 6227 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6228 DependentTemplateSpecializationTypeLoc TL) { 6229 NestedNameSpecifierLoc QualifierLoc; 6230 if (TL.getQualifierLoc()) { 6231 QualifierLoc 6232 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6233 if (!QualifierLoc) 6234 return QualType(); 6235 } 6236 6237 return getDerived() 6238 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6239 } 6240 6241 template<typename Derived> 6242 QualType TreeTransform<Derived>:: 6243 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6244 DependentTemplateSpecializationTypeLoc TL, 6245 NestedNameSpecifierLoc QualifierLoc) { 6246 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6247 6248 TemplateArgumentListInfo NewTemplateArgs; 6249 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6250 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6251 6252 typedef TemplateArgumentLocContainerIterator< 6253 DependentTemplateSpecializationTypeLoc> ArgIterator; 6254 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6255 ArgIterator(TL, TL.getNumArgs()), 6256 NewTemplateArgs)) 6257 return QualType(); 6258 6259 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6260 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6261 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6262 /*AllowInjectedClassName*/ false); 6263 if (Result.isNull()) 6264 return QualType(); 6265 6266 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6267 QualType NamedT = ElabT->getNamedType(); 6268 6269 // Copy information relevant to the template specialization. 6270 TemplateSpecializationTypeLoc NamedTL 6271 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6272 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6273 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6274 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6275 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6276 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6277 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6278 6279 // Copy information relevant to the elaborated type. 6280 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6281 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6282 NewTL.setQualifierLoc(QualifierLoc); 6283 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6284 DependentTemplateSpecializationTypeLoc SpecTL 6285 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6286 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6287 SpecTL.setQualifierLoc(QualifierLoc); 6288 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6289 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6290 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6291 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6292 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6293 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6294 } else { 6295 TemplateSpecializationTypeLoc SpecTL 6296 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6297 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6298 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6299 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6300 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6301 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6302 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6303 } 6304 return Result; 6305 } 6306 6307 template<typename Derived> 6308 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6309 PackExpansionTypeLoc TL) { 6310 QualType Pattern 6311 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6312 if (Pattern.isNull()) 6313 return QualType(); 6314 6315 QualType Result = TL.getType(); 6316 if (getDerived().AlwaysRebuild() || 6317 Pattern != TL.getPatternLoc().getType()) { 6318 Result = getDerived().RebuildPackExpansionType(Pattern, 6319 TL.getPatternLoc().getSourceRange(), 6320 TL.getEllipsisLoc(), 6321 TL.getTypePtr()->getNumExpansions()); 6322 if (Result.isNull()) 6323 return QualType(); 6324 } 6325 6326 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6327 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6328 return Result; 6329 } 6330 6331 template<typename Derived> 6332 QualType 6333 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6334 ObjCInterfaceTypeLoc TL) { 6335 // ObjCInterfaceType is never dependent. 6336 TLB.pushFullCopy(TL); 6337 return TL.getType(); 6338 } 6339 6340 template<typename Derived> 6341 QualType 6342 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6343 ObjCTypeParamTypeLoc TL) { 6344 const ObjCTypeParamType *T = TL.getTypePtr(); 6345 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6346 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6347 if (!OTP) 6348 return QualType(); 6349 6350 QualType Result = TL.getType(); 6351 if (getDerived().AlwaysRebuild() || 6352 OTP != T->getDecl()) { 6353 Result = getDerived().RebuildObjCTypeParamType(OTP, 6354 TL.getProtocolLAngleLoc(), 6355 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6356 TL.getNumProtocols()), 6357 TL.getProtocolLocs(), 6358 TL.getProtocolRAngleLoc()); 6359 if (Result.isNull()) 6360 return QualType(); 6361 } 6362 6363 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6364 if (TL.getNumProtocols()) { 6365 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6366 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6367 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6368 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6369 } 6370 return Result; 6371 } 6372 6373 template<typename Derived> 6374 QualType 6375 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6376 ObjCObjectTypeLoc TL) { 6377 // Transform base type. 6378 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6379 if (BaseType.isNull()) 6380 return QualType(); 6381 6382 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6383 6384 // Transform type arguments. 6385 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6386 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6387 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6388 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6389 QualType TypeArg = TypeArgInfo->getType(); 6390 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6391 AnyChanged = true; 6392 6393 // We have a pack expansion. Instantiate it. 6394 const auto *PackExpansion = PackExpansionLoc.getType() 6395 ->castAs<PackExpansionType>(); 6396 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6397 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6398 Unexpanded); 6399 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6400 6401 // Determine whether the set of unexpanded parameter packs can 6402 // and should be expanded. 6403 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6404 bool Expand = false; 6405 bool RetainExpansion = false; 6406 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6407 if (getDerived().TryExpandParameterPacks( 6408 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6409 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6410 return QualType(); 6411 6412 if (!Expand) { 6413 // We can't expand this pack expansion into separate arguments yet; 6414 // just substitute into the pattern and create a new pack expansion 6415 // type. 6416 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6417 6418 TypeLocBuilder TypeArgBuilder; 6419 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6420 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6421 PatternLoc); 6422 if (NewPatternType.isNull()) 6423 return QualType(); 6424 6425 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6426 NewPatternType, NumExpansions); 6427 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6428 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6429 NewTypeArgInfos.push_back( 6430 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6431 continue; 6432 } 6433 6434 // Substitute into the pack expansion pattern for each slice of the 6435 // pack. 6436 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6437 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6438 6439 TypeLocBuilder TypeArgBuilder; 6440 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6441 6442 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6443 PatternLoc); 6444 if (NewTypeArg.isNull()) 6445 return QualType(); 6446 6447 NewTypeArgInfos.push_back( 6448 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6449 } 6450 6451 continue; 6452 } 6453 6454 TypeLocBuilder TypeArgBuilder; 6455 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6456 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6457 if (NewTypeArg.isNull()) 6458 return QualType(); 6459 6460 // If nothing changed, just keep the old TypeSourceInfo. 6461 if (NewTypeArg == TypeArg) { 6462 NewTypeArgInfos.push_back(TypeArgInfo); 6463 continue; 6464 } 6465 6466 NewTypeArgInfos.push_back( 6467 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6468 AnyChanged = true; 6469 } 6470 6471 QualType Result = TL.getType(); 6472 if (getDerived().AlwaysRebuild() || AnyChanged) { 6473 // Rebuild the type. 6474 Result = getDerived().RebuildObjCObjectType( 6475 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6476 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6477 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6478 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6479 6480 if (Result.isNull()) 6481 return QualType(); 6482 } 6483 6484 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6485 NewT.setHasBaseTypeAsWritten(true); 6486 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6487 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6488 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6489 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6490 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6491 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6492 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6493 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6494 return Result; 6495 } 6496 6497 template<typename Derived> 6498 QualType 6499 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6500 ObjCObjectPointerTypeLoc TL) { 6501 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6502 if (PointeeType.isNull()) 6503 return QualType(); 6504 6505 QualType Result = TL.getType(); 6506 if (getDerived().AlwaysRebuild() || 6507 PointeeType != TL.getPointeeLoc().getType()) { 6508 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6509 TL.getStarLoc()); 6510 if (Result.isNull()) 6511 return QualType(); 6512 } 6513 6514 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6515 NewT.setStarLoc(TL.getStarLoc()); 6516 return Result; 6517 } 6518 6519 //===----------------------------------------------------------------------===// 6520 // Statement transformation 6521 //===----------------------------------------------------------------------===// 6522 template<typename Derived> 6523 StmtResult 6524 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6525 return S; 6526 } 6527 6528 template<typename Derived> 6529 StmtResult 6530 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6531 return getDerived().TransformCompoundStmt(S, false); 6532 } 6533 6534 template<typename Derived> 6535 StmtResult 6536 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6537 bool IsStmtExpr) { 6538 Sema::CompoundScopeRAII CompoundScope(getSema()); 6539 6540 bool SubStmtInvalid = false; 6541 bool SubStmtChanged = false; 6542 SmallVector<Stmt*, 8> Statements; 6543 for (auto *B : S->body()) { 6544 StmtResult Result = getDerived().TransformStmt( 6545 B, 6546 IsStmtExpr && B == S->body_back() ? SDK_StmtExprResult : SDK_Discarded); 6547 6548 if (Result.isInvalid()) { 6549 // Immediately fail if this was a DeclStmt, since it's very 6550 // likely that this will cause problems for future statements. 6551 if (isa<DeclStmt>(B)) 6552 return StmtError(); 6553 6554 // Otherwise, just keep processing substatements and fail later. 6555 SubStmtInvalid = true; 6556 continue; 6557 } 6558 6559 SubStmtChanged = SubStmtChanged || Result.get() != B; 6560 Statements.push_back(Result.getAs<Stmt>()); 6561 } 6562 6563 if (SubStmtInvalid) 6564 return StmtError(); 6565 6566 if (!getDerived().AlwaysRebuild() && 6567 !SubStmtChanged) 6568 return S; 6569 6570 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6571 Statements, 6572 S->getRBracLoc(), 6573 IsStmtExpr); 6574 } 6575 6576 template<typename Derived> 6577 StmtResult 6578 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6579 ExprResult LHS, RHS; 6580 { 6581 EnterExpressionEvaluationContext Unevaluated( 6582 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6583 6584 // Transform the left-hand case value. 6585 LHS = getDerived().TransformExpr(S->getLHS()); 6586 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6587 if (LHS.isInvalid()) 6588 return StmtError(); 6589 6590 // Transform the right-hand case value (for the GNU case-range extension). 6591 RHS = getDerived().TransformExpr(S->getRHS()); 6592 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6593 if (RHS.isInvalid()) 6594 return StmtError(); 6595 } 6596 6597 // Build the case statement. 6598 // Case statements are always rebuilt so that they will attached to their 6599 // transformed switch statement. 6600 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6601 LHS.get(), 6602 S->getEllipsisLoc(), 6603 RHS.get(), 6604 S->getColonLoc()); 6605 if (Case.isInvalid()) 6606 return StmtError(); 6607 6608 // Transform the statement following the case 6609 StmtResult SubStmt = 6610 getDerived().TransformStmt(S->getSubStmt()); 6611 if (SubStmt.isInvalid()) 6612 return StmtError(); 6613 6614 // Attach the body to the case statement 6615 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6616 } 6617 6618 template <typename Derived> 6619 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6620 // Transform the statement following the default case 6621 StmtResult SubStmt = 6622 getDerived().TransformStmt(S->getSubStmt()); 6623 if (SubStmt.isInvalid()) 6624 return StmtError(); 6625 6626 // Default statements are always rebuilt 6627 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6628 SubStmt.get()); 6629 } 6630 6631 template<typename Derived> 6632 StmtResult 6633 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 6634 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6635 if (SubStmt.isInvalid()) 6636 return StmtError(); 6637 6638 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6639 S->getDecl()); 6640 if (!LD) 6641 return StmtError(); 6642 6643 // If we're transforming "in-place" (we're not creating new local 6644 // declarations), assume we're replacing the old label statement 6645 // and clear out the reference to it. 6646 if (LD == S->getDecl()) 6647 S->getDecl()->setStmt(nullptr); 6648 6649 // FIXME: Pass the real colon location in. 6650 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6651 cast<LabelDecl>(LD), SourceLocation(), 6652 SubStmt.get()); 6653 } 6654 6655 template <typename Derived> 6656 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6657 if (!R) 6658 return R; 6659 6660 switch (R->getKind()) { 6661 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6662 #define ATTR(X) 6663 #define PRAGMA_SPELLING_ATTR(X) \ 6664 case attr::X: \ 6665 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6666 #include "clang/Basic/AttrList.inc" 6667 default: 6668 return R; 6669 } 6670 } 6671 6672 template <typename Derived> 6673 StmtResult 6674 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 6675 StmtDiscardKind SDK) { 6676 bool AttrsChanged = false; 6677 SmallVector<const Attr *, 1> Attrs; 6678 6679 // Visit attributes and keep track if any are transformed. 6680 for (const auto *I : S->getAttrs()) { 6681 const Attr *R = getDerived().TransformAttr(I); 6682 AttrsChanged |= (I != R); 6683 Attrs.push_back(R); 6684 } 6685 6686 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6687 if (SubStmt.isInvalid()) 6688 return StmtError(); 6689 6690 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6691 return S; 6692 6693 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6694 SubStmt.get()); 6695 } 6696 6697 template<typename Derived> 6698 StmtResult 6699 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6700 // Transform the initialization statement 6701 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6702 if (Init.isInvalid()) 6703 return StmtError(); 6704 6705 // Transform the condition 6706 Sema::ConditionResult Cond = getDerived().TransformCondition( 6707 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6708 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6709 : Sema::ConditionKind::Boolean); 6710 if (Cond.isInvalid()) 6711 return StmtError(); 6712 6713 // If this is a constexpr if, determine which arm we should instantiate. 6714 llvm::Optional<bool> ConstexprConditionValue; 6715 if (S->isConstexpr()) 6716 ConstexprConditionValue = Cond.getKnownValue(); 6717 6718 // Transform the "then" branch. 6719 StmtResult Then; 6720 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6721 Then = getDerived().TransformStmt(S->getThen()); 6722 if (Then.isInvalid()) 6723 return StmtError(); 6724 } else { 6725 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 6726 } 6727 6728 // Transform the "else" branch. 6729 StmtResult Else; 6730 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6731 Else = getDerived().TransformStmt(S->getElse()); 6732 if (Else.isInvalid()) 6733 return StmtError(); 6734 } 6735 6736 if (!getDerived().AlwaysRebuild() && 6737 Init.get() == S->getInit() && 6738 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6739 Then.get() == S->getThen() && 6740 Else.get() == S->getElse()) 6741 return S; 6742 6743 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6744 Init.get(), Then.get(), S->getElseLoc(), 6745 Else.get()); 6746 } 6747 6748 template<typename Derived> 6749 StmtResult 6750 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6751 // Transform the initialization statement 6752 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6753 if (Init.isInvalid()) 6754 return StmtError(); 6755 6756 // Transform the condition. 6757 Sema::ConditionResult Cond = getDerived().TransformCondition( 6758 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6759 Sema::ConditionKind::Switch); 6760 if (Cond.isInvalid()) 6761 return StmtError(); 6762 6763 // Rebuild the switch statement. 6764 StmtResult Switch 6765 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 6766 if (Switch.isInvalid()) 6767 return StmtError(); 6768 6769 // Transform the body of the switch statement. 6770 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6771 if (Body.isInvalid()) 6772 return StmtError(); 6773 6774 // Complete the switch statement. 6775 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6776 Body.get()); 6777 } 6778 6779 template<typename Derived> 6780 StmtResult 6781 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6782 // Transform the condition 6783 Sema::ConditionResult Cond = getDerived().TransformCondition( 6784 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6785 Sema::ConditionKind::Boolean); 6786 if (Cond.isInvalid()) 6787 return StmtError(); 6788 6789 // Transform the body 6790 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6791 if (Body.isInvalid()) 6792 return StmtError(); 6793 6794 if (!getDerived().AlwaysRebuild() && 6795 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6796 Body.get() == S->getBody()) 6797 return Owned(S); 6798 6799 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6800 } 6801 6802 template<typename Derived> 6803 StmtResult 6804 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6805 // Transform the body 6806 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6807 if (Body.isInvalid()) 6808 return StmtError(); 6809 6810 // Transform the condition 6811 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6812 if (Cond.isInvalid()) 6813 return StmtError(); 6814 6815 if (!getDerived().AlwaysRebuild() && 6816 Cond.get() == S->getCond() && 6817 Body.get() == S->getBody()) 6818 return S; 6819 6820 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6821 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6822 S->getRParenLoc()); 6823 } 6824 6825 template<typename Derived> 6826 StmtResult 6827 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6828 if (getSema().getLangOpts().OpenMP) 6829 getSema().startOpenMPLoop(); 6830 6831 // Transform the initialization statement 6832 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6833 if (Init.isInvalid()) 6834 return StmtError(); 6835 6836 // In OpenMP loop region loop control variable must be captured and be 6837 // private. Perform analysis of first part (if any). 6838 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6839 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6840 6841 // Transform the condition 6842 Sema::ConditionResult Cond = getDerived().TransformCondition( 6843 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6844 Sema::ConditionKind::Boolean); 6845 if (Cond.isInvalid()) 6846 return StmtError(); 6847 6848 // Transform the increment 6849 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6850 if (Inc.isInvalid()) 6851 return StmtError(); 6852 6853 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6854 if (S->getInc() && !FullInc.get()) 6855 return StmtError(); 6856 6857 // Transform the body 6858 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6859 if (Body.isInvalid()) 6860 return StmtError(); 6861 6862 if (!getDerived().AlwaysRebuild() && 6863 Init.get() == S->getInit() && 6864 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6865 Inc.get() == S->getInc() && 6866 Body.get() == S->getBody()) 6867 return S; 6868 6869 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6870 Init.get(), Cond, FullInc, 6871 S->getRParenLoc(), Body.get()); 6872 } 6873 6874 template<typename Derived> 6875 StmtResult 6876 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6877 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6878 S->getLabel()); 6879 if (!LD) 6880 return StmtError(); 6881 6882 // Goto statements must always be rebuilt, to resolve the label. 6883 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6884 cast<LabelDecl>(LD)); 6885 } 6886 6887 template<typename Derived> 6888 StmtResult 6889 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6890 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6891 if (Target.isInvalid()) 6892 return StmtError(); 6893 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6894 6895 if (!getDerived().AlwaysRebuild() && 6896 Target.get() == S->getTarget()) 6897 return S; 6898 6899 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6900 Target.get()); 6901 } 6902 6903 template<typename Derived> 6904 StmtResult 6905 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6906 return S; 6907 } 6908 6909 template<typename Derived> 6910 StmtResult 6911 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6912 return S; 6913 } 6914 6915 template<typename Derived> 6916 StmtResult 6917 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6918 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6919 /*NotCopyInit*/false); 6920 if (Result.isInvalid()) 6921 return StmtError(); 6922 6923 // FIXME: We always rebuild the return statement because there is no way 6924 // to tell whether the return type of the function has changed. 6925 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6926 } 6927 6928 template<typename Derived> 6929 StmtResult 6930 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6931 bool DeclChanged = false; 6932 SmallVector<Decl *, 4> Decls; 6933 for (auto *D : S->decls()) { 6934 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6935 if (!Transformed) 6936 return StmtError(); 6937 6938 if (Transformed != D) 6939 DeclChanged = true; 6940 6941 Decls.push_back(Transformed); 6942 } 6943 6944 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6945 return S; 6946 6947 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 6948 } 6949 6950 template<typename Derived> 6951 StmtResult 6952 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6953 6954 SmallVector<Expr*, 8> Constraints; 6955 SmallVector<Expr*, 8> Exprs; 6956 SmallVector<IdentifierInfo *, 4> Names; 6957 6958 ExprResult AsmString; 6959 SmallVector<Expr*, 8> Clobbers; 6960 6961 bool ExprsChanged = false; 6962 6963 // Go through the outputs. 6964 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6965 Names.push_back(S->getOutputIdentifier(I)); 6966 6967 // No need to transform the constraint literal. 6968 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6969 6970 // Transform the output expr. 6971 Expr *OutputExpr = S->getOutputExpr(I); 6972 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6973 if (Result.isInvalid()) 6974 return StmtError(); 6975 6976 ExprsChanged |= Result.get() != OutputExpr; 6977 6978 Exprs.push_back(Result.get()); 6979 } 6980 6981 // Go through the inputs. 6982 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6983 Names.push_back(S->getInputIdentifier(I)); 6984 6985 // No need to transform the constraint literal. 6986 Constraints.push_back(S->getInputConstraintLiteral(I)); 6987 6988 // Transform the input expr. 6989 Expr *InputExpr = S->getInputExpr(I); 6990 ExprResult Result = getDerived().TransformExpr(InputExpr); 6991 if (Result.isInvalid()) 6992 return StmtError(); 6993 6994 ExprsChanged |= Result.get() != InputExpr; 6995 6996 Exprs.push_back(Result.get()); 6997 } 6998 6999 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7000 return S; 7001 7002 // Go through the clobbers. 7003 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7004 Clobbers.push_back(S->getClobberStringLiteral(I)); 7005 7006 // No need to transform the asm string literal. 7007 AsmString = S->getAsmString(); 7008 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7009 S->isVolatile(), S->getNumOutputs(), 7010 S->getNumInputs(), Names.data(), 7011 Constraints, Exprs, AsmString.get(), 7012 Clobbers, S->getRParenLoc()); 7013 } 7014 7015 template<typename Derived> 7016 StmtResult 7017 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7018 ArrayRef<Token> AsmToks = 7019 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7020 7021 bool HadError = false, HadChange = false; 7022 7023 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7024 SmallVector<Expr*, 8> TransformedExprs; 7025 TransformedExprs.reserve(SrcExprs.size()); 7026 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7027 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7028 if (!Result.isUsable()) { 7029 HadError = true; 7030 } else { 7031 HadChange |= (Result.get() != SrcExprs[i]); 7032 TransformedExprs.push_back(Result.get()); 7033 } 7034 } 7035 7036 if (HadError) return StmtError(); 7037 if (!HadChange && !getDerived().AlwaysRebuild()) 7038 return Owned(S); 7039 7040 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7041 AsmToks, S->getAsmString(), 7042 S->getNumOutputs(), S->getNumInputs(), 7043 S->getAllConstraints(), S->getClobbers(), 7044 TransformedExprs, S->getEndLoc()); 7045 } 7046 7047 // C++ Coroutines TS 7048 7049 template<typename Derived> 7050 StmtResult 7051 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7052 auto *ScopeInfo = SemaRef.getCurFunction(); 7053 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7054 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7055 ScopeInfo->NeedsCoroutineSuspends && 7056 ScopeInfo->CoroutineSuspends.first == nullptr && 7057 ScopeInfo->CoroutineSuspends.second == nullptr && 7058 "expected clean scope info"); 7059 7060 // Set that we have (possibly-invalid) suspend points before we do anything 7061 // that may fail. 7062 ScopeInfo->setNeedsCoroutineSuspends(false); 7063 7064 // The new CoroutinePromise object needs to be built and put into the current 7065 // FunctionScopeInfo before any transformations or rebuilding occurs. 7066 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7067 return StmtError(); 7068 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7069 if (!Promise) 7070 return StmtError(); 7071 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 7072 ScopeInfo->CoroutinePromise = Promise; 7073 7074 // Transform the implicit coroutine statements we built during the initial 7075 // parse. 7076 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7077 if (InitSuspend.isInvalid()) 7078 return StmtError(); 7079 StmtResult FinalSuspend = 7080 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7081 if (FinalSuspend.isInvalid()) 7082 return StmtError(); 7083 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7084 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7085 7086 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7087 if (BodyRes.isInvalid()) 7088 return StmtError(); 7089 7090 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7091 if (Builder.isInvalid()) 7092 return StmtError(); 7093 7094 Expr *ReturnObject = S->getReturnValueInit(); 7095 assert(ReturnObject && "the return object is expected to be valid"); 7096 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7097 /*NoCopyInit*/ false); 7098 if (Res.isInvalid()) 7099 return StmtError(); 7100 Builder.ReturnValue = Res.get(); 7101 7102 if (S->hasDependentPromiseType()) { 7103 assert(!Promise->getType()->isDependentType() && 7104 "the promise type must no longer be dependent"); 7105 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7106 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7107 "these nodes should not have been built yet"); 7108 if (!Builder.buildDependentStatements()) 7109 return StmtError(); 7110 } else { 7111 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7112 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7113 if (Res.isInvalid()) 7114 return StmtError(); 7115 Builder.OnFallthrough = Res.get(); 7116 } 7117 7118 if (auto *OnException = S->getExceptionHandler()) { 7119 StmtResult Res = getDerived().TransformStmt(OnException); 7120 if (Res.isInvalid()) 7121 return StmtError(); 7122 Builder.OnException = Res.get(); 7123 } 7124 7125 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7126 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7127 if (Res.isInvalid()) 7128 return StmtError(); 7129 Builder.ReturnStmtOnAllocFailure = Res.get(); 7130 } 7131 7132 // Transform any additional statements we may have already built 7133 assert(S->getAllocate() && S->getDeallocate() && 7134 "allocation and deallocation calls must already be built"); 7135 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7136 if (AllocRes.isInvalid()) 7137 return StmtError(); 7138 Builder.Allocate = AllocRes.get(); 7139 7140 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7141 if (DeallocRes.isInvalid()) 7142 return StmtError(); 7143 Builder.Deallocate = DeallocRes.get(); 7144 7145 assert(S->getResultDecl() && "ResultDecl must already be built"); 7146 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7147 if (ResultDecl.isInvalid()) 7148 return StmtError(); 7149 Builder.ResultDecl = ResultDecl.get(); 7150 7151 if (auto *ReturnStmt = S->getReturnStmt()) { 7152 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7153 if (Res.isInvalid()) 7154 return StmtError(); 7155 Builder.ReturnStmt = Res.get(); 7156 } 7157 } 7158 7159 return getDerived().RebuildCoroutineBodyStmt(Builder); 7160 } 7161 7162 template<typename Derived> 7163 StmtResult 7164 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7165 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7166 /*NotCopyInit*/false); 7167 if (Result.isInvalid()) 7168 return StmtError(); 7169 7170 // Always rebuild; we don't know if this needs to be injected into a new 7171 // context or if the promise type has changed. 7172 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7173 S->isImplicit()); 7174 } 7175 7176 template<typename Derived> 7177 ExprResult 7178 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7179 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7180 /*NotCopyInit*/false); 7181 if (Result.isInvalid()) 7182 return ExprError(); 7183 7184 // Always rebuild; we don't know if this needs to be injected into a new 7185 // context or if the promise type has changed. 7186 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7187 E->isImplicit()); 7188 } 7189 7190 template <typename Derived> 7191 ExprResult 7192 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7193 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7194 /*NotCopyInit*/ false); 7195 if (OperandResult.isInvalid()) 7196 return ExprError(); 7197 7198 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7199 E->getOperatorCoawaitLookup()); 7200 7201 if (LookupResult.isInvalid()) 7202 return ExprError(); 7203 7204 // Always rebuild; we don't know if this needs to be injected into a new 7205 // context or if the promise type has changed. 7206 return getDerived().RebuildDependentCoawaitExpr( 7207 E->getKeywordLoc(), OperandResult.get(), 7208 cast<UnresolvedLookupExpr>(LookupResult.get())); 7209 } 7210 7211 template<typename Derived> 7212 ExprResult 7213 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7214 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7215 /*NotCopyInit*/false); 7216 if (Result.isInvalid()) 7217 return ExprError(); 7218 7219 // Always rebuild; we don't know if this needs to be injected into a new 7220 // context or if the promise type has changed. 7221 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7222 } 7223 7224 // Objective-C Statements. 7225 7226 template<typename Derived> 7227 StmtResult 7228 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7229 // Transform the body of the @try. 7230 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7231 if (TryBody.isInvalid()) 7232 return StmtError(); 7233 7234 // Transform the @catch statements (if present). 7235 bool AnyCatchChanged = false; 7236 SmallVector<Stmt*, 8> CatchStmts; 7237 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7238 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7239 if (Catch.isInvalid()) 7240 return StmtError(); 7241 if (Catch.get() != S->getCatchStmt(I)) 7242 AnyCatchChanged = true; 7243 CatchStmts.push_back(Catch.get()); 7244 } 7245 7246 // Transform the @finally statement (if present). 7247 StmtResult Finally; 7248 if (S->getFinallyStmt()) { 7249 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7250 if (Finally.isInvalid()) 7251 return StmtError(); 7252 } 7253 7254 // If nothing changed, just retain this statement. 7255 if (!getDerived().AlwaysRebuild() && 7256 TryBody.get() == S->getTryBody() && 7257 !AnyCatchChanged && 7258 Finally.get() == S->getFinallyStmt()) 7259 return S; 7260 7261 // Build a new statement. 7262 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7263 CatchStmts, Finally.get()); 7264 } 7265 7266 template<typename Derived> 7267 StmtResult 7268 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7269 // Transform the @catch parameter, if there is one. 7270 VarDecl *Var = nullptr; 7271 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7272 TypeSourceInfo *TSInfo = nullptr; 7273 if (FromVar->getTypeSourceInfo()) { 7274 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7275 if (!TSInfo) 7276 return StmtError(); 7277 } 7278 7279 QualType T; 7280 if (TSInfo) 7281 T = TSInfo->getType(); 7282 else { 7283 T = getDerived().TransformType(FromVar->getType()); 7284 if (T.isNull()) 7285 return StmtError(); 7286 } 7287 7288 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7289 if (!Var) 7290 return StmtError(); 7291 } 7292 7293 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7294 if (Body.isInvalid()) 7295 return StmtError(); 7296 7297 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7298 S->getRParenLoc(), 7299 Var, Body.get()); 7300 } 7301 7302 template<typename Derived> 7303 StmtResult 7304 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7305 // Transform the body. 7306 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7307 if (Body.isInvalid()) 7308 return StmtError(); 7309 7310 // If nothing changed, just retain this statement. 7311 if (!getDerived().AlwaysRebuild() && 7312 Body.get() == S->getFinallyBody()) 7313 return S; 7314 7315 // Build a new statement. 7316 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7317 Body.get()); 7318 } 7319 7320 template<typename Derived> 7321 StmtResult 7322 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7323 ExprResult Operand; 7324 if (S->getThrowExpr()) { 7325 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7326 if (Operand.isInvalid()) 7327 return StmtError(); 7328 } 7329 7330 if (!getDerived().AlwaysRebuild() && 7331 Operand.get() == S->getThrowExpr()) 7332 return S; 7333 7334 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7335 } 7336 7337 template<typename Derived> 7338 StmtResult 7339 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7340 ObjCAtSynchronizedStmt *S) { 7341 // Transform the object we are locking. 7342 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7343 if (Object.isInvalid()) 7344 return StmtError(); 7345 Object = 7346 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7347 Object.get()); 7348 if (Object.isInvalid()) 7349 return StmtError(); 7350 7351 // Transform the body. 7352 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7353 if (Body.isInvalid()) 7354 return StmtError(); 7355 7356 // If nothing change, just retain the current statement. 7357 if (!getDerived().AlwaysRebuild() && 7358 Object.get() == S->getSynchExpr() && 7359 Body.get() == S->getSynchBody()) 7360 return S; 7361 7362 // Build a new statement. 7363 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7364 Object.get(), Body.get()); 7365 } 7366 7367 template<typename Derived> 7368 StmtResult 7369 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7370 ObjCAutoreleasePoolStmt *S) { 7371 // Transform the body. 7372 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7373 if (Body.isInvalid()) 7374 return StmtError(); 7375 7376 // If nothing changed, just retain this statement. 7377 if (!getDerived().AlwaysRebuild() && 7378 Body.get() == S->getSubStmt()) 7379 return S; 7380 7381 // Build a new statement. 7382 return getDerived().RebuildObjCAutoreleasePoolStmt( 7383 S->getAtLoc(), Body.get()); 7384 } 7385 7386 template<typename Derived> 7387 StmtResult 7388 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7389 ObjCForCollectionStmt *S) { 7390 // Transform the element statement. 7391 StmtResult Element = 7392 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7393 if (Element.isInvalid()) 7394 return StmtError(); 7395 7396 // Transform the collection expression. 7397 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7398 if (Collection.isInvalid()) 7399 return StmtError(); 7400 7401 // Transform the body. 7402 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7403 if (Body.isInvalid()) 7404 return StmtError(); 7405 7406 // If nothing changed, just retain this statement. 7407 if (!getDerived().AlwaysRebuild() && 7408 Element.get() == S->getElement() && 7409 Collection.get() == S->getCollection() && 7410 Body.get() == S->getBody()) 7411 return S; 7412 7413 // Build a new statement. 7414 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7415 Element.get(), 7416 Collection.get(), 7417 S->getRParenLoc(), 7418 Body.get()); 7419 } 7420 7421 template <typename Derived> 7422 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7423 // Transform the exception declaration, if any. 7424 VarDecl *Var = nullptr; 7425 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7426 TypeSourceInfo *T = 7427 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7428 if (!T) 7429 return StmtError(); 7430 7431 Var = getDerived().RebuildExceptionDecl( 7432 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7433 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7434 if (!Var || Var->isInvalidDecl()) 7435 return StmtError(); 7436 } 7437 7438 // Transform the actual exception handler. 7439 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7440 if (Handler.isInvalid()) 7441 return StmtError(); 7442 7443 if (!getDerived().AlwaysRebuild() && !Var && 7444 Handler.get() == S->getHandlerBlock()) 7445 return S; 7446 7447 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7448 } 7449 7450 template <typename Derived> 7451 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7452 // Transform the try block itself. 7453 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7454 if (TryBlock.isInvalid()) 7455 return StmtError(); 7456 7457 // Transform the handlers. 7458 bool HandlerChanged = false; 7459 SmallVector<Stmt *, 8> Handlers; 7460 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7461 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7462 if (Handler.isInvalid()) 7463 return StmtError(); 7464 7465 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7466 Handlers.push_back(Handler.getAs<Stmt>()); 7467 } 7468 7469 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7470 !HandlerChanged) 7471 return S; 7472 7473 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7474 Handlers); 7475 } 7476 7477 template<typename Derived> 7478 StmtResult 7479 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7480 StmtResult Init = 7481 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7482 if (Init.isInvalid()) 7483 return StmtError(); 7484 7485 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7486 if (Range.isInvalid()) 7487 return StmtError(); 7488 7489 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7490 if (Begin.isInvalid()) 7491 return StmtError(); 7492 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7493 if (End.isInvalid()) 7494 return StmtError(); 7495 7496 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7497 if (Cond.isInvalid()) 7498 return StmtError(); 7499 if (Cond.get()) 7500 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7501 if (Cond.isInvalid()) 7502 return StmtError(); 7503 if (Cond.get()) 7504 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7505 7506 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7507 if (Inc.isInvalid()) 7508 return StmtError(); 7509 if (Inc.get()) 7510 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7511 7512 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7513 if (LoopVar.isInvalid()) 7514 return StmtError(); 7515 7516 StmtResult NewStmt = S; 7517 if (getDerived().AlwaysRebuild() || 7518 Init.get() != S->getInit() || 7519 Range.get() != S->getRangeStmt() || 7520 Begin.get() != S->getBeginStmt() || 7521 End.get() != S->getEndStmt() || 7522 Cond.get() != S->getCond() || 7523 Inc.get() != S->getInc() || 7524 LoopVar.get() != S->getLoopVarStmt()) { 7525 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7526 S->getCoawaitLoc(), Init.get(), 7527 S->getColonLoc(), Range.get(), 7528 Begin.get(), End.get(), 7529 Cond.get(), 7530 Inc.get(), LoopVar.get(), 7531 S->getRParenLoc()); 7532 if (NewStmt.isInvalid()) 7533 return StmtError(); 7534 } 7535 7536 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7537 if (Body.isInvalid()) 7538 return StmtError(); 7539 7540 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7541 // it now so we have a new statement to attach the body to. 7542 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7543 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7544 S->getCoawaitLoc(), Init.get(), 7545 S->getColonLoc(), Range.get(), 7546 Begin.get(), End.get(), 7547 Cond.get(), 7548 Inc.get(), LoopVar.get(), 7549 S->getRParenLoc()); 7550 if (NewStmt.isInvalid()) 7551 return StmtError(); 7552 } 7553 7554 if (NewStmt.get() == S) 7555 return S; 7556 7557 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7558 } 7559 7560 template<typename Derived> 7561 StmtResult 7562 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7563 MSDependentExistsStmt *S) { 7564 // Transform the nested-name-specifier, if any. 7565 NestedNameSpecifierLoc QualifierLoc; 7566 if (S->getQualifierLoc()) { 7567 QualifierLoc 7568 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7569 if (!QualifierLoc) 7570 return StmtError(); 7571 } 7572 7573 // Transform the declaration name. 7574 DeclarationNameInfo NameInfo = S->getNameInfo(); 7575 if (NameInfo.getName()) { 7576 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7577 if (!NameInfo.getName()) 7578 return StmtError(); 7579 } 7580 7581 // Check whether anything changed. 7582 if (!getDerived().AlwaysRebuild() && 7583 QualifierLoc == S->getQualifierLoc() && 7584 NameInfo.getName() == S->getNameInfo().getName()) 7585 return S; 7586 7587 // Determine whether this name exists, if we can. 7588 CXXScopeSpec SS; 7589 SS.Adopt(QualifierLoc); 7590 bool Dependent = false; 7591 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7592 case Sema::IER_Exists: 7593 if (S->isIfExists()) 7594 break; 7595 7596 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7597 7598 case Sema::IER_DoesNotExist: 7599 if (S->isIfNotExists()) 7600 break; 7601 7602 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7603 7604 case Sema::IER_Dependent: 7605 Dependent = true; 7606 break; 7607 7608 case Sema::IER_Error: 7609 return StmtError(); 7610 } 7611 7612 // We need to continue with the instantiation, so do so now. 7613 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7614 if (SubStmt.isInvalid()) 7615 return StmtError(); 7616 7617 // If we have resolved the name, just transform to the substatement. 7618 if (!Dependent) 7619 return SubStmt; 7620 7621 // The name is still dependent, so build a dependent expression again. 7622 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7623 S->isIfExists(), 7624 QualifierLoc, 7625 NameInfo, 7626 SubStmt.get()); 7627 } 7628 7629 template<typename Derived> 7630 ExprResult 7631 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7632 NestedNameSpecifierLoc QualifierLoc; 7633 if (E->getQualifierLoc()) { 7634 QualifierLoc 7635 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7636 if (!QualifierLoc) 7637 return ExprError(); 7638 } 7639 7640 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7641 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7642 if (!PD) 7643 return ExprError(); 7644 7645 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7646 if (Base.isInvalid()) 7647 return ExprError(); 7648 7649 return new (SemaRef.getASTContext()) 7650 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7651 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7652 QualifierLoc, E->getMemberLoc()); 7653 } 7654 7655 template <typename Derived> 7656 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7657 MSPropertySubscriptExpr *E) { 7658 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7659 if (BaseRes.isInvalid()) 7660 return ExprError(); 7661 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7662 if (IdxRes.isInvalid()) 7663 return ExprError(); 7664 7665 if (!getDerived().AlwaysRebuild() && 7666 BaseRes.get() == E->getBase() && 7667 IdxRes.get() == E->getIdx()) 7668 return E; 7669 7670 return getDerived().RebuildArraySubscriptExpr( 7671 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7672 } 7673 7674 template <typename Derived> 7675 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7676 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7677 if (TryBlock.isInvalid()) 7678 return StmtError(); 7679 7680 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7681 if (Handler.isInvalid()) 7682 return StmtError(); 7683 7684 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7685 Handler.get() == S->getHandler()) 7686 return S; 7687 7688 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7689 TryBlock.get(), Handler.get()); 7690 } 7691 7692 template <typename Derived> 7693 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7694 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7695 if (Block.isInvalid()) 7696 return StmtError(); 7697 7698 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7699 } 7700 7701 template <typename Derived> 7702 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7703 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7704 if (FilterExpr.isInvalid()) 7705 return StmtError(); 7706 7707 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7708 if (Block.isInvalid()) 7709 return StmtError(); 7710 7711 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7712 Block.get()); 7713 } 7714 7715 template <typename Derived> 7716 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7717 if (isa<SEHFinallyStmt>(Handler)) 7718 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7719 else 7720 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7721 } 7722 7723 template<typename Derived> 7724 StmtResult 7725 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7726 return S; 7727 } 7728 7729 //===----------------------------------------------------------------------===// 7730 // OpenMP directive transformation 7731 //===----------------------------------------------------------------------===// 7732 template <typename Derived> 7733 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7734 OMPExecutableDirective *D) { 7735 7736 // Transform the clauses 7737 llvm::SmallVector<OMPClause *, 16> TClauses; 7738 ArrayRef<OMPClause *> Clauses = D->clauses(); 7739 TClauses.reserve(Clauses.size()); 7740 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7741 I != E; ++I) { 7742 if (*I) { 7743 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7744 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7745 getDerived().getSema().EndOpenMPClause(); 7746 if (Clause) 7747 TClauses.push_back(Clause); 7748 } else { 7749 TClauses.push_back(nullptr); 7750 } 7751 } 7752 StmtResult AssociatedStmt; 7753 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7754 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7755 /*CurScope=*/nullptr); 7756 StmtResult Body; 7757 { 7758 Sema::CompoundScopeRAII CompoundScope(getSema()); 7759 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 7760 Body = getDerived().TransformStmt(CS); 7761 } 7762 AssociatedStmt = 7763 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7764 if (AssociatedStmt.isInvalid()) { 7765 return StmtError(); 7766 } 7767 } 7768 if (TClauses.size() != Clauses.size()) { 7769 return StmtError(); 7770 } 7771 7772 // Transform directive name for 'omp critical' directive. 7773 DeclarationNameInfo DirName; 7774 if (D->getDirectiveKind() == OMPD_critical) { 7775 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7776 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7777 } 7778 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7779 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7780 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7781 } else if (D->getDirectiveKind() == OMPD_cancel) { 7782 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7783 } 7784 7785 return getDerived().RebuildOMPExecutableDirective( 7786 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7787 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 7788 } 7789 7790 template <typename Derived> 7791 StmtResult 7792 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7793 DeclarationNameInfo DirName; 7794 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7795 D->getBeginLoc()); 7796 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7797 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7798 return Res; 7799 } 7800 7801 template <typename Derived> 7802 StmtResult 7803 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7804 DeclarationNameInfo DirName; 7805 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7806 D->getBeginLoc()); 7807 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7808 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7809 return Res; 7810 } 7811 7812 template <typename Derived> 7813 StmtResult 7814 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7815 DeclarationNameInfo DirName; 7816 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7817 D->getBeginLoc()); 7818 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7819 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7820 return Res; 7821 } 7822 7823 template <typename Derived> 7824 StmtResult 7825 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7826 DeclarationNameInfo DirName; 7827 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7828 D->getBeginLoc()); 7829 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7830 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7831 return Res; 7832 } 7833 7834 template <typename Derived> 7835 StmtResult 7836 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7837 DeclarationNameInfo DirName; 7838 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7839 D->getBeginLoc()); 7840 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7841 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7842 return Res; 7843 } 7844 7845 template <typename Derived> 7846 StmtResult 7847 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7848 DeclarationNameInfo DirName; 7849 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7850 D->getBeginLoc()); 7851 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7852 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7853 return Res; 7854 } 7855 7856 template <typename Derived> 7857 StmtResult 7858 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7859 DeclarationNameInfo DirName; 7860 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7861 D->getBeginLoc()); 7862 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7863 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7864 return Res; 7865 } 7866 7867 template <typename Derived> 7868 StmtResult 7869 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7870 DeclarationNameInfo DirName; 7871 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7872 D->getBeginLoc()); 7873 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7874 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7875 return Res; 7876 } 7877 7878 template <typename Derived> 7879 StmtResult 7880 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7881 getDerived().getSema().StartOpenMPDSABlock( 7882 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 7883 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7884 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7885 return Res; 7886 } 7887 7888 template <typename Derived> 7889 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7890 OMPParallelForDirective *D) { 7891 DeclarationNameInfo DirName; 7892 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7893 nullptr, D->getBeginLoc()); 7894 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7895 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7896 return Res; 7897 } 7898 7899 template <typename Derived> 7900 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7901 OMPParallelForSimdDirective *D) { 7902 DeclarationNameInfo DirName; 7903 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7904 nullptr, D->getBeginLoc()); 7905 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7906 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7907 return Res; 7908 } 7909 7910 template <typename Derived> 7911 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7912 OMPParallelSectionsDirective *D) { 7913 DeclarationNameInfo DirName; 7914 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7915 nullptr, D->getBeginLoc()); 7916 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7917 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7918 return Res; 7919 } 7920 7921 template <typename Derived> 7922 StmtResult 7923 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7924 DeclarationNameInfo DirName; 7925 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7926 D->getBeginLoc()); 7927 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7928 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7929 return Res; 7930 } 7931 7932 template <typename Derived> 7933 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7934 OMPTaskyieldDirective *D) { 7935 DeclarationNameInfo DirName; 7936 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7937 D->getBeginLoc()); 7938 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7939 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7940 return Res; 7941 } 7942 7943 template <typename Derived> 7944 StmtResult 7945 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7946 DeclarationNameInfo DirName; 7947 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7948 D->getBeginLoc()); 7949 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7950 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7951 return Res; 7952 } 7953 7954 template <typename Derived> 7955 StmtResult 7956 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7957 DeclarationNameInfo DirName; 7958 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7959 D->getBeginLoc()); 7960 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7961 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7962 return Res; 7963 } 7964 7965 template <typename Derived> 7966 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7967 OMPTaskgroupDirective *D) { 7968 DeclarationNameInfo DirName; 7969 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7970 D->getBeginLoc()); 7971 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7972 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7973 return Res; 7974 } 7975 7976 template <typename Derived> 7977 StmtResult 7978 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7979 DeclarationNameInfo DirName; 7980 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7981 D->getBeginLoc()); 7982 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7983 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7984 return Res; 7985 } 7986 7987 template <typename Derived> 7988 StmtResult 7989 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7990 DeclarationNameInfo DirName; 7991 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7992 D->getBeginLoc()); 7993 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7994 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7995 return Res; 7996 } 7997 7998 template <typename Derived> 7999 StmtResult 8000 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8001 DeclarationNameInfo DirName; 8002 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8003 D->getBeginLoc()); 8004 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8005 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8006 return Res; 8007 } 8008 8009 template <typename Derived> 8010 StmtResult 8011 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8012 DeclarationNameInfo DirName; 8013 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8014 D->getBeginLoc()); 8015 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8016 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8017 return Res; 8018 } 8019 8020 template <typename Derived> 8021 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8022 OMPTargetDataDirective *D) { 8023 DeclarationNameInfo DirName; 8024 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8025 D->getBeginLoc()); 8026 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8027 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8028 return Res; 8029 } 8030 8031 template <typename Derived> 8032 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8033 OMPTargetEnterDataDirective *D) { 8034 DeclarationNameInfo DirName; 8035 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8036 nullptr, D->getBeginLoc()); 8037 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8038 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8039 return Res; 8040 } 8041 8042 template <typename Derived> 8043 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8044 OMPTargetExitDataDirective *D) { 8045 DeclarationNameInfo DirName; 8046 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8047 nullptr, D->getBeginLoc()); 8048 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8049 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8050 return Res; 8051 } 8052 8053 template <typename Derived> 8054 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8055 OMPTargetParallelDirective *D) { 8056 DeclarationNameInfo DirName; 8057 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8058 nullptr, D->getBeginLoc()); 8059 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8060 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8061 return Res; 8062 } 8063 8064 template <typename Derived> 8065 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8066 OMPTargetParallelForDirective *D) { 8067 DeclarationNameInfo DirName; 8068 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8069 nullptr, D->getBeginLoc()); 8070 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8071 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8072 return Res; 8073 } 8074 8075 template <typename Derived> 8076 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8077 OMPTargetUpdateDirective *D) { 8078 DeclarationNameInfo DirName; 8079 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8080 nullptr, D->getBeginLoc()); 8081 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8082 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8083 return Res; 8084 } 8085 8086 template <typename Derived> 8087 StmtResult 8088 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8089 DeclarationNameInfo DirName; 8090 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8091 D->getBeginLoc()); 8092 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8093 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8094 return Res; 8095 } 8096 8097 template <typename Derived> 8098 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8099 OMPCancellationPointDirective *D) { 8100 DeclarationNameInfo DirName; 8101 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8102 nullptr, D->getBeginLoc()); 8103 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8104 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8105 return Res; 8106 } 8107 8108 template <typename Derived> 8109 StmtResult 8110 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8111 DeclarationNameInfo DirName; 8112 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8113 D->getBeginLoc()); 8114 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8115 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8116 return Res; 8117 } 8118 8119 template <typename Derived> 8120 StmtResult 8121 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8122 DeclarationNameInfo DirName; 8123 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8124 D->getBeginLoc()); 8125 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8126 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8127 return Res; 8128 } 8129 8130 template <typename Derived> 8131 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8132 OMPTaskLoopSimdDirective *D) { 8133 DeclarationNameInfo DirName; 8134 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8135 nullptr, D->getBeginLoc()); 8136 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8137 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8138 return Res; 8139 } 8140 8141 template <typename Derived> 8142 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8143 OMPDistributeDirective *D) { 8144 DeclarationNameInfo DirName; 8145 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8146 D->getBeginLoc()); 8147 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8148 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8149 return Res; 8150 } 8151 8152 template <typename Derived> 8153 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8154 OMPDistributeParallelForDirective *D) { 8155 DeclarationNameInfo DirName; 8156 getDerived().getSema().StartOpenMPDSABlock( 8157 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8158 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8159 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8160 return Res; 8161 } 8162 8163 template <typename Derived> 8164 StmtResult 8165 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8166 OMPDistributeParallelForSimdDirective *D) { 8167 DeclarationNameInfo DirName; 8168 getDerived().getSema().StartOpenMPDSABlock( 8169 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8170 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8171 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8172 return Res; 8173 } 8174 8175 template <typename Derived> 8176 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8177 OMPDistributeSimdDirective *D) { 8178 DeclarationNameInfo DirName; 8179 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8180 nullptr, D->getBeginLoc()); 8181 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8182 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8183 return Res; 8184 } 8185 8186 template <typename Derived> 8187 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8188 OMPTargetParallelForSimdDirective *D) { 8189 DeclarationNameInfo DirName; 8190 getDerived().getSema().StartOpenMPDSABlock( 8191 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8192 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8193 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8194 return Res; 8195 } 8196 8197 template <typename Derived> 8198 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8199 OMPTargetSimdDirective *D) { 8200 DeclarationNameInfo DirName; 8201 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8202 D->getBeginLoc()); 8203 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8204 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8205 return Res; 8206 } 8207 8208 template <typename Derived> 8209 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8210 OMPTeamsDistributeDirective *D) { 8211 DeclarationNameInfo DirName; 8212 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8213 nullptr, D->getBeginLoc()); 8214 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8215 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8216 return Res; 8217 } 8218 8219 template <typename Derived> 8220 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8221 OMPTeamsDistributeSimdDirective *D) { 8222 DeclarationNameInfo DirName; 8223 getDerived().getSema().StartOpenMPDSABlock( 8224 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8225 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8226 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8227 return Res; 8228 } 8229 8230 template <typename Derived> 8231 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8232 OMPTeamsDistributeParallelForSimdDirective *D) { 8233 DeclarationNameInfo DirName; 8234 getDerived().getSema().StartOpenMPDSABlock( 8235 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8236 D->getBeginLoc()); 8237 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8238 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8239 return Res; 8240 } 8241 8242 template <typename Derived> 8243 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8244 OMPTeamsDistributeParallelForDirective *D) { 8245 DeclarationNameInfo DirName; 8246 getDerived().getSema().StartOpenMPDSABlock( 8247 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8248 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8249 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8250 return Res; 8251 } 8252 8253 template <typename Derived> 8254 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8255 OMPTargetTeamsDirective *D) { 8256 DeclarationNameInfo DirName; 8257 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8258 nullptr, D->getBeginLoc()); 8259 auto Res = getDerived().TransformOMPExecutableDirective(D); 8260 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8261 return Res; 8262 } 8263 8264 template <typename Derived> 8265 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8266 OMPTargetTeamsDistributeDirective *D) { 8267 DeclarationNameInfo DirName; 8268 getDerived().getSema().StartOpenMPDSABlock( 8269 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8270 auto Res = getDerived().TransformOMPExecutableDirective(D); 8271 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8272 return Res; 8273 } 8274 8275 template <typename Derived> 8276 StmtResult 8277 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8278 OMPTargetTeamsDistributeParallelForDirective *D) { 8279 DeclarationNameInfo DirName; 8280 getDerived().getSema().StartOpenMPDSABlock( 8281 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8282 D->getBeginLoc()); 8283 auto Res = getDerived().TransformOMPExecutableDirective(D); 8284 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8285 return Res; 8286 } 8287 8288 template <typename Derived> 8289 StmtResult TreeTransform<Derived>:: 8290 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8291 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8292 DeclarationNameInfo DirName; 8293 getDerived().getSema().StartOpenMPDSABlock( 8294 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8295 D->getBeginLoc()); 8296 auto Res = getDerived().TransformOMPExecutableDirective(D); 8297 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8298 return Res; 8299 } 8300 8301 template <typename Derived> 8302 StmtResult 8303 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8304 OMPTargetTeamsDistributeSimdDirective *D) { 8305 DeclarationNameInfo DirName; 8306 getDerived().getSema().StartOpenMPDSABlock( 8307 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8308 auto Res = getDerived().TransformOMPExecutableDirective(D); 8309 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8310 return Res; 8311 } 8312 8313 8314 //===----------------------------------------------------------------------===// 8315 // OpenMP clause transformation 8316 //===----------------------------------------------------------------------===// 8317 template <typename Derived> 8318 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8319 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8320 if (Cond.isInvalid()) 8321 return nullptr; 8322 return getDerived().RebuildOMPIfClause( 8323 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8324 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8325 } 8326 8327 template <typename Derived> 8328 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8329 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8330 if (Cond.isInvalid()) 8331 return nullptr; 8332 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8333 C->getLParenLoc(), C->getEndLoc()); 8334 } 8335 8336 template <typename Derived> 8337 OMPClause * 8338 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8339 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8340 if (NumThreads.isInvalid()) 8341 return nullptr; 8342 return getDerived().RebuildOMPNumThreadsClause( 8343 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8344 } 8345 8346 template <typename Derived> 8347 OMPClause * 8348 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8349 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8350 if (E.isInvalid()) 8351 return nullptr; 8352 return getDerived().RebuildOMPSafelenClause( 8353 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8354 } 8355 8356 template <typename Derived> 8357 OMPClause * 8358 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 8359 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 8360 if (E.isInvalid()) 8361 return nullptr; 8362 return getDerived().RebuildOMPAllocatorClause( 8363 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8364 } 8365 8366 template <typename Derived> 8367 OMPClause * 8368 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8369 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8370 if (E.isInvalid()) 8371 return nullptr; 8372 return getDerived().RebuildOMPSimdlenClause( 8373 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8374 } 8375 8376 template <typename Derived> 8377 OMPClause * 8378 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8379 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8380 if (E.isInvalid()) 8381 return nullptr; 8382 return getDerived().RebuildOMPCollapseClause( 8383 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8384 } 8385 8386 template <typename Derived> 8387 OMPClause * 8388 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8389 return getDerived().RebuildOMPDefaultClause( 8390 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8391 C->getLParenLoc(), C->getEndLoc()); 8392 } 8393 8394 template <typename Derived> 8395 OMPClause * 8396 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8397 return getDerived().RebuildOMPProcBindClause( 8398 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8399 C->getLParenLoc(), C->getEndLoc()); 8400 } 8401 8402 template <typename Derived> 8403 OMPClause * 8404 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8405 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8406 if (E.isInvalid()) 8407 return nullptr; 8408 return getDerived().RebuildOMPScheduleClause( 8409 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8410 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8411 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8412 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8413 } 8414 8415 template <typename Derived> 8416 OMPClause * 8417 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8418 ExprResult E; 8419 if (auto *Num = C->getNumForLoops()) { 8420 E = getDerived().TransformExpr(Num); 8421 if (E.isInvalid()) 8422 return nullptr; 8423 } 8424 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8425 C->getLParenLoc(), E.get()); 8426 } 8427 8428 template <typename Derived> 8429 OMPClause * 8430 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8431 // No need to rebuild this clause, no template-dependent parameters. 8432 return C; 8433 } 8434 8435 template <typename Derived> 8436 OMPClause * 8437 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8438 // No need to rebuild this clause, no template-dependent parameters. 8439 return C; 8440 } 8441 8442 template <typename Derived> 8443 OMPClause * 8444 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8445 // No need to rebuild this clause, no template-dependent parameters. 8446 return C; 8447 } 8448 8449 template <typename Derived> 8450 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8451 // No need to rebuild this clause, no template-dependent parameters. 8452 return C; 8453 } 8454 8455 template <typename Derived> 8456 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8457 // No need to rebuild this clause, no template-dependent parameters. 8458 return C; 8459 } 8460 8461 template <typename Derived> 8462 OMPClause * 8463 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8464 // No need to rebuild this clause, no template-dependent parameters. 8465 return C; 8466 } 8467 8468 template <typename Derived> 8469 OMPClause * 8470 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8471 // No need to rebuild this clause, no template-dependent parameters. 8472 return C; 8473 } 8474 8475 template <typename Derived> 8476 OMPClause * 8477 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8478 // No need to rebuild this clause, no template-dependent parameters. 8479 return C; 8480 } 8481 8482 template <typename Derived> 8483 OMPClause * 8484 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8485 // No need to rebuild this clause, no template-dependent parameters. 8486 return C; 8487 } 8488 8489 template <typename Derived> 8490 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8491 // No need to rebuild this clause, no template-dependent parameters. 8492 return C; 8493 } 8494 8495 template <typename Derived> 8496 OMPClause * 8497 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8498 // No need to rebuild this clause, no template-dependent parameters. 8499 return C; 8500 } 8501 8502 template <typename Derived> 8503 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8504 OMPUnifiedAddressClause *C) { 8505 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8506 } 8507 8508 template <typename Derived> 8509 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8510 OMPUnifiedSharedMemoryClause *C) { 8511 llvm_unreachable( 8512 "unified_shared_memory clause cannot appear in dependent context"); 8513 } 8514 8515 template <typename Derived> 8516 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8517 OMPReverseOffloadClause *C) { 8518 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8519 } 8520 8521 template <typename Derived> 8522 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8523 OMPDynamicAllocatorsClause *C) { 8524 llvm_unreachable( 8525 "dynamic_allocators clause cannot appear in dependent context"); 8526 } 8527 8528 template <typename Derived> 8529 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 8530 OMPAtomicDefaultMemOrderClause *C) { 8531 llvm_unreachable( 8532 "atomic_default_mem_order clause cannot appear in dependent context"); 8533 } 8534 8535 template <typename Derived> 8536 OMPClause * 8537 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8538 llvm::SmallVector<Expr *, 16> Vars; 8539 Vars.reserve(C->varlist_size()); 8540 for (auto *VE : C->varlists()) { 8541 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8542 if (EVar.isInvalid()) 8543 return nullptr; 8544 Vars.push_back(EVar.get()); 8545 } 8546 return getDerived().RebuildOMPPrivateClause( 8547 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8548 } 8549 8550 template <typename Derived> 8551 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8552 OMPFirstprivateClause *C) { 8553 llvm::SmallVector<Expr *, 16> Vars; 8554 Vars.reserve(C->varlist_size()); 8555 for (auto *VE : C->varlists()) { 8556 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8557 if (EVar.isInvalid()) 8558 return nullptr; 8559 Vars.push_back(EVar.get()); 8560 } 8561 return getDerived().RebuildOMPFirstprivateClause( 8562 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8563 } 8564 8565 template <typename Derived> 8566 OMPClause * 8567 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8568 llvm::SmallVector<Expr *, 16> Vars; 8569 Vars.reserve(C->varlist_size()); 8570 for (auto *VE : C->varlists()) { 8571 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8572 if (EVar.isInvalid()) 8573 return nullptr; 8574 Vars.push_back(EVar.get()); 8575 } 8576 return getDerived().RebuildOMPLastprivateClause( 8577 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8578 } 8579 8580 template <typename Derived> 8581 OMPClause * 8582 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8583 llvm::SmallVector<Expr *, 16> Vars; 8584 Vars.reserve(C->varlist_size()); 8585 for (auto *VE : C->varlists()) { 8586 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8587 if (EVar.isInvalid()) 8588 return nullptr; 8589 Vars.push_back(EVar.get()); 8590 } 8591 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8592 C->getLParenLoc(), C->getEndLoc()); 8593 } 8594 8595 template <typename Derived> 8596 OMPClause * 8597 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8598 llvm::SmallVector<Expr *, 16> Vars; 8599 Vars.reserve(C->varlist_size()); 8600 for (auto *VE : C->varlists()) { 8601 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8602 if (EVar.isInvalid()) 8603 return nullptr; 8604 Vars.push_back(EVar.get()); 8605 } 8606 CXXScopeSpec ReductionIdScopeSpec; 8607 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8608 8609 DeclarationNameInfo NameInfo = C->getNameInfo(); 8610 if (NameInfo.getName()) { 8611 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8612 if (!NameInfo.getName()) 8613 return nullptr; 8614 } 8615 // Build a list of all UDR decls with the same names ranged by the Scopes. 8616 // The Scope boundary is a duplication of the previous decl. 8617 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8618 for (auto *E : C->reduction_ops()) { 8619 // Transform all the decls. 8620 if (E) { 8621 auto *ULE = cast<UnresolvedLookupExpr>(E); 8622 UnresolvedSet<8> Decls; 8623 for (auto *D : ULE->decls()) { 8624 NamedDecl *InstD = 8625 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8626 Decls.addDecl(InstD, InstD->getAccess()); 8627 } 8628 UnresolvedReductions.push_back( 8629 UnresolvedLookupExpr::Create( 8630 SemaRef.Context, /*NamingClass=*/nullptr, 8631 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8632 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8633 Decls.begin(), Decls.end())); 8634 } else 8635 UnresolvedReductions.push_back(nullptr); 8636 } 8637 return getDerived().RebuildOMPReductionClause( 8638 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8639 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8640 } 8641 8642 template <typename Derived> 8643 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8644 OMPTaskReductionClause *C) { 8645 llvm::SmallVector<Expr *, 16> Vars; 8646 Vars.reserve(C->varlist_size()); 8647 for (auto *VE : C->varlists()) { 8648 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8649 if (EVar.isInvalid()) 8650 return nullptr; 8651 Vars.push_back(EVar.get()); 8652 } 8653 CXXScopeSpec ReductionIdScopeSpec; 8654 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8655 8656 DeclarationNameInfo NameInfo = C->getNameInfo(); 8657 if (NameInfo.getName()) { 8658 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8659 if (!NameInfo.getName()) 8660 return nullptr; 8661 } 8662 // Build a list of all UDR decls with the same names ranged by the Scopes. 8663 // The Scope boundary is a duplication of the previous decl. 8664 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8665 for (auto *E : C->reduction_ops()) { 8666 // Transform all the decls. 8667 if (E) { 8668 auto *ULE = cast<UnresolvedLookupExpr>(E); 8669 UnresolvedSet<8> Decls; 8670 for (auto *D : ULE->decls()) { 8671 NamedDecl *InstD = 8672 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8673 Decls.addDecl(InstD, InstD->getAccess()); 8674 } 8675 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8676 SemaRef.Context, /*NamingClass=*/nullptr, 8677 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8678 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8679 } else 8680 UnresolvedReductions.push_back(nullptr); 8681 } 8682 return getDerived().RebuildOMPTaskReductionClause( 8683 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8684 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8685 } 8686 8687 template <typename Derived> 8688 OMPClause * 8689 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 8690 llvm::SmallVector<Expr *, 16> Vars; 8691 Vars.reserve(C->varlist_size()); 8692 for (auto *VE : C->varlists()) { 8693 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8694 if (EVar.isInvalid()) 8695 return nullptr; 8696 Vars.push_back(EVar.get()); 8697 } 8698 CXXScopeSpec ReductionIdScopeSpec; 8699 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8700 8701 DeclarationNameInfo NameInfo = C->getNameInfo(); 8702 if (NameInfo.getName()) { 8703 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8704 if (!NameInfo.getName()) 8705 return nullptr; 8706 } 8707 // Build a list of all UDR decls with the same names ranged by the Scopes. 8708 // The Scope boundary is a duplication of the previous decl. 8709 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8710 for (auto *E : C->reduction_ops()) { 8711 // Transform all the decls. 8712 if (E) { 8713 auto *ULE = cast<UnresolvedLookupExpr>(E); 8714 UnresolvedSet<8> Decls; 8715 for (auto *D : ULE->decls()) { 8716 NamedDecl *InstD = 8717 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8718 Decls.addDecl(InstD, InstD->getAccess()); 8719 } 8720 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8721 SemaRef.Context, /*NamingClass=*/nullptr, 8722 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8723 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8724 } else 8725 UnresolvedReductions.push_back(nullptr); 8726 } 8727 return getDerived().RebuildOMPInReductionClause( 8728 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8729 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8730 } 8731 8732 template <typename Derived> 8733 OMPClause * 8734 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8735 llvm::SmallVector<Expr *, 16> Vars; 8736 Vars.reserve(C->varlist_size()); 8737 for (auto *VE : C->varlists()) { 8738 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8739 if (EVar.isInvalid()) 8740 return nullptr; 8741 Vars.push_back(EVar.get()); 8742 } 8743 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8744 if (Step.isInvalid()) 8745 return nullptr; 8746 return getDerived().RebuildOMPLinearClause( 8747 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 8748 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8749 } 8750 8751 template <typename Derived> 8752 OMPClause * 8753 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8754 llvm::SmallVector<Expr *, 16> Vars; 8755 Vars.reserve(C->varlist_size()); 8756 for (auto *VE : C->varlists()) { 8757 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8758 if (EVar.isInvalid()) 8759 return nullptr; 8760 Vars.push_back(EVar.get()); 8761 } 8762 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8763 if (Alignment.isInvalid()) 8764 return nullptr; 8765 return getDerived().RebuildOMPAlignedClause( 8766 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 8767 C->getColonLoc(), C->getEndLoc()); 8768 } 8769 8770 template <typename Derived> 8771 OMPClause * 8772 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8773 llvm::SmallVector<Expr *, 16> Vars; 8774 Vars.reserve(C->varlist_size()); 8775 for (auto *VE : C->varlists()) { 8776 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8777 if (EVar.isInvalid()) 8778 return nullptr; 8779 Vars.push_back(EVar.get()); 8780 } 8781 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 8782 C->getLParenLoc(), C->getEndLoc()); 8783 } 8784 8785 template <typename Derived> 8786 OMPClause * 8787 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8788 llvm::SmallVector<Expr *, 16> Vars; 8789 Vars.reserve(C->varlist_size()); 8790 for (auto *VE : C->varlists()) { 8791 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8792 if (EVar.isInvalid()) 8793 return nullptr; 8794 Vars.push_back(EVar.get()); 8795 } 8796 return getDerived().RebuildOMPCopyprivateClause( 8797 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8798 } 8799 8800 template <typename Derived> 8801 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8802 llvm::SmallVector<Expr *, 16> Vars; 8803 Vars.reserve(C->varlist_size()); 8804 for (auto *VE : C->varlists()) { 8805 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8806 if (EVar.isInvalid()) 8807 return nullptr; 8808 Vars.push_back(EVar.get()); 8809 } 8810 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 8811 C->getLParenLoc(), C->getEndLoc()); 8812 } 8813 8814 template <typename Derived> 8815 OMPClause * 8816 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8817 llvm::SmallVector<Expr *, 16> Vars; 8818 Vars.reserve(C->varlist_size()); 8819 for (auto *VE : C->varlists()) { 8820 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8821 if (EVar.isInvalid()) 8822 return nullptr; 8823 Vars.push_back(EVar.get()); 8824 } 8825 return getDerived().RebuildOMPDependClause( 8826 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8827 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8828 } 8829 8830 template <typename Derived> 8831 OMPClause * 8832 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8833 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8834 if (E.isInvalid()) 8835 return nullptr; 8836 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 8837 C->getLParenLoc(), C->getEndLoc()); 8838 } 8839 8840 template <typename Derived, class T> 8841 bool transformOMPMappableExprListClause( 8842 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 8843 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 8844 DeclarationNameInfo &MapperIdInfo, 8845 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 8846 // Transform expressions in the list. 8847 Vars.reserve(C->varlist_size()); 8848 for (auto *VE : C->varlists()) { 8849 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 8850 if (EVar.isInvalid()) 8851 return true; 8852 Vars.push_back(EVar.get()); 8853 } 8854 // Transform mapper scope specifier and identifier. 8855 NestedNameSpecifierLoc QualifierLoc; 8856 if (C->getMapperQualifierLoc()) { 8857 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 8858 C->getMapperQualifierLoc()); 8859 if (!QualifierLoc) 8860 return true; 8861 } 8862 MapperIdScopeSpec.Adopt(QualifierLoc); 8863 MapperIdInfo = C->getMapperIdInfo(); 8864 if (MapperIdInfo.getName()) { 8865 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 8866 if (!MapperIdInfo.getName()) 8867 return true; 8868 } 8869 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 8870 // the previous user-defined mapper lookup in dependent environment. 8871 for (auto *E : C->mapperlists()) { 8872 // Transform all the decls. 8873 if (E) { 8874 auto *ULE = cast<UnresolvedLookupExpr>(E); 8875 UnresolvedSet<8> Decls; 8876 for (auto *D : ULE->decls()) { 8877 NamedDecl *InstD = 8878 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 8879 Decls.addDecl(InstD, InstD->getAccess()); 8880 } 8881 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 8882 TT.getSema().Context, /*NamingClass=*/nullptr, 8883 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 8884 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 8885 Decls.end())); 8886 } else { 8887 UnresolvedMappers.push_back(nullptr); 8888 } 8889 } 8890 return false; 8891 } 8892 8893 template <typename Derived> 8894 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8895 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8896 llvm::SmallVector<Expr *, 16> Vars; 8897 CXXScopeSpec MapperIdScopeSpec; 8898 DeclarationNameInfo MapperIdInfo; 8899 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 8900 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 8901 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 8902 return nullptr; 8903 return getDerived().RebuildOMPMapClause( 8904 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 8905 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 8906 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 8907 } 8908 8909 template <typename Derived> 8910 OMPClause * 8911 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8912 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8913 if (E.isInvalid()) 8914 return nullptr; 8915 return getDerived().RebuildOMPNumTeamsClause( 8916 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8917 } 8918 8919 template <typename Derived> 8920 OMPClause * 8921 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8922 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8923 if (E.isInvalid()) 8924 return nullptr; 8925 return getDerived().RebuildOMPThreadLimitClause( 8926 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8927 } 8928 8929 template <typename Derived> 8930 OMPClause * 8931 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8932 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8933 if (E.isInvalid()) 8934 return nullptr; 8935 return getDerived().RebuildOMPPriorityClause( 8936 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8937 } 8938 8939 template <typename Derived> 8940 OMPClause * 8941 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8942 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8943 if (E.isInvalid()) 8944 return nullptr; 8945 return getDerived().RebuildOMPGrainsizeClause( 8946 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8947 } 8948 8949 template <typename Derived> 8950 OMPClause * 8951 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8952 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8953 if (E.isInvalid()) 8954 return nullptr; 8955 return getDerived().RebuildOMPNumTasksClause( 8956 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8957 } 8958 8959 template <typename Derived> 8960 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8961 ExprResult E = getDerived().TransformExpr(C->getHint()); 8962 if (E.isInvalid()) 8963 return nullptr; 8964 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 8965 C->getLParenLoc(), C->getEndLoc()); 8966 } 8967 8968 template <typename Derived> 8969 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8970 OMPDistScheduleClause *C) { 8971 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8972 if (E.isInvalid()) 8973 return nullptr; 8974 return getDerived().RebuildOMPDistScheduleClause( 8975 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8976 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8977 } 8978 8979 template <typename Derived> 8980 OMPClause * 8981 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8982 return C; 8983 } 8984 8985 template <typename Derived> 8986 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8987 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8988 llvm::SmallVector<Expr *, 16> Vars; 8989 CXXScopeSpec MapperIdScopeSpec; 8990 DeclarationNameInfo MapperIdInfo; 8991 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 8992 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 8993 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 8994 return nullptr; 8995 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 8996 Locs, UnresolvedMappers); 8997 } 8998 8999 template <typename Derived> 9000 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9001 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9002 llvm::SmallVector<Expr *, 16> Vars; 9003 CXXScopeSpec MapperIdScopeSpec; 9004 DeclarationNameInfo MapperIdInfo; 9005 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9006 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9007 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9008 return nullptr; 9009 return getDerived().RebuildOMPFromClause( 9010 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9011 } 9012 9013 template <typename Derived> 9014 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9015 OMPUseDevicePtrClause *C) { 9016 llvm::SmallVector<Expr *, 16> Vars; 9017 Vars.reserve(C->varlist_size()); 9018 for (auto *VE : C->varlists()) { 9019 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9020 if (EVar.isInvalid()) 9021 return nullptr; 9022 Vars.push_back(EVar.get()); 9023 } 9024 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9025 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9026 } 9027 9028 template <typename Derived> 9029 OMPClause * 9030 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9031 llvm::SmallVector<Expr *, 16> Vars; 9032 Vars.reserve(C->varlist_size()); 9033 for (auto *VE : C->varlists()) { 9034 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9035 if (EVar.isInvalid()) 9036 return nullptr; 9037 Vars.push_back(EVar.get()); 9038 } 9039 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9040 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9041 } 9042 9043 //===----------------------------------------------------------------------===// 9044 // Expression transformation 9045 //===----------------------------------------------------------------------===// 9046 template<typename Derived> 9047 ExprResult 9048 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9049 return TransformExpr(E->getSubExpr()); 9050 } 9051 9052 template<typename Derived> 9053 ExprResult 9054 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9055 if (!E->isTypeDependent()) 9056 return E; 9057 9058 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9059 E->getIdentKind()); 9060 } 9061 9062 template<typename Derived> 9063 ExprResult 9064 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9065 NestedNameSpecifierLoc QualifierLoc; 9066 if (E->getQualifierLoc()) { 9067 QualifierLoc 9068 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9069 if (!QualifierLoc) 9070 return ExprError(); 9071 } 9072 9073 ValueDecl *ND 9074 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9075 E->getDecl())); 9076 if (!ND) 9077 return ExprError(); 9078 9079 DeclarationNameInfo NameInfo = E->getNameInfo(); 9080 if (NameInfo.getName()) { 9081 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9082 if (!NameInfo.getName()) 9083 return ExprError(); 9084 } 9085 9086 if (!getDerived().AlwaysRebuild() && 9087 QualifierLoc == E->getQualifierLoc() && 9088 ND == E->getDecl() && 9089 NameInfo.getName() == E->getDecl()->getDeclName() && 9090 !E->hasExplicitTemplateArgs()) { 9091 9092 // Mark it referenced in the new context regardless. 9093 // FIXME: this is a bit instantiation-specific. 9094 SemaRef.MarkDeclRefReferenced(E); 9095 9096 return E; 9097 } 9098 9099 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9100 if (E->hasExplicitTemplateArgs()) { 9101 TemplateArgs = &TransArgs; 9102 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9103 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9104 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9105 E->getNumTemplateArgs(), 9106 TransArgs)) 9107 return ExprError(); 9108 } 9109 9110 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9111 TemplateArgs); 9112 } 9113 9114 template<typename Derived> 9115 ExprResult 9116 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9117 return E; 9118 } 9119 9120 template <typename Derived> 9121 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9122 FixedPointLiteral *E) { 9123 return E; 9124 } 9125 9126 template<typename Derived> 9127 ExprResult 9128 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9129 return E; 9130 } 9131 9132 template<typename Derived> 9133 ExprResult 9134 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9135 return E; 9136 } 9137 9138 template<typename Derived> 9139 ExprResult 9140 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9141 return E; 9142 } 9143 9144 template<typename Derived> 9145 ExprResult 9146 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9147 return E; 9148 } 9149 9150 template<typename Derived> 9151 ExprResult 9152 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9153 if (FunctionDecl *FD = E->getDirectCallee()) 9154 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9155 return SemaRef.MaybeBindToTemporary(E); 9156 } 9157 9158 template<typename Derived> 9159 ExprResult 9160 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9161 ExprResult ControllingExpr = 9162 getDerived().TransformExpr(E->getControllingExpr()); 9163 if (ControllingExpr.isInvalid()) 9164 return ExprError(); 9165 9166 SmallVector<Expr *, 4> AssocExprs; 9167 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9168 for (const GenericSelectionExpr::Association &Assoc : E->associations()) { 9169 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9170 if (TSI) { 9171 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9172 if (!AssocType) 9173 return ExprError(); 9174 AssocTypes.push_back(AssocType); 9175 } else { 9176 AssocTypes.push_back(nullptr); 9177 } 9178 9179 ExprResult AssocExpr = 9180 getDerived().TransformExpr(Assoc.getAssociationExpr()); 9181 if (AssocExpr.isInvalid()) 9182 return ExprError(); 9183 AssocExprs.push_back(AssocExpr.get()); 9184 } 9185 9186 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9187 E->getDefaultLoc(), 9188 E->getRParenLoc(), 9189 ControllingExpr.get(), 9190 AssocTypes, 9191 AssocExprs); 9192 } 9193 9194 template<typename Derived> 9195 ExprResult 9196 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9197 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9198 if (SubExpr.isInvalid()) 9199 return ExprError(); 9200 9201 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9202 return E; 9203 9204 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9205 E->getRParen()); 9206 } 9207 9208 /// The operand of a unary address-of operator has special rules: it's 9209 /// allowed to refer to a non-static member of a class even if there's no 'this' 9210 /// object available. 9211 template<typename Derived> 9212 ExprResult 9213 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9214 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9215 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9216 else 9217 return getDerived().TransformExpr(E); 9218 } 9219 9220 template<typename Derived> 9221 ExprResult 9222 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9223 ExprResult SubExpr; 9224 if (E->getOpcode() == UO_AddrOf) 9225 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9226 else 9227 SubExpr = TransformExpr(E->getSubExpr()); 9228 if (SubExpr.isInvalid()) 9229 return ExprError(); 9230 9231 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9232 return E; 9233 9234 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9235 E->getOpcode(), 9236 SubExpr.get()); 9237 } 9238 9239 template<typename Derived> 9240 ExprResult 9241 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9242 // Transform the type. 9243 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9244 if (!Type) 9245 return ExprError(); 9246 9247 // Transform all of the components into components similar to what the 9248 // parser uses. 9249 // FIXME: It would be slightly more efficient in the non-dependent case to 9250 // just map FieldDecls, rather than requiring the rebuilder to look for 9251 // the fields again. However, __builtin_offsetof is rare enough in 9252 // template code that we don't care. 9253 bool ExprChanged = false; 9254 typedef Sema::OffsetOfComponent Component; 9255 SmallVector<Component, 4> Components; 9256 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9257 const OffsetOfNode &ON = E->getComponent(I); 9258 Component Comp; 9259 Comp.isBrackets = true; 9260 Comp.LocStart = ON.getSourceRange().getBegin(); 9261 Comp.LocEnd = ON.getSourceRange().getEnd(); 9262 switch (ON.getKind()) { 9263 case OffsetOfNode::Array: { 9264 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9265 ExprResult Index = getDerived().TransformExpr(FromIndex); 9266 if (Index.isInvalid()) 9267 return ExprError(); 9268 9269 ExprChanged = ExprChanged || Index.get() != FromIndex; 9270 Comp.isBrackets = true; 9271 Comp.U.E = Index.get(); 9272 break; 9273 } 9274 9275 case OffsetOfNode::Field: 9276 case OffsetOfNode::Identifier: 9277 Comp.isBrackets = false; 9278 Comp.U.IdentInfo = ON.getFieldName(); 9279 if (!Comp.U.IdentInfo) 9280 continue; 9281 9282 break; 9283 9284 case OffsetOfNode::Base: 9285 // Will be recomputed during the rebuild. 9286 continue; 9287 } 9288 9289 Components.push_back(Comp); 9290 } 9291 9292 // If nothing changed, retain the existing expression. 9293 if (!getDerived().AlwaysRebuild() && 9294 Type == E->getTypeSourceInfo() && 9295 !ExprChanged) 9296 return E; 9297 9298 // Build a new offsetof expression. 9299 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9300 Components, E->getRParenLoc()); 9301 } 9302 9303 template<typename Derived> 9304 ExprResult 9305 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9306 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9307 "opaque value expression requires transformation"); 9308 return E; 9309 } 9310 9311 template<typename Derived> 9312 ExprResult 9313 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9314 return E; 9315 } 9316 9317 template<typename Derived> 9318 ExprResult 9319 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9320 // Rebuild the syntactic form. The original syntactic form has 9321 // opaque-value expressions in it, so strip those away and rebuild 9322 // the result. This is a really awful way of doing this, but the 9323 // better solution (rebuilding the semantic expressions and 9324 // rebinding OVEs as necessary) doesn't work; we'd need 9325 // TreeTransform to not strip away implicit conversions. 9326 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9327 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9328 if (result.isInvalid()) return ExprError(); 9329 9330 // If that gives us a pseudo-object result back, the pseudo-object 9331 // expression must have been an lvalue-to-rvalue conversion which we 9332 // should reapply. 9333 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9334 result = SemaRef.checkPseudoObjectRValue(result.get()); 9335 9336 return result; 9337 } 9338 9339 template<typename Derived> 9340 ExprResult 9341 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9342 UnaryExprOrTypeTraitExpr *E) { 9343 if (E->isArgumentType()) { 9344 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9345 9346 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9347 if (!NewT) 9348 return ExprError(); 9349 9350 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9351 return E; 9352 9353 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9354 E->getKind(), 9355 E->getSourceRange()); 9356 } 9357 9358 // C++0x [expr.sizeof]p1: 9359 // The operand is either an expression, which is an unevaluated operand 9360 // [...] 9361 EnterExpressionEvaluationContext Unevaluated( 9362 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9363 Sema::ReuseLambdaContextDecl); 9364 9365 // Try to recover if we have something like sizeof(T::X) where X is a type. 9366 // Notably, there must be *exactly* one set of parens if X is a type. 9367 TypeSourceInfo *RecoveryTSI = nullptr; 9368 ExprResult SubExpr; 9369 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9370 if (auto *DRE = 9371 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9372 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9373 PE, DRE, false, &RecoveryTSI); 9374 else 9375 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9376 9377 if (RecoveryTSI) { 9378 return getDerived().RebuildUnaryExprOrTypeTrait( 9379 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9380 } else if (SubExpr.isInvalid()) 9381 return ExprError(); 9382 9383 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9384 return E; 9385 9386 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9387 E->getOperatorLoc(), 9388 E->getKind(), 9389 E->getSourceRange()); 9390 } 9391 9392 template<typename Derived> 9393 ExprResult 9394 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9395 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9396 if (LHS.isInvalid()) 9397 return ExprError(); 9398 9399 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9400 if (RHS.isInvalid()) 9401 return ExprError(); 9402 9403 9404 if (!getDerived().AlwaysRebuild() && 9405 LHS.get() == E->getLHS() && 9406 RHS.get() == E->getRHS()) 9407 return E; 9408 9409 return getDerived().RebuildArraySubscriptExpr( 9410 LHS.get(), 9411 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9412 } 9413 9414 template <typename Derived> 9415 ExprResult 9416 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9417 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9418 if (Base.isInvalid()) 9419 return ExprError(); 9420 9421 ExprResult LowerBound; 9422 if (E->getLowerBound()) { 9423 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9424 if (LowerBound.isInvalid()) 9425 return ExprError(); 9426 } 9427 9428 ExprResult Length; 9429 if (E->getLength()) { 9430 Length = getDerived().TransformExpr(E->getLength()); 9431 if (Length.isInvalid()) 9432 return ExprError(); 9433 } 9434 9435 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9436 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9437 return E; 9438 9439 return getDerived().RebuildOMPArraySectionExpr( 9440 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9441 Length.get(), E->getRBracketLoc()); 9442 } 9443 9444 template<typename Derived> 9445 ExprResult 9446 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9447 // Transform the callee. 9448 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9449 if (Callee.isInvalid()) 9450 return ExprError(); 9451 9452 // Transform arguments. 9453 bool ArgChanged = false; 9454 SmallVector<Expr*, 8> Args; 9455 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9456 &ArgChanged)) 9457 return ExprError(); 9458 9459 if (!getDerived().AlwaysRebuild() && 9460 Callee.get() == E->getCallee() && 9461 !ArgChanged) 9462 return SemaRef.MaybeBindToTemporary(E); 9463 9464 // FIXME: Wrong source location information for the '('. 9465 SourceLocation FakeLParenLoc 9466 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9467 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9468 Args, 9469 E->getRParenLoc()); 9470 } 9471 9472 template<typename Derived> 9473 ExprResult 9474 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9475 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9476 if (Base.isInvalid()) 9477 return ExprError(); 9478 9479 NestedNameSpecifierLoc QualifierLoc; 9480 if (E->hasQualifier()) { 9481 QualifierLoc 9482 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9483 9484 if (!QualifierLoc) 9485 return ExprError(); 9486 } 9487 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9488 9489 ValueDecl *Member 9490 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9491 E->getMemberDecl())); 9492 if (!Member) 9493 return ExprError(); 9494 9495 NamedDecl *FoundDecl = E->getFoundDecl(); 9496 if (FoundDecl == E->getMemberDecl()) { 9497 FoundDecl = Member; 9498 } else { 9499 FoundDecl = cast_or_null<NamedDecl>( 9500 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9501 if (!FoundDecl) 9502 return ExprError(); 9503 } 9504 9505 if (!getDerived().AlwaysRebuild() && 9506 Base.get() == E->getBase() && 9507 QualifierLoc == E->getQualifierLoc() && 9508 Member == E->getMemberDecl() && 9509 FoundDecl == E->getFoundDecl() && 9510 !E->hasExplicitTemplateArgs()) { 9511 9512 // Mark it referenced in the new context regardless. 9513 // FIXME: this is a bit instantiation-specific. 9514 SemaRef.MarkMemberReferenced(E); 9515 9516 return E; 9517 } 9518 9519 TemplateArgumentListInfo TransArgs; 9520 if (E->hasExplicitTemplateArgs()) { 9521 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9522 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9523 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9524 E->getNumTemplateArgs(), 9525 TransArgs)) 9526 return ExprError(); 9527 } 9528 9529 // FIXME: Bogus source location for the operator 9530 SourceLocation FakeOperatorLoc = 9531 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9532 9533 // FIXME: to do this check properly, we will need to preserve the 9534 // first-qualifier-in-scope here, just in case we had a dependent 9535 // base (and therefore couldn't do the check) and a 9536 // nested-name-qualifier (and therefore could do the lookup). 9537 NamedDecl *FirstQualifierInScope = nullptr; 9538 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9539 if (MemberNameInfo.getName()) { 9540 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9541 if (!MemberNameInfo.getName()) 9542 return ExprError(); 9543 } 9544 9545 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9546 E->isArrow(), 9547 QualifierLoc, 9548 TemplateKWLoc, 9549 MemberNameInfo, 9550 Member, 9551 FoundDecl, 9552 (E->hasExplicitTemplateArgs() 9553 ? &TransArgs : nullptr), 9554 FirstQualifierInScope); 9555 } 9556 9557 template<typename Derived> 9558 ExprResult 9559 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9560 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9561 if (LHS.isInvalid()) 9562 return ExprError(); 9563 9564 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9565 if (RHS.isInvalid()) 9566 return ExprError(); 9567 9568 if (!getDerived().AlwaysRebuild() && 9569 LHS.get() == E->getLHS() && 9570 RHS.get() == E->getRHS()) 9571 return E; 9572 9573 Sema::FPContractStateRAII FPContractState(getSema()); 9574 getSema().FPFeatures = E->getFPFeatures(); 9575 9576 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9577 LHS.get(), RHS.get()); 9578 } 9579 9580 template<typename Derived> 9581 ExprResult 9582 TreeTransform<Derived>::TransformCompoundAssignOperator( 9583 CompoundAssignOperator *E) { 9584 return getDerived().TransformBinaryOperator(E); 9585 } 9586 9587 template<typename Derived> 9588 ExprResult TreeTransform<Derived>:: 9589 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9590 // Just rebuild the common and RHS expressions and see whether we 9591 // get any changes. 9592 9593 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9594 if (commonExpr.isInvalid()) 9595 return ExprError(); 9596 9597 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9598 if (rhs.isInvalid()) 9599 return ExprError(); 9600 9601 if (!getDerived().AlwaysRebuild() && 9602 commonExpr.get() == e->getCommon() && 9603 rhs.get() == e->getFalseExpr()) 9604 return e; 9605 9606 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9607 e->getQuestionLoc(), 9608 nullptr, 9609 e->getColonLoc(), 9610 rhs.get()); 9611 } 9612 9613 template<typename Derived> 9614 ExprResult 9615 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9616 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9617 if (Cond.isInvalid()) 9618 return ExprError(); 9619 9620 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9621 if (LHS.isInvalid()) 9622 return ExprError(); 9623 9624 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9625 if (RHS.isInvalid()) 9626 return ExprError(); 9627 9628 if (!getDerived().AlwaysRebuild() && 9629 Cond.get() == E->getCond() && 9630 LHS.get() == E->getLHS() && 9631 RHS.get() == E->getRHS()) 9632 return E; 9633 9634 return getDerived().RebuildConditionalOperator(Cond.get(), 9635 E->getQuestionLoc(), 9636 LHS.get(), 9637 E->getColonLoc(), 9638 RHS.get()); 9639 } 9640 9641 template<typename Derived> 9642 ExprResult 9643 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9644 // Implicit casts are eliminated during transformation, since they 9645 // will be recomputed by semantic analysis after transformation. 9646 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9647 } 9648 9649 template<typename Derived> 9650 ExprResult 9651 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9652 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9653 if (!Type) 9654 return ExprError(); 9655 9656 ExprResult SubExpr 9657 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9658 if (SubExpr.isInvalid()) 9659 return ExprError(); 9660 9661 if (!getDerived().AlwaysRebuild() && 9662 Type == E->getTypeInfoAsWritten() && 9663 SubExpr.get() == E->getSubExpr()) 9664 return E; 9665 9666 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9667 Type, 9668 E->getRParenLoc(), 9669 SubExpr.get()); 9670 } 9671 9672 template<typename Derived> 9673 ExprResult 9674 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9675 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9676 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9677 if (!NewT) 9678 return ExprError(); 9679 9680 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9681 if (Init.isInvalid()) 9682 return ExprError(); 9683 9684 if (!getDerived().AlwaysRebuild() && 9685 OldT == NewT && 9686 Init.get() == E->getInitializer()) 9687 return SemaRef.MaybeBindToTemporary(E); 9688 9689 // Note: the expression type doesn't necessarily match the 9690 // type-as-written, but that's okay, because it should always be 9691 // derivable from the initializer. 9692 9693 return getDerived().RebuildCompoundLiteralExpr( 9694 E->getLParenLoc(), NewT, 9695 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 9696 } 9697 9698 template<typename Derived> 9699 ExprResult 9700 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9701 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9702 if (Base.isInvalid()) 9703 return ExprError(); 9704 9705 if (!getDerived().AlwaysRebuild() && 9706 Base.get() == E->getBase()) 9707 return E; 9708 9709 // FIXME: Bad source location 9710 SourceLocation FakeOperatorLoc = 9711 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 9712 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9713 E->getAccessorLoc(), 9714 E->getAccessor()); 9715 } 9716 9717 template<typename Derived> 9718 ExprResult 9719 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9720 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9721 E = Syntactic; 9722 9723 bool InitChanged = false; 9724 9725 EnterExpressionEvaluationContext Context( 9726 getSema(), EnterExpressionEvaluationContext::InitList); 9727 9728 SmallVector<Expr*, 4> Inits; 9729 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9730 Inits, &InitChanged)) 9731 return ExprError(); 9732 9733 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9734 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9735 // in some cases. We can't reuse it in general, because the syntactic and 9736 // semantic forms are linked, and we can't know that semantic form will 9737 // match even if the syntactic form does. 9738 } 9739 9740 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9741 E->getRBraceLoc()); 9742 } 9743 9744 template<typename Derived> 9745 ExprResult 9746 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9747 Designation Desig; 9748 9749 // transform the initializer value 9750 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9751 if (Init.isInvalid()) 9752 return ExprError(); 9753 9754 // transform the designators. 9755 SmallVector<Expr*, 4> ArrayExprs; 9756 bool ExprChanged = false; 9757 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9758 if (D.isFieldDesignator()) { 9759 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9760 D.getDotLoc(), 9761 D.getFieldLoc())); 9762 if (D.getField()) { 9763 FieldDecl *Field = cast_or_null<FieldDecl>( 9764 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9765 if (Field != D.getField()) 9766 // Rebuild the expression when the transformed FieldDecl is 9767 // different to the already assigned FieldDecl. 9768 ExprChanged = true; 9769 } else { 9770 // Ensure that the designator expression is rebuilt when there isn't 9771 // a resolved FieldDecl in the designator as we don't want to assign 9772 // a FieldDecl to a pattern designator that will be instantiated again. 9773 ExprChanged = true; 9774 } 9775 continue; 9776 } 9777 9778 if (D.isArrayDesignator()) { 9779 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9780 if (Index.isInvalid()) 9781 return ExprError(); 9782 9783 Desig.AddDesignator( 9784 Designator::getArray(Index.get(), D.getLBracketLoc())); 9785 9786 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9787 ArrayExprs.push_back(Index.get()); 9788 continue; 9789 } 9790 9791 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9792 ExprResult Start 9793 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9794 if (Start.isInvalid()) 9795 return ExprError(); 9796 9797 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9798 if (End.isInvalid()) 9799 return ExprError(); 9800 9801 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9802 End.get(), 9803 D.getLBracketLoc(), 9804 D.getEllipsisLoc())); 9805 9806 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9807 End.get() != E->getArrayRangeEnd(D); 9808 9809 ArrayExprs.push_back(Start.get()); 9810 ArrayExprs.push_back(End.get()); 9811 } 9812 9813 if (!getDerived().AlwaysRebuild() && 9814 Init.get() == E->getInit() && 9815 !ExprChanged) 9816 return E; 9817 9818 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9819 E->getEqualOrColonLoc(), 9820 E->usesGNUSyntax(), Init.get()); 9821 } 9822 9823 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9824 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9825 template<typename Derived> 9826 ExprResult 9827 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9828 DesignatedInitUpdateExpr *E) { 9829 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9830 "initializer"); 9831 return ExprError(); 9832 } 9833 9834 template<typename Derived> 9835 ExprResult 9836 TreeTransform<Derived>::TransformNoInitExpr( 9837 NoInitExpr *E) { 9838 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9839 return ExprError(); 9840 } 9841 9842 template<typename Derived> 9843 ExprResult 9844 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9845 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9846 return ExprError(); 9847 } 9848 9849 template<typename Derived> 9850 ExprResult 9851 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9852 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9853 return ExprError(); 9854 } 9855 9856 template<typename Derived> 9857 ExprResult 9858 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9859 ImplicitValueInitExpr *E) { 9860 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 9861 9862 // FIXME: Will we ever have proper type location here? Will we actually 9863 // need to transform the type? 9864 QualType T = getDerived().TransformType(E->getType()); 9865 if (T.isNull()) 9866 return ExprError(); 9867 9868 if (!getDerived().AlwaysRebuild() && 9869 T == E->getType()) 9870 return E; 9871 9872 return getDerived().RebuildImplicitValueInitExpr(T); 9873 } 9874 9875 template<typename Derived> 9876 ExprResult 9877 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9878 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9879 if (!TInfo) 9880 return ExprError(); 9881 9882 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9883 if (SubExpr.isInvalid()) 9884 return ExprError(); 9885 9886 if (!getDerived().AlwaysRebuild() && 9887 TInfo == E->getWrittenTypeInfo() && 9888 SubExpr.get() == E->getSubExpr()) 9889 return E; 9890 9891 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9892 TInfo, E->getRParenLoc()); 9893 } 9894 9895 template<typename Derived> 9896 ExprResult 9897 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9898 bool ArgumentChanged = false; 9899 SmallVector<Expr*, 4> Inits; 9900 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9901 &ArgumentChanged)) 9902 return ExprError(); 9903 9904 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9905 Inits, 9906 E->getRParenLoc()); 9907 } 9908 9909 /// Transform an address-of-label expression. 9910 /// 9911 /// By default, the transformation of an address-of-label expression always 9912 /// rebuilds the expression, so that the label identifier can be resolved to 9913 /// the corresponding label statement by semantic analysis. 9914 template<typename Derived> 9915 ExprResult 9916 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9917 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9918 E->getLabel()); 9919 if (!LD) 9920 return ExprError(); 9921 9922 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9923 cast<LabelDecl>(LD)); 9924 } 9925 9926 template<typename Derived> 9927 ExprResult 9928 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9929 SemaRef.ActOnStartStmtExpr(); 9930 StmtResult SubStmt 9931 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9932 if (SubStmt.isInvalid()) { 9933 SemaRef.ActOnStmtExprError(); 9934 return ExprError(); 9935 } 9936 9937 if (!getDerived().AlwaysRebuild() && 9938 SubStmt.get() == E->getSubStmt()) { 9939 // Calling this an 'error' is unintuitive, but it does the right thing. 9940 SemaRef.ActOnStmtExprError(); 9941 return SemaRef.MaybeBindToTemporary(E); 9942 } 9943 9944 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9945 SubStmt.get(), 9946 E->getRParenLoc()); 9947 } 9948 9949 template<typename Derived> 9950 ExprResult 9951 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9952 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9953 if (Cond.isInvalid()) 9954 return ExprError(); 9955 9956 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9957 if (LHS.isInvalid()) 9958 return ExprError(); 9959 9960 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9961 if (RHS.isInvalid()) 9962 return ExprError(); 9963 9964 if (!getDerived().AlwaysRebuild() && 9965 Cond.get() == E->getCond() && 9966 LHS.get() == E->getLHS() && 9967 RHS.get() == E->getRHS()) 9968 return E; 9969 9970 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9971 Cond.get(), LHS.get(), RHS.get(), 9972 E->getRParenLoc()); 9973 } 9974 9975 template<typename Derived> 9976 ExprResult 9977 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9978 return E; 9979 } 9980 9981 template<typename Derived> 9982 ExprResult 9983 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9984 switch (E->getOperator()) { 9985 case OO_New: 9986 case OO_Delete: 9987 case OO_Array_New: 9988 case OO_Array_Delete: 9989 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9990 9991 case OO_Call: { 9992 // This is a call to an object's operator(). 9993 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9994 9995 // Transform the object itself. 9996 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9997 if (Object.isInvalid()) 9998 return ExprError(); 9999 10000 // FIXME: Poor location information 10001 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 10002 static_cast<Expr *>(Object.get())->getEndLoc()); 10003 10004 // Transform the call arguments. 10005 SmallVector<Expr*, 8> Args; 10006 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 10007 Args)) 10008 return ExprError(); 10009 10010 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 10011 E->getEndLoc()); 10012 } 10013 10014 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 10015 case OO_##Name: 10016 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 10017 #include "clang/Basic/OperatorKinds.def" 10018 case OO_Subscript: 10019 // Handled below. 10020 break; 10021 10022 case OO_Conditional: 10023 llvm_unreachable("conditional operator is not actually overloadable"); 10024 10025 case OO_None: 10026 case NUM_OVERLOADED_OPERATORS: 10027 llvm_unreachable("not an overloaded operator?"); 10028 } 10029 10030 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10031 if (Callee.isInvalid()) 10032 return ExprError(); 10033 10034 ExprResult First; 10035 if (E->getOperator() == OO_Amp) 10036 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 10037 else 10038 First = getDerived().TransformExpr(E->getArg(0)); 10039 if (First.isInvalid()) 10040 return ExprError(); 10041 10042 ExprResult Second; 10043 if (E->getNumArgs() == 2) { 10044 Second = getDerived().TransformExpr(E->getArg(1)); 10045 if (Second.isInvalid()) 10046 return ExprError(); 10047 } 10048 10049 if (!getDerived().AlwaysRebuild() && 10050 Callee.get() == E->getCallee() && 10051 First.get() == E->getArg(0) && 10052 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 10053 return SemaRef.MaybeBindToTemporary(E); 10054 10055 Sema::FPContractStateRAII FPContractState(getSema()); 10056 getSema().FPFeatures = E->getFPFeatures(); 10057 10058 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 10059 E->getOperatorLoc(), 10060 Callee.get(), 10061 First.get(), 10062 Second.get()); 10063 } 10064 10065 template<typename Derived> 10066 ExprResult 10067 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 10068 return getDerived().TransformCallExpr(E); 10069 } 10070 10071 template<typename Derived> 10072 ExprResult 10073 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 10074 // Transform the callee. 10075 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10076 if (Callee.isInvalid()) 10077 return ExprError(); 10078 10079 // Transform exec config. 10080 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 10081 if (EC.isInvalid()) 10082 return ExprError(); 10083 10084 // Transform arguments. 10085 bool ArgChanged = false; 10086 SmallVector<Expr*, 8> Args; 10087 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10088 &ArgChanged)) 10089 return ExprError(); 10090 10091 if (!getDerived().AlwaysRebuild() && 10092 Callee.get() == E->getCallee() && 10093 !ArgChanged) 10094 return SemaRef.MaybeBindToTemporary(E); 10095 10096 // FIXME: Wrong source location information for the '('. 10097 SourceLocation FakeLParenLoc 10098 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10099 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10100 Args, 10101 E->getRParenLoc(), EC.get()); 10102 } 10103 10104 template<typename Derived> 10105 ExprResult 10106 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 10107 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10108 if (!Type) 10109 return ExprError(); 10110 10111 ExprResult SubExpr 10112 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10113 if (SubExpr.isInvalid()) 10114 return ExprError(); 10115 10116 if (!getDerived().AlwaysRebuild() && 10117 Type == E->getTypeInfoAsWritten() && 10118 SubExpr.get() == E->getSubExpr()) 10119 return E; 10120 return getDerived().RebuildCXXNamedCastExpr( 10121 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 10122 Type, E->getAngleBrackets().getEnd(), 10123 // FIXME. this should be '(' location 10124 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10125 } 10126 10127 template<typename Derived> 10128 ExprResult 10129 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10130 return getDerived().TransformCXXNamedCastExpr(E); 10131 } 10132 10133 template<typename Derived> 10134 ExprResult 10135 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10136 return getDerived().TransformCXXNamedCastExpr(E); 10137 } 10138 10139 template<typename Derived> 10140 ExprResult 10141 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10142 CXXReinterpretCastExpr *E) { 10143 return getDerived().TransformCXXNamedCastExpr(E); 10144 } 10145 10146 template<typename Derived> 10147 ExprResult 10148 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10149 return getDerived().TransformCXXNamedCastExpr(E); 10150 } 10151 10152 template<typename Derived> 10153 ExprResult 10154 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10155 CXXFunctionalCastExpr *E) { 10156 TypeSourceInfo *Type = 10157 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10158 if (!Type) 10159 return ExprError(); 10160 10161 ExprResult SubExpr 10162 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10163 if (SubExpr.isInvalid()) 10164 return ExprError(); 10165 10166 if (!getDerived().AlwaysRebuild() && 10167 Type == E->getTypeInfoAsWritten() && 10168 SubExpr.get() == E->getSubExpr()) 10169 return E; 10170 10171 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10172 E->getLParenLoc(), 10173 SubExpr.get(), 10174 E->getRParenLoc(), 10175 E->isListInitialization()); 10176 } 10177 10178 template<typename Derived> 10179 ExprResult 10180 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10181 if (E->isTypeOperand()) { 10182 TypeSourceInfo *TInfo 10183 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10184 if (!TInfo) 10185 return ExprError(); 10186 10187 if (!getDerived().AlwaysRebuild() && 10188 TInfo == E->getTypeOperandSourceInfo()) 10189 return E; 10190 10191 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10192 TInfo, E->getEndLoc()); 10193 } 10194 10195 // We don't know whether the subexpression is potentially evaluated until 10196 // after we perform semantic analysis. We speculatively assume it is 10197 // unevaluated; it will get fixed later if the subexpression is in fact 10198 // potentially evaluated. 10199 EnterExpressionEvaluationContext Unevaluated( 10200 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10201 Sema::ReuseLambdaContextDecl); 10202 10203 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10204 if (SubExpr.isInvalid()) 10205 return ExprError(); 10206 10207 if (!getDerived().AlwaysRebuild() && 10208 SubExpr.get() == E->getExprOperand()) 10209 return E; 10210 10211 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10212 SubExpr.get(), E->getEndLoc()); 10213 } 10214 10215 template<typename Derived> 10216 ExprResult 10217 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10218 if (E->isTypeOperand()) { 10219 TypeSourceInfo *TInfo 10220 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10221 if (!TInfo) 10222 return ExprError(); 10223 10224 if (!getDerived().AlwaysRebuild() && 10225 TInfo == E->getTypeOperandSourceInfo()) 10226 return E; 10227 10228 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10229 TInfo, E->getEndLoc()); 10230 } 10231 10232 EnterExpressionEvaluationContext Unevaluated( 10233 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10234 10235 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10236 if (SubExpr.isInvalid()) 10237 return ExprError(); 10238 10239 if (!getDerived().AlwaysRebuild() && 10240 SubExpr.get() == E->getExprOperand()) 10241 return E; 10242 10243 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10244 SubExpr.get(), E->getEndLoc()); 10245 } 10246 10247 template<typename Derived> 10248 ExprResult 10249 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10250 return E; 10251 } 10252 10253 template<typename Derived> 10254 ExprResult 10255 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10256 CXXNullPtrLiteralExpr *E) { 10257 return E; 10258 } 10259 10260 template<typename Derived> 10261 ExprResult 10262 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10263 QualType T = getSema().getCurrentThisType(); 10264 10265 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10266 // Make sure that we capture 'this'. 10267 getSema().CheckCXXThisCapture(E->getBeginLoc()); 10268 return E; 10269 } 10270 10271 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10272 } 10273 10274 template<typename Derived> 10275 ExprResult 10276 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10277 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10278 if (SubExpr.isInvalid()) 10279 return ExprError(); 10280 10281 if (!getDerived().AlwaysRebuild() && 10282 SubExpr.get() == E->getSubExpr()) 10283 return E; 10284 10285 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10286 E->isThrownVariableInScope()); 10287 } 10288 10289 template<typename Derived> 10290 ExprResult 10291 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10292 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10293 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10294 if (!Param) 10295 return ExprError(); 10296 10297 if (!getDerived().AlwaysRebuild() && 10298 Param == E->getParam()) 10299 return E; 10300 10301 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10302 } 10303 10304 template<typename Derived> 10305 ExprResult 10306 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10307 FieldDecl *Field = cast_or_null<FieldDecl>( 10308 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10309 if (!Field) 10310 return ExprError(); 10311 10312 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10313 return E; 10314 10315 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10316 } 10317 10318 template<typename Derived> 10319 ExprResult 10320 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10321 CXXScalarValueInitExpr *E) { 10322 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10323 if (!T) 10324 return ExprError(); 10325 10326 if (!getDerived().AlwaysRebuild() && 10327 T == E->getTypeSourceInfo()) 10328 return E; 10329 10330 return getDerived().RebuildCXXScalarValueInitExpr(T, 10331 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10332 E->getRParenLoc()); 10333 } 10334 10335 template<typename Derived> 10336 ExprResult 10337 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10338 // Transform the type that we're allocating 10339 TypeSourceInfo *AllocTypeInfo = 10340 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10341 if (!AllocTypeInfo) 10342 return ExprError(); 10343 10344 // Transform the size of the array we're allocating (if any). 10345 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10346 if (ArraySize.isInvalid()) 10347 return ExprError(); 10348 10349 // Transform the placement arguments (if any). 10350 bool ArgumentChanged = false; 10351 SmallVector<Expr*, 8> PlacementArgs; 10352 if (getDerived().TransformExprs(E->getPlacementArgs(), 10353 E->getNumPlacementArgs(), true, 10354 PlacementArgs, &ArgumentChanged)) 10355 return ExprError(); 10356 10357 // Transform the initializer (if any). 10358 Expr *OldInit = E->getInitializer(); 10359 ExprResult NewInit; 10360 if (OldInit) 10361 NewInit = getDerived().TransformInitializer(OldInit, true); 10362 if (NewInit.isInvalid()) 10363 return ExprError(); 10364 10365 // Transform new operator and delete operator. 10366 FunctionDecl *OperatorNew = nullptr; 10367 if (E->getOperatorNew()) { 10368 OperatorNew = cast_or_null<FunctionDecl>( 10369 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10370 if (!OperatorNew) 10371 return ExprError(); 10372 } 10373 10374 FunctionDecl *OperatorDelete = nullptr; 10375 if (E->getOperatorDelete()) { 10376 OperatorDelete = cast_or_null<FunctionDecl>( 10377 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10378 if (!OperatorDelete) 10379 return ExprError(); 10380 } 10381 10382 if (!getDerived().AlwaysRebuild() && 10383 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10384 ArraySize.get() == E->getArraySize() && 10385 NewInit.get() == OldInit && 10386 OperatorNew == E->getOperatorNew() && 10387 OperatorDelete == E->getOperatorDelete() && 10388 !ArgumentChanged) { 10389 // Mark any declarations we need as referenced. 10390 // FIXME: instantiation-specific. 10391 if (OperatorNew) 10392 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10393 if (OperatorDelete) 10394 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10395 10396 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10397 QualType ElementType 10398 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10399 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10400 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10401 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10402 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10403 } 10404 } 10405 } 10406 10407 return E; 10408 } 10409 10410 QualType AllocType = AllocTypeInfo->getType(); 10411 if (!ArraySize.get()) { 10412 // If no array size was specified, but the new expression was 10413 // instantiated with an array type (e.g., "new T" where T is 10414 // instantiated with "int[4]"), extract the outer bound from the 10415 // array type as our array size. We do this with constant and 10416 // dependently-sized array types. 10417 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10418 if (!ArrayT) { 10419 // Do nothing 10420 } else if (const ConstantArrayType *ConsArrayT 10421 = dyn_cast<ConstantArrayType>(ArrayT)) { 10422 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10423 SemaRef.Context.getSizeType(), 10424 /*FIXME:*/ E->getBeginLoc()); 10425 AllocType = ConsArrayT->getElementType(); 10426 } else if (const DependentSizedArrayType *DepArrayT 10427 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10428 if (DepArrayT->getSizeExpr()) { 10429 ArraySize = DepArrayT->getSizeExpr(); 10430 AllocType = DepArrayT->getElementType(); 10431 } 10432 } 10433 } 10434 10435 return getDerived().RebuildCXXNewExpr( 10436 E->getBeginLoc(), E->isGlobalNew(), 10437 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10438 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10439 AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get()); 10440 } 10441 10442 template<typename Derived> 10443 ExprResult 10444 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10445 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10446 if (Operand.isInvalid()) 10447 return ExprError(); 10448 10449 // Transform the delete operator, if known. 10450 FunctionDecl *OperatorDelete = nullptr; 10451 if (E->getOperatorDelete()) { 10452 OperatorDelete = cast_or_null<FunctionDecl>( 10453 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10454 if (!OperatorDelete) 10455 return ExprError(); 10456 } 10457 10458 if (!getDerived().AlwaysRebuild() && 10459 Operand.get() == E->getArgument() && 10460 OperatorDelete == E->getOperatorDelete()) { 10461 // Mark any declarations we need as referenced. 10462 // FIXME: instantiation-specific. 10463 if (OperatorDelete) 10464 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10465 10466 if (!E->getArgument()->isTypeDependent()) { 10467 QualType Destroyed = SemaRef.Context.getBaseElementType( 10468 E->getDestroyedType()); 10469 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10470 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10471 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10472 SemaRef.LookupDestructor(Record)); 10473 } 10474 } 10475 10476 return E; 10477 } 10478 10479 return getDerived().RebuildCXXDeleteExpr( 10480 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10481 } 10482 10483 template<typename Derived> 10484 ExprResult 10485 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10486 CXXPseudoDestructorExpr *E) { 10487 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10488 if (Base.isInvalid()) 10489 return ExprError(); 10490 10491 ParsedType ObjectTypePtr; 10492 bool MayBePseudoDestructor = false; 10493 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10494 E->getOperatorLoc(), 10495 E->isArrow()? tok::arrow : tok::period, 10496 ObjectTypePtr, 10497 MayBePseudoDestructor); 10498 if (Base.isInvalid()) 10499 return ExprError(); 10500 10501 QualType ObjectType = ObjectTypePtr.get(); 10502 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10503 if (QualifierLoc) { 10504 QualifierLoc 10505 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10506 if (!QualifierLoc) 10507 return ExprError(); 10508 } 10509 CXXScopeSpec SS; 10510 SS.Adopt(QualifierLoc); 10511 10512 PseudoDestructorTypeStorage Destroyed; 10513 if (E->getDestroyedTypeInfo()) { 10514 TypeSourceInfo *DestroyedTypeInfo 10515 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10516 ObjectType, nullptr, SS); 10517 if (!DestroyedTypeInfo) 10518 return ExprError(); 10519 Destroyed = DestroyedTypeInfo; 10520 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10521 // We aren't likely to be able to resolve the identifier down to a type 10522 // now anyway, so just retain the identifier. 10523 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10524 E->getDestroyedTypeLoc()); 10525 } else { 10526 // Look for a destructor known with the given name. 10527 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10528 *E->getDestroyedTypeIdentifier(), 10529 E->getDestroyedTypeLoc(), 10530 /*Scope=*/nullptr, 10531 SS, ObjectTypePtr, 10532 false); 10533 if (!T) 10534 return ExprError(); 10535 10536 Destroyed 10537 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10538 E->getDestroyedTypeLoc()); 10539 } 10540 10541 TypeSourceInfo *ScopeTypeInfo = nullptr; 10542 if (E->getScopeTypeInfo()) { 10543 CXXScopeSpec EmptySS; 10544 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10545 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10546 if (!ScopeTypeInfo) 10547 return ExprError(); 10548 } 10549 10550 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10551 E->getOperatorLoc(), 10552 E->isArrow(), 10553 SS, 10554 ScopeTypeInfo, 10555 E->getColonColonLoc(), 10556 E->getTildeLoc(), 10557 Destroyed); 10558 } 10559 10560 template <typename Derived> 10561 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10562 bool RequiresADL, 10563 LookupResult &R) { 10564 // Transform all the decls. 10565 bool AllEmptyPacks = true; 10566 for (auto *OldD : Old->decls()) { 10567 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10568 if (!InstD) { 10569 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10570 // This can happen because of dependent hiding. 10571 if (isa<UsingShadowDecl>(OldD)) 10572 continue; 10573 else { 10574 R.clear(); 10575 return true; 10576 } 10577 } 10578 10579 // Expand using pack declarations. 10580 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10581 ArrayRef<NamedDecl*> Decls = SingleDecl; 10582 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10583 Decls = UPD->expansions(); 10584 10585 // Expand using declarations. 10586 for (auto *D : Decls) { 10587 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10588 for (auto *SD : UD->shadows()) 10589 R.addDecl(SD); 10590 } else { 10591 R.addDecl(D); 10592 } 10593 } 10594 10595 AllEmptyPacks &= Decls.empty(); 10596 }; 10597 10598 // C++ [temp.res]/8.4.2: 10599 // The program is ill-formed, no diagnostic required, if [...] lookup for 10600 // a name in the template definition found a using-declaration, but the 10601 // lookup in the corresponding scope in the instantiation odoes not find 10602 // any declarations because the using-declaration was a pack expansion and 10603 // the corresponding pack is empty 10604 if (AllEmptyPacks && !RequiresADL) { 10605 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10606 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10607 return true; 10608 } 10609 10610 // Resolve a kind, but don't do any further analysis. If it's 10611 // ambiguous, the callee needs to deal with it. 10612 R.resolveKind(); 10613 return false; 10614 } 10615 10616 template<typename Derived> 10617 ExprResult 10618 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10619 UnresolvedLookupExpr *Old) { 10620 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10621 Sema::LookupOrdinaryName); 10622 10623 // Transform the declaration set. 10624 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10625 return ExprError(); 10626 10627 // Rebuild the nested-name qualifier, if present. 10628 CXXScopeSpec SS; 10629 if (Old->getQualifierLoc()) { 10630 NestedNameSpecifierLoc QualifierLoc 10631 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10632 if (!QualifierLoc) 10633 return ExprError(); 10634 10635 SS.Adopt(QualifierLoc); 10636 } 10637 10638 if (Old->getNamingClass()) { 10639 CXXRecordDecl *NamingClass 10640 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10641 Old->getNameLoc(), 10642 Old->getNamingClass())); 10643 if (!NamingClass) { 10644 R.clear(); 10645 return ExprError(); 10646 } 10647 10648 R.setNamingClass(NamingClass); 10649 } 10650 10651 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10652 10653 // If we have neither explicit template arguments, nor the template keyword, 10654 // it's a normal declaration name or member reference. 10655 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10656 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10657 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10658 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10659 // give a good diagnostic. 10660 if (D && D->isCXXInstanceMember()) { 10661 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10662 /*TemplateArgs=*/nullptr, 10663 /*Scope=*/nullptr); 10664 } 10665 10666 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10667 } 10668 10669 // If we have template arguments, rebuild them, then rebuild the 10670 // templateid expression. 10671 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10672 if (Old->hasExplicitTemplateArgs() && 10673 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10674 Old->getNumTemplateArgs(), 10675 TransArgs)) { 10676 R.clear(); 10677 return ExprError(); 10678 } 10679 10680 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10681 Old->requiresADL(), &TransArgs); 10682 } 10683 10684 template<typename Derived> 10685 ExprResult 10686 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10687 bool ArgChanged = false; 10688 SmallVector<TypeSourceInfo *, 4> Args; 10689 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10690 TypeSourceInfo *From = E->getArg(I); 10691 TypeLoc FromTL = From->getTypeLoc(); 10692 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10693 TypeLocBuilder TLB; 10694 TLB.reserve(FromTL.getFullDataSize()); 10695 QualType To = getDerived().TransformType(TLB, FromTL); 10696 if (To.isNull()) 10697 return ExprError(); 10698 10699 if (To == From->getType()) 10700 Args.push_back(From); 10701 else { 10702 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10703 ArgChanged = true; 10704 } 10705 continue; 10706 } 10707 10708 ArgChanged = true; 10709 10710 // We have a pack expansion. Instantiate it. 10711 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10712 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10713 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10714 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10715 10716 // Determine whether the set of unexpanded parameter packs can and should 10717 // be expanded. 10718 bool Expand = true; 10719 bool RetainExpansion = false; 10720 Optional<unsigned> OrigNumExpansions = 10721 ExpansionTL.getTypePtr()->getNumExpansions(); 10722 Optional<unsigned> NumExpansions = OrigNumExpansions; 10723 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10724 PatternTL.getSourceRange(), 10725 Unexpanded, 10726 Expand, RetainExpansion, 10727 NumExpansions)) 10728 return ExprError(); 10729 10730 if (!Expand) { 10731 // The transform has determined that we should perform a simple 10732 // transformation on the pack expansion, producing another pack 10733 // expansion. 10734 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10735 10736 TypeLocBuilder TLB; 10737 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10738 10739 QualType To = getDerived().TransformType(TLB, PatternTL); 10740 if (To.isNull()) 10741 return ExprError(); 10742 10743 To = getDerived().RebuildPackExpansionType(To, 10744 PatternTL.getSourceRange(), 10745 ExpansionTL.getEllipsisLoc(), 10746 NumExpansions); 10747 if (To.isNull()) 10748 return ExprError(); 10749 10750 PackExpansionTypeLoc ToExpansionTL 10751 = TLB.push<PackExpansionTypeLoc>(To); 10752 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10753 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10754 continue; 10755 } 10756 10757 // Expand the pack expansion by substituting for each argument in the 10758 // pack(s). 10759 for (unsigned I = 0; I != *NumExpansions; ++I) { 10760 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10761 TypeLocBuilder TLB; 10762 TLB.reserve(PatternTL.getFullDataSize()); 10763 QualType To = getDerived().TransformType(TLB, PatternTL); 10764 if (To.isNull()) 10765 return ExprError(); 10766 10767 if (To->containsUnexpandedParameterPack()) { 10768 To = getDerived().RebuildPackExpansionType(To, 10769 PatternTL.getSourceRange(), 10770 ExpansionTL.getEllipsisLoc(), 10771 NumExpansions); 10772 if (To.isNull()) 10773 return ExprError(); 10774 10775 PackExpansionTypeLoc ToExpansionTL 10776 = TLB.push<PackExpansionTypeLoc>(To); 10777 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10778 } 10779 10780 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10781 } 10782 10783 if (!RetainExpansion) 10784 continue; 10785 10786 // If we're supposed to retain a pack expansion, do so by temporarily 10787 // forgetting the partially-substituted parameter pack. 10788 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10789 10790 TypeLocBuilder TLB; 10791 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10792 10793 QualType To = getDerived().TransformType(TLB, PatternTL); 10794 if (To.isNull()) 10795 return ExprError(); 10796 10797 To = getDerived().RebuildPackExpansionType(To, 10798 PatternTL.getSourceRange(), 10799 ExpansionTL.getEllipsisLoc(), 10800 NumExpansions); 10801 if (To.isNull()) 10802 return ExprError(); 10803 10804 PackExpansionTypeLoc ToExpansionTL 10805 = TLB.push<PackExpansionTypeLoc>(To); 10806 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10807 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10808 } 10809 10810 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10811 return E; 10812 10813 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 10814 E->getEndLoc()); 10815 } 10816 10817 template<typename Derived> 10818 ExprResult 10819 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10820 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10821 if (!T) 10822 return ExprError(); 10823 10824 if (!getDerived().AlwaysRebuild() && 10825 T == E->getQueriedTypeSourceInfo()) 10826 return E; 10827 10828 ExprResult SubExpr; 10829 { 10830 EnterExpressionEvaluationContext Unevaluated( 10831 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10832 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10833 if (SubExpr.isInvalid()) 10834 return ExprError(); 10835 10836 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10837 return E; 10838 } 10839 10840 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 10841 SubExpr.get(), E->getEndLoc()); 10842 } 10843 10844 template<typename Derived> 10845 ExprResult 10846 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10847 ExprResult SubExpr; 10848 { 10849 EnterExpressionEvaluationContext Unevaluated( 10850 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10851 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10852 if (SubExpr.isInvalid()) 10853 return ExprError(); 10854 10855 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10856 return E; 10857 } 10858 10859 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 10860 SubExpr.get(), E->getEndLoc()); 10861 } 10862 10863 template <typename Derived> 10864 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10865 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10866 TypeSourceInfo **RecoveryTSI) { 10867 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10868 DRE, AddrTaken, RecoveryTSI); 10869 10870 // Propagate both errors and recovered types, which return ExprEmpty. 10871 if (!NewDRE.isUsable()) 10872 return NewDRE; 10873 10874 // We got an expr, wrap it up in parens. 10875 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10876 return PE; 10877 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10878 PE->getRParen()); 10879 } 10880 10881 template <typename Derived> 10882 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10883 DependentScopeDeclRefExpr *E) { 10884 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10885 nullptr); 10886 } 10887 10888 template<typename Derived> 10889 ExprResult 10890 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10891 DependentScopeDeclRefExpr *E, 10892 bool IsAddressOfOperand, 10893 TypeSourceInfo **RecoveryTSI) { 10894 assert(E->getQualifierLoc()); 10895 NestedNameSpecifierLoc QualifierLoc 10896 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10897 if (!QualifierLoc) 10898 return ExprError(); 10899 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10900 10901 // TODO: If this is a conversion-function-id, verify that the 10902 // destination type name (if present) resolves the same way after 10903 // instantiation as it did in the local scope. 10904 10905 DeclarationNameInfo NameInfo 10906 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10907 if (!NameInfo.getName()) 10908 return ExprError(); 10909 10910 if (!E->hasExplicitTemplateArgs()) { 10911 if (!getDerived().AlwaysRebuild() && 10912 QualifierLoc == E->getQualifierLoc() && 10913 // Note: it is sufficient to compare the Name component of NameInfo: 10914 // if name has not changed, DNLoc has not changed either. 10915 NameInfo.getName() == E->getDeclName()) 10916 return E; 10917 10918 return getDerived().RebuildDependentScopeDeclRefExpr( 10919 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10920 IsAddressOfOperand, RecoveryTSI); 10921 } 10922 10923 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10924 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10925 E->getNumTemplateArgs(), 10926 TransArgs)) 10927 return ExprError(); 10928 10929 return getDerived().RebuildDependentScopeDeclRefExpr( 10930 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10931 RecoveryTSI); 10932 } 10933 10934 template<typename Derived> 10935 ExprResult 10936 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10937 // CXXConstructExprs other than for list-initialization and 10938 // CXXTemporaryObjectExpr are always implicit, so when we have 10939 // a 1-argument construction we just transform that argument. 10940 if ((E->getNumArgs() == 1 || 10941 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10942 (!getDerived().DropCallArgument(E->getArg(0))) && 10943 !E->isListInitialization()) 10944 return getDerived().TransformExpr(E->getArg(0)); 10945 10946 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 10947 10948 QualType T = getDerived().TransformType(E->getType()); 10949 if (T.isNull()) 10950 return ExprError(); 10951 10952 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10953 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10954 if (!Constructor) 10955 return ExprError(); 10956 10957 bool ArgumentChanged = false; 10958 SmallVector<Expr*, 8> Args; 10959 { 10960 EnterExpressionEvaluationContext Context( 10961 getSema(), EnterExpressionEvaluationContext::InitList, 10962 E->isListInitialization()); 10963 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10964 &ArgumentChanged)) 10965 return ExprError(); 10966 } 10967 10968 if (!getDerived().AlwaysRebuild() && 10969 T == E->getType() && 10970 Constructor == E->getConstructor() && 10971 !ArgumentChanged) { 10972 // Mark the constructor as referenced. 10973 // FIXME: Instantiation-specific 10974 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10975 return E; 10976 } 10977 10978 return getDerived().RebuildCXXConstructExpr( 10979 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 10980 E->hadMultipleCandidates(), E->isListInitialization(), 10981 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 10982 E->getConstructionKind(), E->getParenOrBraceRange()); 10983 } 10984 10985 template<typename Derived> 10986 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10987 CXXInheritedCtorInitExpr *E) { 10988 QualType T = getDerived().TransformType(E->getType()); 10989 if (T.isNull()) 10990 return ExprError(); 10991 10992 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10993 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10994 if (!Constructor) 10995 return ExprError(); 10996 10997 if (!getDerived().AlwaysRebuild() && 10998 T == E->getType() && 10999 Constructor == E->getConstructor()) { 11000 // Mark the constructor as referenced. 11001 // FIXME: Instantiation-specific 11002 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11003 return E; 11004 } 11005 11006 return getDerived().RebuildCXXInheritedCtorInitExpr( 11007 T, E->getLocation(), Constructor, 11008 E->constructsVBase(), E->inheritedFromVBase()); 11009 } 11010 11011 /// Transform a C++ temporary-binding expression. 11012 /// 11013 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 11014 /// transform the subexpression and return that. 11015 template<typename Derived> 11016 ExprResult 11017 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 11018 return getDerived().TransformExpr(E->getSubExpr()); 11019 } 11020 11021 /// Transform a C++ expression that contains cleanups that should 11022 /// be run after the expression is evaluated. 11023 /// 11024 /// Since ExprWithCleanups nodes are implicitly generated, we 11025 /// just transform the subexpression and return that. 11026 template<typename Derived> 11027 ExprResult 11028 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 11029 return getDerived().TransformExpr(E->getSubExpr()); 11030 } 11031 11032 template<typename Derived> 11033 ExprResult 11034 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 11035 CXXTemporaryObjectExpr *E) { 11036 TypeSourceInfo *T = 11037 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11038 if (!T) 11039 return ExprError(); 11040 11041 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11042 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11043 if (!Constructor) 11044 return ExprError(); 11045 11046 bool ArgumentChanged = false; 11047 SmallVector<Expr*, 8> Args; 11048 Args.reserve(E->getNumArgs()); 11049 { 11050 EnterExpressionEvaluationContext Context( 11051 getSema(), EnterExpressionEvaluationContext::InitList, 11052 E->isListInitialization()); 11053 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11054 &ArgumentChanged)) 11055 return ExprError(); 11056 } 11057 11058 if (!getDerived().AlwaysRebuild() && 11059 T == E->getTypeSourceInfo() && 11060 Constructor == E->getConstructor() && 11061 !ArgumentChanged) { 11062 // FIXME: Instantiation-specific 11063 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11064 return SemaRef.MaybeBindToTemporary(E); 11065 } 11066 11067 // FIXME: We should just pass E->isListInitialization(), but we're not 11068 // prepared to handle list-initialization without a child InitListExpr. 11069 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 11070 return getDerived().RebuildCXXTemporaryObjectExpr( 11071 T, LParenLoc, Args, E->getEndLoc(), 11072 /*ListInitialization=*/LParenLoc.isInvalid()); 11073 } 11074 11075 template<typename Derived> 11076 ExprResult 11077 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 11078 // Transform any init-capture expressions before entering the scope of the 11079 // lambda body, because they are not semantically within that scope. 11080 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 11081 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 11082 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 11083 E->explicit_capture_begin()); 11084 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11085 CEnd = E->capture_end(); 11086 C != CEnd; ++C) { 11087 if (!E->isInitCapture(C)) 11088 continue; 11089 EnterExpressionEvaluationContext EEEC( 11090 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11091 ExprResult NewExprInitResult = getDerived().TransformInitializer( 11092 C->getCapturedVar()->getInit(), 11093 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 11094 11095 if (NewExprInitResult.isInvalid()) 11096 return ExprError(); 11097 Expr *NewExprInit = NewExprInitResult.get(); 11098 11099 VarDecl *OldVD = C->getCapturedVar(); 11100 QualType NewInitCaptureType = 11101 getSema().buildLambdaInitCaptureInitialization( 11102 C->getLocation(), OldVD->getType()->isReferenceType(), 11103 OldVD->getIdentifier(), 11104 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 11105 NewExprInitResult = NewExprInit; 11106 InitCaptureExprsAndTypes[C - E->capture_begin()] = 11107 std::make_pair(NewExprInitResult, NewInitCaptureType); 11108 } 11109 11110 // Transform the template parameters, and add them to the current 11111 // instantiation scope. The null case is handled correctly. 11112 auto TPL = getDerived().TransformTemplateParameterList( 11113 E->getTemplateParameterList()); 11114 11115 // Transform the type of the original lambda's call operator. 11116 // The transformation MUST be done in the CurrentInstantiationScope since 11117 // it introduces a mapping of the original to the newly created 11118 // transformed parameters. 11119 TypeSourceInfo *NewCallOpTSI = nullptr; 11120 { 11121 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 11122 FunctionProtoTypeLoc OldCallOpFPTL = 11123 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 11124 11125 TypeLocBuilder NewCallOpTLBuilder; 11126 SmallVector<QualType, 4> ExceptionStorage; 11127 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 11128 QualType NewCallOpType = TransformFunctionProtoType( 11129 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 11130 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 11131 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 11132 ExceptionStorage, Changed); 11133 }); 11134 if (NewCallOpType.isNull()) 11135 return ExprError(); 11136 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 11137 NewCallOpType); 11138 } 11139 11140 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 11141 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 11142 LSI->GLTemplateParameterList = TPL; 11143 11144 // Create the local class that will describe the lambda. 11145 CXXRecordDecl *Class 11146 = getSema().createLambdaClosureType(E->getIntroducerRange(), 11147 NewCallOpTSI, 11148 /*KnownDependent=*/false, 11149 E->getCaptureDefault()); 11150 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 11151 11152 // Build the call operator. 11153 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 11154 Class, E->getIntroducerRange(), NewCallOpTSI, 11155 E->getCallOperator()->getEndLoc(), 11156 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 11157 E->getCallOperator()->isConstexpr()); 11158 11159 LSI->CallOperator = NewCallOperator; 11160 11161 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 11162 I != NumParams; ++I) { 11163 auto *P = NewCallOperator->getParamDecl(I); 11164 if (P->hasUninstantiatedDefaultArg()) { 11165 EnterExpressionEvaluationContext Eval( 11166 getSema(), 11167 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 11168 ExprResult R = getDerived().TransformExpr( 11169 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 11170 P->setDefaultArg(R.get()); 11171 } 11172 } 11173 11174 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 11175 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 11176 11177 // Introduce the context of the call operator. 11178 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 11179 /*NewThisContext*/false); 11180 11181 // Enter the scope of the lambda. 11182 getSema().buildLambdaScope(LSI, NewCallOperator, 11183 E->getIntroducerRange(), 11184 E->getCaptureDefault(), 11185 E->getCaptureDefaultLoc(), 11186 E->hasExplicitParameters(), 11187 E->hasExplicitResultType(), 11188 E->isMutable()); 11189 11190 bool Invalid = false; 11191 11192 // Transform captures. 11193 bool FinishedExplicitCaptures = false; 11194 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11195 CEnd = E->capture_end(); 11196 C != CEnd; ++C) { 11197 // When we hit the first implicit capture, tell Sema that we've finished 11198 // the list of explicit captures. 11199 if (!FinishedExplicitCaptures && C->isImplicit()) { 11200 getSema().finishLambdaExplicitCaptures(LSI); 11201 FinishedExplicitCaptures = true; 11202 } 11203 11204 // Capturing 'this' is trivial. 11205 if (C->capturesThis()) { 11206 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11207 /*BuildAndDiagnose*/ true, nullptr, 11208 C->getCaptureKind() == LCK_StarThis); 11209 continue; 11210 } 11211 // Captured expression will be recaptured during captured variables 11212 // rebuilding. 11213 if (C->capturesVLAType()) 11214 continue; 11215 11216 // Rebuild init-captures, including the implied field declaration. 11217 if (E->isInitCapture(C)) { 11218 InitCaptureInfoTy InitExprTypePair = 11219 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11220 ExprResult Init = InitExprTypePair.first; 11221 QualType InitQualType = InitExprTypePair.second; 11222 if (Init.isInvalid() || InitQualType.isNull()) { 11223 Invalid = true; 11224 continue; 11225 } 11226 VarDecl *OldVD = C->getCapturedVar(); 11227 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11228 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11229 OldVD->getInitStyle(), Init.get()); 11230 if (!NewVD) 11231 Invalid = true; 11232 else { 11233 getDerived().transformedLocalDecl(OldVD, NewVD); 11234 } 11235 getSema().buildInitCaptureField(LSI, NewVD); 11236 continue; 11237 } 11238 11239 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11240 11241 // Determine the capture kind for Sema. 11242 Sema::TryCaptureKind Kind 11243 = C->isImplicit()? Sema::TryCapture_Implicit 11244 : C->getCaptureKind() == LCK_ByCopy 11245 ? Sema::TryCapture_ExplicitByVal 11246 : Sema::TryCapture_ExplicitByRef; 11247 SourceLocation EllipsisLoc; 11248 if (C->isPackExpansion()) { 11249 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11250 bool ShouldExpand = false; 11251 bool RetainExpansion = false; 11252 Optional<unsigned> NumExpansions; 11253 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11254 C->getLocation(), 11255 Unexpanded, 11256 ShouldExpand, RetainExpansion, 11257 NumExpansions)) { 11258 Invalid = true; 11259 continue; 11260 } 11261 11262 if (ShouldExpand) { 11263 // The transform has determined that we should perform an expansion; 11264 // transform and capture each of the arguments. 11265 // expansion of the pattern. Do so. 11266 VarDecl *Pack = C->getCapturedVar(); 11267 for (unsigned I = 0; I != *NumExpansions; ++I) { 11268 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11269 VarDecl *CapturedVar 11270 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11271 Pack)); 11272 if (!CapturedVar) { 11273 Invalid = true; 11274 continue; 11275 } 11276 11277 // Capture the transformed variable. 11278 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11279 } 11280 11281 // FIXME: Retain a pack expansion if RetainExpansion is true. 11282 11283 continue; 11284 } 11285 11286 EllipsisLoc = C->getEllipsisLoc(); 11287 } 11288 11289 // Transform the captured variable. 11290 VarDecl *CapturedVar 11291 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11292 C->getCapturedVar())); 11293 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11294 Invalid = true; 11295 continue; 11296 } 11297 11298 // Capture the transformed variable. 11299 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11300 EllipsisLoc); 11301 } 11302 if (!FinishedExplicitCaptures) 11303 getSema().finishLambdaExplicitCaptures(LSI); 11304 11305 // Enter a new evaluation context to insulate the lambda from any 11306 // cleanups from the enclosing full-expression. 11307 getSema().PushExpressionEvaluationContext( 11308 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11309 11310 // Instantiate the body of the lambda expression. 11311 StmtResult Body = 11312 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11313 11314 // ActOnLambda* will pop the function scope for us. 11315 FuncScopeCleanup.disable(); 11316 11317 if (Body.isInvalid()) { 11318 SavedContext.pop(); 11319 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 11320 /*IsInstantiation=*/true); 11321 return ExprError(); 11322 } 11323 11324 // Copy the LSI before ActOnFinishFunctionBody removes it. 11325 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11326 // the call operator. 11327 auto LSICopy = *LSI; 11328 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11329 /*IsInstantiation*/ true); 11330 SavedContext.pop(); 11331 11332 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 11333 &LSICopy); 11334 } 11335 11336 template<typename Derived> 11337 ExprResult 11338 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11339 CXXUnresolvedConstructExpr *E) { 11340 TypeSourceInfo *T = 11341 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11342 if (!T) 11343 return ExprError(); 11344 11345 bool ArgumentChanged = false; 11346 SmallVector<Expr*, 8> Args; 11347 Args.reserve(E->arg_size()); 11348 { 11349 EnterExpressionEvaluationContext Context( 11350 getSema(), EnterExpressionEvaluationContext::InitList, 11351 E->isListInitialization()); 11352 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11353 &ArgumentChanged)) 11354 return ExprError(); 11355 } 11356 11357 if (!getDerived().AlwaysRebuild() && 11358 T == E->getTypeSourceInfo() && 11359 !ArgumentChanged) 11360 return E; 11361 11362 // FIXME: we're faking the locations of the commas 11363 return getDerived().RebuildCXXUnresolvedConstructExpr( 11364 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11365 } 11366 11367 template<typename Derived> 11368 ExprResult 11369 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11370 CXXDependentScopeMemberExpr *E) { 11371 // Transform the base of the expression. 11372 ExprResult Base((Expr*) nullptr); 11373 Expr *OldBase; 11374 QualType BaseType; 11375 QualType ObjectType; 11376 if (!E->isImplicitAccess()) { 11377 OldBase = E->getBase(); 11378 Base = getDerived().TransformExpr(OldBase); 11379 if (Base.isInvalid()) 11380 return ExprError(); 11381 11382 // Start the member reference and compute the object's type. 11383 ParsedType ObjectTy; 11384 bool MayBePseudoDestructor = false; 11385 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11386 E->getOperatorLoc(), 11387 E->isArrow()? tok::arrow : tok::period, 11388 ObjectTy, 11389 MayBePseudoDestructor); 11390 if (Base.isInvalid()) 11391 return ExprError(); 11392 11393 ObjectType = ObjectTy.get(); 11394 BaseType = ((Expr*) Base.get())->getType(); 11395 } else { 11396 OldBase = nullptr; 11397 BaseType = getDerived().TransformType(E->getBaseType()); 11398 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11399 } 11400 11401 // Transform the first part of the nested-name-specifier that qualifies 11402 // the member name. 11403 NamedDecl *FirstQualifierInScope 11404 = getDerived().TransformFirstQualifierInScope( 11405 E->getFirstQualifierFoundInScope(), 11406 E->getQualifierLoc().getBeginLoc()); 11407 11408 NestedNameSpecifierLoc QualifierLoc; 11409 if (E->getQualifier()) { 11410 QualifierLoc 11411 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11412 ObjectType, 11413 FirstQualifierInScope); 11414 if (!QualifierLoc) 11415 return ExprError(); 11416 } 11417 11418 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11419 11420 // TODO: If this is a conversion-function-id, verify that the 11421 // destination type name (if present) resolves the same way after 11422 // instantiation as it did in the local scope. 11423 11424 DeclarationNameInfo NameInfo 11425 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11426 if (!NameInfo.getName()) 11427 return ExprError(); 11428 11429 if (!E->hasExplicitTemplateArgs()) { 11430 // This is a reference to a member without an explicitly-specified 11431 // template argument list. Optimize for this common case. 11432 if (!getDerived().AlwaysRebuild() && 11433 Base.get() == OldBase && 11434 BaseType == E->getBaseType() && 11435 QualifierLoc == E->getQualifierLoc() && 11436 NameInfo.getName() == E->getMember() && 11437 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11438 return E; 11439 11440 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11441 BaseType, 11442 E->isArrow(), 11443 E->getOperatorLoc(), 11444 QualifierLoc, 11445 TemplateKWLoc, 11446 FirstQualifierInScope, 11447 NameInfo, 11448 /*TemplateArgs*/nullptr); 11449 } 11450 11451 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11452 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11453 E->getNumTemplateArgs(), 11454 TransArgs)) 11455 return ExprError(); 11456 11457 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11458 BaseType, 11459 E->isArrow(), 11460 E->getOperatorLoc(), 11461 QualifierLoc, 11462 TemplateKWLoc, 11463 FirstQualifierInScope, 11464 NameInfo, 11465 &TransArgs); 11466 } 11467 11468 template<typename Derived> 11469 ExprResult 11470 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11471 // Transform the base of the expression. 11472 ExprResult Base((Expr*) nullptr); 11473 QualType BaseType; 11474 if (!Old->isImplicitAccess()) { 11475 Base = getDerived().TransformExpr(Old->getBase()); 11476 if (Base.isInvalid()) 11477 return ExprError(); 11478 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11479 Old->isArrow()); 11480 if (Base.isInvalid()) 11481 return ExprError(); 11482 BaseType = Base.get()->getType(); 11483 } else { 11484 BaseType = getDerived().TransformType(Old->getBaseType()); 11485 } 11486 11487 NestedNameSpecifierLoc QualifierLoc; 11488 if (Old->getQualifierLoc()) { 11489 QualifierLoc 11490 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11491 if (!QualifierLoc) 11492 return ExprError(); 11493 } 11494 11495 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11496 11497 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11498 Sema::LookupOrdinaryName); 11499 11500 // Transform the declaration set. 11501 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11502 return ExprError(); 11503 11504 // Determine the naming class. 11505 if (Old->getNamingClass()) { 11506 CXXRecordDecl *NamingClass 11507 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11508 Old->getMemberLoc(), 11509 Old->getNamingClass())); 11510 if (!NamingClass) 11511 return ExprError(); 11512 11513 R.setNamingClass(NamingClass); 11514 } 11515 11516 TemplateArgumentListInfo TransArgs; 11517 if (Old->hasExplicitTemplateArgs()) { 11518 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11519 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11520 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11521 Old->getNumTemplateArgs(), 11522 TransArgs)) 11523 return ExprError(); 11524 } 11525 11526 // FIXME: to do this check properly, we will need to preserve the 11527 // first-qualifier-in-scope here, just in case we had a dependent 11528 // base (and therefore couldn't do the check) and a 11529 // nested-name-qualifier (and therefore could do the lookup). 11530 NamedDecl *FirstQualifierInScope = nullptr; 11531 11532 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11533 BaseType, 11534 Old->getOperatorLoc(), 11535 Old->isArrow(), 11536 QualifierLoc, 11537 TemplateKWLoc, 11538 FirstQualifierInScope, 11539 R, 11540 (Old->hasExplicitTemplateArgs() 11541 ? &TransArgs : nullptr)); 11542 } 11543 11544 template<typename Derived> 11545 ExprResult 11546 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11547 EnterExpressionEvaluationContext Unevaluated( 11548 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11549 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11550 if (SubExpr.isInvalid()) 11551 return ExprError(); 11552 11553 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11554 return E; 11555 11556 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11557 } 11558 11559 template<typename Derived> 11560 ExprResult 11561 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11562 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11563 if (Pattern.isInvalid()) 11564 return ExprError(); 11565 11566 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11567 return E; 11568 11569 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11570 E->getNumExpansions()); 11571 } 11572 11573 template<typename Derived> 11574 ExprResult 11575 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11576 // If E is not value-dependent, then nothing will change when we transform it. 11577 // Note: This is an instantiation-centric view. 11578 if (!E->isValueDependent()) 11579 return E; 11580 11581 EnterExpressionEvaluationContext Unevaluated( 11582 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11583 11584 ArrayRef<TemplateArgument> PackArgs; 11585 TemplateArgument ArgStorage; 11586 11587 // Find the argument list to transform. 11588 if (E->isPartiallySubstituted()) { 11589 PackArgs = E->getPartialArguments(); 11590 } else if (E->isValueDependent()) { 11591 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11592 bool ShouldExpand = false; 11593 bool RetainExpansion = false; 11594 Optional<unsigned> NumExpansions; 11595 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11596 Unexpanded, 11597 ShouldExpand, RetainExpansion, 11598 NumExpansions)) 11599 return ExprError(); 11600 11601 // If we need to expand the pack, build a template argument from it and 11602 // expand that. 11603 if (ShouldExpand) { 11604 auto *Pack = E->getPack(); 11605 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11606 ArgStorage = getSema().Context.getPackExpansionType( 11607 getSema().Context.getTypeDeclType(TTPD), None); 11608 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11609 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11610 } else { 11611 auto *VD = cast<ValueDecl>(Pack); 11612 ExprResult DRE = getSema().BuildDeclRefExpr( 11613 VD, VD->getType().getNonLValueExprType(getSema().Context), 11614 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11615 E->getPackLoc()); 11616 if (DRE.isInvalid()) 11617 return ExprError(); 11618 ArgStorage = new (getSema().Context) PackExpansionExpr( 11619 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11620 } 11621 PackArgs = ArgStorage; 11622 } 11623 } 11624 11625 // If we're not expanding the pack, just transform the decl. 11626 if (!PackArgs.size()) { 11627 auto *Pack = cast_or_null<NamedDecl>( 11628 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11629 if (!Pack) 11630 return ExprError(); 11631 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11632 E->getPackLoc(), 11633 E->getRParenLoc(), None, None); 11634 } 11635 11636 // Try to compute the result without performing a partial substitution. 11637 Optional<unsigned> Result = 0; 11638 for (const TemplateArgument &Arg : PackArgs) { 11639 if (!Arg.isPackExpansion()) { 11640 Result = *Result + 1; 11641 continue; 11642 } 11643 11644 TemplateArgumentLoc ArgLoc; 11645 InventTemplateArgumentLoc(Arg, ArgLoc); 11646 11647 // Find the pattern of the pack expansion. 11648 SourceLocation Ellipsis; 11649 Optional<unsigned> OrigNumExpansions; 11650 TemplateArgumentLoc Pattern = 11651 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11652 OrigNumExpansions); 11653 11654 // Substitute under the pack expansion. Do not expand the pack (yet). 11655 TemplateArgumentLoc OutPattern; 11656 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11657 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11658 /*Uneval*/ true)) 11659 return true; 11660 11661 // See if we can determine the number of arguments from the result. 11662 Optional<unsigned> NumExpansions = 11663 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11664 if (!NumExpansions) { 11665 // No: we must be in an alias template expansion, and we're going to need 11666 // to actually expand the packs. 11667 Result = None; 11668 break; 11669 } 11670 11671 Result = *Result + *NumExpansions; 11672 } 11673 11674 // Common case: we could determine the number of expansions without 11675 // substituting. 11676 if (Result) 11677 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11678 E->getPackLoc(), 11679 E->getRParenLoc(), *Result, None); 11680 11681 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11682 E->getPackLoc()); 11683 { 11684 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11685 typedef TemplateArgumentLocInventIterator< 11686 Derived, const TemplateArgument*> PackLocIterator; 11687 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11688 PackLocIterator(*this, PackArgs.end()), 11689 TransformedPackArgs, /*Uneval*/true)) 11690 return ExprError(); 11691 } 11692 11693 // Check whether we managed to fully-expand the pack. 11694 // FIXME: Is it possible for us to do so and not hit the early exit path? 11695 SmallVector<TemplateArgument, 8> Args; 11696 bool PartialSubstitution = false; 11697 for (auto &Loc : TransformedPackArgs.arguments()) { 11698 Args.push_back(Loc.getArgument()); 11699 if (Loc.getArgument().isPackExpansion()) 11700 PartialSubstitution = true; 11701 } 11702 11703 if (PartialSubstitution) 11704 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11705 E->getPackLoc(), 11706 E->getRParenLoc(), None, Args); 11707 11708 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11709 E->getPackLoc(), E->getRParenLoc(), 11710 Args.size(), None); 11711 } 11712 11713 template<typename Derived> 11714 ExprResult 11715 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11716 SubstNonTypeTemplateParmPackExpr *E) { 11717 // Default behavior is to do nothing with this transformation. 11718 return E; 11719 } 11720 11721 template<typename Derived> 11722 ExprResult 11723 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11724 SubstNonTypeTemplateParmExpr *E) { 11725 // Default behavior is to do nothing with this transformation. 11726 return E; 11727 } 11728 11729 template<typename Derived> 11730 ExprResult 11731 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11732 // Default behavior is to do nothing with this transformation. 11733 return E; 11734 } 11735 11736 template<typename Derived> 11737 ExprResult 11738 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11739 MaterializeTemporaryExpr *E) { 11740 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11741 } 11742 11743 template<typename Derived> 11744 ExprResult 11745 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11746 Expr *Pattern = E->getPattern(); 11747 11748 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11749 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11750 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11751 11752 // Determine whether the set of unexpanded parameter packs can and should 11753 // be expanded. 11754 bool Expand = true; 11755 bool RetainExpansion = false; 11756 Optional<unsigned> NumExpansions; 11757 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11758 Pattern->getSourceRange(), 11759 Unexpanded, 11760 Expand, RetainExpansion, 11761 NumExpansions)) 11762 return true; 11763 11764 if (!Expand) { 11765 // Do not expand any packs here, just transform and rebuild a fold 11766 // expression. 11767 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11768 11769 ExprResult LHS = 11770 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11771 if (LHS.isInvalid()) 11772 return true; 11773 11774 ExprResult RHS = 11775 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11776 if (RHS.isInvalid()) 11777 return true; 11778 11779 if (!getDerived().AlwaysRebuild() && 11780 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11781 return E; 11782 11783 return getDerived().RebuildCXXFoldExpr( 11784 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11785 RHS.get(), E->getEndLoc()); 11786 } 11787 11788 // The transform has determined that we should perform an elementwise 11789 // expansion of the pattern. Do so. 11790 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11791 if (Result.isInvalid()) 11792 return true; 11793 bool LeftFold = E->isLeftFold(); 11794 11795 // If we're retaining an expansion for a right fold, it is the innermost 11796 // component and takes the init (if any). 11797 if (!LeftFold && RetainExpansion) { 11798 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11799 11800 ExprResult Out = getDerived().TransformExpr(Pattern); 11801 if (Out.isInvalid()) 11802 return true; 11803 11804 Result = getDerived().RebuildCXXFoldExpr( 11805 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11806 Result.get(), E->getEndLoc()); 11807 if (Result.isInvalid()) 11808 return true; 11809 } 11810 11811 for (unsigned I = 0; I != *NumExpansions; ++I) { 11812 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11813 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11814 ExprResult Out = getDerived().TransformExpr(Pattern); 11815 if (Out.isInvalid()) 11816 return true; 11817 11818 if (Out.get()->containsUnexpandedParameterPack()) { 11819 // We still have a pack; retain a pack expansion for this slice. 11820 Result = getDerived().RebuildCXXFoldExpr( 11821 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 11822 E->getOperator(), E->getEllipsisLoc(), 11823 LeftFold ? Out.get() : Result.get(), E->getEndLoc()); 11824 } else if (Result.isUsable()) { 11825 // We've got down to a single element; build a binary operator. 11826 Result = getDerived().RebuildBinaryOperator( 11827 E->getEllipsisLoc(), E->getOperator(), 11828 LeftFold ? Result.get() : Out.get(), 11829 LeftFold ? Out.get() : Result.get()); 11830 } else 11831 Result = Out; 11832 11833 if (Result.isInvalid()) 11834 return true; 11835 } 11836 11837 // If we're retaining an expansion for a left fold, it is the outermost 11838 // component and takes the complete expansion so far as its init (if any). 11839 if (LeftFold && RetainExpansion) { 11840 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11841 11842 ExprResult Out = getDerived().TransformExpr(Pattern); 11843 if (Out.isInvalid()) 11844 return true; 11845 11846 Result = getDerived().RebuildCXXFoldExpr( 11847 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 11848 Out.get(), E->getEndLoc()); 11849 if (Result.isInvalid()) 11850 return true; 11851 } 11852 11853 // If we had no init and an empty pack, and we're not retaining an expansion, 11854 // then produce a fallback value or error. 11855 if (Result.isUnset()) 11856 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11857 E->getOperator()); 11858 11859 return Result; 11860 } 11861 11862 template<typename Derived> 11863 ExprResult 11864 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11865 CXXStdInitializerListExpr *E) { 11866 return getDerived().TransformExpr(E->getSubExpr()); 11867 } 11868 11869 template<typename Derived> 11870 ExprResult 11871 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11872 return SemaRef.MaybeBindToTemporary(E); 11873 } 11874 11875 template<typename Derived> 11876 ExprResult 11877 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11878 return E; 11879 } 11880 11881 template<typename Derived> 11882 ExprResult 11883 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11884 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11885 if (SubExpr.isInvalid()) 11886 return ExprError(); 11887 11888 if (!getDerived().AlwaysRebuild() && 11889 SubExpr.get() == E->getSubExpr()) 11890 return E; 11891 11892 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11893 } 11894 11895 template<typename Derived> 11896 ExprResult 11897 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11898 // Transform each of the elements. 11899 SmallVector<Expr *, 8> Elements; 11900 bool ArgChanged = false; 11901 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11902 /*IsCall=*/false, Elements, &ArgChanged)) 11903 return ExprError(); 11904 11905 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11906 return SemaRef.MaybeBindToTemporary(E); 11907 11908 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11909 Elements.data(), 11910 Elements.size()); 11911 } 11912 11913 template<typename Derived> 11914 ExprResult 11915 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11916 ObjCDictionaryLiteral *E) { 11917 // Transform each of the elements. 11918 SmallVector<ObjCDictionaryElement, 8> Elements; 11919 bool ArgChanged = false; 11920 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11921 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11922 11923 if (OrigElement.isPackExpansion()) { 11924 // This key/value element is a pack expansion. 11925 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11926 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11927 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11928 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11929 11930 // Determine whether the set of unexpanded parameter packs can 11931 // and should be expanded. 11932 bool Expand = true; 11933 bool RetainExpansion = false; 11934 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11935 Optional<unsigned> NumExpansions = OrigNumExpansions; 11936 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 11937 OrigElement.Value->getEndLoc()); 11938 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11939 PatternRange, Unexpanded, Expand, 11940 RetainExpansion, NumExpansions)) 11941 return ExprError(); 11942 11943 if (!Expand) { 11944 // The transform has determined that we should perform a simple 11945 // transformation on the pack expansion, producing another pack 11946 // expansion. 11947 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11948 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11949 if (Key.isInvalid()) 11950 return ExprError(); 11951 11952 if (Key.get() != OrigElement.Key) 11953 ArgChanged = true; 11954 11955 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11956 if (Value.isInvalid()) 11957 return ExprError(); 11958 11959 if (Value.get() != OrigElement.Value) 11960 ArgChanged = true; 11961 11962 ObjCDictionaryElement Expansion = { 11963 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11964 }; 11965 Elements.push_back(Expansion); 11966 continue; 11967 } 11968 11969 // Record right away that the argument was changed. This needs 11970 // to happen even if the array expands to nothing. 11971 ArgChanged = true; 11972 11973 // The transform has determined that we should perform an elementwise 11974 // expansion of the pattern. Do so. 11975 for (unsigned I = 0; I != *NumExpansions; ++I) { 11976 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11977 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11978 if (Key.isInvalid()) 11979 return ExprError(); 11980 11981 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11982 if (Value.isInvalid()) 11983 return ExprError(); 11984 11985 ObjCDictionaryElement Element = { 11986 Key.get(), Value.get(), SourceLocation(), NumExpansions 11987 }; 11988 11989 // If any unexpanded parameter packs remain, we still have a 11990 // pack expansion. 11991 // FIXME: Can this really happen? 11992 if (Key.get()->containsUnexpandedParameterPack() || 11993 Value.get()->containsUnexpandedParameterPack()) 11994 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11995 11996 Elements.push_back(Element); 11997 } 11998 11999 // FIXME: Retain a pack expansion if RetainExpansion is true. 12000 12001 // We've finished with this pack expansion. 12002 continue; 12003 } 12004 12005 // Transform and check key. 12006 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12007 if (Key.isInvalid()) 12008 return ExprError(); 12009 12010 if (Key.get() != OrigElement.Key) 12011 ArgChanged = true; 12012 12013 // Transform and check value. 12014 ExprResult Value 12015 = getDerived().TransformExpr(OrigElement.Value); 12016 if (Value.isInvalid()) 12017 return ExprError(); 12018 12019 if (Value.get() != OrigElement.Value) 12020 ArgChanged = true; 12021 12022 ObjCDictionaryElement Element = { 12023 Key.get(), Value.get(), SourceLocation(), None 12024 }; 12025 Elements.push_back(Element); 12026 } 12027 12028 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12029 return SemaRef.MaybeBindToTemporary(E); 12030 12031 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 12032 Elements); 12033 } 12034 12035 template<typename Derived> 12036 ExprResult 12037 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 12038 TypeSourceInfo *EncodedTypeInfo 12039 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 12040 if (!EncodedTypeInfo) 12041 return ExprError(); 12042 12043 if (!getDerived().AlwaysRebuild() && 12044 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 12045 return E; 12046 12047 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 12048 EncodedTypeInfo, 12049 E->getRParenLoc()); 12050 } 12051 12052 template<typename Derived> 12053 ExprResult TreeTransform<Derived>:: 12054 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 12055 // This is a kind of implicit conversion, and it needs to get dropped 12056 // and recomputed for the same general reasons that ImplicitCastExprs 12057 // do, as well a more specific one: this expression is only valid when 12058 // it appears *immediately* as an argument expression. 12059 return getDerived().TransformExpr(E->getSubExpr()); 12060 } 12061 12062 template<typename Derived> 12063 ExprResult TreeTransform<Derived>:: 12064 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 12065 TypeSourceInfo *TSInfo 12066 = getDerived().TransformType(E->getTypeInfoAsWritten()); 12067 if (!TSInfo) 12068 return ExprError(); 12069 12070 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 12071 if (Result.isInvalid()) 12072 return ExprError(); 12073 12074 if (!getDerived().AlwaysRebuild() && 12075 TSInfo == E->getTypeInfoAsWritten() && 12076 Result.get() == E->getSubExpr()) 12077 return E; 12078 12079 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 12080 E->getBridgeKeywordLoc(), TSInfo, 12081 Result.get()); 12082 } 12083 12084 template <typename Derived> 12085 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 12086 ObjCAvailabilityCheckExpr *E) { 12087 return E; 12088 } 12089 12090 template<typename Derived> 12091 ExprResult 12092 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 12093 // Transform arguments. 12094 bool ArgChanged = false; 12095 SmallVector<Expr*, 8> Args; 12096 Args.reserve(E->getNumArgs()); 12097 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 12098 &ArgChanged)) 12099 return ExprError(); 12100 12101 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 12102 // Class message: transform the receiver type. 12103 TypeSourceInfo *ReceiverTypeInfo 12104 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 12105 if (!ReceiverTypeInfo) 12106 return ExprError(); 12107 12108 // If nothing changed, just retain the existing message send. 12109 if (!getDerived().AlwaysRebuild() && 12110 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 12111 return SemaRef.MaybeBindToTemporary(E); 12112 12113 // Build a new class message send. 12114 SmallVector<SourceLocation, 16> SelLocs; 12115 E->getSelectorLocs(SelLocs); 12116 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 12117 E->getSelector(), 12118 SelLocs, 12119 E->getMethodDecl(), 12120 E->getLeftLoc(), 12121 Args, 12122 E->getRightLoc()); 12123 } 12124 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 12125 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 12126 if (!E->getMethodDecl()) 12127 return ExprError(); 12128 12129 // Build a new class message send to 'super'. 12130 SmallVector<SourceLocation, 16> SelLocs; 12131 E->getSelectorLocs(SelLocs); 12132 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 12133 E->getSelector(), 12134 SelLocs, 12135 E->getReceiverType(), 12136 E->getMethodDecl(), 12137 E->getLeftLoc(), 12138 Args, 12139 E->getRightLoc()); 12140 } 12141 12142 // Instance message: transform the receiver 12143 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 12144 "Only class and instance messages may be instantiated"); 12145 ExprResult Receiver 12146 = getDerived().TransformExpr(E->getInstanceReceiver()); 12147 if (Receiver.isInvalid()) 12148 return ExprError(); 12149 12150 // If nothing changed, just retain the existing message send. 12151 if (!getDerived().AlwaysRebuild() && 12152 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 12153 return SemaRef.MaybeBindToTemporary(E); 12154 12155 // Build a new instance message send. 12156 SmallVector<SourceLocation, 16> SelLocs; 12157 E->getSelectorLocs(SelLocs); 12158 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 12159 E->getSelector(), 12160 SelLocs, 12161 E->getMethodDecl(), 12162 E->getLeftLoc(), 12163 Args, 12164 E->getRightLoc()); 12165 } 12166 12167 template<typename Derived> 12168 ExprResult 12169 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 12170 return E; 12171 } 12172 12173 template<typename Derived> 12174 ExprResult 12175 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 12176 return E; 12177 } 12178 12179 template<typename Derived> 12180 ExprResult 12181 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 12182 // Transform the base expression. 12183 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12184 if (Base.isInvalid()) 12185 return ExprError(); 12186 12187 // We don't need to transform the ivar; it will never change. 12188 12189 // If nothing changed, just retain the existing expression. 12190 if (!getDerived().AlwaysRebuild() && 12191 Base.get() == E->getBase()) 12192 return E; 12193 12194 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 12195 E->getLocation(), 12196 E->isArrow(), E->isFreeIvar()); 12197 } 12198 12199 template<typename Derived> 12200 ExprResult 12201 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 12202 // 'super' and types never change. Property never changes. Just 12203 // retain the existing expression. 12204 if (!E->isObjectReceiver()) 12205 return E; 12206 12207 // Transform the base expression. 12208 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12209 if (Base.isInvalid()) 12210 return ExprError(); 12211 12212 // We don't need to transform the property; it will never change. 12213 12214 // If nothing changed, just retain the existing expression. 12215 if (!getDerived().AlwaysRebuild() && 12216 Base.get() == E->getBase()) 12217 return E; 12218 12219 if (E->isExplicitProperty()) 12220 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12221 E->getExplicitProperty(), 12222 E->getLocation()); 12223 12224 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12225 SemaRef.Context.PseudoObjectTy, 12226 E->getImplicitPropertyGetter(), 12227 E->getImplicitPropertySetter(), 12228 E->getLocation()); 12229 } 12230 12231 template<typename Derived> 12232 ExprResult 12233 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12234 // Transform the base expression. 12235 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12236 if (Base.isInvalid()) 12237 return ExprError(); 12238 12239 // Transform the key expression. 12240 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12241 if (Key.isInvalid()) 12242 return ExprError(); 12243 12244 // If nothing changed, just retain the existing expression. 12245 if (!getDerived().AlwaysRebuild() && 12246 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12247 return E; 12248 12249 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12250 Base.get(), Key.get(), 12251 E->getAtIndexMethodDecl(), 12252 E->setAtIndexMethodDecl()); 12253 } 12254 12255 template<typename Derived> 12256 ExprResult 12257 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12258 // Transform the base expression. 12259 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12260 if (Base.isInvalid()) 12261 return ExprError(); 12262 12263 // If nothing changed, just retain the existing expression. 12264 if (!getDerived().AlwaysRebuild() && 12265 Base.get() == E->getBase()) 12266 return E; 12267 12268 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12269 E->getOpLoc(), 12270 E->isArrow()); 12271 } 12272 12273 template<typename Derived> 12274 ExprResult 12275 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12276 bool ArgumentChanged = false; 12277 SmallVector<Expr*, 8> SubExprs; 12278 SubExprs.reserve(E->getNumSubExprs()); 12279 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12280 SubExprs, &ArgumentChanged)) 12281 return ExprError(); 12282 12283 if (!getDerived().AlwaysRebuild() && 12284 !ArgumentChanged) 12285 return E; 12286 12287 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12288 SubExprs, 12289 E->getRParenLoc()); 12290 } 12291 12292 template<typename Derived> 12293 ExprResult 12294 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12295 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12296 if (SrcExpr.isInvalid()) 12297 return ExprError(); 12298 12299 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12300 if (!Type) 12301 return ExprError(); 12302 12303 if (!getDerived().AlwaysRebuild() && 12304 Type == E->getTypeSourceInfo() && 12305 SrcExpr.get() == E->getSrcExpr()) 12306 return E; 12307 12308 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12309 SrcExpr.get(), Type, 12310 E->getRParenLoc()); 12311 } 12312 12313 template<typename Derived> 12314 ExprResult 12315 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12316 BlockDecl *oldBlock = E->getBlockDecl(); 12317 12318 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12319 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12320 12321 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12322 blockScope->TheDecl->setBlockMissingReturnType( 12323 oldBlock->blockMissingReturnType()); 12324 12325 SmallVector<ParmVarDecl*, 4> params; 12326 SmallVector<QualType, 4> paramTypes; 12327 12328 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12329 12330 // Parameter substitution. 12331 Sema::ExtParameterInfoBuilder extParamInfos; 12332 if (getDerived().TransformFunctionTypeParams( 12333 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12334 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12335 extParamInfos)) { 12336 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12337 return ExprError(); 12338 } 12339 12340 QualType exprResultType = 12341 getDerived().TransformType(exprFunctionType->getReturnType()); 12342 12343 auto epi = exprFunctionType->getExtProtoInfo(); 12344 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12345 12346 QualType functionType = 12347 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12348 blockScope->FunctionType = functionType; 12349 12350 // Set the parameters on the block decl. 12351 if (!params.empty()) 12352 blockScope->TheDecl->setParams(params); 12353 12354 if (!oldBlock->blockMissingReturnType()) { 12355 blockScope->HasImplicitReturnType = false; 12356 blockScope->ReturnType = exprResultType; 12357 } 12358 12359 // Transform the body 12360 StmtResult body = getDerived().TransformStmt(E->getBody()); 12361 if (body.isInvalid()) { 12362 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12363 return ExprError(); 12364 } 12365 12366 #ifndef NDEBUG 12367 // In builds with assertions, make sure that we captured everything we 12368 // captured before. 12369 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12370 for (const auto &I : oldBlock->captures()) { 12371 VarDecl *oldCapture = I.getVariable(); 12372 12373 // Ignore parameter packs. 12374 if (isa<ParmVarDecl>(oldCapture) && 12375 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12376 continue; 12377 12378 VarDecl *newCapture = 12379 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12380 oldCapture)); 12381 assert(blockScope->CaptureMap.count(newCapture)); 12382 } 12383 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12384 } 12385 #endif 12386 12387 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12388 /*Scope=*/nullptr); 12389 } 12390 12391 template<typename Derived> 12392 ExprResult 12393 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12394 llvm_unreachable("Cannot transform asType expressions yet"); 12395 } 12396 12397 template<typename Derived> 12398 ExprResult 12399 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12400 QualType RetTy = getDerived().TransformType(E->getType()); 12401 bool ArgumentChanged = false; 12402 SmallVector<Expr*, 8> SubExprs; 12403 SubExprs.reserve(E->getNumSubExprs()); 12404 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12405 SubExprs, &ArgumentChanged)) 12406 return ExprError(); 12407 12408 if (!getDerived().AlwaysRebuild() && 12409 !ArgumentChanged) 12410 return E; 12411 12412 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12413 RetTy, E->getOp(), E->getRParenLoc()); 12414 } 12415 12416 //===----------------------------------------------------------------------===// 12417 // Type reconstruction 12418 //===----------------------------------------------------------------------===// 12419 12420 template<typename Derived> 12421 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12422 SourceLocation Star) { 12423 return SemaRef.BuildPointerType(PointeeType, Star, 12424 getDerived().getBaseEntity()); 12425 } 12426 12427 template<typename Derived> 12428 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12429 SourceLocation Star) { 12430 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12431 getDerived().getBaseEntity()); 12432 } 12433 12434 template<typename Derived> 12435 QualType 12436 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12437 bool WrittenAsLValue, 12438 SourceLocation Sigil) { 12439 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12440 Sigil, getDerived().getBaseEntity()); 12441 } 12442 12443 template<typename Derived> 12444 QualType 12445 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12446 QualType ClassType, 12447 SourceLocation Sigil) { 12448 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12449 getDerived().getBaseEntity()); 12450 } 12451 12452 template<typename Derived> 12453 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12454 const ObjCTypeParamDecl *Decl, 12455 SourceLocation ProtocolLAngleLoc, 12456 ArrayRef<ObjCProtocolDecl *> Protocols, 12457 ArrayRef<SourceLocation> ProtocolLocs, 12458 SourceLocation ProtocolRAngleLoc) { 12459 return SemaRef.BuildObjCTypeParamType(Decl, 12460 ProtocolLAngleLoc, Protocols, 12461 ProtocolLocs, ProtocolRAngleLoc, 12462 /*FailOnError=*/true); 12463 } 12464 12465 template<typename Derived> 12466 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12467 QualType BaseType, 12468 SourceLocation Loc, 12469 SourceLocation TypeArgsLAngleLoc, 12470 ArrayRef<TypeSourceInfo *> TypeArgs, 12471 SourceLocation TypeArgsRAngleLoc, 12472 SourceLocation ProtocolLAngleLoc, 12473 ArrayRef<ObjCProtocolDecl *> Protocols, 12474 ArrayRef<SourceLocation> ProtocolLocs, 12475 SourceLocation ProtocolRAngleLoc) { 12476 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12477 TypeArgs, TypeArgsRAngleLoc, 12478 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12479 ProtocolRAngleLoc, 12480 /*FailOnError=*/true); 12481 } 12482 12483 template<typename Derived> 12484 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12485 QualType PointeeType, 12486 SourceLocation Star) { 12487 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12488 } 12489 12490 template<typename Derived> 12491 QualType 12492 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12493 ArrayType::ArraySizeModifier SizeMod, 12494 const llvm::APInt *Size, 12495 Expr *SizeExpr, 12496 unsigned IndexTypeQuals, 12497 SourceRange BracketsRange) { 12498 if (SizeExpr || !Size) 12499 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12500 IndexTypeQuals, BracketsRange, 12501 getDerived().getBaseEntity()); 12502 12503 QualType Types[] = { 12504 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12505 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12506 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12507 }; 12508 const unsigned NumTypes = llvm::array_lengthof(Types); 12509 QualType SizeType; 12510 for (unsigned I = 0; I != NumTypes; ++I) 12511 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12512 SizeType = Types[I]; 12513 break; 12514 } 12515 12516 // Note that we can return a VariableArrayType here in the case where 12517 // the element type was a dependent VariableArrayType. 12518 IntegerLiteral *ArraySize 12519 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12520 /*FIXME*/BracketsRange.getBegin()); 12521 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12522 IndexTypeQuals, BracketsRange, 12523 getDerived().getBaseEntity()); 12524 } 12525 12526 template<typename Derived> 12527 QualType 12528 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12529 ArrayType::ArraySizeModifier SizeMod, 12530 const llvm::APInt &Size, 12531 unsigned IndexTypeQuals, 12532 SourceRange BracketsRange) { 12533 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12534 IndexTypeQuals, BracketsRange); 12535 } 12536 12537 template<typename Derived> 12538 QualType 12539 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12540 ArrayType::ArraySizeModifier SizeMod, 12541 unsigned IndexTypeQuals, 12542 SourceRange BracketsRange) { 12543 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12544 IndexTypeQuals, BracketsRange); 12545 } 12546 12547 template<typename Derived> 12548 QualType 12549 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12550 ArrayType::ArraySizeModifier SizeMod, 12551 Expr *SizeExpr, 12552 unsigned IndexTypeQuals, 12553 SourceRange BracketsRange) { 12554 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12555 SizeExpr, 12556 IndexTypeQuals, BracketsRange); 12557 } 12558 12559 template<typename Derived> 12560 QualType 12561 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12562 ArrayType::ArraySizeModifier SizeMod, 12563 Expr *SizeExpr, 12564 unsigned IndexTypeQuals, 12565 SourceRange BracketsRange) { 12566 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12567 SizeExpr, 12568 IndexTypeQuals, BracketsRange); 12569 } 12570 12571 template <typename Derived> 12572 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12573 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12574 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12575 AttributeLoc); 12576 } 12577 12578 template <typename Derived> 12579 QualType 12580 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12581 unsigned NumElements, 12582 VectorType::VectorKind VecKind) { 12583 // FIXME: semantic checking! 12584 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12585 } 12586 12587 template <typename Derived> 12588 QualType TreeTransform<Derived>::RebuildDependentVectorType( 12589 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 12590 VectorType::VectorKind VecKind) { 12591 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 12592 } 12593 12594 template<typename Derived> 12595 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12596 unsigned NumElements, 12597 SourceLocation AttributeLoc) { 12598 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12599 NumElements, true); 12600 IntegerLiteral *VectorSize 12601 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12602 AttributeLoc); 12603 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12604 } 12605 12606 template<typename Derived> 12607 QualType 12608 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12609 Expr *SizeExpr, 12610 SourceLocation AttributeLoc) { 12611 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12612 } 12613 12614 template<typename Derived> 12615 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12616 QualType T, 12617 MutableArrayRef<QualType> ParamTypes, 12618 const FunctionProtoType::ExtProtoInfo &EPI) { 12619 return SemaRef.BuildFunctionType(T, ParamTypes, 12620 getDerived().getBaseLocation(), 12621 getDerived().getBaseEntity(), 12622 EPI); 12623 } 12624 12625 template<typename Derived> 12626 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12627 return SemaRef.Context.getFunctionNoProtoType(T); 12628 } 12629 12630 template<typename Derived> 12631 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12632 Decl *D) { 12633 assert(D && "no decl found"); 12634 if (D->isInvalidDecl()) return QualType(); 12635 12636 // FIXME: Doesn't account for ObjCInterfaceDecl! 12637 TypeDecl *Ty; 12638 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12639 // A valid resolved using typename pack expansion decl can have multiple 12640 // UsingDecls, but they must each have exactly one type, and it must be 12641 // the same type in every case. But we must have at least one expansion! 12642 if (UPD->expansions().empty()) { 12643 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12644 << UPD->isCXXClassMember() << UPD; 12645 return QualType(); 12646 } 12647 12648 // We might still have some unresolved types. Try to pick a resolved type 12649 // if we can. The final instantiation will check that the remaining 12650 // unresolved types instantiate to the type we pick. 12651 QualType FallbackT; 12652 QualType T; 12653 for (auto *E : UPD->expansions()) { 12654 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12655 if (ThisT.isNull()) 12656 continue; 12657 else if (ThisT->getAs<UnresolvedUsingType>()) 12658 FallbackT = ThisT; 12659 else if (T.isNull()) 12660 T = ThisT; 12661 else 12662 assert(getSema().Context.hasSameType(ThisT, T) && 12663 "mismatched resolved types in using pack expansion"); 12664 } 12665 return T.isNull() ? FallbackT : T; 12666 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12667 assert(Using->hasTypename() && 12668 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12669 12670 // A valid resolved using typename decl points to exactly one type decl. 12671 assert(++Using->shadow_begin() == Using->shadow_end()); 12672 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12673 } else { 12674 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12675 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12676 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12677 } 12678 12679 return SemaRef.Context.getTypeDeclType(Ty); 12680 } 12681 12682 template<typename Derived> 12683 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12684 SourceLocation Loc) { 12685 return SemaRef.BuildTypeofExprType(E, Loc); 12686 } 12687 12688 template<typename Derived> 12689 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12690 return SemaRef.Context.getTypeOfType(Underlying); 12691 } 12692 12693 template<typename Derived> 12694 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12695 SourceLocation Loc) { 12696 return SemaRef.BuildDecltypeType(E, Loc); 12697 } 12698 12699 template<typename Derived> 12700 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12701 UnaryTransformType::UTTKind UKind, 12702 SourceLocation Loc) { 12703 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12704 } 12705 12706 template<typename Derived> 12707 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12708 TemplateName Template, 12709 SourceLocation TemplateNameLoc, 12710 TemplateArgumentListInfo &TemplateArgs) { 12711 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12712 } 12713 12714 template<typename Derived> 12715 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12716 SourceLocation KWLoc) { 12717 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12718 } 12719 12720 template<typename Derived> 12721 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12722 SourceLocation KWLoc, 12723 bool isReadPipe) { 12724 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12725 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12726 } 12727 12728 template<typename Derived> 12729 TemplateName 12730 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12731 bool TemplateKW, 12732 TemplateDecl *Template) { 12733 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12734 Template); 12735 } 12736 12737 template<typename Derived> 12738 TemplateName 12739 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12740 SourceLocation TemplateKWLoc, 12741 const IdentifierInfo &Name, 12742 SourceLocation NameLoc, 12743 QualType ObjectType, 12744 NamedDecl *FirstQualifierInScope, 12745 bool AllowInjectedClassName) { 12746 UnqualifiedId TemplateName; 12747 TemplateName.setIdentifier(&Name, NameLoc); 12748 Sema::TemplateTy Template; 12749 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12750 SS, TemplateKWLoc, TemplateName, 12751 ParsedType::make(ObjectType), 12752 /*EnteringContext=*/false, 12753 Template, AllowInjectedClassName); 12754 return Template.get(); 12755 } 12756 12757 template<typename Derived> 12758 TemplateName 12759 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12760 SourceLocation TemplateKWLoc, 12761 OverloadedOperatorKind Operator, 12762 SourceLocation NameLoc, 12763 QualType ObjectType, 12764 bool AllowInjectedClassName) { 12765 UnqualifiedId Name; 12766 // FIXME: Bogus location information. 12767 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12768 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12769 Sema::TemplateTy Template; 12770 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12771 SS, TemplateKWLoc, Name, 12772 ParsedType::make(ObjectType), 12773 /*EnteringContext=*/false, 12774 Template, AllowInjectedClassName); 12775 return Template.get(); 12776 } 12777 12778 template<typename Derived> 12779 ExprResult 12780 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12781 SourceLocation OpLoc, 12782 Expr *OrigCallee, 12783 Expr *First, 12784 Expr *Second) { 12785 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12786 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12787 12788 if (First->getObjectKind() == OK_ObjCProperty) { 12789 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12790 if (BinaryOperator::isAssignmentOp(Opc)) 12791 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12792 First, Second); 12793 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12794 if (Result.isInvalid()) 12795 return ExprError(); 12796 First = Result.get(); 12797 } 12798 12799 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12800 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12801 if (Result.isInvalid()) 12802 return ExprError(); 12803 Second = Result.get(); 12804 } 12805 12806 // Determine whether this should be a builtin operation. 12807 if (Op == OO_Subscript) { 12808 if (!First->getType()->isOverloadableType() && 12809 !Second->getType()->isOverloadableType()) 12810 return getSema().CreateBuiltinArraySubscriptExpr( 12811 First, Callee->getBeginLoc(), Second, OpLoc); 12812 } else if (Op == OO_Arrow) { 12813 // -> is never a builtin operation. 12814 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12815 } else if (Second == nullptr || isPostIncDec) { 12816 if (!First->getType()->isOverloadableType() || 12817 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 12818 // The argument is not of overloadable type, or this is an expression 12819 // of the form &Class::member, so try to create a built-in unary 12820 // operation. 12821 UnaryOperatorKind Opc 12822 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12823 12824 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12825 } 12826 } else { 12827 if (!First->getType()->isOverloadableType() && 12828 !Second->getType()->isOverloadableType()) { 12829 // Neither of the arguments is an overloadable type, so try to 12830 // create a built-in binary operation. 12831 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12832 ExprResult Result 12833 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12834 if (Result.isInvalid()) 12835 return ExprError(); 12836 12837 return Result; 12838 } 12839 } 12840 12841 // Compute the transformed set of functions (and function templates) to be 12842 // used during overload resolution. 12843 UnresolvedSet<16> Functions; 12844 bool RequiresADL; 12845 12846 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12847 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12848 // If the overload could not be resolved in the template definition 12849 // (because we had a dependent argument), ADL is performed as part of 12850 // template instantiation. 12851 RequiresADL = ULE->requiresADL(); 12852 } else { 12853 // If we've resolved this to a particular non-member function, just call 12854 // that function. If we resolved it to a member function, 12855 // CreateOverloaded* will find that function for us. 12856 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12857 if (!isa<CXXMethodDecl>(ND)) 12858 Functions.addDecl(ND); 12859 RequiresADL = false; 12860 } 12861 12862 // Add any functions found via argument-dependent lookup. 12863 Expr *Args[2] = { First, Second }; 12864 unsigned NumArgs = 1 + (Second != nullptr); 12865 12866 // Create the overloaded operator invocation for unary operators. 12867 if (NumArgs == 1 || isPostIncDec) { 12868 UnaryOperatorKind Opc 12869 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12870 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12871 RequiresADL); 12872 } 12873 12874 if (Op == OO_Subscript) { 12875 SourceLocation LBrace; 12876 SourceLocation RBrace; 12877 12878 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12879 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12880 LBrace = SourceLocation::getFromRawEncoding( 12881 NameLoc.CXXOperatorName.BeginOpNameLoc); 12882 RBrace = SourceLocation::getFromRawEncoding( 12883 NameLoc.CXXOperatorName.EndOpNameLoc); 12884 } else { 12885 LBrace = Callee->getBeginLoc(); 12886 RBrace = OpLoc; 12887 } 12888 12889 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12890 First, Second); 12891 } 12892 12893 // Create the overloaded operator invocation for binary operators. 12894 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12895 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12896 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12897 if (Result.isInvalid()) 12898 return ExprError(); 12899 12900 return Result; 12901 } 12902 12903 template<typename Derived> 12904 ExprResult 12905 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12906 SourceLocation OperatorLoc, 12907 bool isArrow, 12908 CXXScopeSpec &SS, 12909 TypeSourceInfo *ScopeType, 12910 SourceLocation CCLoc, 12911 SourceLocation TildeLoc, 12912 PseudoDestructorTypeStorage Destroyed) { 12913 QualType BaseType = Base->getType(); 12914 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12915 (!isArrow && !BaseType->getAs<RecordType>()) || 12916 (isArrow && BaseType->getAs<PointerType>() && 12917 !BaseType->getAs<PointerType>()->getPointeeType() 12918 ->template getAs<RecordType>())){ 12919 // This pseudo-destructor expression is still a pseudo-destructor. 12920 return SemaRef.BuildPseudoDestructorExpr( 12921 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12922 CCLoc, TildeLoc, Destroyed); 12923 } 12924 12925 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12926 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12927 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12928 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12929 NameInfo.setNamedTypeInfo(DestroyedType); 12930 12931 // The scope type is now known to be a valid nested name specifier 12932 // component. Tack it on to the end of the nested name specifier. 12933 if (ScopeType) { 12934 if (!ScopeType->getType()->getAs<TagType>()) { 12935 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12936 diag::err_expected_class_or_namespace) 12937 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12938 return ExprError(); 12939 } 12940 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12941 CCLoc); 12942 } 12943 12944 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12945 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12946 OperatorLoc, isArrow, 12947 SS, TemplateKWLoc, 12948 /*FIXME: FirstQualifier*/ nullptr, 12949 NameInfo, 12950 /*TemplateArgs*/ nullptr, 12951 /*S*/nullptr); 12952 } 12953 12954 template<typename Derived> 12955 StmtResult 12956 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12957 SourceLocation Loc = S->getBeginLoc(); 12958 CapturedDecl *CD = S->getCapturedDecl(); 12959 unsigned NumParams = CD->getNumParams(); 12960 unsigned ContextParamPos = CD->getContextParamPosition(); 12961 SmallVector<Sema::CapturedParamNameType, 4> Params; 12962 for (unsigned I = 0; I < NumParams; ++I) { 12963 if (I != ContextParamPos) { 12964 Params.push_back( 12965 std::make_pair( 12966 CD->getParam(I)->getName(), 12967 getDerived().TransformType(CD->getParam(I)->getType()))); 12968 } else { 12969 Params.push_back(std::make_pair(StringRef(), QualType())); 12970 } 12971 } 12972 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12973 S->getCapturedRegionKind(), Params); 12974 StmtResult Body; 12975 { 12976 Sema::CompoundScopeRAII CompoundScope(getSema()); 12977 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12978 } 12979 12980 if (Body.isInvalid()) { 12981 getSema().ActOnCapturedRegionError(); 12982 return StmtError(); 12983 } 12984 12985 return getSema().ActOnCapturedRegionEnd(Body.get()); 12986 } 12987 12988 } // end namespace clang 12989 12990 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12991