1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements a semantic tree transformation that takes a given 10 // AST and rebuilds it, possibly transforming some nodes in the process. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 16 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 /// \brief 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 /// overridding 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 /// \brief 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 /// \brief 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 /// \brief Initializes a new tree transformer. 123 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 124 125 /// \brief Retrieves a reference to the derived class. 126 Derived &getDerived() { return static_cast<Derived&>(*this); } 127 128 /// \brief 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 /// \brief Retrieves a reference to the semantic analysis object used for 137 /// this tree transform. 138 Sema &getSema() const { return SemaRef; } 139 140 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief "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 /// \brief "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 /// \brief Note to the derived class when a function parameter pack is 280 /// being expanded. 281 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 282 283 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief Transform the given statement. 311 /// 312 /// By default, this routine transforms a statement by delegating to the 313 /// appropriate TransformXXXStmt function to transform a specific kind of 314 /// statement or the TransformExpr() function to transform an expression. 315 /// Subclasses may override this function to transform statements using some 316 /// other mechanism. 317 /// 318 /// \returns the transformed statement. 319 StmtResult TransformStmt(Stmt *S); 320 321 /// \brief Transform the given statement. 322 /// 323 /// By default, this routine transforms a statement by delegating to the 324 /// appropriate TransformOMPXXXClause function to transform a specific kind 325 /// of clause. Subclasses may override this function to transform statements 326 /// using some other mechanism. 327 /// 328 /// \returns the transformed OpenMP clause. 329 OMPClause *TransformOMPClause(OMPClause *S); 330 331 /// \brief Transform the given attribute. 332 /// 333 /// By default, this routine transforms a statement by delegating to the 334 /// appropriate TransformXXXAttr function to transform a specific kind 335 /// of attribute. Subclasses may override this function to transform 336 /// attributed statements using some other mechanism. 337 /// 338 /// \returns the transformed attribute 339 const Attr *TransformAttr(const Attr *S); 340 341 /// \brief Transform the specified attribute. 342 /// 343 /// Subclasses should override the transformation of attributes with a pragma 344 /// spelling to transform expressions stored within the attribute. 345 /// 346 /// \returns the transformed attribute. 347 #define ATTR(X) 348 #define PRAGMA_SPELLING_ATTR(X) \ 349 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 350 #include "clang/Basic/AttrList.inc" 351 352 /// \brief Transform the given expression. 353 /// 354 /// By default, this routine transforms an expression by delegating to the 355 /// appropriate TransformXXXExpr function to build a new expression. 356 /// Subclasses may override this function to transform expressions using some 357 /// other mechanism. 358 /// 359 /// \returns the transformed expression. 360 ExprResult TransformExpr(Expr *E); 361 362 /// \brief Transform the given initializer. 363 /// 364 /// By default, this routine transforms an initializer by stripping off the 365 /// semantic nodes added by initialization, then passing the result to 366 /// TransformExpr or TransformExprs. 367 /// 368 /// \returns the transformed initializer. 369 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 370 371 /// \brief Transform the given list of expressions. 372 /// 373 /// This routine transforms a list of expressions by invoking 374 /// \c TransformExpr() for each subexpression. However, it also provides 375 /// support for variadic templates by expanding any pack expansions (if the 376 /// derived class permits such expansion) along the way. When pack expansions 377 /// are present, the number of outputs may not equal the number of inputs. 378 /// 379 /// \param Inputs The set of expressions to be transformed. 380 /// 381 /// \param NumInputs The number of expressions in \c Inputs. 382 /// 383 /// \param IsCall If \c true, then this transform is being performed on 384 /// function-call arguments, and any arguments that should be dropped, will 385 /// be. 386 /// 387 /// \param Outputs The transformed input expressions will be added to this 388 /// vector. 389 /// 390 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 391 /// due to transformation. 392 /// 393 /// \returns true if an error occurred, false otherwise. 394 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 395 SmallVectorImpl<Expr *> &Outputs, 396 bool *ArgChanged = nullptr); 397 398 /// \brief Transform the given declaration, which is referenced from a type 399 /// or expression. 400 /// 401 /// By default, acts as the identity function on declarations, unless the 402 /// transformer has had to transform the declaration itself. Subclasses 403 /// may override this function to provide alternate behavior. 404 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 405 llvm::DenseMap<Decl *, Decl *>::iterator Known 406 = TransformedLocalDecls.find(D); 407 if (Known != TransformedLocalDecls.end()) 408 return Known->second; 409 410 return D; 411 } 412 413 /// \brief Transform the attributes associated with the given declaration and 414 /// place them on the new declaration. 415 /// 416 /// By default, this operation does nothing. Subclasses may override this 417 /// behavior to transform attributes. 418 void transformAttrs(Decl *Old, Decl *New) { } 419 420 /// \brief Note that a local declaration has been transformed by this 421 /// transformer. 422 /// 423 /// Local declarations are typically transformed via a call to 424 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 425 /// the transformer itself has to transform the declarations. This routine 426 /// can be overridden by a subclass that keeps track of such mappings. 427 void transformedLocalDecl(Decl *Old, Decl *New) { 428 TransformedLocalDecls[Old] = New; 429 } 430 431 /// \brief Transform the definition of the given declaration. 432 /// 433 /// By default, invokes TransformDecl() to transform the declaration. 434 /// Subclasses may override this function to provide alternate behavior. 435 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 436 return getDerived().TransformDecl(Loc, D); 437 } 438 439 /// \brief Transform the given declaration, which was the first part of a 440 /// nested-name-specifier in a member access expression. 441 /// 442 /// This specific declaration transformation only applies to the first 443 /// identifier in a nested-name-specifier of a member access expression, e.g., 444 /// the \c T in \c x->T::member 445 /// 446 /// By default, invokes TransformDecl() to transform the declaration. 447 /// Subclasses may override this function to provide alternate behavior. 448 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 449 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 450 } 451 452 /// \brief Transform the given nested-name-specifier with source-location 453 /// information. 454 /// 455 /// By default, transforms all of the types and declarations within the 456 /// nested-name-specifier. Subclasses may override this function to provide 457 /// alternate behavior. 458 NestedNameSpecifierLoc 459 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 460 QualType ObjectType = QualType(), 461 NamedDecl *FirstQualifierInScope = nullptr); 462 463 /// \brief Transform the given declaration name. 464 /// 465 /// By default, transforms the types of conversion function, constructor, 466 /// and destructor names and then (if needed) rebuilds the declaration name. 467 /// Identifiers and selectors are returned unmodified. Sublcasses may 468 /// override this function to provide alternate behavior. 469 DeclarationNameInfo 470 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 471 472 /// \brief Transform the given template name. 473 /// 474 /// \param SS The nested-name-specifier that qualifies the template 475 /// name. This nested-name-specifier must already have been transformed. 476 /// 477 /// \param Name The template name to transform. 478 /// 479 /// \param NameLoc The source location of the template name. 480 /// 481 /// \param ObjectType If we're translating a template name within a member 482 /// access expression, this is the type of the object whose member template 483 /// is being referenced. 484 /// 485 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 486 /// also refers to a name within the current (lexical) scope, this is the 487 /// declaration it refers to. 488 /// 489 /// By default, transforms the template name by transforming the declarations 490 /// and nested-name-specifiers that occur within the template name. 491 /// Subclasses may override this function to provide alternate behavior. 492 TemplateName 493 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 494 SourceLocation NameLoc, 495 QualType ObjectType = QualType(), 496 NamedDecl *FirstQualifierInScope = nullptr); 497 498 /// \brief Transform the given template argument. 499 /// 500 /// By default, this operation transforms the type, expression, or 501 /// declaration stored within the template argument and constructs a 502 /// new template argument from the transformed result. Subclasses may 503 /// override this function to provide alternate behavior. 504 /// 505 /// Returns true if there was an error. 506 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 507 TemplateArgumentLoc &Output, 508 bool Uneval = false); 509 510 /// \brief Transform the given set of template arguments. 511 /// 512 /// By default, this operation transforms all of the template arguments 513 /// in the input set using \c TransformTemplateArgument(), and appends 514 /// the transformed arguments to the output list. 515 /// 516 /// Note that this overload of \c TransformTemplateArguments() is merely 517 /// a convenience function. Subclasses that wish to override this behavior 518 /// should override the iterator-based member template version. 519 /// 520 /// \param Inputs The set of template arguments to be transformed. 521 /// 522 /// \param NumInputs The number of template arguments in \p Inputs. 523 /// 524 /// \param Outputs The set of transformed template arguments output by this 525 /// routine. 526 /// 527 /// Returns true if an error occurred. 528 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 529 unsigned NumInputs, 530 TemplateArgumentListInfo &Outputs, 531 bool Uneval = false) { 532 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 533 Uneval); 534 } 535 536 /// \brief Transform the given set of template arguments. 537 /// 538 /// By default, this operation transforms all of the template arguments 539 /// in the input set using \c TransformTemplateArgument(), and appends 540 /// the transformed arguments to the output list. 541 /// 542 /// \param First An iterator to the first template argument. 543 /// 544 /// \param Last An iterator one step past the last template argument. 545 /// 546 /// \param Outputs The set of transformed template arguments output by this 547 /// routine. 548 /// 549 /// Returns true if an error occurred. 550 template<typename InputIterator> 551 bool TransformTemplateArguments(InputIterator First, 552 InputIterator Last, 553 TemplateArgumentListInfo &Outputs, 554 bool Uneval = false); 555 556 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 557 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 558 TemplateArgumentLoc &ArgLoc); 559 560 /// \brief Fakes up a TypeSourceInfo for a type. 561 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 562 return SemaRef.Context.getTrivialTypeSourceInfo(T, 563 getDerived().getBaseLocation()); 564 } 565 566 #define ABSTRACT_TYPELOC(CLASS, PARENT) 567 #define TYPELOC(CLASS, PARENT) \ 568 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 569 #include "clang/AST/TypeLocNodes.def" 570 571 template<typename Fn> 572 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 573 FunctionProtoTypeLoc TL, 574 CXXRecordDecl *ThisContext, 575 unsigned ThisTypeQuals, 576 Fn TransformExceptionSpec); 577 578 bool TransformExceptionSpec(SourceLocation Loc, 579 FunctionProtoType::ExceptionSpecInfo &ESI, 580 SmallVectorImpl<QualType> &Exceptions, 581 bool &Changed); 582 583 StmtResult TransformSEHHandler(Stmt *Handler); 584 585 QualType 586 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 587 TemplateSpecializationTypeLoc TL, 588 TemplateName Template); 589 590 QualType 591 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 592 DependentTemplateSpecializationTypeLoc TL, 593 TemplateName Template, 594 CXXScopeSpec &SS); 595 596 QualType TransformDependentTemplateSpecializationType( 597 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 598 NestedNameSpecifierLoc QualifierLoc); 599 600 /// \brief Transforms the parameters of a function type into the 601 /// given vectors. 602 /// 603 /// The result vectors should be kept in sync; null entries in the 604 /// variables vector are acceptable. 605 /// 606 /// Return true on error. 607 bool TransformFunctionTypeParams(SourceLocation Loc, 608 ParmVarDecl **Params, unsigned NumParams, 609 const QualType *ParamTypes, 610 const FunctionProtoType::ExtParameterInfo *ParamInfos, 611 SmallVectorImpl<QualType> &PTypes, 612 SmallVectorImpl<ParmVarDecl*> *PVars, 613 Sema::ExtParameterInfoBuilder &PInfos); 614 615 /// \brief Transforms a single function-type parameter. Return null 616 /// on error. 617 /// 618 /// \param indexAdjustment - A number to add to the parameter's 619 /// scope index; can be negative 620 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 621 int indexAdjustment, 622 Optional<unsigned> NumExpansions, 623 bool ExpectParameterPack); 624 625 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 626 627 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 628 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 629 630 TemplateParameterList *TransformTemplateParameterList( 631 TemplateParameterList *TPL) { 632 return TPL; 633 } 634 635 ExprResult TransformAddressOfOperand(Expr *E); 636 637 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 638 bool IsAddressOfOperand, 639 TypeSourceInfo **RecoveryTSI); 640 641 ExprResult TransformParenDependentScopeDeclRefExpr( 642 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 643 TypeSourceInfo **RecoveryTSI); 644 645 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 646 647 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 648 // amount of stack usage with clang. 649 #define STMT(Node, Parent) \ 650 LLVM_ATTRIBUTE_NOINLINE \ 651 StmtResult Transform##Node(Node *S); 652 #define EXPR(Node, Parent) \ 653 LLVM_ATTRIBUTE_NOINLINE \ 654 ExprResult Transform##Node(Node *E); 655 #define ABSTRACT_STMT(Stmt) 656 #include "clang/AST/StmtNodes.inc" 657 658 #define OPENMP_CLAUSE(Name, Class) \ 659 LLVM_ATTRIBUTE_NOINLINE \ 660 OMPClause *Transform ## Class(Class *S); 661 #include "clang/Basic/OpenMPKinds.def" 662 663 /// \brief Build a new pointer type given its pointee type. 664 /// 665 /// By default, performs semantic analysis when building the pointer type. 666 /// Subclasses may override this routine to provide different behavior. 667 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 668 669 /// \brief Build a new block pointer type given its pointee type. 670 /// 671 /// By default, performs semantic analysis when building the block pointer 672 /// type. Subclasses may override this routine to provide different behavior. 673 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 674 675 /// \brief Build a new reference type given the type it references. 676 /// 677 /// By default, performs semantic analysis when building the 678 /// reference type. Subclasses may override this routine to provide 679 /// different behavior. 680 /// 681 /// \param LValue whether the type was written with an lvalue sigil 682 /// or an rvalue sigil. 683 QualType RebuildReferenceType(QualType ReferentType, 684 bool LValue, 685 SourceLocation Sigil); 686 687 /// \brief Build a new member pointer type given the pointee type and the 688 /// class type it refers into. 689 /// 690 /// By default, performs semantic analysis when building the member pointer 691 /// type. Subclasses may override this routine to provide different behavior. 692 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 693 SourceLocation Sigil); 694 695 /// \brief Build an Objective-C object type. 696 /// 697 /// By default, performs semantic analysis when building the object type. 698 /// Subclasses may override this routine to provide different behavior. 699 QualType RebuildObjCObjectType(QualType BaseType, 700 SourceLocation Loc, 701 SourceLocation TypeArgsLAngleLoc, 702 ArrayRef<TypeSourceInfo *> TypeArgs, 703 SourceLocation TypeArgsRAngleLoc, 704 SourceLocation ProtocolLAngleLoc, 705 ArrayRef<ObjCProtocolDecl *> Protocols, 706 ArrayRef<SourceLocation> ProtocolLocs, 707 SourceLocation ProtocolRAngleLoc); 708 709 /// \brief Build a new Objective-C object pointer type given the pointee type. 710 /// 711 /// By default, directly builds the pointer type, with no additional semantic 712 /// analysis. 713 QualType RebuildObjCObjectPointerType(QualType PointeeType, 714 SourceLocation Star); 715 716 /// \brief Build a new array type given the element type, size 717 /// modifier, size of the array (if known), size expression, and index type 718 /// qualifiers. 719 /// 720 /// By default, performs semantic analysis when building the array type. 721 /// Subclasses may override this routine to provide different behavior. 722 /// Also by default, all of the other Rebuild*Array 723 QualType RebuildArrayType(QualType ElementType, 724 ArrayType::ArraySizeModifier SizeMod, 725 const llvm::APInt *Size, 726 Expr *SizeExpr, 727 unsigned IndexTypeQuals, 728 SourceRange BracketsRange); 729 730 /// \brief Build a new constant array type given the element type, size 731 /// modifier, (known) size of the array, and index type qualifiers. 732 /// 733 /// By default, performs semantic analysis when building the array type. 734 /// Subclasses may override this routine to provide different behavior. 735 QualType RebuildConstantArrayType(QualType ElementType, 736 ArrayType::ArraySizeModifier SizeMod, 737 const llvm::APInt &Size, 738 unsigned IndexTypeQuals, 739 SourceRange BracketsRange); 740 741 /// \brief Build a new incomplete array type given the element type, size 742 /// modifier, and index type qualifiers. 743 /// 744 /// By default, performs semantic analysis when building the array type. 745 /// Subclasses may override this routine to provide different behavior. 746 QualType RebuildIncompleteArrayType(QualType ElementType, 747 ArrayType::ArraySizeModifier SizeMod, 748 unsigned IndexTypeQuals, 749 SourceRange BracketsRange); 750 751 /// \brief Build a new variable-length array type given the element type, 752 /// size modifier, size expression, and index type qualifiers. 753 /// 754 /// By default, performs semantic analysis when building the array type. 755 /// Subclasses may override this routine to provide different behavior. 756 QualType RebuildVariableArrayType(QualType ElementType, 757 ArrayType::ArraySizeModifier SizeMod, 758 Expr *SizeExpr, 759 unsigned IndexTypeQuals, 760 SourceRange BracketsRange); 761 762 /// \brief Build a new dependent-sized array type given the element type, 763 /// size modifier, size expression, and index type qualifiers. 764 /// 765 /// By default, performs semantic analysis when building the array type. 766 /// Subclasses may override this routine to provide different behavior. 767 QualType RebuildDependentSizedArrayType(QualType ElementType, 768 ArrayType::ArraySizeModifier SizeMod, 769 Expr *SizeExpr, 770 unsigned IndexTypeQuals, 771 SourceRange BracketsRange); 772 773 /// \brief Build a new vector type given the element type and 774 /// number of elements. 775 /// 776 /// By default, performs semantic analysis when building the vector type. 777 /// Subclasses may override this routine to provide different behavior. 778 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 779 VectorType::VectorKind VecKind); 780 781 /// \brief Build a new extended vector type given the element type and 782 /// number of elements. 783 /// 784 /// By default, performs semantic analysis when building the vector type. 785 /// Subclasses may override this routine to provide different behavior. 786 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 787 SourceLocation AttributeLoc); 788 789 /// \brief Build a new potentially dependently-sized extended vector type 790 /// given the element type and number of elements. 791 /// 792 /// By default, performs semantic analysis when building the vector type. 793 /// Subclasses may override this routine to provide different behavior. 794 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 795 Expr *SizeExpr, 796 SourceLocation AttributeLoc); 797 798 /// \brief Build a new function type. 799 /// 800 /// By default, performs semantic analysis when building the function type. 801 /// Subclasses may override this routine to provide different behavior. 802 QualType RebuildFunctionProtoType(QualType T, 803 MutableArrayRef<QualType> ParamTypes, 804 const FunctionProtoType::ExtProtoInfo &EPI); 805 806 /// \brief Build a new unprototyped function type. 807 QualType RebuildFunctionNoProtoType(QualType ResultType); 808 809 /// \brief Rebuild an unresolved typename type, given the decl that 810 /// the UnresolvedUsingTypenameDecl was transformed to. 811 QualType RebuildUnresolvedUsingType(Decl *D); 812 813 /// \brief Build a new typedef type. 814 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 815 return SemaRef.Context.getTypeDeclType(Typedef); 816 } 817 818 /// \brief Build a new class/struct/union type. 819 QualType RebuildRecordType(RecordDecl *Record) { 820 return SemaRef.Context.getTypeDeclType(Record); 821 } 822 823 /// \brief Build a new Enum type. 824 QualType RebuildEnumType(EnumDecl *Enum) { 825 return SemaRef.Context.getTypeDeclType(Enum); 826 } 827 828 /// \brief Build a new typeof(expr) type. 829 /// 830 /// By default, performs semantic analysis when building the typeof type. 831 /// Subclasses may override this routine to provide different behavior. 832 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 833 834 /// \brief Build a new typeof(type) type. 835 /// 836 /// By default, builds a new TypeOfType with the given underlying type. 837 QualType RebuildTypeOfType(QualType Underlying); 838 839 /// \brief Build a new unary transform type. 840 QualType RebuildUnaryTransformType(QualType BaseType, 841 UnaryTransformType::UTTKind UKind, 842 SourceLocation Loc); 843 844 /// \brief Build a new C++11 decltype type. 845 /// 846 /// By default, performs semantic analysis when building the decltype type. 847 /// Subclasses may override this routine to provide different behavior. 848 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 849 850 /// \brief Build a new C++11 auto type. 851 /// 852 /// By default, builds a new AutoType with the given deduced type. 853 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 854 // Note, IsDependent is always false here: we implicitly convert an 'auto' 855 // which has been deduced to a dependent type into an undeduced 'auto', so 856 // that we'll retry deduction after the transformation. 857 return SemaRef.Context.getAutoType(Deduced, Keyword, 858 /*IsDependent*/ false); 859 } 860 861 /// \brief Build a new template specialization type. 862 /// 863 /// By default, performs semantic analysis when building the template 864 /// specialization type. Subclasses may override this routine to provide 865 /// different behavior. 866 QualType RebuildTemplateSpecializationType(TemplateName Template, 867 SourceLocation TemplateLoc, 868 TemplateArgumentListInfo &Args); 869 870 /// \brief Build a new parenthesized type. 871 /// 872 /// By default, builds a new ParenType type from the inner type. 873 /// Subclasses may override this routine to provide different behavior. 874 QualType RebuildParenType(QualType InnerType) { 875 return SemaRef.Context.getParenType(InnerType); 876 } 877 878 /// \brief Build a new qualified name type. 879 /// 880 /// By default, builds a new ElaboratedType type from the keyword, 881 /// the nested-name-specifier and the named type. 882 /// Subclasses may override this routine to provide different behavior. 883 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 884 ElaboratedTypeKeyword Keyword, 885 NestedNameSpecifierLoc QualifierLoc, 886 QualType Named) { 887 return SemaRef.Context.getElaboratedType(Keyword, 888 QualifierLoc.getNestedNameSpecifier(), 889 Named); 890 } 891 892 /// \brief Build a new typename type that refers to a template-id. 893 /// 894 /// By default, builds a new DependentNameType type from the 895 /// nested-name-specifier and the given type. Subclasses may override 896 /// this routine to provide different behavior. 897 QualType RebuildDependentTemplateSpecializationType( 898 ElaboratedTypeKeyword Keyword, 899 NestedNameSpecifierLoc QualifierLoc, 900 const IdentifierInfo *Name, 901 SourceLocation NameLoc, 902 TemplateArgumentListInfo &Args) { 903 // Rebuild the template name. 904 // TODO: avoid TemplateName abstraction 905 CXXScopeSpec SS; 906 SS.Adopt(QualifierLoc); 907 TemplateName InstName 908 = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 909 nullptr); 910 911 if (InstName.isNull()) 912 return QualType(); 913 914 // If it's still dependent, make a dependent specialization. 915 if (InstName.getAsDependentTemplateName()) 916 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 917 QualifierLoc.getNestedNameSpecifier(), 918 Name, 919 Args); 920 921 // Otherwise, make an elaborated type wrapping a non-dependent 922 // specialization. 923 QualType T = 924 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 925 if (T.isNull()) return QualType(); 926 927 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 928 return T; 929 930 return SemaRef.Context.getElaboratedType(Keyword, 931 QualifierLoc.getNestedNameSpecifier(), 932 T); 933 } 934 935 /// \brief Build a new typename type that refers to an identifier. 936 /// 937 /// By default, performs semantic analysis when building the typename type 938 /// (or elaborated type). Subclasses may override this routine to provide 939 /// different behavior. 940 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 941 SourceLocation KeywordLoc, 942 NestedNameSpecifierLoc QualifierLoc, 943 const IdentifierInfo *Id, 944 SourceLocation IdLoc) { 945 CXXScopeSpec SS; 946 SS.Adopt(QualifierLoc); 947 948 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 949 // If the name is still dependent, just build a new dependent name type. 950 if (!SemaRef.computeDeclContext(SS)) 951 return SemaRef.Context.getDependentNameType(Keyword, 952 QualifierLoc.getNestedNameSpecifier(), 953 Id); 954 } 955 956 if (Keyword == ETK_None || Keyword == ETK_Typename) 957 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 958 *Id, IdLoc); 959 960 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 961 962 // We had a dependent elaborated-type-specifier that has been transformed 963 // into a non-dependent elaborated-type-specifier. Find the tag we're 964 // referring to. 965 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 966 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 967 if (!DC) 968 return QualType(); 969 970 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 971 return QualType(); 972 973 TagDecl *Tag = nullptr; 974 SemaRef.LookupQualifiedName(Result, DC); 975 switch (Result.getResultKind()) { 976 case LookupResult::NotFound: 977 case LookupResult::NotFoundInCurrentInstantiation: 978 break; 979 980 case LookupResult::Found: 981 Tag = Result.getAsSingle<TagDecl>(); 982 break; 983 984 case LookupResult::FoundOverloaded: 985 case LookupResult::FoundUnresolvedValue: 986 llvm_unreachable("Tag lookup cannot find non-tags"); 987 988 case LookupResult::Ambiguous: 989 // Let the LookupResult structure handle ambiguities. 990 return QualType(); 991 } 992 993 if (!Tag) { 994 // Check where the name exists but isn't a tag type and use that to emit 995 // better diagnostics. 996 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 997 SemaRef.LookupQualifiedName(Result, DC); 998 switch (Result.getResultKind()) { 999 case LookupResult::Found: 1000 case LookupResult::FoundOverloaded: 1001 case LookupResult::FoundUnresolvedValue: { 1002 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1003 unsigned Kind = 0; 1004 if (isa<TypedefDecl>(SomeDecl)) Kind = 1; 1005 else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2; 1006 else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3; 1007 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; 1008 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1009 break; 1010 } 1011 default: 1012 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1013 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1014 break; 1015 } 1016 return QualType(); 1017 } 1018 1019 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1020 IdLoc, Id)) { 1021 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1022 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1023 return QualType(); 1024 } 1025 1026 // Build the elaborated-type-specifier type. 1027 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1028 return SemaRef.Context.getElaboratedType(Keyword, 1029 QualifierLoc.getNestedNameSpecifier(), 1030 T); 1031 } 1032 1033 /// \brief Build a new pack expansion type. 1034 /// 1035 /// By default, builds a new PackExpansionType type from the given pattern. 1036 /// Subclasses may override this routine to provide different behavior. 1037 QualType RebuildPackExpansionType(QualType Pattern, 1038 SourceRange PatternRange, 1039 SourceLocation EllipsisLoc, 1040 Optional<unsigned> NumExpansions) { 1041 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1042 NumExpansions); 1043 } 1044 1045 /// \brief Build a new atomic type given its value type. 1046 /// 1047 /// By default, performs semantic analysis when building the atomic type. 1048 /// Subclasses may override this routine to provide different behavior. 1049 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1050 1051 /// \brief Build a new pipe type given its value type. 1052 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc); 1053 1054 /// \brief Build a new template name given a nested name specifier, a flag 1055 /// indicating whether the "template" keyword was provided, and the template 1056 /// that the template name refers to. 1057 /// 1058 /// By default, builds the new template name directly. Subclasses may override 1059 /// this routine to provide different behavior. 1060 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1061 bool TemplateKW, 1062 TemplateDecl *Template); 1063 1064 /// \brief Build a new template name given a nested name specifier and the 1065 /// name that is referred to as a template. 1066 /// 1067 /// By default, performs semantic analysis to determine whether the name can 1068 /// be resolved to a specific template, then builds the appropriate kind of 1069 /// template name. Subclasses may override this routine to provide different 1070 /// behavior. 1071 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1072 const IdentifierInfo &Name, 1073 SourceLocation NameLoc, 1074 QualType ObjectType, 1075 NamedDecl *FirstQualifierInScope); 1076 1077 /// \brief Build a new template name given a nested name specifier and the 1078 /// overloaded operator name that is referred to as a template. 1079 /// 1080 /// By default, performs semantic analysis to determine whether the name can 1081 /// be resolved to a specific template, then builds the appropriate kind of 1082 /// template name. Subclasses may override this routine to provide different 1083 /// behavior. 1084 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1085 OverloadedOperatorKind Operator, 1086 SourceLocation NameLoc, 1087 QualType ObjectType); 1088 1089 /// \brief Build a new template name given a template template parameter pack 1090 /// and the 1091 /// 1092 /// By default, performs semantic analysis to determine whether the name can 1093 /// be resolved to a specific template, then builds the appropriate kind of 1094 /// template name. Subclasses may override this routine to provide different 1095 /// behavior. 1096 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1097 const TemplateArgument &ArgPack) { 1098 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1099 } 1100 1101 /// \brief Build a new compound statement. 1102 /// 1103 /// By default, performs semantic analysis to build the new statement. 1104 /// Subclasses may override this routine to provide different behavior. 1105 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1106 MultiStmtArg Statements, 1107 SourceLocation RBraceLoc, 1108 bool IsStmtExpr) { 1109 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1110 IsStmtExpr); 1111 } 1112 1113 /// \brief Build a new case statement. 1114 /// 1115 /// By default, performs semantic analysis to build the new statement. 1116 /// Subclasses may override this routine to provide different behavior. 1117 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1118 Expr *LHS, 1119 SourceLocation EllipsisLoc, 1120 Expr *RHS, 1121 SourceLocation ColonLoc) { 1122 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1123 ColonLoc); 1124 } 1125 1126 /// \brief Attach the body to a new case statement. 1127 /// 1128 /// By default, performs semantic analysis to build the new statement. 1129 /// Subclasses may override this routine to provide different behavior. 1130 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1131 getSema().ActOnCaseStmtBody(S, Body); 1132 return S; 1133 } 1134 1135 /// \brief Build a new default statement. 1136 /// 1137 /// By default, performs semantic analysis to build the new statement. 1138 /// Subclasses may override this routine to provide different behavior. 1139 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1140 SourceLocation ColonLoc, 1141 Stmt *SubStmt) { 1142 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1143 /*CurScope=*/nullptr); 1144 } 1145 1146 /// \brief Build a new label statement. 1147 /// 1148 /// By default, performs semantic analysis to build the new statement. 1149 /// Subclasses may override this routine to provide different behavior. 1150 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1151 SourceLocation ColonLoc, Stmt *SubStmt) { 1152 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1153 } 1154 1155 /// \brief Build a new label statement. 1156 /// 1157 /// By default, performs semantic analysis to build the new statement. 1158 /// Subclasses may override this routine to provide different behavior. 1159 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1160 ArrayRef<const Attr*> Attrs, 1161 Stmt *SubStmt) { 1162 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1163 } 1164 1165 /// \brief Build a new "if" statement. 1166 /// 1167 /// By default, performs semantic analysis to build the new statement. 1168 /// Subclasses may override this routine to provide different behavior. 1169 StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 1170 VarDecl *CondVar, Stmt *Then, 1171 SourceLocation ElseLoc, Stmt *Else) { 1172 return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else); 1173 } 1174 1175 /// \brief Start building a new switch statement. 1176 /// 1177 /// By default, performs semantic analysis to build the new statement. 1178 /// Subclasses may override this routine to provide different behavior. 1179 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1180 Expr *Cond, VarDecl *CondVar) { 1181 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond, 1182 CondVar); 1183 } 1184 1185 /// \brief Attach the body to the switch statement. 1186 /// 1187 /// By default, performs semantic analysis to build the new statement. 1188 /// Subclasses may override this routine to provide different behavior. 1189 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1190 Stmt *Switch, Stmt *Body) { 1191 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1192 } 1193 1194 /// \brief Build a new while statement. 1195 /// 1196 /// By default, performs semantic analysis to build the new statement. 1197 /// Subclasses may override this routine to provide different behavior. 1198 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond, 1199 VarDecl *CondVar, Stmt *Body) { 1200 return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body); 1201 } 1202 1203 /// \brief Build a new do-while statement. 1204 /// 1205 /// By default, performs semantic analysis to build the new statement. 1206 /// Subclasses may override this routine to provide different behavior. 1207 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1208 SourceLocation WhileLoc, SourceLocation LParenLoc, 1209 Expr *Cond, SourceLocation RParenLoc) { 1210 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1211 Cond, RParenLoc); 1212 } 1213 1214 /// \brief Build a new for statement. 1215 /// 1216 /// By default, performs semantic analysis to build the new statement. 1217 /// Subclasses may override this routine to provide different behavior. 1218 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1219 Stmt *Init, Sema::FullExprArg Cond, 1220 VarDecl *CondVar, Sema::FullExprArg Inc, 1221 SourceLocation RParenLoc, Stmt *Body) { 1222 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1223 CondVar, Inc, RParenLoc, Body); 1224 } 1225 1226 /// \brief Build a new goto statement. 1227 /// 1228 /// By default, performs semantic analysis to build the new statement. 1229 /// Subclasses may override this routine to provide different behavior. 1230 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1231 LabelDecl *Label) { 1232 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1233 } 1234 1235 /// \brief Build a new indirect goto statement. 1236 /// 1237 /// By default, performs semantic analysis to build the new statement. 1238 /// Subclasses may override this routine to provide different behavior. 1239 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1240 SourceLocation StarLoc, 1241 Expr *Target) { 1242 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1243 } 1244 1245 /// \brief Build a new return statement. 1246 /// 1247 /// By default, performs semantic analysis to build the new statement. 1248 /// Subclasses may override this routine to provide different behavior. 1249 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1250 return getSema().BuildReturnStmt(ReturnLoc, Result); 1251 } 1252 1253 /// \brief Build a new declaration statement. 1254 /// 1255 /// By default, performs semantic analysis to build the new statement. 1256 /// Subclasses may override this routine to provide different behavior. 1257 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1258 SourceLocation StartLoc, SourceLocation EndLoc) { 1259 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1260 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1261 } 1262 1263 /// \brief Build a new inline asm statement. 1264 /// 1265 /// By default, performs semantic analysis to build the new statement. 1266 /// Subclasses may override this routine to provide different behavior. 1267 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1268 bool IsVolatile, unsigned NumOutputs, 1269 unsigned NumInputs, IdentifierInfo **Names, 1270 MultiExprArg Constraints, MultiExprArg Exprs, 1271 Expr *AsmString, MultiExprArg Clobbers, 1272 SourceLocation RParenLoc) { 1273 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1274 NumInputs, Names, Constraints, Exprs, 1275 AsmString, Clobbers, RParenLoc); 1276 } 1277 1278 /// \brief Build a new MS style inline asm statement. 1279 /// 1280 /// By default, performs semantic analysis to build the new statement. 1281 /// Subclasses may override this routine to provide different behavior. 1282 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1283 ArrayRef<Token> AsmToks, 1284 StringRef AsmString, 1285 unsigned NumOutputs, unsigned NumInputs, 1286 ArrayRef<StringRef> Constraints, 1287 ArrayRef<StringRef> Clobbers, 1288 ArrayRef<Expr*> Exprs, 1289 SourceLocation EndLoc) { 1290 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1291 NumOutputs, NumInputs, 1292 Constraints, Clobbers, Exprs, EndLoc); 1293 } 1294 1295 /// \brief Build a new co_return statement. 1296 /// 1297 /// By default, performs semantic analysis to build the new statement. 1298 /// Subclasses may override this routine to provide different behavior. 1299 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result) { 1300 return getSema().BuildCoreturnStmt(CoreturnLoc, Result); 1301 } 1302 1303 /// \brief Build a new co_await expression. 1304 /// 1305 /// By default, performs semantic analysis to build the new expression. 1306 /// Subclasses may override this routine to provide different behavior. 1307 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result) { 1308 return getSema().BuildCoawaitExpr(CoawaitLoc, Result); 1309 } 1310 1311 /// \brief Build a new co_yield expression. 1312 /// 1313 /// By default, performs semantic analysis to build the new expression. 1314 /// Subclasses may override this routine to provide different behavior. 1315 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1316 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1317 } 1318 1319 /// \brief Build a new Objective-C \@try statement. 1320 /// 1321 /// By default, performs semantic analysis to build the new statement. 1322 /// Subclasses may override this routine to provide different behavior. 1323 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1324 Stmt *TryBody, 1325 MultiStmtArg CatchStmts, 1326 Stmt *Finally) { 1327 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1328 Finally); 1329 } 1330 1331 /// \brief Rebuild an Objective-C exception declaration. 1332 /// 1333 /// By default, performs semantic analysis to build the new declaration. 1334 /// Subclasses may override this routine to provide different behavior. 1335 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1336 TypeSourceInfo *TInfo, QualType T) { 1337 return getSema().BuildObjCExceptionDecl(TInfo, T, 1338 ExceptionDecl->getInnerLocStart(), 1339 ExceptionDecl->getLocation(), 1340 ExceptionDecl->getIdentifier()); 1341 } 1342 1343 /// \brief Build a new Objective-C \@catch statement. 1344 /// 1345 /// By default, performs semantic analysis to build the new statement. 1346 /// Subclasses may override this routine to provide different behavior. 1347 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1348 SourceLocation RParenLoc, 1349 VarDecl *Var, 1350 Stmt *Body) { 1351 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1352 Var, Body); 1353 } 1354 1355 /// \brief Build a new Objective-C \@finally statement. 1356 /// 1357 /// By default, performs semantic analysis to build the new statement. 1358 /// Subclasses may override this routine to provide different behavior. 1359 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1360 Stmt *Body) { 1361 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1362 } 1363 1364 /// \brief Build a new Objective-C \@throw statement. 1365 /// 1366 /// By default, performs semantic analysis to build the new statement. 1367 /// Subclasses may override this routine to provide different behavior. 1368 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1369 Expr *Operand) { 1370 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1371 } 1372 1373 /// \brief Build a new OpenMP executable directive. 1374 /// 1375 /// By default, performs semantic analysis to build the new statement. 1376 /// Subclasses may override this routine to provide different behavior. 1377 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1378 DeclarationNameInfo DirName, 1379 OpenMPDirectiveKind CancelRegion, 1380 ArrayRef<OMPClause *> Clauses, 1381 Stmt *AStmt, SourceLocation StartLoc, 1382 SourceLocation EndLoc) { 1383 return getSema().ActOnOpenMPExecutableDirective( 1384 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1385 } 1386 1387 /// \brief Build a new OpenMP 'if' clause. 1388 /// 1389 /// By default, performs semantic analysis to build the new OpenMP clause. 1390 /// Subclasses may override this routine to provide different behavior. 1391 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1392 Expr *Condition, SourceLocation StartLoc, 1393 SourceLocation LParenLoc, 1394 SourceLocation NameModifierLoc, 1395 SourceLocation ColonLoc, 1396 SourceLocation EndLoc) { 1397 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1398 LParenLoc, NameModifierLoc, ColonLoc, 1399 EndLoc); 1400 } 1401 1402 /// \brief Build a new OpenMP 'final' clause. 1403 /// 1404 /// By default, performs semantic analysis to build the new OpenMP clause. 1405 /// Subclasses may override this routine to provide different behavior. 1406 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1407 SourceLocation LParenLoc, 1408 SourceLocation EndLoc) { 1409 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1410 EndLoc); 1411 } 1412 1413 /// \brief Build a new OpenMP 'num_threads' clause. 1414 /// 1415 /// By default, performs semantic analysis to build the new OpenMP clause. 1416 /// Subclasses may override this routine to provide different behavior. 1417 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1418 SourceLocation StartLoc, 1419 SourceLocation LParenLoc, 1420 SourceLocation EndLoc) { 1421 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1422 LParenLoc, EndLoc); 1423 } 1424 1425 /// \brief Build a new OpenMP 'safelen' clause. 1426 /// 1427 /// By default, performs semantic analysis to build the new OpenMP clause. 1428 /// Subclasses may override this routine to provide different behavior. 1429 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1430 SourceLocation LParenLoc, 1431 SourceLocation EndLoc) { 1432 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1433 } 1434 1435 /// \brief Build a new OpenMP 'simdlen' clause. 1436 /// 1437 /// By default, performs semantic analysis to build the new OpenMP clause. 1438 /// Subclasses may override this routine to provide different behavior. 1439 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1440 SourceLocation LParenLoc, 1441 SourceLocation EndLoc) { 1442 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1443 } 1444 1445 /// \brief Build a new OpenMP 'collapse' clause. 1446 /// 1447 /// By default, performs semantic analysis to build the new OpenMP clause. 1448 /// Subclasses may override this routine to provide different behavior. 1449 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1450 SourceLocation LParenLoc, 1451 SourceLocation EndLoc) { 1452 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1453 EndLoc); 1454 } 1455 1456 /// \brief Build a new OpenMP 'default' clause. 1457 /// 1458 /// By default, performs semantic analysis to build the new OpenMP clause. 1459 /// Subclasses may override this routine to provide different behavior. 1460 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1461 SourceLocation KindKwLoc, 1462 SourceLocation StartLoc, 1463 SourceLocation LParenLoc, 1464 SourceLocation EndLoc) { 1465 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1466 StartLoc, LParenLoc, EndLoc); 1467 } 1468 1469 /// \brief Build a new OpenMP 'proc_bind' clause. 1470 /// 1471 /// By default, performs semantic analysis to build the new OpenMP clause. 1472 /// Subclasses may override this routine to provide different behavior. 1473 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1474 SourceLocation KindKwLoc, 1475 SourceLocation StartLoc, 1476 SourceLocation LParenLoc, 1477 SourceLocation EndLoc) { 1478 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1479 StartLoc, LParenLoc, EndLoc); 1480 } 1481 1482 /// \brief Build a new OpenMP 'schedule' clause. 1483 /// 1484 /// By default, performs semantic analysis to build the new OpenMP clause. 1485 /// Subclasses may override this routine to provide different behavior. 1486 OMPClause *RebuildOMPScheduleClause( 1487 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1488 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1489 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1490 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1491 return getSema().ActOnOpenMPScheduleClause( 1492 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1493 CommaLoc, EndLoc); 1494 } 1495 1496 /// \brief Build a new OpenMP 'ordered' clause. 1497 /// 1498 /// By default, performs semantic analysis to build the new OpenMP clause. 1499 /// Subclasses may override this routine to provide different behavior. 1500 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1501 SourceLocation EndLoc, 1502 SourceLocation LParenLoc, Expr *Num) { 1503 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1504 } 1505 1506 /// \brief Build a new OpenMP 'private' clause. 1507 /// 1508 /// By default, performs semantic analysis to build the new OpenMP clause. 1509 /// Subclasses may override this routine to provide different behavior. 1510 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1511 SourceLocation StartLoc, 1512 SourceLocation LParenLoc, 1513 SourceLocation EndLoc) { 1514 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1515 EndLoc); 1516 } 1517 1518 /// \brief Build a new OpenMP 'firstprivate' clause. 1519 /// 1520 /// By default, performs semantic analysis to build the new OpenMP clause. 1521 /// Subclasses may override this routine to provide different behavior. 1522 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1523 SourceLocation StartLoc, 1524 SourceLocation LParenLoc, 1525 SourceLocation EndLoc) { 1526 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1527 EndLoc); 1528 } 1529 1530 /// \brief Build a new OpenMP 'lastprivate' clause. 1531 /// 1532 /// By default, performs semantic analysis to build the new OpenMP clause. 1533 /// Subclasses may override this routine to provide different behavior. 1534 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1535 SourceLocation StartLoc, 1536 SourceLocation LParenLoc, 1537 SourceLocation EndLoc) { 1538 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1539 EndLoc); 1540 } 1541 1542 /// \brief Build a new OpenMP 'shared' clause. 1543 /// 1544 /// By default, performs semantic analysis to build the new OpenMP clause. 1545 /// Subclasses may override this routine to provide different behavior. 1546 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1547 SourceLocation StartLoc, 1548 SourceLocation LParenLoc, 1549 SourceLocation EndLoc) { 1550 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1551 EndLoc); 1552 } 1553 1554 /// \brief Build a new OpenMP 'reduction' clause. 1555 /// 1556 /// By default, performs semantic analysis to build the new statement. 1557 /// Subclasses may override this routine to provide different behavior. 1558 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1559 SourceLocation StartLoc, 1560 SourceLocation LParenLoc, 1561 SourceLocation ColonLoc, 1562 SourceLocation EndLoc, 1563 CXXScopeSpec &ReductionIdScopeSpec, 1564 const DeclarationNameInfo &ReductionId, 1565 ArrayRef<Expr *> UnresolvedReductions) { 1566 return getSema().ActOnOpenMPReductionClause( 1567 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1568 ReductionId, UnresolvedReductions); 1569 } 1570 1571 /// \brief Build a new OpenMP 'linear' clause. 1572 /// 1573 /// By default, performs semantic analysis to build the new OpenMP clause. 1574 /// Subclasses may override this routine to provide different behavior. 1575 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1576 SourceLocation StartLoc, 1577 SourceLocation LParenLoc, 1578 OpenMPLinearClauseKind Modifier, 1579 SourceLocation ModifierLoc, 1580 SourceLocation ColonLoc, 1581 SourceLocation EndLoc) { 1582 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1583 Modifier, ModifierLoc, ColonLoc, 1584 EndLoc); 1585 } 1586 1587 /// \brief Build a new OpenMP 'aligned' clause. 1588 /// 1589 /// By default, performs semantic analysis to build the new OpenMP clause. 1590 /// Subclasses may override this routine to provide different behavior. 1591 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1592 SourceLocation StartLoc, 1593 SourceLocation LParenLoc, 1594 SourceLocation ColonLoc, 1595 SourceLocation EndLoc) { 1596 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1597 LParenLoc, ColonLoc, EndLoc); 1598 } 1599 1600 /// \brief Build a new OpenMP 'copyin' clause. 1601 /// 1602 /// By default, performs semantic analysis to build the new OpenMP clause. 1603 /// Subclasses may override this routine to provide different behavior. 1604 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1605 SourceLocation StartLoc, 1606 SourceLocation LParenLoc, 1607 SourceLocation EndLoc) { 1608 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1609 EndLoc); 1610 } 1611 1612 /// \brief Build a new OpenMP 'copyprivate' clause. 1613 /// 1614 /// By default, performs semantic analysis to build the new OpenMP clause. 1615 /// Subclasses may override this routine to provide different behavior. 1616 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1617 SourceLocation StartLoc, 1618 SourceLocation LParenLoc, 1619 SourceLocation EndLoc) { 1620 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1621 EndLoc); 1622 } 1623 1624 /// \brief Build a new OpenMP 'flush' pseudo clause. 1625 /// 1626 /// By default, performs semantic analysis to build the new OpenMP clause. 1627 /// Subclasses may override this routine to provide different behavior. 1628 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1629 SourceLocation StartLoc, 1630 SourceLocation LParenLoc, 1631 SourceLocation EndLoc) { 1632 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1633 EndLoc); 1634 } 1635 1636 /// \brief Build a new OpenMP 'depend' pseudo clause. 1637 /// 1638 /// By default, performs semantic analysis to build the new OpenMP clause. 1639 /// Subclasses may override this routine to provide different behavior. 1640 OMPClause * 1641 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1642 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1643 SourceLocation StartLoc, SourceLocation LParenLoc, 1644 SourceLocation EndLoc) { 1645 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1646 StartLoc, LParenLoc, EndLoc); 1647 } 1648 1649 /// \brief Build a new OpenMP 'device' clause. 1650 /// 1651 /// By default, performs semantic analysis to build the new statement. 1652 /// Subclasses may override this routine to provide different behavior. 1653 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1654 SourceLocation LParenLoc, 1655 SourceLocation EndLoc) { 1656 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1657 EndLoc); 1658 } 1659 1660 /// \brief Build a new OpenMP 'map' clause. 1661 /// 1662 /// By default, performs semantic analysis to build the new OpenMP clause. 1663 /// Subclasses may override this routine to provide different behavior. 1664 OMPClause * 1665 RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier, 1666 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1667 SourceLocation MapLoc, SourceLocation ColonLoc, 1668 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1669 SourceLocation LParenLoc, SourceLocation EndLoc) { 1670 return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType, 1671 IsMapTypeImplicit, MapLoc, ColonLoc, 1672 VarList, StartLoc, LParenLoc, EndLoc); 1673 } 1674 1675 /// \brief Build a new OpenMP 'num_teams' clause. 1676 /// 1677 /// By default, performs semantic analysis to build the new statement. 1678 /// Subclasses may override this routine to provide different behavior. 1679 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1680 SourceLocation LParenLoc, 1681 SourceLocation EndLoc) { 1682 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1683 EndLoc); 1684 } 1685 1686 /// \brief Build a new OpenMP 'thread_limit' clause. 1687 /// 1688 /// By default, performs semantic analysis to build the new statement. 1689 /// Subclasses may override this routine to provide different behavior. 1690 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1691 SourceLocation StartLoc, 1692 SourceLocation LParenLoc, 1693 SourceLocation EndLoc) { 1694 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1695 LParenLoc, EndLoc); 1696 } 1697 1698 /// \brief Build a new OpenMP 'priority' clause. 1699 /// 1700 /// By default, performs semantic analysis to build the new statement. 1701 /// Subclasses may override this routine to provide different behavior. 1702 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1703 SourceLocation LParenLoc, 1704 SourceLocation EndLoc) { 1705 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1706 EndLoc); 1707 } 1708 1709 /// \brief Build a new OpenMP 'grainsize' clause. 1710 /// 1711 /// By default, performs semantic analysis to build the new statement. 1712 /// Subclasses may override this routine to provide different behavior. 1713 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1714 SourceLocation LParenLoc, 1715 SourceLocation EndLoc) { 1716 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1717 EndLoc); 1718 } 1719 1720 /// \brief Build a new OpenMP 'num_tasks' clause. 1721 /// 1722 /// By default, performs semantic analysis to build the new statement. 1723 /// Subclasses may override this routine to provide different behavior. 1724 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1725 SourceLocation LParenLoc, 1726 SourceLocation EndLoc) { 1727 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1728 EndLoc); 1729 } 1730 1731 /// \brief Build a new OpenMP 'hint' clause. 1732 /// 1733 /// By default, performs semantic analysis to build the new statement. 1734 /// Subclasses may override this routine to provide different behavior. 1735 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1736 SourceLocation LParenLoc, 1737 SourceLocation EndLoc) { 1738 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1739 } 1740 1741 /// \brief Build a new OpenMP 'dist_schedule' clause. 1742 /// 1743 /// By default, performs semantic analysis to build the new OpenMP clause. 1744 /// Subclasses may override this routine to provide different behavior. 1745 OMPClause * 1746 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1747 Expr *ChunkSize, SourceLocation StartLoc, 1748 SourceLocation LParenLoc, SourceLocation KindLoc, 1749 SourceLocation CommaLoc, SourceLocation EndLoc) { 1750 return getSema().ActOnOpenMPDistScheduleClause( 1751 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1752 } 1753 1754 /// \brief Rebuild the operand to an Objective-C \@synchronized statement. 1755 /// 1756 /// By default, performs semantic analysis to build the new statement. 1757 /// Subclasses may override this routine to provide different behavior. 1758 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1759 Expr *object) { 1760 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1761 } 1762 1763 /// \brief Build a new Objective-C \@synchronized statement. 1764 /// 1765 /// By default, performs semantic analysis to build the new statement. 1766 /// Subclasses may override this routine to provide different behavior. 1767 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1768 Expr *Object, Stmt *Body) { 1769 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1770 } 1771 1772 /// \brief Build a new Objective-C \@autoreleasepool statement. 1773 /// 1774 /// By default, performs semantic analysis to build the new statement. 1775 /// Subclasses may override this routine to provide different behavior. 1776 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1777 Stmt *Body) { 1778 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1779 } 1780 1781 /// \brief Build a new Objective-C fast enumeration statement. 1782 /// 1783 /// By default, performs semantic analysis to build the new statement. 1784 /// Subclasses may override this routine to provide different behavior. 1785 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1786 Stmt *Element, 1787 Expr *Collection, 1788 SourceLocation RParenLoc, 1789 Stmt *Body) { 1790 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1791 Element, 1792 Collection, 1793 RParenLoc); 1794 if (ForEachStmt.isInvalid()) 1795 return StmtError(); 1796 1797 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1798 } 1799 1800 /// \brief Build a new C++ exception declaration. 1801 /// 1802 /// By default, performs semantic analysis to build the new decaration. 1803 /// Subclasses may override this routine to provide different behavior. 1804 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1805 TypeSourceInfo *Declarator, 1806 SourceLocation StartLoc, 1807 SourceLocation IdLoc, 1808 IdentifierInfo *Id) { 1809 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1810 StartLoc, IdLoc, Id); 1811 if (Var) 1812 getSema().CurContext->addDecl(Var); 1813 return Var; 1814 } 1815 1816 /// \brief Build a new C++ catch statement. 1817 /// 1818 /// By default, performs semantic analysis to build the new statement. 1819 /// Subclasses may override this routine to provide different behavior. 1820 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1821 VarDecl *ExceptionDecl, 1822 Stmt *Handler) { 1823 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 1824 Handler)); 1825 } 1826 1827 /// \brief Build a new C++ try statement. 1828 /// 1829 /// By default, performs semantic analysis to build the new statement. 1830 /// Subclasses may override this routine to provide different behavior. 1831 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 1832 ArrayRef<Stmt *> Handlers) { 1833 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 1834 } 1835 1836 /// \brief Build a new C++0x range-based for statement. 1837 /// 1838 /// By default, performs semantic analysis to build the new statement. 1839 /// Subclasses may override this routine to provide different behavior. 1840 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 1841 SourceLocation CoawaitLoc, 1842 SourceLocation ColonLoc, 1843 Stmt *Range, Stmt *Begin, Stmt *End, 1844 Expr *Cond, Expr *Inc, 1845 Stmt *LoopVar, 1846 SourceLocation RParenLoc) { 1847 // If we've just learned that the range is actually an Objective-C 1848 // collection, treat this as an Objective-C fast enumeration loop. 1849 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 1850 if (RangeStmt->isSingleDecl()) { 1851 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 1852 if (RangeVar->isInvalidDecl()) 1853 return StmtError(); 1854 1855 Expr *RangeExpr = RangeVar->getInit(); 1856 if (!RangeExpr->isTypeDependent() && 1857 RangeExpr->getType()->isObjCObjectPointerType()) 1858 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr, 1859 RParenLoc); 1860 } 1861 } 1862 } 1863 1864 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc, 1865 Range, Begin, End, 1866 Cond, Inc, LoopVar, RParenLoc, 1867 Sema::BFRK_Rebuild); 1868 } 1869 1870 /// \brief Build a new C++0x range-based for statement. 1871 /// 1872 /// By default, performs semantic analysis to build the new statement. 1873 /// Subclasses may override this routine to provide different behavior. 1874 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 1875 bool IsIfExists, 1876 NestedNameSpecifierLoc QualifierLoc, 1877 DeclarationNameInfo NameInfo, 1878 Stmt *Nested) { 1879 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 1880 QualifierLoc, NameInfo, Nested); 1881 } 1882 1883 /// \brief Attach body to a C++0x range-based for statement. 1884 /// 1885 /// By default, performs semantic analysis to finish the new statement. 1886 /// Subclasses may override this routine to provide different behavior. 1887 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 1888 return getSema().FinishCXXForRangeStmt(ForRange, Body); 1889 } 1890 1891 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 1892 Stmt *TryBlock, Stmt *Handler) { 1893 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 1894 } 1895 1896 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 1897 Stmt *Block) { 1898 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 1899 } 1900 1901 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 1902 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 1903 } 1904 1905 /// \brief Build a new predefined expression. 1906 /// 1907 /// By default, performs semantic analysis to build the new expression. 1908 /// Subclasses may override this routine to provide different behavior. 1909 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 1910 PredefinedExpr::IdentType IT) { 1911 return getSema().BuildPredefinedExpr(Loc, IT); 1912 } 1913 1914 /// \brief Build a new expression that references a declaration. 1915 /// 1916 /// By default, performs semantic analysis to build the new expression. 1917 /// Subclasses may override this routine to provide different behavior. 1918 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 1919 LookupResult &R, 1920 bool RequiresADL) { 1921 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 1922 } 1923 1924 1925 /// \brief Build a new expression that references a declaration. 1926 /// 1927 /// By default, performs semantic analysis to build the new expression. 1928 /// Subclasses may override this routine to provide different behavior. 1929 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 1930 ValueDecl *VD, 1931 const DeclarationNameInfo &NameInfo, 1932 TemplateArgumentListInfo *TemplateArgs) { 1933 CXXScopeSpec SS; 1934 SS.Adopt(QualifierLoc); 1935 1936 // FIXME: loses template args. 1937 1938 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 1939 } 1940 1941 /// \brief Build a new expression in parentheses. 1942 /// 1943 /// By default, performs semantic analysis to build the new expression. 1944 /// Subclasses may override this routine to provide different behavior. 1945 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 1946 SourceLocation RParen) { 1947 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 1948 } 1949 1950 /// \brief Build a new pseudo-destructor expression. 1951 /// 1952 /// By default, performs semantic analysis to build the new expression. 1953 /// Subclasses may override this routine to provide different behavior. 1954 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 1955 SourceLocation OperatorLoc, 1956 bool isArrow, 1957 CXXScopeSpec &SS, 1958 TypeSourceInfo *ScopeType, 1959 SourceLocation CCLoc, 1960 SourceLocation TildeLoc, 1961 PseudoDestructorTypeStorage Destroyed); 1962 1963 /// \brief Build a new unary operator expression. 1964 /// 1965 /// By default, performs semantic analysis to build the new expression. 1966 /// Subclasses may override this routine to provide different behavior. 1967 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 1968 UnaryOperatorKind Opc, 1969 Expr *SubExpr) { 1970 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 1971 } 1972 1973 /// \brief Build a new builtin offsetof expression. 1974 /// 1975 /// By default, performs semantic analysis to build the new expression. 1976 /// Subclasses may override this routine to provide different behavior. 1977 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 1978 TypeSourceInfo *Type, 1979 ArrayRef<Sema::OffsetOfComponent> Components, 1980 SourceLocation RParenLoc) { 1981 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 1982 RParenLoc); 1983 } 1984 1985 /// \brief Build a new sizeof, alignof or vec_step expression with a 1986 /// type argument. 1987 /// 1988 /// By default, performs semantic analysis to build the new expression. 1989 /// Subclasses may override this routine to provide different behavior. 1990 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 1991 SourceLocation OpLoc, 1992 UnaryExprOrTypeTrait ExprKind, 1993 SourceRange R) { 1994 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 1995 } 1996 1997 /// \brief Build a new sizeof, alignof or vec step expression with an 1998 /// expression argument. 1999 /// 2000 /// By default, performs semantic analysis to build the new expression. 2001 /// Subclasses may override this routine to provide different behavior. 2002 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2003 UnaryExprOrTypeTrait ExprKind, 2004 SourceRange R) { 2005 ExprResult Result 2006 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2007 if (Result.isInvalid()) 2008 return ExprError(); 2009 2010 return Result; 2011 } 2012 2013 /// \brief Build a new array subscript expression. 2014 /// 2015 /// By default, performs semantic analysis to build the new expression. 2016 /// Subclasses may override this routine to provide different behavior. 2017 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2018 SourceLocation LBracketLoc, 2019 Expr *RHS, 2020 SourceLocation RBracketLoc) { 2021 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2022 LBracketLoc, RHS, 2023 RBracketLoc); 2024 } 2025 2026 /// \brief Build a new array section expression. 2027 /// 2028 /// By default, performs semantic analysis to build the new expression. 2029 /// Subclasses may override this routine to provide different behavior. 2030 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2031 Expr *LowerBound, 2032 SourceLocation ColonLoc, Expr *Length, 2033 SourceLocation RBracketLoc) { 2034 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2035 ColonLoc, Length, RBracketLoc); 2036 } 2037 2038 /// \brief Build a new call expression. 2039 /// 2040 /// By default, performs semantic analysis to build the new expression. 2041 /// Subclasses may override this routine to provide different behavior. 2042 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2043 MultiExprArg Args, 2044 SourceLocation RParenLoc, 2045 Expr *ExecConfig = nullptr) { 2046 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2047 Args, RParenLoc, ExecConfig); 2048 } 2049 2050 /// \brief Build a new member access expression. 2051 /// 2052 /// By default, performs semantic analysis to build the new expression. 2053 /// Subclasses may override this routine to provide different behavior. 2054 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2055 bool isArrow, 2056 NestedNameSpecifierLoc QualifierLoc, 2057 SourceLocation TemplateKWLoc, 2058 const DeclarationNameInfo &MemberNameInfo, 2059 ValueDecl *Member, 2060 NamedDecl *FoundDecl, 2061 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2062 NamedDecl *FirstQualifierInScope) { 2063 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2064 isArrow); 2065 if (!Member->getDeclName()) { 2066 // We have a reference to an unnamed field. This is always the 2067 // base of an anonymous struct/union member access, i.e. the 2068 // field is always of record type. 2069 assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!"); 2070 assert(Member->getType()->isRecordType() && 2071 "unnamed member not of record type?"); 2072 2073 BaseResult = 2074 getSema().PerformObjectMemberConversion(BaseResult.get(), 2075 QualifierLoc.getNestedNameSpecifier(), 2076 FoundDecl, Member); 2077 if (BaseResult.isInvalid()) 2078 return ExprError(); 2079 Base = BaseResult.get(); 2080 ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); 2081 MemberExpr *ME = new (getSema().Context) 2082 MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo, 2083 cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary); 2084 return ME; 2085 } 2086 2087 CXXScopeSpec SS; 2088 SS.Adopt(QualifierLoc); 2089 2090 Base = BaseResult.get(); 2091 QualType BaseType = Base->getType(); 2092 2093 // FIXME: this involves duplicating earlier analysis in a lot of 2094 // cases; we should avoid this when possible. 2095 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2096 R.addDecl(FoundDecl); 2097 R.resolveKind(); 2098 2099 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2100 SS, TemplateKWLoc, 2101 FirstQualifierInScope, 2102 R, ExplicitTemplateArgs, 2103 /*S*/nullptr); 2104 } 2105 2106 /// \brief Build a new binary operator expression. 2107 /// 2108 /// By default, performs semantic analysis to build the new expression. 2109 /// Subclasses may override this routine to provide different behavior. 2110 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2111 BinaryOperatorKind Opc, 2112 Expr *LHS, Expr *RHS) { 2113 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2114 } 2115 2116 /// \brief Build a new conditional operator expression. 2117 /// 2118 /// By default, performs semantic analysis to build the new expression. 2119 /// Subclasses may override this routine to provide different behavior. 2120 ExprResult RebuildConditionalOperator(Expr *Cond, 2121 SourceLocation QuestionLoc, 2122 Expr *LHS, 2123 SourceLocation ColonLoc, 2124 Expr *RHS) { 2125 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2126 LHS, RHS); 2127 } 2128 2129 /// \brief Build a new C-style cast expression. 2130 /// 2131 /// By default, performs semantic analysis to build the new expression. 2132 /// Subclasses may override this routine to provide different behavior. 2133 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2134 TypeSourceInfo *TInfo, 2135 SourceLocation RParenLoc, 2136 Expr *SubExpr) { 2137 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2138 SubExpr); 2139 } 2140 2141 /// \brief Build a new compound literal expression. 2142 /// 2143 /// By default, performs semantic analysis to build the new expression. 2144 /// Subclasses may override this routine to provide different behavior. 2145 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2146 TypeSourceInfo *TInfo, 2147 SourceLocation RParenLoc, 2148 Expr *Init) { 2149 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2150 Init); 2151 } 2152 2153 /// \brief Build a new extended vector element access expression. 2154 /// 2155 /// By default, performs semantic analysis to build the new expression. 2156 /// Subclasses may override this routine to provide different behavior. 2157 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2158 SourceLocation OpLoc, 2159 SourceLocation AccessorLoc, 2160 IdentifierInfo &Accessor) { 2161 2162 CXXScopeSpec SS; 2163 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2164 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2165 OpLoc, /*IsArrow*/ false, 2166 SS, SourceLocation(), 2167 /*FirstQualifierInScope*/ nullptr, 2168 NameInfo, 2169 /* TemplateArgs */ nullptr, 2170 /*S*/ nullptr); 2171 } 2172 2173 /// \brief Build a new initializer list expression. 2174 /// 2175 /// By default, performs semantic analysis to build the new expression. 2176 /// Subclasses may override this routine to provide different behavior. 2177 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2178 MultiExprArg Inits, 2179 SourceLocation RBraceLoc, 2180 QualType ResultTy) { 2181 ExprResult Result 2182 = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2183 if (Result.isInvalid() || ResultTy->isDependentType()) 2184 return Result; 2185 2186 // Patch in the result type we were given, which may have been computed 2187 // when the initial InitListExpr was built. 2188 InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 2189 ILE->setType(ResultTy); 2190 return Result; 2191 } 2192 2193 /// \brief Build a new designated initializer expression. 2194 /// 2195 /// By default, performs semantic analysis to build the new expression. 2196 /// Subclasses may override this routine to provide different behavior. 2197 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2198 MultiExprArg ArrayExprs, 2199 SourceLocation EqualOrColonLoc, 2200 bool GNUSyntax, 2201 Expr *Init) { 2202 ExprResult Result 2203 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2204 Init); 2205 if (Result.isInvalid()) 2206 return ExprError(); 2207 2208 return Result; 2209 } 2210 2211 /// \brief Build a new value-initialized expression. 2212 /// 2213 /// By default, builds the implicit value initialization without performing 2214 /// any semantic analysis. Subclasses may override this routine to provide 2215 /// different behavior. 2216 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2217 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2218 } 2219 2220 /// \brief Build a new \c va_arg expression. 2221 /// 2222 /// By default, performs semantic analysis to build the new expression. 2223 /// Subclasses may override this routine to provide different behavior. 2224 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2225 Expr *SubExpr, TypeSourceInfo *TInfo, 2226 SourceLocation RParenLoc) { 2227 return getSema().BuildVAArgExpr(BuiltinLoc, 2228 SubExpr, TInfo, 2229 RParenLoc); 2230 } 2231 2232 /// \brief Build a new expression list in parentheses. 2233 /// 2234 /// By default, performs semantic analysis to build the new expression. 2235 /// Subclasses may override this routine to provide different behavior. 2236 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2237 MultiExprArg SubExprs, 2238 SourceLocation RParenLoc) { 2239 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2240 } 2241 2242 /// \brief Build a new address-of-label expression. 2243 /// 2244 /// By default, performs semantic analysis, using the name of the label 2245 /// rather than attempting to map the label statement itself. 2246 /// Subclasses may override this routine to provide different behavior. 2247 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2248 SourceLocation LabelLoc, LabelDecl *Label) { 2249 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2250 } 2251 2252 /// \brief Build a new GNU statement expression. 2253 /// 2254 /// By default, performs semantic analysis to build the new expression. 2255 /// Subclasses may override this routine to provide different behavior. 2256 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2257 Stmt *SubStmt, 2258 SourceLocation RParenLoc) { 2259 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2260 } 2261 2262 /// \brief Build a new __builtin_choose_expr expression. 2263 /// 2264 /// By default, performs semantic analysis to build the new expression. 2265 /// Subclasses may override this routine to provide different behavior. 2266 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2267 Expr *Cond, Expr *LHS, Expr *RHS, 2268 SourceLocation RParenLoc) { 2269 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2270 Cond, LHS, RHS, 2271 RParenLoc); 2272 } 2273 2274 /// \brief Build a new generic selection expression. 2275 /// 2276 /// By default, performs semantic analysis to build the new expression. 2277 /// Subclasses may override this routine to provide different behavior. 2278 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2279 SourceLocation DefaultLoc, 2280 SourceLocation RParenLoc, 2281 Expr *ControllingExpr, 2282 ArrayRef<TypeSourceInfo *> Types, 2283 ArrayRef<Expr *> Exprs) { 2284 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2285 ControllingExpr, Types, Exprs); 2286 } 2287 2288 /// \brief Build a new overloaded operator call expression. 2289 /// 2290 /// By default, performs semantic analysis to build the new expression. 2291 /// The semantic analysis provides the behavior of template instantiation, 2292 /// copying with transformations that turn what looks like an overloaded 2293 /// operator call into a use of a builtin operator, performing 2294 /// argument-dependent lookup, etc. Subclasses may override this routine to 2295 /// provide different behavior. 2296 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2297 SourceLocation OpLoc, 2298 Expr *Callee, 2299 Expr *First, 2300 Expr *Second); 2301 2302 /// \brief Build a new C++ "named" cast expression, such as static_cast or 2303 /// reinterpret_cast. 2304 /// 2305 /// By default, this routine dispatches to one of the more-specific routines 2306 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2307 /// Subclasses may override this routine to provide different behavior. 2308 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2309 Stmt::StmtClass Class, 2310 SourceLocation LAngleLoc, 2311 TypeSourceInfo *TInfo, 2312 SourceLocation RAngleLoc, 2313 SourceLocation LParenLoc, 2314 Expr *SubExpr, 2315 SourceLocation RParenLoc) { 2316 switch (Class) { 2317 case Stmt::CXXStaticCastExprClass: 2318 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2319 RAngleLoc, LParenLoc, 2320 SubExpr, RParenLoc); 2321 2322 case Stmt::CXXDynamicCastExprClass: 2323 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2324 RAngleLoc, LParenLoc, 2325 SubExpr, RParenLoc); 2326 2327 case Stmt::CXXReinterpretCastExprClass: 2328 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2329 RAngleLoc, LParenLoc, 2330 SubExpr, 2331 RParenLoc); 2332 2333 case Stmt::CXXConstCastExprClass: 2334 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2335 RAngleLoc, LParenLoc, 2336 SubExpr, RParenLoc); 2337 2338 default: 2339 llvm_unreachable("Invalid C++ named cast"); 2340 } 2341 } 2342 2343 /// \brief Build a new C++ static_cast expression. 2344 /// 2345 /// By default, performs semantic analysis to build the new expression. 2346 /// Subclasses may override this routine to provide different behavior. 2347 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2348 SourceLocation LAngleLoc, 2349 TypeSourceInfo *TInfo, 2350 SourceLocation RAngleLoc, 2351 SourceLocation LParenLoc, 2352 Expr *SubExpr, 2353 SourceLocation RParenLoc) { 2354 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2355 TInfo, SubExpr, 2356 SourceRange(LAngleLoc, RAngleLoc), 2357 SourceRange(LParenLoc, RParenLoc)); 2358 } 2359 2360 /// \brief Build a new C++ dynamic_cast 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 RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2365 SourceLocation LAngleLoc, 2366 TypeSourceInfo *TInfo, 2367 SourceLocation RAngleLoc, 2368 SourceLocation LParenLoc, 2369 Expr *SubExpr, 2370 SourceLocation RParenLoc) { 2371 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2372 TInfo, SubExpr, 2373 SourceRange(LAngleLoc, RAngleLoc), 2374 SourceRange(LParenLoc, RParenLoc)); 2375 } 2376 2377 /// \brief Build a new C++ reinterpret_cast expression. 2378 /// 2379 /// By default, performs semantic analysis to build the new expression. 2380 /// Subclasses may override this routine to provide different behavior. 2381 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2382 SourceLocation LAngleLoc, 2383 TypeSourceInfo *TInfo, 2384 SourceLocation RAngleLoc, 2385 SourceLocation LParenLoc, 2386 Expr *SubExpr, 2387 SourceLocation RParenLoc) { 2388 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2389 TInfo, SubExpr, 2390 SourceRange(LAngleLoc, RAngleLoc), 2391 SourceRange(LParenLoc, RParenLoc)); 2392 } 2393 2394 /// \brief Build a new C++ const_cast expression. 2395 /// 2396 /// By default, performs semantic analysis to build the new expression. 2397 /// Subclasses may override this routine to provide different behavior. 2398 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2399 SourceLocation LAngleLoc, 2400 TypeSourceInfo *TInfo, 2401 SourceLocation RAngleLoc, 2402 SourceLocation LParenLoc, 2403 Expr *SubExpr, 2404 SourceLocation RParenLoc) { 2405 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2406 TInfo, SubExpr, 2407 SourceRange(LAngleLoc, RAngleLoc), 2408 SourceRange(LParenLoc, RParenLoc)); 2409 } 2410 2411 /// \brief Build a new C++ functional-style cast expression. 2412 /// 2413 /// By default, performs semantic analysis to build the new expression. 2414 /// Subclasses may override this routine to provide different behavior. 2415 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2416 SourceLocation LParenLoc, 2417 Expr *Sub, 2418 SourceLocation RParenLoc) { 2419 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2420 MultiExprArg(&Sub, 1), 2421 RParenLoc); 2422 } 2423 2424 /// \brief Build a new C++ typeid(type) expression. 2425 /// 2426 /// By default, performs semantic analysis to build the new expression. 2427 /// Subclasses may override this routine to provide different behavior. 2428 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2429 SourceLocation TypeidLoc, 2430 TypeSourceInfo *Operand, 2431 SourceLocation RParenLoc) { 2432 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2433 RParenLoc); 2434 } 2435 2436 2437 /// \brief Build a new C++ typeid(expr) expression. 2438 /// 2439 /// By default, performs semantic analysis to build the new expression. 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2442 SourceLocation TypeidLoc, 2443 Expr *Operand, 2444 SourceLocation RParenLoc) { 2445 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2446 RParenLoc); 2447 } 2448 2449 /// \brief Build a new C++ __uuidof(type) 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 RebuildCXXUuidofExpr(QualType TypeInfoType, 2454 SourceLocation TypeidLoc, 2455 TypeSourceInfo *Operand, 2456 SourceLocation RParenLoc) { 2457 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2458 RParenLoc); 2459 } 2460 2461 /// \brief Build a new C++ __uuidof(expr) expression. 2462 /// 2463 /// By default, performs semantic analysis to build the new expression. 2464 /// Subclasses may override this routine to provide different behavior. 2465 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2466 SourceLocation TypeidLoc, 2467 Expr *Operand, 2468 SourceLocation RParenLoc) { 2469 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2470 RParenLoc); 2471 } 2472 2473 /// \brief Build a new C++ "this" expression. 2474 /// 2475 /// By default, builds a new "this" expression without performing any 2476 /// semantic analysis. Subclasses may override this routine to provide 2477 /// different behavior. 2478 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2479 QualType ThisType, 2480 bool isImplicit) { 2481 getSema().CheckCXXThisCapture(ThisLoc); 2482 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2483 } 2484 2485 /// \brief Build a new C++ throw expression. 2486 /// 2487 /// By default, performs semantic analysis to build the new expression. 2488 /// Subclasses may override this routine to provide different behavior. 2489 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2490 bool IsThrownVariableInScope) { 2491 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2492 } 2493 2494 /// \brief Build a new C++ default-argument expression. 2495 /// 2496 /// By default, builds a new default-argument expression, which does not 2497 /// require any semantic analysis. Subclasses may override this routine to 2498 /// provide different behavior. 2499 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2500 ParmVarDecl *Param) { 2501 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2502 } 2503 2504 /// \brief Build a new C++11 default-initialization expression. 2505 /// 2506 /// By default, builds a new default field initialization expression, which 2507 /// does not require any semantic analysis. Subclasses may override this 2508 /// routine to provide different behavior. 2509 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2510 FieldDecl *Field) { 2511 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2512 } 2513 2514 /// \brief Build a new C++ zero-initialization expression. 2515 /// 2516 /// By default, performs semantic analysis to build the new expression. 2517 /// Subclasses may override this routine to provide different behavior. 2518 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2519 SourceLocation LParenLoc, 2520 SourceLocation RParenLoc) { 2521 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, 2522 None, RParenLoc); 2523 } 2524 2525 /// \brief Build a new C++ "new" expression. 2526 /// 2527 /// By default, performs semantic analysis to build the new expression. 2528 /// Subclasses may override this routine to provide different behavior. 2529 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2530 bool UseGlobal, 2531 SourceLocation PlacementLParen, 2532 MultiExprArg PlacementArgs, 2533 SourceLocation PlacementRParen, 2534 SourceRange TypeIdParens, 2535 QualType AllocatedType, 2536 TypeSourceInfo *AllocatedTypeInfo, 2537 Expr *ArraySize, 2538 SourceRange DirectInitRange, 2539 Expr *Initializer) { 2540 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2541 PlacementLParen, 2542 PlacementArgs, 2543 PlacementRParen, 2544 TypeIdParens, 2545 AllocatedType, 2546 AllocatedTypeInfo, 2547 ArraySize, 2548 DirectInitRange, 2549 Initializer); 2550 } 2551 2552 /// \brief Build a new C++ "delete" expression. 2553 /// 2554 /// By default, performs semantic analysis to build the new expression. 2555 /// Subclasses may override this routine to provide different behavior. 2556 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2557 bool IsGlobalDelete, 2558 bool IsArrayForm, 2559 Expr *Operand) { 2560 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2561 Operand); 2562 } 2563 2564 /// \brief Build a new type trait expression. 2565 /// 2566 /// By default, performs semantic analysis to build the new expression. 2567 /// Subclasses may override this routine to provide different behavior. 2568 ExprResult RebuildTypeTrait(TypeTrait Trait, 2569 SourceLocation StartLoc, 2570 ArrayRef<TypeSourceInfo *> Args, 2571 SourceLocation RParenLoc) { 2572 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2573 } 2574 2575 /// \brief Build a new array type trait expression. 2576 /// 2577 /// By default, performs semantic analysis to build the new expression. 2578 /// Subclasses may override this routine to provide different behavior. 2579 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2580 SourceLocation StartLoc, 2581 TypeSourceInfo *TSInfo, 2582 Expr *DimExpr, 2583 SourceLocation RParenLoc) { 2584 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2585 } 2586 2587 /// \brief Build a new expression trait expression. 2588 /// 2589 /// By default, performs semantic analysis to build the new expression. 2590 /// Subclasses may override this routine to provide different behavior. 2591 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2592 SourceLocation StartLoc, 2593 Expr *Queried, 2594 SourceLocation RParenLoc) { 2595 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2596 } 2597 2598 /// \brief Build a new (previously unresolved) declaration reference 2599 /// expression. 2600 /// 2601 /// By default, performs semantic analysis to build the new expression. 2602 /// Subclasses may override this routine to provide different behavior. 2603 ExprResult RebuildDependentScopeDeclRefExpr( 2604 NestedNameSpecifierLoc QualifierLoc, 2605 SourceLocation TemplateKWLoc, 2606 const DeclarationNameInfo &NameInfo, 2607 const TemplateArgumentListInfo *TemplateArgs, 2608 bool IsAddressOfOperand, 2609 TypeSourceInfo **RecoveryTSI) { 2610 CXXScopeSpec SS; 2611 SS.Adopt(QualifierLoc); 2612 2613 if (TemplateArgs || TemplateKWLoc.isValid()) 2614 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2615 TemplateArgs); 2616 2617 return getSema().BuildQualifiedDeclarationNameExpr( 2618 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2619 } 2620 2621 /// \brief Build a new template-id expression. 2622 /// 2623 /// By default, performs semantic analysis to build the new expression. 2624 /// Subclasses may override this routine to provide different behavior. 2625 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2626 SourceLocation TemplateKWLoc, 2627 LookupResult &R, 2628 bool RequiresADL, 2629 const TemplateArgumentListInfo *TemplateArgs) { 2630 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2631 TemplateArgs); 2632 } 2633 2634 /// \brief Build a new object-construction expression. 2635 /// 2636 /// By default, performs semantic analysis to build the new expression. 2637 /// Subclasses may override this routine to provide different behavior. 2638 ExprResult RebuildCXXConstructExpr(QualType T, 2639 SourceLocation Loc, 2640 CXXConstructorDecl *Constructor, 2641 bool IsElidable, 2642 MultiExprArg Args, 2643 bool HadMultipleCandidates, 2644 bool ListInitialization, 2645 bool StdInitListInitialization, 2646 bool RequiresZeroInit, 2647 CXXConstructExpr::ConstructionKind ConstructKind, 2648 SourceRange ParenRange) { 2649 SmallVector<Expr*, 8> ConvertedArgs; 2650 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2651 ConvertedArgs)) 2652 return ExprError(); 2653 2654 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 2655 ConvertedArgs, 2656 HadMultipleCandidates, 2657 ListInitialization, 2658 StdInitListInitialization, 2659 RequiresZeroInit, ConstructKind, 2660 ParenRange); 2661 } 2662 2663 /// \brief Build a new object-construction expression. 2664 /// 2665 /// By default, performs semantic analysis to build the new expression. 2666 /// Subclasses may override this routine to provide different behavior. 2667 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2668 SourceLocation LParenLoc, 2669 MultiExprArg Args, 2670 SourceLocation RParenLoc) { 2671 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2672 LParenLoc, 2673 Args, 2674 RParenLoc); 2675 } 2676 2677 /// \brief Build a new object-construction expression. 2678 /// 2679 /// By default, performs semantic analysis to build the new expression. 2680 /// Subclasses may override this routine to provide different behavior. 2681 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2682 SourceLocation LParenLoc, 2683 MultiExprArg Args, 2684 SourceLocation RParenLoc) { 2685 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2686 LParenLoc, 2687 Args, 2688 RParenLoc); 2689 } 2690 2691 /// \brief Build a new member reference expression. 2692 /// 2693 /// By default, performs semantic analysis to build the new expression. 2694 /// Subclasses may override this routine to provide different behavior. 2695 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2696 QualType BaseType, 2697 bool IsArrow, 2698 SourceLocation OperatorLoc, 2699 NestedNameSpecifierLoc QualifierLoc, 2700 SourceLocation TemplateKWLoc, 2701 NamedDecl *FirstQualifierInScope, 2702 const DeclarationNameInfo &MemberNameInfo, 2703 const TemplateArgumentListInfo *TemplateArgs) { 2704 CXXScopeSpec SS; 2705 SS.Adopt(QualifierLoc); 2706 2707 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2708 OperatorLoc, IsArrow, 2709 SS, TemplateKWLoc, 2710 FirstQualifierInScope, 2711 MemberNameInfo, 2712 TemplateArgs, /*S*/nullptr); 2713 } 2714 2715 /// \brief Build a new member reference expression. 2716 /// 2717 /// By default, performs semantic analysis to build the new expression. 2718 /// Subclasses may override this routine to provide different behavior. 2719 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2720 SourceLocation OperatorLoc, 2721 bool IsArrow, 2722 NestedNameSpecifierLoc QualifierLoc, 2723 SourceLocation TemplateKWLoc, 2724 NamedDecl *FirstQualifierInScope, 2725 LookupResult &R, 2726 const TemplateArgumentListInfo *TemplateArgs) { 2727 CXXScopeSpec SS; 2728 SS.Adopt(QualifierLoc); 2729 2730 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2731 OperatorLoc, IsArrow, 2732 SS, TemplateKWLoc, 2733 FirstQualifierInScope, 2734 R, TemplateArgs, /*S*/nullptr); 2735 } 2736 2737 /// \brief Build a new noexcept expression. 2738 /// 2739 /// By default, performs semantic analysis to build the new expression. 2740 /// Subclasses may override this routine to provide different behavior. 2741 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2742 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2743 } 2744 2745 /// \brief Build a new expression to compute the length of a parameter pack. 2746 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2747 NamedDecl *Pack, 2748 SourceLocation PackLoc, 2749 SourceLocation RParenLoc, 2750 Optional<unsigned> Length, 2751 ArrayRef<TemplateArgument> PartialArgs) { 2752 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2753 RParenLoc, Length, PartialArgs); 2754 } 2755 2756 /// \brief Build a new Objective-C boxed expression. 2757 /// 2758 /// By default, performs semantic analysis to build the new expression. 2759 /// Subclasses may override this routine to provide different behavior. 2760 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2761 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2762 } 2763 2764 /// \brief Build a new Objective-C array literal. 2765 /// 2766 /// By default, performs semantic analysis to build the new expression. 2767 /// Subclasses may override this routine to provide different behavior. 2768 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2769 Expr **Elements, unsigned NumElements) { 2770 return getSema().BuildObjCArrayLiteral(Range, 2771 MultiExprArg(Elements, NumElements)); 2772 } 2773 2774 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2775 Expr *Base, Expr *Key, 2776 ObjCMethodDecl *getterMethod, 2777 ObjCMethodDecl *setterMethod) { 2778 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2779 getterMethod, setterMethod); 2780 } 2781 2782 /// \brief Build a new Objective-C dictionary literal. 2783 /// 2784 /// By default, performs semantic analysis to build the new expression. 2785 /// Subclasses may override this routine to provide different behavior. 2786 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2787 MutableArrayRef<ObjCDictionaryElement> Elements) { 2788 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2789 } 2790 2791 /// \brief Build a new Objective-C \@encode expression. 2792 /// 2793 /// By default, performs semantic analysis to build the new expression. 2794 /// Subclasses may override this routine to provide different behavior. 2795 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2796 TypeSourceInfo *EncodeTypeInfo, 2797 SourceLocation RParenLoc) { 2798 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2799 } 2800 2801 /// \brief Build a new Objective-C class message. 2802 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2803 Selector Sel, 2804 ArrayRef<SourceLocation> SelectorLocs, 2805 ObjCMethodDecl *Method, 2806 SourceLocation LBracLoc, 2807 MultiExprArg Args, 2808 SourceLocation RBracLoc) { 2809 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 2810 ReceiverTypeInfo->getType(), 2811 /*SuperLoc=*/SourceLocation(), 2812 Sel, Method, LBracLoc, SelectorLocs, 2813 RBracLoc, Args); 2814 } 2815 2816 /// \brief Build a new Objective-C instance message. 2817 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 2818 Selector Sel, 2819 ArrayRef<SourceLocation> SelectorLocs, 2820 ObjCMethodDecl *Method, 2821 SourceLocation LBracLoc, 2822 MultiExprArg Args, 2823 SourceLocation RBracLoc) { 2824 return SemaRef.BuildInstanceMessage(Receiver, 2825 Receiver->getType(), 2826 /*SuperLoc=*/SourceLocation(), 2827 Sel, Method, LBracLoc, SelectorLocs, 2828 RBracLoc, Args); 2829 } 2830 2831 /// \brief Build a new Objective-C instance/class message to 'super'. 2832 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 2833 Selector Sel, 2834 ArrayRef<SourceLocation> SelectorLocs, 2835 QualType SuperType, 2836 ObjCMethodDecl *Method, 2837 SourceLocation LBracLoc, 2838 MultiExprArg Args, 2839 SourceLocation RBracLoc) { 2840 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 2841 SuperType, 2842 SuperLoc, 2843 Sel, Method, LBracLoc, SelectorLocs, 2844 RBracLoc, Args) 2845 : SemaRef.BuildClassMessage(nullptr, 2846 SuperType, 2847 SuperLoc, 2848 Sel, Method, LBracLoc, SelectorLocs, 2849 RBracLoc, Args); 2850 2851 2852 } 2853 2854 /// \brief Build a new Objective-C ivar reference expression. 2855 /// 2856 /// By default, performs semantic analysis to build the new expression. 2857 /// Subclasses may override this routine to provide different behavior. 2858 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 2859 SourceLocation IvarLoc, 2860 bool IsArrow, bool IsFreeIvar) { 2861 // FIXME: We lose track of the IsFreeIvar bit. 2862 CXXScopeSpec SS; 2863 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 2864 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 2865 /*FIXME:*/IvarLoc, IsArrow, 2866 SS, SourceLocation(), 2867 /*FirstQualifierInScope=*/nullptr, 2868 NameInfo, 2869 /*TemplateArgs=*/nullptr, 2870 /*S=*/nullptr); 2871 } 2872 2873 /// \brief Build a new Objective-C property reference expression. 2874 /// 2875 /// By default, performs semantic analysis to build the new expression. 2876 /// Subclasses may override this routine to provide different behavior. 2877 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 2878 ObjCPropertyDecl *Property, 2879 SourceLocation PropertyLoc) { 2880 CXXScopeSpec SS; 2881 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 2882 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 2883 /*FIXME:*/PropertyLoc, 2884 /*IsArrow=*/false, 2885 SS, SourceLocation(), 2886 /*FirstQualifierInScope=*/nullptr, 2887 NameInfo, 2888 /*TemplateArgs=*/nullptr, 2889 /*S=*/nullptr); 2890 } 2891 2892 /// \brief Build a new Objective-C property reference expression. 2893 /// 2894 /// By default, performs semantic analysis to build the new expression. 2895 /// Subclasses may override this routine to provide different behavior. 2896 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 2897 ObjCMethodDecl *Getter, 2898 ObjCMethodDecl *Setter, 2899 SourceLocation PropertyLoc) { 2900 // Since these expressions can only be value-dependent, we do not 2901 // need to perform semantic analysis again. 2902 return Owned( 2903 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 2904 VK_LValue, OK_ObjCProperty, 2905 PropertyLoc, Base)); 2906 } 2907 2908 /// \brief Build a new Objective-C "isa" expression. 2909 /// 2910 /// By default, performs semantic analysis to build the new expression. 2911 /// Subclasses may override this routine to provide different behavior. 2912 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 2913 SourceLocation OpLoc, bool IsArrow) { 2914 CXXScopeSpec SS; 2915 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 2916 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 2917 OpLoc, IsArrow, 2918 SS, SourceLocation(), 2919 /*FirstQualifierInScope=*/nullptr, 2920 NameInfo, 2921 /*TemplateArgs=*/nullptr, 2922 /*S=*/nullptr); 2923 } 2924 2925 /// \brief Build a new shuffle vector expression. 2926 /// 2927 /// By default, performs semantic analysis to build the new expression. 2928 /// Subclasses may override this routine to provide different behavior. 2929 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 2930 MultiExprArg SubExprs, 2931 SourceLocation RParenLoc) { 2932 // Find the declaration for __builtin_shufflevector 2933 const IdentifierInfo &Name 2934 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 2935 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 2936 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 2937 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 2938 2939 // Build a reference to the __builtin_shufflevector builtin 2940 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 2941 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 2942 SemaRef.Context.BuiltinFnTy, 2943 VK_RValue, BuiltinLoc); 2944 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 2945 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 2946 CK_BuiltinFnToFnPtr).get(); 2947 2948 // Build the CallExpr 2949 ExprResult TheCall = new (SemaRef.Context) CallExpr( 2950 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 2951 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 2952 2953 // Type-check the __builtin_shufflevector expression. 2954 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 2955 } 2956 2957 /// \brief Build a new convert vector expression. 2958 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 2959 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 2960 SourceLocation RParenLoc) { 2961 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 2962 BuiltinLoc, RParenLoc); 2963 } 2964 2965 /// \brief Build a new template argument pack expansion. 2966 /// 2967 /// By default, performs semantic analysis to build a new pack expansion 2968 /// for a template argument. Subclasses may override this routine to provide 2969 /// different behavior. 2970 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 2971 SourceLocation EllipsisLoc, 2972 Optional<unsigned> NumExpansions) { 2973 switch (Pattern.getArgument().getKind()) { 2974 case TemplateArgument::Expression: { 2975 ExprResult Result 2976 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 2977 EllipsisLoc, NumExpansions); 2978 if (Result.isInvalid()) 2979 return TemplateArgumentLoc(); 2980 2981 return TemplateArgumentLoc(Result.get(), Result.get()); 2982 } 2983 2984 case TemplateArgument::Template: 2985 return TemplateArgumentLoc(TemplateArgument( 2986 Pattern.getArgument().getAsTemplate(), 2987 NumExpansions), 2988 Pattern.getTemplateQualifierLoc(), 2989 Pattern.getTemplateNameLoc(), 2990 EllipsisLoc); 2991 2992 case TemplateArgument::Null: 2993 case TemplateArgument::Integral: 2994 case TemplateArgument::Declaration: 2995 case TemplateArgument::Pack: 2996 case TemplateArgument::TemplateExpansion: 2997 case TemplateArgument::NullPtr: 2998 llvm_unreachable("Pack expansion pattern has no parameter packs"); 2999 3000 case TemplateArgument::Type: 3001 if (TypeSourceInfo *Expansion 3002 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3003 EllipsisLoc, 3004 NumExpansions)) 3005 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3006 Expansion); 3007 break; 3008 } 3009 3010 return TemplateArgumentLoc(); 3011 } 3012 3013 /// \brief Build a new expression pack expansion. 3014 /// 3015 /// By default, performs semantic analysis to build a new pack expansion 3016 /// for an expression. Subclasses may override this routine to provide 3017 /// different behavior. 3018 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3019 Optional<unsigned> NumExpansions) { 3020 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3021 } 3022 3023 /// \brief Build a new C++1z fold-expression. 3024 /// 3025 /// By default, performs semantic analysis in order to build a new fold 3026 /// expression. 3027 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3028 BinaryOperatorKind Operator, 3029 SourceLocation EllipsisLoc, Expr *RHS, 3030 SourceLocation RParenLoc) { 3031 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3032 RHS, RParenLoc); 3033 } 3034 3035 /// \brief Build an empty C++1z fold-expression with the given operator. 3036 /// 3037 /// By default, produces the fallback value for the fold-expression, or 3038 /// produce an error if there is no fallback value. 3039 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3040 BinaryOperatorKind Operator) { 3041 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3042 } 3043 3044 /// \brief Build a new atomic operation expression. 3045 /// 3046 /// By default, performs semantic analysis to build the new expression. 3047 /// Subclasses may override this routine to provide different behavior. 3048 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3049 MultiExprArg SubExprs, 3050 QualType RetTy, 3051 AtomicExpr::AtomicOp Op, 3052 SourceLocation RParenLoc) { 3053 // Just create the expression; there is not any interesting semantic 3054 // analysis here because we can't actually build an AtomicExpr until 3055 // we are sure it is semantically sound. 3056 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3057 RParenLoc); 3058 } 3059 3060 private: 3061 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3062 QualType ObjectType, 3063 NamedDecl *FirstQualifierInScope, 3064 CXXScopeSpec &SS); 3065 3066 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3067 QualType ObjectType, 3068 NamedDecl *FirstQualifierInScope, 3069 CXXScopeSpec &SS); 3070 3071 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3072 NamedDecl *FirstQualifierInScope, 3073 CXXScopeSpec &SS); 3074 }; 3075 3076 template<typename Derived> 3077 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 3078 if (!S) 3079 return S; 3080 3081 switch (S->getStmtClass()) { 3082 case Stmt::NoStmtClass: break; 3083 3084 // Transform individual statement nodes 3085 #define STMT(Node, Parent) \ 3086 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3087 #define ABSTRACT_STMT(Node) 3088 #define EXPR(Node, Parent) 3089 #include "clang/AST/StmtNodes.inc" 3090 3091 // Transform expressions by calling TransformExpr. 3092 #define STMT(Node, Parent) 3093 #define ABSTRACT_STMT(Stmt) 3094 #define EXPR(Node, Parent) case Stmt::Node##Class: 3095 #include "clang/AST/StmtNodes.inc" 3096 { 3097 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3098 if (E.isInvalid()) 3099 return StmtError(); 3100 3101 return getSema().ActOnExprStmt(E); 3102 } 3103 } 3104 3105 return S; 3106 } 3107 3108 template<typename Derived> 3109 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3110 if (!S) 3111 return S; 3112 3113 switch (S->getClauseKind()) { 3114 default: break; 3115 // Transform individual clause nodes 3116 #define OPENMP_CLAUSE(Name, Class) \ 3117 case OMPC_ ## Name : \ 3118 return getDerived().Transform ## Class(cast<Class>(S)); 3119 #include "clang/Basic/OpenMPKinds.def" 3120 } 3121 3122 return S; 3123 } 3124 3125 3126 template<typename Derived> 3127 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3128 if (!E) 3129 return E; 3130 3131 switch (E->getStmtClass()) { 3132 case Stmt::NoStmtClass: break; 3133 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3134 #define ABSTRACT_STMT(Stmt) 3135 #define EXPR(Node, Parent) \ 3136 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3137 #include "clang/AST/StmtNodes.inc" 3138 } 3139 3140 return E; 3141 } 3142 3143 template<typename Derived> 3144 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3145 bool NotCopyInit) { 3146 // Initializers are instantiated like expressions, except that various outer 3147 // layers are stripped. 3148 if (!Init) 3149 return Init; 3150 3151 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 3152 Init = ExprTemp->getSubExpr(); 3153 3154 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3155 Init = MTE->GetTemporaryExpr(); 3156 3157 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3158 Init = Binder->getSubExpr(); 3159 3160 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3161 Init = ICE->getSubExprAsWritten(); 3162 3163 if (CXXStdInitializerListExpr *ILE = 3164 dyn_cast<CXXStdInitializerListExpr>(Init)) 3165 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3166 3167 // If this is copy-initialization, we only need to reconstruct 3168 // InitListExprs. Other forms of copy-initialization will be a no-op if 3169 // the initializer is already the right type. 3170 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3171 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3172 return getDerived().TransformExpr(Init); 3173 3174 // Revert value-initialization back to empty parens. 3175 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3176 SourceRange Parens = VIE->getSourceRange(); 3177 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3178 Parens.getEnd()); 3179 } 3180 3181 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3182 if (isa<ImplicitValueInitExpr>(Init)) 3183 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3184 SourceLocation()); 3185 3186 // Revert initialization by constructor back to a parenthesized or braced list 3187 // of expressions. Any other form of initializer can just be reused directly. 3188 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3189 return getDerived().TransformExpr(Init); 3190 3191 // If the initialization implicitly converted an initializer list to a 3192 // std::initializer_list object, unwrap the std::initializer_list too. 3193 if (Construct && Construct->isStdInitListInitialization()) 3194 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3195 3196 SmallVector<Expr*, 8> NewArgs; 3197 bool ArgChanged = false; 3198 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3199 /*IsCall*/true, NewArgs, &ArgChanged)) 3200 return ExprError(); 3201 3202 // If this was list initialization, revert to list form. 3203 if (Construct->isListInitialization()) 3204 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs, 3205 Construct->getLocEnd(), 3206 Construct->getType()); 3207 3208 // Build a ParenListExpr to represent anything else. 3209 SourceRange Parens = Construct->getParenOrBraceRange(); 3210 if (Parens.isInvalid()) { 3211 // This was a variable declaration's initialization for which no initializer 3212 // was specified. 3213 assert(NewArgs.empty() && 3214 "no parens or braces but have direct init with arguments?"); 3215 return ExprEmpty(); 3216 } 3217 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3218 Parens.getEnd()); 3219 } 3220 3221 template<typename Derived> 3222 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3223 unsigned NumInputs, 3224 bool IsCall, 3225 SmallVectorImpl<Expr *> &Outputs, 3226 bool *ArgChanged) { 3227 for (unsigned I = 0; I != NumInputs; ++I) { 3228 // If requested, drop call arguments that need to be dropped. 3229 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3230 if (ArgChanged) 3231 *ArgChanged = true; 3232 3233 break; 3234 } 3235 3236 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3237 Expr *Pattern = Expansion->getPattern(); 3238 3239 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3240 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3241 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3242 3243 // Determine whether the set of unexpanded parameter packs can and should 3244 // be expanded. 3245 bool Expand = true; 3246 bool RetainExpansion = false; 3247 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3248 Optional<unsigned> NumExpansions = OrigNumExpansions; 3249 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3250 Pattern->getSourceRange(), 3251 Unexpanded, 3252 Expand, RetainExpansion, 3253 NumExpansions)) 3254 return true; 3255 3256 if (!Expand) { 3257 // The transform has determined that we should perform a simple 3258 // transformation on the pack expansion, producing another pack 3259 // expansion. 3260 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3261 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3262 if (OutPattern.isInvalid()) 3263 return true; 3264 3265 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3266 Expansion->getEllipsisLoc(), 3267 NumExpansions); 3268 if (Out.isInvalid()) 3269 return true; 3270 3271 if (ArgChanged) 3272 *ArgChanged = true; 3273 Outputs.push_back(Out.get()); 3274 continue; 3275 } 3276 3277 // Record right away that the argument was changed. This needs 3278 // to happen even if the array expands to nothing. 3279 if (ArgChanged) *ArgChanged = true; 3280 3281 // The transform has determined that we should perform an elementwise 3282 // expansion of the pattern. Do so. 3283 for (unsigned I = 0; I != *NumExpansions; ++I) { 3284 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3285 ExprResult Out = getDerived().TransformExpr(Pattern); 3286 if (Out.isInvalid()) 3287 return true; 3288 3289 // FIXME: Can this happen? We should not try to expand the pack 3290 // in this case. 3291 if (Out.get()->containsUnexpandedParameterPack()) { 3292 Out = getDerived().RebuildPackExpansion( 3293 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3294 if (Out.isInvalid()) 3295 return true; 3296 } 3297 3298 Outputs.push_back(Out.get()); 3299 } 3300 3301 // If we're supposed to retain a pack expansion, do so by temporarily 3302 // forgetting the partially-substituted parameter pack. 3303 if (RetainExpansion) { 3304 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3305 3306 ExprResult Out = getDerived().TransformExpr(Pattern); 3307 if (Out.isInvalid()) 3308 return true; 3309 3310 Out = getDerived().RebuildPackExpansion( 3311 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3312 if (Out.isInvalid()) 3313 return true; 3314 3315 Outputs.push_back(Out.get()); 3316 } 3317 3318 continue; 3319 } 3320 3321 ExprResult Result = 3322 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3323 : getDerived().TransformExpr(Inputs[I]); 3324 if (Result.isInvalid()) 3325 return true; 3326 3327 if (Result.get() != Inputs[I] && ArgChanged) 3328 *ArgChanged = true; 3329 3330 Outputs.push_back(Result.get()); 3331 } 3332 3333 return false; 3334 } 3335 3336 template<typename Derived> 3337 NestedNameSpecifierLoc 3338 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3339 NestedNameSpecifierLoc NNS, 3340 QualType ObjectType, 3341 NamedDecl *FirstQualifierInScope) { 3342 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3343 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3344 Qualifier = Qualifier.getPrefix()) 3345 Qualifiers.push_back(Qualifier); 3346 3347 CXXScopeSpec SS; 3348 while (!Qualifiers.empty()) { 3349 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3350 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3351 3352 switch (QNNS->getKind()) { 3353 case NestedNameSpecifier::Identifier: 3354 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, 3355 *QNNS->getAsIdentifier(), 3356 Q.getLocalBeginLoc(), 3357 Q.getLocalEndLoc(), 3358 ObjectType, false, SS, 3359 FirstQualifierInScope, false)) 3360 return NestedNameSpecifierLoc(); 3361 3362 break; 3363 3364 case NestedNameSpecifier::Namespace: { 3365 NamespaceDecl *NS 3366 = cast_or_null<NamespaceDecl>( 3367 getDerived().TransformDecl( 3368 Q.getLocalBeginLoc(), 3369 QNNS->getAsNamespace())); 3370 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3371 break; 3372 } 3373 3374 case NestedNameSpecifier::NamespaceAlias: { 3375 NamespaceAliasDecl *Alias 3376 = cast_or_null<NamespaceAliasDecl>( 3377 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3378 QNNS->getAsNamespaceAlias())); 3379 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3380 Q.getLocalEndLoc()); 3381 break; 3382 } 3383 3384 case NestedNameSpecifier::Global: 3385 // There is no meaningful transformation that one could perform on the 3386 // global scope. 3387 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3388 break; 3389 3390 case NestedNameSpecifier::Super: { 3391 CXXRecordDecl *RD = 3392 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3393 SourceLocation(), QNNS->getAsRecordDecl())); 3394 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3395 break; 3396 } 3397 3398 case NestedNameSpecifier::TypeSpecWithTemplate: 3399 case NestedNameSpecifier::TypeSpec: { 3400 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3401 FirstQualifierInScope, SS); 3402 3403 if (!TL) 3404 return NestedNameSpecifierLoc(); 3405 3406 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3407 (SemaRef.getLangOpts().CPlusPlus11 && 3408 TL.getType()->isEnumeralType())) { 3409 assert(!TL.getType().hasLocalQualifiers() && 3410 "Can't get cv-qualifiers here"); 3411 if (TL.getType()->isEnumeralType()) 3412 SemaRef.Diag(TL.getBeginLoc(), 3413 diag::warn_cxx98_compat_enum_nested_name_spec); 3414 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3415 Q.getLocalEndLoc()); 3416 break; 3417 } 3418 // If the nested-name-specifier is an invalid type def, don't emit an 3419 // error because a previous error should have already been emitted. 3420 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3421 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3422 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3423 << TL.getType() << SS.getRange(); 3424 } 3425 return NestedNameSpecifierLoc(); 3426 } 3427 } 3428 3429 // The qualifier-in-scope and object type only apply to the leftmost entity. 3430 FirstQualifierInScope = nullptr; 3431 ObjectType = QualType(); 3432 } 3433 3434 // Don't rebuild the nested-name-specifier if we don't have to. 3435 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3436 !getDerived().AlwaysRebuild()) 3437 return NNS; 3438 3439 // If we can re-use the source-location data from the original 3440 // nested-name-specifier, do so. 3441 if (SS.location_size() == NNS.getDataLength() && 3442 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3443 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3444 3445 // Allocate new nested-name-specifier location information. 3446 return SS.getWithLocInContext(SemaRef.Context); 3447 } 3448 3449 template<typename Derived> 3450 DeclarationNameInfo 3451 TreeTransform<Derived> 3452 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3453 DeclarationName Name = NameInfo.getName(); 3454 if (!Name) 3455 return DeclarationNameInfo(); 3456 3457 switch (Name.getNameKind()) { 3458 case DeclarationName::Identifier: 3459 case DeclarationName::ObjCZeroArgSelector: 3460 case DeclarationName::ObjCOneArgSelector: 3461 case DeclarationName::ObjCMultiArgSelector: 3462 case DeclarationName::CXXOperatorName: 3463 case DeclarationName::CXXLiteralOperatorName: 3464 case DeclarationName::CXXUsingDirective: 3465 return NameInfo; 3466 3467 case DeclarationName::CXXConstructorName: 3468 case DeclarationName::CXXDestructorName: 3469 case DeclarationName::CXXConversionFunctionName: { 3470 TypeSourceInfo *NewTInfo; 3471 CanQualType NewCanTy; 3472 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3473 NewTInfo = getDerived().TransformType(OldTInfo); 3474 if (!NewTInfo) 3475 return DeclarationNameInfo(); 3476 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3477 } 3478 else { 3479 NewTInfo = nullptr; 3480 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3481 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3482 if (NewT.isNull()) 3483 return DeclarationNameInfo(); 3484 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3485 } 3486 3487 DeclarationName NewName 3488 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3489 NewCanTy); 3490 DeclarationNameInfo NewNameInfo(NameInfo); 3491 NewNameInfo.setName(NewName); 3492 NewNameInfo.setNamedTypeInfo(NewTInfo); 3493 return NewNameInfo; 3494 } 3495 } 3496 3497 llvm_unreachable("Unknown name kind."); 3498 } 3499 3500 template<typename Derived> 3501 TemplateName 3502 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3503 TemplateName Name, 3504 SourceLocation NameLoc, 3505 QualType ObjectType, 3506 NamedDecl *FirstQualifierInScope) { 3507 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3508 TemplateDecl *Template = QTN->getTemplateDecl(); 3509 assert(Template && "qualified template name must refer to a template"); 3510 3511 TemplateDecl *TransTemplate 3512 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3513 Template)); 3514 if (!TransTemplate) 3515 return TemplateName(); 3516 3517 if (!getDerived().AlwaysRebuild() && 3518 SS.getScopeRep() == QTN->getQualifier() && 3519 TransTemplate == Template) 3520 return Name; 3521 3522 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3523 TransTemplate); 3524 } 3525 3526 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3527 if (SS.getScopeRep()) { 3528 // These apply to the scope specifier, not the template. 3529 ObjectType = QualType(); 3530 FirstQualifierInScope = nullptr; 3531 } 3532 3533 if (!getDerived().AlwaysRebuild() && 3534 SS.getScopeRep() == DTN->getQualifier() && 3535 ObjectType.isNull()) 3536 return Name; 3537 3538 if (DTN->isIdentifier()) { 3539 return getDerived().RebuildTemplateName(SS, 3540 *DTN->getIdentifier(), 3541 NameLoc, 3542 ObjectType, 3543 FirstQualifierInScope); 3544 } 3545 3546 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 3547 ObjectType); 3548 } 3549 3550 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3551 TemplateDecl *TransTemplate 3552 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3553 Template)); 3554 if (!TransTemplate) 3555 return TemplateName(); 3556 3557 if (!getDerived().AlwaysRebuild() && 3558 TransTemplate == Template) 3559 return Name; 3560 3561 return TemplateName(TransTemplate); 3562 } 3563 3564 if (SubstTemplateTemplateParmPackStorage *SubstPack 3565 = Name.getAsSubstTemplateTemplateParmPack()) { 3566 TemplateTemplateParmDecl *TransParam 3567 = cast_or_null<TemplateTemplateParmDecl>( 3568 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3569 if (!TransParam) 3570 return TemplateName(); 3571 3572 if (!getDerived().AlwaysRebuild() && 3573 TransParam == SubstPack->getParameterPack()) 3574 return Name; 3575 3576 return getDerived().RebuildTemplateName(TransParam, 3577 SubstPack->getArgumentPack()); 3578 } 3579 3580 // These should be getting filtered out before they reach the AST. 3581 llvm_unreachable("overloaded function decl survived to here"); 3582 } 3583 3584 template<typename Derived> 3585 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3586 const TemplateArgument &Arg, 3587 TemplateArgumentLoc &Output) { 3588 SourceLocation Loc = getDerived().getBaseLocation(); 3589 switch (Arg.getKind()) { 3590 case TemplateArgument::Null: 3591 llvm_unreachable("null template argument in TreeTransform"); 3592 break; 3593 3594 case TemplateArgument::Type: 3595 Output = TemplateArgumentLoc(Arg, 3596 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3597 3598 break; 3599 3600 case TemplateArgument::Template: 3601 case TemplateArgument::TemplateExpansion: { 3602 NestedNameSpecifierLocBuilder Builder; 3603 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3604 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3605 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3606 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3607 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3608 3609 if (Arg.getKind() == TemplateArgument::Template) 3610 Output = TemplateArgumentLoc(Arg, 3611 Builder.getWithLocInContext(SemaRef.Context), 3612 Loc); 3613 else 3614 Output = TemplateArgumentLoc(Arg, 3615 Builder.getWithLocInContext(SemaRef.Context), 3616 Loc, Loc); 3617 3618 break; 3619 } 3620 3621 case TemplateArgument::Expression: 3622 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3623 break; 3624 3625 case TemplateArgument::Declaration: 3626 case TemplateArgument::Integral: 3627 case TemplateArgument::Pack: 3628 case TemplateArgument::NullPtr: 3629 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3630 break; 3631 } 3632 } 3633 3634 template<typename Derived> 3635 bool TreeTransform<Derived>::TransformTemplateArgument( 3636 const TemplateArgumentLoc &Input, 3637 TemplateArgumentLoc &Output, bool Uneval) { 3638 const TemplateArgument &Arg = Input.getArgument(); 3639 switch (Arg.getKind()) { 3640 case TemplateArgument::Null: 3641 case TemplateArgument::Integral: 3642 case TemplateArgument::Pack: 3643 case TemplateArgument::Declaration: 3644 case TemplateArgument::NullPtr: 3645 llvm_unreachable("Unexpected TemplateArgument"); 3646 3647 case TemplateArgument::Type: { 3648 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3649 if (!DI) 3650 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3651 3652 DI = getDerived().TransformType(DI); 3653 if (!DI) return true; 3654 3655 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3656 return false; 3657 } 3658 3659 case TemplateArgument::Template: { 3660 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3661 if (QualifierLoc) { 3662 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3663 if (!QualifierLoc) 3664 return true; 3665 } 3666 3667 CXXScopeSpec SS; 3668 SS.Adopt(QualifierLoc); 3669 TemplateName Template 3670 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3671 Input.getTemplateNameLoc()); 3672 if (Template.isNull()) 3673 return true; 3674 3675 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3676 Input.getTemplateNameLoc()); 3677 return false; 3678 } 3679 3680 case TemplateArgument::TemplateExpansion: 3681 llvm_unreachable("Caller should expand pack expansions"); 3682 3683 case TemplateArgument::Expression: { 3684 // Template argument expressions are constant expressions. 3685 EnterExpressionEvaluationContext Unevaluated( 3686 getSema(), Uneval ? Sema::Unevaluated : Sema::ConstantEvaluated); 3687 3688 Expr *InputExpr = Input.getSourceExpression(); 3689 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3690 3691 ExprResult E = getDerived().TransformExpr(InputExpr); 3692 E = SemaRef.ActOnConstantExpression(E); 3693 if (E.isInvalid()) return true; 3694 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3695 return false; 3696 } 3697 } 3698 3699 // Work around bogus GCC warning 3700 return true; 3701 } 3702 3703 /// \brief Iterator adaptor that invents template argument location information 3704 /// for each of the template arguments in its underlying iterator. 3705 template<typename Derived, typename InputIterator> 3706 class TemplateArgumentLocInventIterator { 3707 TreeTransform<Derived> &Self; 3708 InputIterator Iter; 3709 3710 public: 3711 typedef TemplateArgumentLoc value_type; 3712 typedef TemplateArgumentLoc reference; 3713 typedef typename std::iterator_traits<InputIterator>::difference_type 3714 difference_type; 3715 typedef std::input_iterator_tag iterator_category; 3716 3717 class pointer { 3718 TemplateArgumentLoc Arg; 3719 3720 public: 3721 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3722 3723 const TemplateArgumentLoc *operator->() const { return &Arg; } 3724 }; 3725 3726 TemplateArgumentLocInventIterator() { } 3727 3728 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3729 InputIterator Iter) 3730 : Self(Self), Iter(Iter) { } 3731 3732 TemplateArgumentLocInventIterator &operator++() { 3733 ++Iter; 3734 return *this; 3735 } 3736 3737 TemplateArgumentLocInventIterator operator++(int) { 3738 TemplateArgumentLocInventIterator Old(*this); 3739 ++(*this); 3740 return Old; 3741 } 3742 3743 reference operator*() const { 3744 TemplateArgumentLoc Result; 3745 Self.InventTemplateArgumentLoc(*Iter, Result); 3746 return Result; 3747 } 3748 3749 pointer operator->() const { return pointer(**this); } 3750 3751 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3752 const TemplateArgumentLocInventIterator &Y) { 3753 return X.Iter == Y.Iter; 3754 } 3755 3756 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3757 const TemplateArgumentLocInventIterator &Y) { 3758 return X.Iter != Y.Iter; 3759 } 3760 }; 3761 3762 template<typename Derived> 3763 template<typename InputIterator> 3764 bool TreeTransform<Derived>::TransformTemplateArguments( 3765 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 3766 bool Uneval) { 3767 for (; First != Last; ++First) { 3768 TemplateArgumentLoc Out; 3769 TemplateArgumentLoc In = *First; 3770 3771 if (In.getArgument().getKind() == TemplateArgument::Pack) { 3772 // Unpack argument packs, which we translate them into separate 3773 // arguments. 3774 // FIXME: We could do much better if we could guarantee that the 3775 // TemplateArgumentLocInfo for the pack expansion would be usable for 3776 // all of the template arguments in the argument pack. 3777 typedef TemplateArgumentLocInventIterator<Derived, 3778 TemplateArgument::pack_iterator> 3779 PackLocIterator; 3780 if (TransformTemplateArguments(PackLocIterator(*this, 3781 In.getArgument().pack_begin()), 3782 PackLocIterator(*this, 3783 In.getArgument().pack_end()), 3784 Outputs, Uneval)) 3785 return true; 3786 3787 continue; 3788 } 3789 3790 if (In.getArgument().isPackExpansion()) { 3791 // We have a pack expansion, for which we will be substituting into 3792 // the pattern. 3793 SourceLocation Ellipsis; 3794 Optional<unsigned> OrigNumExpansions; 3795 TemplateArgumentLoc Pattern 3796 = getSema().getTemplateArgumentPackExpansionPattern( 3797 In, Ellipsis, OrigNumExpansions); 3798 3799 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3800 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3801 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3802 3803 // Determine whether the set of unexpanded parameter packs can and should 3804 // be expanded. 3805 bool Expand = true; 3806 bool RetainExpansion = false; 3807 Optional<unsigned> NumExpansions = OrigNumExpansions; 3808 if (getDerived().TryExpandParameterPacks(Ellipsis, 3809 Pattern.getSourceRange(), 3810 Unexpanded, 3811 Expand, 3812 RetainExpansion, 3813 NumExpansions)) 3814 return true; 3815 3816 if (!Expand) { 3817 // The transform has determined that we should perform a simple 3818 // transformation on the pack expansion, producing another pack 3819 // expansion. 3820 TemplateArgumentLoc OutPattern; 3821 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3822 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 3823 return true; 3824 3825 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 3826 NumExpansions); 3827 if (Out.getArgument().isNull()) 3828 return true; 3829 3830 Outputs.addArgument(Out); 3831 continue; 3832 } 3833 3834 // The transform has determined that we should perform an elementwise 3835 // expansion of the pattern. Do so. 3836 for (unsigned I = 0; I != *NumExpansions; ++I) { 3837 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3838 3839 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 3840 return true; 3841 3842 if (Out.getArgument().containsUnexpandedParameterPack()) { 3843 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3844 OrigNumExpansions); 3845 if (Out.getArgument().isNull()) 3846 return true; 3847 } 3848 3849 Outputs.addArgument(Out); 3850 } 3851 3852 // If we're supposed to retain a pack expansion, do so by temporarily 3853 // forgetting the partially-substituted parameter pack. 3854 if (RetainExpansion) { 3855 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3856 3857 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 3858 return true; 3859 3860 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3861 OrigNumExpansions); 3862 if (Out.getArgument().isNull()) 3863 return true; 3864 3865 Outputs.addArgument(Out); 3866 } 3867 3868 continue; 3869 } 3870 3871 // The simple case: 3872 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 3873 return true; 3874 3875 Outputs.addArgument(Out); 3876 } 3877 3878 return false; 3879 3880 } 3881 3882 //===----------------------------------------------------------------------===// 3883 // Type transformation 3884 //===----------------------------------------------------------------------===// 3885 3886 template<typename Derived> 3887 QualType TreeTransform<Derived>::TransformType(QualType T) { 3888 if (getDerived().AlreadyTransformed(T)) 3889 return T; 3890 3891 // Temporary workaround. All of these transformations should 3892 // eventually turn into transformations on TypeLocs. 3893 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 3894 getDerived().getBaseLocation()); 3895 3896 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 3897 3898 if (!NewDI) 3899 return QualType(); 3900 3901 return NewDI->getType(); 3902 } 3903 3904 template<typename Derived> 3905 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 3906 // Refine the base location to the type's location. 3907 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 3908 getDerived().getBaseEntity()); 3909 if (getDerived().AlreadyTransformed(DI->getType())) 3910 return DI; 3911 3912 TypeLocBuilder TLB; 3913 3914 TypeLoc TL = DI->getTypeLoc(); 3915 TLB.reserve(TL.getFullDataSize()); 3916 3917 QualType Result = getDerived().TransformType(TLB, TL); 3918 if (Result.isNull()) 3919 return nullptr; 3920 3921 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3922 } 3923 3924 template<typename Derived> 3925 QualType 3926 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 3927 switch (T.getTypeLocClass()) { 3928 #define ABSTRACT_TYPELOC(CLASS, PARENT) 3929 #define TYPELOC(CLASS, PARENT) \ 3930 case TypeLoc::CLASS: \ 3931 return getDerived().Transform##CLASS##Type(TLB, \ 3932 T.castAs<CLASS##TypeLoc>()); 3933 #include "clang/AST/TypeLocNodes.def" 3934 } 3935 3936 llvm_unreachable("unhandled type loc!"); 3937 } 3938 3939 /// FIXME: By default, this routine adds type qualifiers only to types 3940 /// that can have qualifiers, and silently suppresses those qualifiers 3941 /// that are not permitted (e.g., qualifiers on reference or function 3942 /// types). This is the right thing for template instantiation, but 3943 /// probably not for other clients. 3944 template<typename Derived> 3945 QualType 3946 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 3947 QualifiedTypeLoc T) { 3948 Qualifiers Quals = T.getType().getLocalQualifiers(); 3949 3950 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 3951 if (Result.isNull()) 3952 return QualType(); 3953 3954 // Silently suppress qualifiers if the result type can't be qualified. 3955 // FIXME: this is the right thing for template instantiation, but 3956 // probably not for other clients. 3957 if (Result->isFunctionType() || Result->isReferenceType()) 3958 return Result; 3959 3960 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 3961 // resulting type. 3962 if (Quals.hasObjCLifetime()) { 3963 if (!Result->isObjCLifetimeType() && !Result->isDependentType()) 3964 Quals.removeObjCLifetime(); 3965 else if (Result.getObjCLifetime()) { 3966 // Objective-C ARC: 3967 // A lifetime qualifier applied to a substituted template parameter 3968 // overrides the lifetime qualifier from the template argument. 3969 const AutoType *AutoTy; 3970 if (const SubstTemplateTypeParmType *SubstTypeParam 3971 = dyn_cast<SubstTemplateTypeParmType>(Result)) { 3972 QualType Replacement = SubstTypeParam->getReplacementType(); 3973 Qualifiers Qs = Replacement.getQualifiers(); 3974 Qs.removeObjCLifetime(); 3975 Replacement 3976 = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), 3977 Qs); 3978 Result = SemaRef.Context.getSubstTemplateTypeParmType( 3979 SubstTypeParam->getReplacedParameter(), 3980 Replacement); 3981 TLB.TypeWasModifiedSafely(Result); 3982 } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) { 3983 // 'auto' types behave the same way as template parameters. 3984 QualType Deduced = AutoTy->getDeducedType(); 3985 Qualifiers Qs = Deduced.getQualifiers(); 3986 Qs.removeObjCLifetime(); 3987 Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), 3988 Qs); 3989 Result = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 3990 AutoTy->isDependentType()); 3991 TLB.TypeWasModifiedSafely(Result); 3992 } else { 3993 // Otherwise, complain about the addition of a qualifier to an 3994 // already-qualified type. 3995 SourceRange R = T.getUnqualifiedLoc().getSourceRange(); 3996 SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant) 3997 << Result << R; 3998 3999 Quals.removeObjCLifetime(); 4000 } 4001 } 4002 } 4003 if (!Quals.empty()) { 4004 Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); 4005 // BuildQualifiedType might not add qualifiers if they are invalid. 4006 if (Result.hasLocalQualifiers()) 4007 TLB.push<QualifiedTypeLoc>(Result); 4008 // No location information to preserve. 4009 } 4010 4011 return Result; 4012 } 4013 4014 template<typename Derived> 4015 TypeLoc 4016 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4017 QualType ObjectType, 4018 NamedDecl *UnqualLookup, 4019 CXXScopeSpec &SS) { 4020 if (getDerived().AlreadyTransformed(TL.getType())) 4021 return TL; 4022 4023 TypeSourceInfo *TSI = 4024 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4025 if (TSI) 4026 return TSI->getTypeLoc(); 4027 return TypeLoc(); 4028 } 4029 4030 template<typename Derived> 4031 TypeSourceInfo * 4032 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4033 QualType ObjectType, 4034 NamedDecl *UnqualLookup, 4035 CXXScopeSpec &SS) { 4036 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4037 return TSInfo; 4038 4039 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4040 UnqualLookup, SS); 4041 } 4042 4043 template <typename Derived> 4044 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4045 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4046 CXXScopeSpec &SS) { 4047 QualType T = TL.getType(); 4048 assert(!getDerived().AlreadyTransformed(T)); 4049 4050 TypeLocBuilder TLB; 4051 QualType Result; 4052 4053 if (isa<TemplateSpecializationType>(T)) { 4054 TemplateSpecializationTypeLoc SpecTL = 4055 TL.castAs<TemplateSpecializationTypeLoc>(); 4056 4057 TemplateName Template 4058 = getDerived().TransformTemplateName(SS, 4059 SpecTL.getTypePtr()->getTemplateName(), 4060 SpecTL.getTemplateNameLoc(), 4061 ObjectType, UnqualLookup); 4062 if (Template.isNull()) 4063 return nullptr; 4064 4065 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4066 Template); 4067 } else if (isa<DependentTemplateSpecializationType>(T)) { 4068 DependentTemplateSpecializationTypeLoc SpecTL = 4069 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4070 4071 TemplateName Template 4072 = getDerived().RebuildTemplateName(SS, 4073 *SpecTL.getTypePtr()->getIdentifier(), 4074 SpecTL.getTemplateNameLoc(), 4075 ObjectType, UnqualLookup); 4076 if (Template.isNull()) 4077 return nullptr; 4078 4079 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4080 SpecTL, 4081 Template, 4082 SS); 4083 } else { 4084 // Nothing special needs to be done for these. 4085 Result = getDerived().TransformType(TLB, TL); 4086 } 4087 4088 if (Result.isNull()) 4089 return nullptr; 4090 4091 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4092 } 4093 4094 template <class TyLoc> static inline 4095 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4096 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4097 NewT.setNameLoc(T.getNameLoc()); 4098 return T.getType(); 4099 } 4100 4101 template<typename Derived> 4102 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4103 BuiltinTypeLoc T) { 4104 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4105 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4106 if (T.needsExtraLocalData()) 4107 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4108 return T.getType(); 4109 } 4110 4111 template<typename Derived> 4112 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4113 ComplexTypeLoc T) { 4114 // FIXME: recurse? 4115 return TransformTypeSpecType(TLB, T); 4116 } 4117 4118 template <typename Derived> 4119 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4120 AdjustedTypeLoc TL) { 4121 // Adjustments applied during transformation are handled elsewhere. 4122 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4123 } 4124 4125 template<typename Derived> 4126 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4127 DecayedTypeLoc TL) { 4128 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4129 if (OriginalType.isNull()) 4130 return QualType(); 4131 4132 QualType Result = TL.getType(); 4133 if (getDerived().AlwaysRebuild() || 4134 OriginalType != TL.getOriginalLoc().getType()) 4135 Result = SemaRef.Context.getDecayedType(OriginalType); 4136 TLB.push<DecayedTypeLoc>(Result); 4137 // Nothing to set for DecayedTypeLoc. 4138 return Result; 4139 } 4140 4141 template<typename Derived> 4142 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4143 PointerTypeLoc TL) { 4144 QualType PointeeType 4145 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4146 if (PointeeType.isNull()) 4147 return QualType(); 4148 4149 QualType Result = TL.getType(); 4150 if (PointeeType->getAs<ObjCObjectType>()) { 4151 // A dependent pointer type 'T *' has is being transformed such 4152 // that an Objective-C class type is being replaced for 'T'. The 4153 // resulting pointer type is an ObjCObjectPointerType, not a 4154 // PointerType. 4155 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4156 4157 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4158 NewT.setStarLoc(TL.getStarLoc()); 4159 return Result; 4160 } 4161 4162 if (getDerived().AlwaysRebuild() || 4163 PointeeType != TL.getPointeeLoc().getType()) { 4164 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4165 if (Result.isNull()) 4166 return QualType(); 4167 } 4168 4169 // Objective-C ARC can add lifetime qualifiers to the type that we're 4170 // pointing to. 4171 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4172 4173 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4174 NewT.setSigilLoc(TL.getSigilLoc()); 4175 return Result; 4176 } 4177 4178 template<typename Derived> 4179 QualType 4180 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4181 BlockPointerTypeLoc TL) { 4182 QualType PointeeType 4183 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4184 if (PointeeType.isNull()) 4185 return QualType(); 4186 4187 QualType Result = TL.getType(); 4188 if (getDerived().AlwaysRebuild() || 4189 PointeeType != TL.getPointeeLoc().getType()) { 4190 Result = getDerived().RebuildBlockPointerType(PointeeType, 4191 TL.getSigilLoc()); 4192 if (Result.isNull()) 4193 return QualType(); 4194 } 4195 4196 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4197 NewT.setSigilLoc(TL.getSigilLoc()); 4198 return Result; 4199 } 4200 4201 /// Transforms a reference type. Note that somewhat paradoxically we 4202 /// don't care whether the type itself is an l-value type or an r-value 4203 /// type; we only care if the type was *written* as an l-value type 4204 /// or an r-value type. 4205 template<typename Derived> 4206 QualType 4207 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4208 ReferenceTypeLoc TL) { 4209 const ReferenceType *T = TL.getTypePtr(); 4210 4211 // Note that this works with the pointee-as-written. 4212 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4213 if (PointeeType.isNull()) 4214 return QualType(); 4215 4216 QualType Result = TL.getType(); 4217 if (getDerived().AlwaysRebuild() || 4218 PointeeType != T->getPointeeTypeAsWritten()) { 4219 Result = getDerived().RebuildReferenceType(PointeeType, 4220 T->isSpelledAsLValue(), 4221 TL.getSigilLoc()); 4222 if (Result.isNull()) 4223 return QualType(); 4224 } 4225 4226 // Objective-C ARC can add lifetime qualifiers to the type that we're 4227 // referring to. 4228 TLB.TypeWasModifiedSafely( 4229 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4230 4231 // r-value references can be rebuilt as l-value references. 4232 ReferenceTypeLoc NewTL; 4233 if (isa<LValueReferenceType>(Result)) 4234 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4235 else 4236 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4237 NewTL.setSigilLoc(TL.getSigilLoc()); 4238 4239 return Result; 4240 } 4241 4242 template<typename Derived> 4243 QualType 4244 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4245 LValueReferenceTypeLoc TL) { 4246 return TransformReferenceType(TLB, TL); 4247 } 4248 4249 template<typename Derived> 4250 QualType 4251 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4252 RValueReferenceTypeLoc TL) { 4253 return TransformReferenceType(TLB, TL); 4254 } 4255 4256 template<typename Derived> 4257 QualType 4258 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4259 MemberPointerTypeLoc TL) { 4260 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4261 if (PointeeType.isNull()) 4262 return QualType(); 4263 4264 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4265 TypeSourceInfo *NewClsTInfo = nullptr; 4266 if (OldClsTInfo) { 4267 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4268 if (!NewClsTInfo) 4269 return QualType(); 4270 } 4271 4272 const MemberPointerType *T = TL.getTypePtr(); 4273 QualType OldClsType = QualType(T->getClass(), 0); 4274 QualType NewClsType; 4275 if (NewClsTInfo) 4276 NewClsType = NewClsTInfo->getType(); 4277 else { 4278 NewClsType = getDerived().TransformType(OldClsType); 4279 if (NewClsType.isNull()) 4280 return QualType(); 4281 } 4282 4283 QualType Result = TL.getType(); 4284 if (getDerived().AlwaysRebuild() || 4285 PointeeType != T->getPointeeType() || 4286 NewClsType != OldClsType) { 4287 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4288 TL.getStarLoc()); 4289 if (Result.isNull()) 4290 return QualType(); 4291 } 4292 4293 // If we had to adjust the pointee type when building a member pointer, make 4294 // sure to push TypeLoc info for it. 4295 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4296 if (MPT && PointeeType != MPT->getPointeeType()) { 4297 assert(isa<AdjustedType>(MPT->getPointeeType())); 4298 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4299 } 4300 4301 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4302 NewTL.setSigilLoc(TL.getSigilLoc()); 4303 NewTL.setClassTInfo(NewClsTInfo); 4304 4305 return Result; 4306 } 4307 4308 template<typename Derived> 4309 QualType 4310 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4311 ConstantArrayTypeLoc TL) { 4312 const ConstantArrayType *T = TL.getTypePtr(); 4313 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4314 if (ElementType.isNull()) 4315 return QualType(); 4316 4317 QualType Result = TL.getType(); 4318 if (getDerived().AlwaysRebuild() || 4319 ElementType != T->getElementType()) { 4320 Result = getDerived().RebuildConstantArrayType(ElementType, 4321 T->getSizeModifier(), 4322 T->getSize(), 4323 T->getIndexTypeCVRQualifiers(), 4324 TL.getBracketsRange()); 4325 if (Result.isNull()) 4326 return QualType(); 4327 } 4328 4329 // We might have either a ConstantArrayType or a VariableArrayType now: 4330 // a ConstantArrayType is allowed to have an element type which is a 4331 // VariableArrayType if the type is dependent. Fortunately, all array 4332 // types have the same location layout. 4333 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4334 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4335 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4336 4337 Expr *Size = TL.getSizeExpr(); 4338 if (Size) { 4339 EnterExpressionEvaluationContext Unevaluated(SemaRef, 4340 Sema::ConstantEvaluated); 4341 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4342 Size = SemaRef.ActOnConstantExpression(Size).get(); 4343 } 4344 NewTL.setSizeExpr(Size); 4345 4346 return Result; 4347 } 4348 4349 template<typename Derived> 4350 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4351 TypeLocBuilder &TLB, 4352 IncompleteArrayTypeLoc TL) { 4353 const IncompleteArrayType *T = TL.getTypePtr(); 4354 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4355 if (ElementType.isNull()) 4356 return QualType(); 4357 4358 QualType Result = TL.getType(); 4359 if (getDerived().AlwaysRebuild() || 4360 ElementType != T->getElementType()) { 4361 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4362 T->getSizeModifier(), 4363 T->getIndexTypeCVRQualifiers(), 4364 TL.getBracketsRange()); 4365 if (Result.isNull()) 4366 return QualType(); 4367 } 4368 4369 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4370 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4371 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4372 NewTL.setSizeExpr(nullptr); 4373 4374 return Result; 4375 } 4376 4377 template<typename Derived> 4378 QualType 4379 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4380 VariableArrayTypeLoc TL) { 4381 const VariableArrayType *T = TL.getTypePtr(); 4382 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4383 if (ElementType.isNull()) 4384 return QualType(); 4385 4386 ExprResult SizeResult 4387 = getDerived().TransformExpr(T->getSizeExpr()); 4388 if (SizeResult.isInvalid()) 4389 return QualType(); 4390 4391 Expr *Size = SizeResult.get(); 4392 4393 QualType Result = TL.getType(); 4394 if (getDerived().AlwaysRebuild() || 4395 ElementType != T->getElementType() || 4396 Size != T->getSizeExpr()) { 4397 Result = getDerived().RebuildVariableArrayType(ElementType, 4398 T->getSizeModifier(), 4399 Size, 4400 T->getIndexTypeCVRQualifiers(), 4401 TL.getBracketsRange()); 4402 if (Result.isNull()) 4403 return QualType(); 4404 } 4405 4406 // We might have constant size array now, but fortunately it has the same 4407 // location layout. 4408 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4409 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4410 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4411 NewTL.setSizeExpr(Size); 4412 4413 return Result; 4414 } 4415 4416 template<typename Derived> 4417 QualType 4418 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4419 DependentSizedArrayTypeLoc TL) { 4420 const DependentSizedArrayType *T = TL.getTypePtr(); 4421 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4422 if (ElementType.isNull()) 4423 return QualType(); 4424 4425 // Array bounds are constant expressions. 4426 EnterExpressionEvaluationContext Unevaluated(SemaRef, 4427 Sema::ConstantEvaluated); 4428 4429 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4430 Expr *origSize = TL.getSizeExpr(); 4431 if (!origSize) origSize = T->getSizeExpr(); 4432 4433 ExprResult sizeResult 4434 = getDerived().TransformExpr(origSize); 4435 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4436 if (sizeResult.isInvalid()) 4437 return QualType(); 4438 4439 Expr *size = sizeResult.get(); 4440 4441 QualType Result = TL.getType(); 4442 if (getDerived().AlwaysRebuild() || 4443 ElementType != T->getElementType() || 4444 size != origSize) { 4445 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4446 T->getSizeModifier(), 4447 size, 4448 T->getIndexTypeCVRQualifiers(), 4449 TL.getBracketsRange()); 4450 if (Result.isNull()) 4451 return QualType(); 4452 } 4453 4454 // We might have any sort of array type now, but fortunately they 4455 // all have the same location layout. 4456 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4457 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4458 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4459 NewTL.setSizeExpr(size); 4460 4461 return Result; 4462 } 4463 4464 template<typename Derived> 4465 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4466 TypeLocBuilder &TLB, 4467 DependentSizedExtVectorTypeLoc TL) { 4468 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4469 4470 // FIXME: ext vector locs should be nested 4471 QualType ElementType = getDerived().TransformType(T->getElementType()); 4472 if (ElementType.isNull()) 4473 return QualType(); 4474 4475 // Vector sizes are constant expressions. 4476 EnterExpressionEvaluationContext Unevaluated(SemaRef, 4477 Sema::ConstantEvaluated); 4478 4479 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4480 Size = SemaRef.ActOnConstantExpression(Size); 4481 if (Size.isInvalid()) 4482 return QualType(); 4483 4484 QualType Result = TL.getType(); 4485 if (getDerived().AlwaysRebuild() || 4486 ElementType != T->getElementType() || 4487 Size.get() != T->getSizeExpr()) { 4488 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4489 Size.get(), 4490 T->getAttributeLoc()); 4491 if (Result.isNull()) 4492 return QualType(); 4493 } 4494 4495 // Result might be dependent or not. 4496 if (isa<DependentSizedExtVectorType>(Result)) { 4497 DependentSizedExtVectorTypeLoc NewTL 4498 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4499 NewTL.setNameLoc(TL.getNameLoc()); 4500 } else { 4501 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4502 NewTL.setNameLoc(TL.getNameLoc()); 4503 } 4504 4505 return Result; 4506 } 4507 4508 template<typename Derived> 4509 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4510 VectorTypeLoc TL) { 4511 const VectorType *T = TL.getTypePtr(); 4512 QualType ElementType = getDerived().TransformType(T->getElementType()); 4513 if (ElementType.isNull()) 4514 return QualType(); 4515 4516 QualType Result = TL.getType(); 4517 if (getDerived().AlwaysRebuild() || 4518 ElementType != T->getElementType()) { 4519 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4520 T->getVectorKind()); 4521 if (Result.isNull()) 4522 return QualType(); 4523 } 4524 4525 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4526 NewTL.setNameLoc(TL.getNameLoc()); 4527 4528 return Result; 4529 } 4530 4531 template<typename Derived> 4532 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4533 ExtVectorTypeLoc TL) { 4534 const VectorType *T = TL.getTypePtr(); 4535 QualType ElementType = getDerived().TransformType(T->getElementType()); 4536 if (ElementType.isNull()) 4537 return QualType(); 4538 4539 QualType Result = TL.getType(); 4540 if (getDerived().AlwaysRebuild() || 4541 ElementType != T->getElementType()) { 4542 Result = getDerived().RebuildExtVectorType(ElementType, 4543 T->getNumElements(), 4544 /*FIXME*/ SourceLocation()); 4545 if (Result.isNull()) 4546 return QualType(); 4547 } 4548 4549 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4550 NewTL.setNameLoc(TL.getNameLoc()); 4551 4552 return Result; 4553 } 4554 4555 template <typename Derived> 4556 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4557 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4558 bool ExpectParameterPack) { 4559 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4560 TypeSourceInfo *NewDI = nullptr; 4561 4562 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4563 // If we're substituting into a pack expansion type and we know the 4564 // length we want to expand to, just substitute for the pattern. 4565 TypeLoc OldTL = OldDI->getTypeLoc(); 4566 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4567 4568 TypeLocBuilder TLB; 4569 TypeLoc NewTL = OldDI->getTypeLoc(); 4570 TLB.reserve(NewTL.getFullDataSize()); 4571 4572 QualType Result = getDerived().TransformType(TLB, 4573 OldExpansionTL.getPatternLoc()); 4574 if (Result.isNull()) 4575 return nullptr; 4576 4577 Result = RebuildPackExpansionType(Result, 4578 OldExpansionTL.getPatternLoc().getSourceRange(), 4579 OldExpansionTL.getEllipsisLoc(), 4580 NumExpansions); 4581 if (Result.isNull()) 4582 return nullptr; 4583 4584 PackExpansionTypeLoc NewExpansionTL 4585 = TLB.push<PackExpansionTypeLoc>(Result); 4586 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4587 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4588 } else 4589 NewDI = getDerived().TransformType(OldDI); 4590 if (!NewDI) 4591 return nullptr; 4592 4593 if (NewDI == OldDI && indexAdjustment == 0) 4594 return OldParm; 4595 4596 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4597 OldParm->getDeclContext(), 4598 OldParm->getInnerLocStart(), 4599 OldParm->getLocation(), 4600 OldParm->getIdentifier(), 4601 NewDI->getType(), 4602 NewDI, 4603 OldParm->getStorageClass(), 4604 /* DefArg */ nullptr); 4605 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4606 OldParm->getFunctionScopeIndex() + indexAdjustment); 4607 return newParm; 4608 } 4609 4610 template<typename Derived> 4611 bool TreeTransform<Derived>:: 4612 TransformFunctionTypeParams(SourceLocation Loc, 4613 ParmVarDecl **Params, unsigned NumParams, 4614 const QualType *ParamTypes, 4615 const FunctionProtoType::ExtParameterInfo *ParamInfos, 4616 SmallVectorImpl<QualType> &OutParamTypes, 4617 SmallVectorImpl<ParmVarDecl*> *PVars, 4618 Sema::ExtParameterInfoBuilder &PInfos) { 4619 int indexAdjustment = 0; 4620 4621 for (unsigned i = 0; i != NumParams; ++i) { 4622 if (ParmVarDecl *OldParm = Params[i]) { 4623 assert(OldParm->getFunctionScopeIndex() == i); 4624 4625 Optional<unsigned> NumExpansions; 4626 ParmVarDecl *NewParm = nullptr; 4627 if (OldParm->isParameterPack()) { 4628 // We have a function parameter pack that may need to be expanded. 4629 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4630 4631 // Find the parameter packs that could be expanded. 4632 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 4633 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 4634 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 4635 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 4636 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 4637 4638 // Determine whether we should expand the parameter packs. 4639 bool ShouldExpand = false; 4640 bool RetainExpansion = false; 4641 Optional<unsigned> OrigNumExpansions = 4642 ExpansionTL.getTypePtr()->getNumExpansions(); 4643 NumExpansions = OrigNumExpansions; 4644 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 4645 Pattern.getSourceRange(), 4646 Unexpanded, 4647 ShouldExpand, 4648 RetainExpansion, 4649 NumExpansions)) { 4650 return true; 4651 } 4652 4653 if (ShouldExpand) { 4654 // Expand the function parameter pack into multiple, separate 4655 // parameters. 4656 getDerived().ExpandingFunctionParameterPack(OldParm); 4657 for (unsigned I = 0; I != *NumExpansions; ++I) { 4658 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4659 ParmVarDecl *NewParm 4660 = getDerived().TransformFunctionTypeParam(OldParm, 4661 indexAdjustment++, 4662 OrigNumExpansions, 4663 /*ExpectParameterPack=*/false); 4664 if (!NewParm) 4665 return true; 4666 4667 if (ParamInfos) 4668 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4669 OutParamTypes.push_back(NewParm->getType()); 4670 if (PVars) 4671 PVars->push_back(NewParm); 4672 } 4673 4674 // If we're supposed to retain a pack expansion, do so by temporarily 4675 // forgetting the partially-substituted parameter pack. 4676 if (RetainExpansion) { 4677 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4678 ParmVarDecl *NewParm 4679 = getDerived().TransformFunctionTypeParam(OldParm, 4680 indexAdjustment++, 4681 OrigNumExpansions, 4682 /*ExpectParameterPack=*/false); 4683 if (!NewParm) 4684 return true; 4685 4686 if (ParamInfos) 4687 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4688 OutParamTypes.push_back(NewParm->getType()); 4689 if (PVars) 4690 PVars->push_back(NewParm); 4691 } 4692 4693 // The next parameter should have the same adjustment as the 4694 // last thing we pushed, but we post-incremented indexAdjustment 4695 // on every push. Also, if we push nothing, the adjustment should 4696 // go down by one. 4697 indexAdjustment--; 4698 4699 // We're done with the pack expansion. 4700 continue; 4701 } 4702 4703 // We'll substitute the parameter now without expanding the pack 4704 // expansion. 4705 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4706 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 4707 indexAdjustment, 4708 NumExpansions, 4709 /*ExpectParameterPack=*/true); 4710 } else { 4711 NewParm = getDerived().TransformFunctionTypeParam( 4712 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 4713 } 4714 4715 if (!NewParm) 4716 return true; 4717 4718 if (ParamInfos) 4719 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4720 OutParamTypes.push_back(NewParm->getType()); 4721 if (PVars) 4722 PVars->push_back(NewParm); 4723 continue; 4724 } 4725 4726 // Deal with the possibility that we don't have a parameter 4727 // declaration for this parameter. 4728 QualType OldType = ParamTypes[i]; 4729 bool IsPackExpansion = false; 4730 Optional<unsigned> NumExpansions; 4731 QualType NewType; 4732 if (const PackExpansionType *Expansion 4733 = dyn_cast<PackExpansionType>(OldType)) { 4734 // We have a function parameter pack that may need to be expanded. 4735 QualType Pattern = Expansion->getPattern(); 4736 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4737 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4738 4739 // Determine whether we should expand the parameter packs. 4740 bool ShouldExpand = false; 4741 bool RetainExpansion = false; 4742 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 4743 Unexpanded, 4744 ShouldExpand, 4745 RetainExpansion, 4746 NumExpansions)) { 4747 return true; 4748 } 4749 4750 if (ShouldExpand) { 4751 // Expand the function parameter pack into multiple, separate 4752 // parameters. 4753 for (unsigned I = 0; I != *NumExpansions; ++I) { 4754 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4755 QualType NewType = getDerived().TransformType(Pattern); 4756 if (NewType.isNull()) 4757 return true; 4758 4759 if (ParamInfos) 4760 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4761 OutParamTypes.push_back(NewType); 4762 if (PVars) 4763 PVars->push_back(nullptr); 4764 } 4765 4766 // We're done with the pack expansion. 4767 continue; 4768 } 4769 4770 // If we're supposed to retain a pack expansion, do so by temporarily 4771 // forgetting the partially-substituted parameter pack. 4772 if (RetainExpansion) { 4773 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4774 QualType NewType = getDerived().TransformType(Pattern); 4775 if (NewType.isNull()) 4776 return true; 4777 4778 if (ParamInfos) 4779 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4780 OutParamTypes.push_back(NewType); 4781 if (PVars) 4782 PVars->push_back(nullptr); 4783 } 4784 4785 // We'll substitute the parameter now without expanding the pack 4786 // expansion. 4787 OldType = Expansion->getPattern(); 4788 IsPackExpansion = true; 4789 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4790 NewType = getDerived().TransformType(OldType); 4791 } else { 4792 NewType = getDerived().TransformType(OldType); 4793 } 4794 4795 if (NewType.isNull()) 4796 return true; 4797 4798 if (IsPackExpansion) 4799 NewType = getSema().Context.getPackExpansionType(NewType, 4800 NumExpansions); 4801 4802 if (ParamInfos) 4803 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4804 OutParamTypes.push_back(NewType); 4805 if (PVars) 4806 PVars->push_back(nullptr); 4807 } 4808 4809 #ifndef NDEBUG 4810 if (PVars) { 4811 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 4812 if (ParmVarDecl *parm = (*PVars)[i]) 4813 assert(parm->getFunctionScopeIndex() == i); 4814 } 4815 #endif 4816 4817 return false; 4818 } 4819 4820 template<typename Derived> 4821 QualType 4822 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 4823 FunctionProtoTypeLoc TL) { 4824 SmallVector<QualType, 4> ExceptionStorage; 4825 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 4826 return getDerived().TransformFunctionProtoType( 4827 TLB, TL, nullptr, 0, 4828 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 4829 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 4830 ExceptionStorage, Changed); 4831 }); 4832 } 4833 4834 template<typename Derived> template<typename Fn> 4835 QualType TreeTransform<Derived>::TransformFunctionProtoType( 4836 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 4837 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 4838 4839 // Transform the parameters and return type. 4840 // 4841 // We are required to instantiate the params and return type in source order. 4842 // When the function has a trailing return type, we instantiate the 4843 // parameters before the return type, since the return type can then refer 4844 // to the parameters themselves (via decltype, sizeof, etc.). 4845 // 4846 SmallVector<QualType, 4> ParamTypes; 4847 SmallVector<ParmVarDecl*, 4> ParamDecls; 4848 Sema::ExtParameterInfoBuilder ExtParamInfos; 4849 const FunctionProtoType *T = TL.getTypePtr(); 4850 4851 QualType ResultType; 4852 4853 if (T->hasTrailingReturn()) { 4854 if (getDerived().TransformFunctionTypeParams( 4855 TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(), 4856 TL.getTypePtr()->param_type_begin(), 4857 T->getExtParameterInfosOrNull(), 4858 ParamTypes, &ParamDecls, ExtParamInfos)) 4859 return QualType(); 4860 4861 { 4862 // C++11 [expr.prim.general]p3: 4863 // If a declaration declares a member function or member function 4864 // template of a class X, the expression this is a prvalue of type 4865 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 4866 // and the end of the function-definition, member-declarator, or 4867 // declarator. 4868 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 4869 4870 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 4871 if (ResultType.isNull()) 4872 return QualType(); 4873 } 4874 } 4875 else { 4876 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 4877 if (ResultType.isNull()) 4878 return QualType(); 4879 4880 if (getDerived().TransformFunctionTypeParams( 4881 TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(), 4882 TL.getTypePtr()->param_type_begin(), 4883 T->getExtParameterInfosOrNull(), 4884 ParamTypes, &ParamDecls, ExtParamInfos)) 4885 return QualType(); 4886 } 4887 4888 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 4889 4890 bool EPIChanged = false; 4891 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 4892 return QualType(); 4893 4894 // Handle extended parameter information. 4895 if (auto NewExtParamInfos = 4896 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 4897 if (!EPI.ExtParameterInfos || 4898 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 4899 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 4900 EPIChanged = true; 4901 } 4902 EPI.ExtParameterInfos = NewExtParamInfos; 4903 } else if (EPI.ExtParameterInfos) { 4904 EPIChanged = true; 4905 EPI.ExtParameterInfos = nullptr; 4906 } 4907 4908 QualType Result = TL.getType(); 4909 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 4910 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 4911 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 4912 if (Result.isNull()) 4913 return QualType(); 4914 } 4915 4916 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 4917 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 4918 NewTL.setLParenLoc(TL.getLParenLoc()); 4919 NewTL.setRParenLoc(TL.getRParenLoc()); 4920 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 4921 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 4922 NewTL.setParam(i, ParamDecls[i]); 4923 4924 return Result; 4925 } 4926 4927 template<typename Derived> 4928 bool TreeTransform<Derived>::TransformExceptionSpec( 4929 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 4930 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 4931 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 4932 4933 // Instantiate a dynamic noexcept expression, if any. 4934 if (ESI.Type == EST_ComputedNoexcept) { 4935 EnterExpressionEvaluationContext Unevaluated(getSema(), 4936 Sema::ConstantEvaluated); 4937 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 4938 if (NoexceptExpr.isInvalid()) 4939 return true; 4940 4941 NoexceptExpr = getSema().CheckBooleanCondition( 4942 NoexceptExpr.get(), NoexceptExpr.get()->getLocStart()); 4943 if (NoexceptExpr.isInvalid()) 4944 return true; 4945 4946 if (!NoexceptExpr.get()->isValueDependent()) { 4947 NoexceptExpr = getSema().VerifyIntegerConstantExpression( 4948 NoexceptExpr.get(), nullptr, 4949 diag::err_noexcept_needs_constant_expression, 4950 /*AllowFold*/false); 4951 if (NoexceptExpr.isInvalid()) 4952 return true; 4953 } 4954 4955 if (ESI.NoexceptExpr != NoexceptExpr.get()) 4956 Changed = true; 4957 ESI.NoexceptExpr = NoexceptExpr.get(); 4958 } 4959 4960 if (ESI.Type != EST_Dynamic) 4961 return false; 4962 4963 // Instantiate a dynamic exception specification's type. 4964 for (QualType T : ESI.Exceptions) { 4965 if (const PackExpansionType *PackExpansion = 4966 T->getAs<PackExpansionType>()) { 4967 Changed = true; 4968 4969 // We have a pack expansion. Instantiate it. 4970 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4971 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 4972 Unexpanded); 4973 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4974 4975 // Determine whether the set of unexpanded parameter packs can and 4976 // should 4977 // be expanded. 4978 bool Expand = false; 4979 bool RetainExpansion = false; 4980 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 4981 // FIXME: Track the location of the ellipsis (and track source location 4982 // information for the types in the exception specification in general). 4983 if (getDerived().TryExpandParameterPacks( 4984 Loc, SourceRange(), Unexpanded, Expand, 4985 RetainExpansion, NumExpansions)) 4986 return true; 4987 4988 if (!Expand) { 4989 // We can't expand this pack expansion into separate arguments yet; 4990 // just substitute into the pattern and create a new pack expansion 4991 // type. 4992 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4993 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 4994 if (U.isNull()) 4995 return true; 4996 4997 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 4998 Exceptions.push_back(U); 4999 continue; 5000 } 5001 5002 // Substitute into the pack expansion pattern for each slice of the 5003 // pack. 5004 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5005 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5006 5007 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5008 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5009 return true; 5010 5011 Exceptions.push_back(U); 5012 } 5013 } else { 5014 QualType U = getDerived().TransformType(T); 5015 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5016 return true; 5017 if (T != U) 5018 Changed = true; 5019 5020 Exceptions.push_back(U); 5021 } 5022 } 5023 5024 ESI.Exceptions = Exceptions; 5025 return false; 5026 } 5027 5028 template<typename Derived> 5029 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5030 TypeLocBuilder &TLB, 5031 FunctionNoProtoTypeLoc TL) { 5032 const FunctionNoProtoType *T = TL.getTypePtr(); 5033 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5034 if (ResultType.isNull()) 5035 return QualType(); 5036 5037 QualType Result = TL.getType(); 5038 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5039 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5040 5041 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5042 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5043 NewTL.setLParenLoc(TL.getLParenLoc()); 5044 NewTL.setRParenLoc(TL.getRParenLoc()); 5045 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5046 5047 return Result; 5048 } 5049 5050 template<typename Derived> QualType 5051 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5052 UnresolvedUsingTypeLoc TL) { 5053 const UnresolvedUsingType *T = TL.getTypePtr(); 5054 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5055 if (!D) 5056 return QualType(); 5057 5058 QualType Result = TL.getType(); 5059 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5060 Result = getDerived().RebuildUnresolvedUsingType(D); 5061 if (Result.isNull()) 5062 return QualType(); 5063 } 5064 5065 // We might get an arbitrary type spec type back. We should at 5066 // least always get a type spec type, though. 5067 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5068 NewTL.setNameLoc(TL.getNameLoc()); 5069 5070 return Result; 5071 } 5072 5073 template<typename Derived> 5074 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5075 TypedefTypeLoc TL) { 5076 const TypedefType *T = TL.getTypePtr(); 5077 TypedefNameDecl *Typedef 5078 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5079 T->getDecl())); 5080 if (!Typedef) 5081 return QualType(); 5082 5083 QualType Result = TL.getType(); 5084 if (getDerived().AlwaysRebuild() || 5085 Typedef != T->getDecl()) { 5086 Result = getDerived().RebuildTypedefType(Typedef); 5087 if (Result.isNull()) 5088 return QualType(); 5089 } 5090 5091 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5092 NewTL.setNameLoc(TL.getNameLoc()); 5093 5094 return Result; 5095 } 5096 5097 template<typename Derived> 5098 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5099 TypeOfExprTypeLoc TL) { 5100 // typeof expressions are not potentially evaluated contexts 5101 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 5102 Sema::ReuseLambdaContextDecl); 5103 5104 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5105 if (E.isInvalid()) 5106 return QualType(); 5107 5108 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5109 if (E.isInvalid()) 5110 return QualType(); 5111 5112 QualType Result = TL.getType(); 5113 if (getDerived().AlwaysRebuild() || 5114 E.get() != TL.getUnderlyingExpr()) { 5115 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5116 if (Result.isNull()) 5117 return QualType(); 5118 } 5119 else E.get(); 5120 5121 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5122 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5123 NewTL.setLParenLoc(TL.getLParenLoc()); 5124 NewTL.setRParenLoc(TL.getRParenLoc()); 5125 5126 return Result; 5127 } 5128 5129 template<typename Derived> 5130 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5131 TypeOfTypeLoc TL) { 5132 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5133 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5134 if (!New_Under_TI) 5135 return QualType(); 5136 5137 QualType Result = TL.getType(); 5138 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5139 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5140 if (Result.isNull()) 5141 return QualType(); 5142 } 5143 5144 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5145 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5146 NewTL.setLParenLoc(TL.getLParenLoc()); 5147 NewTL.setRParenLoc(TL.getRParenLoc()); 5148 NewTL.setUnderlyingTInfo(New_Under_TI); 5149 5150 return Result; 5151 } 5152 5153 template<typename Derived> 5154 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5155 DecltypeTypeLoc TL) { 5156 const DecltypeType *T = TL.getTypePtr(); 5157 5158 // decltype expressions are not potentially evaluated contexts 5159 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 5160 nullptr, /*IsDecltype=*/ true); 5161 5162 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5163 if (E.isInvalid()) 5164 return QualType(); 5165 5166 E = getSema().ActOnDecltypeExpression(E.get()); 5167 if (E.isInvalid()) 5168 return QualType(); 5169 5170 QualType Result = TL.getType(); 5171 if (getDerived().AlwaysRebuild() || 5172 E.get() != T->getUnderlyingExpr()) { 5173 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5174 if (Result.isNull()) 5175 return QualType(); 5176 } 5177 else E.get(); 5178 5179 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5180 NewTL.setNameLoc(TL.getNameLoc()); 5181 5182 return Result; 5183 } 5184 5185 template<typename Derived> 5186 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5187 TypeLocBuilder &TLB, 5188 UnaryTransformTypeLoc TL) { 5189 QualType Result = TL.getType(); 5190 if (Result->isDependentType()) { 5191 const UnaryTransformType *T = TL.getTypePtr(); 5192 QualType NewBase = 5193 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5194 Result = getDerived().RebuildUnaryTransformType(NewBase, 5195 T->getUTTKind(), 5196 TL.getKWLoc()); 5197 if (Result.isNull()) 5198 return QualType(); 5199 } 5200 5201 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5202 NewTL.setKWLoc(TL.getKWLoc()); 5203 NewTL.setParensRange(TL.getParensRange()); 5204 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5205 return Result; 5206 } 5207 5208 template<typename Derived> 5209 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5210 AutoTypeLoc TL) { 5211 const AutoType *T = TL.getTypePtr(); 5212 QualType OldDeduced = T->getDeducedType(); 5213 QualType NewDeduced; 5214 if (!OldDeduced.isNull()) { 5215 NewDeduced = getDerived().TransformType(OldDeduced); 5216 if (NewDeduced.isNull()) 5217 return QualType(); 5218 } 5219 5220 QualType Result = TL.getType(); 5221 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5222 T->isDependentType()) { 5223 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5224 if (Result.isNull()) 5225 return QualType(); 5226 } 5227 5228 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5229 NewTL.setNameLoc(TL.getNameLoc()); 5230 5231 return Result; 5232 } 5233 5234 template<typename Derived> 5235 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5236 RecordTypeLoc TL) { 5237 const RecordType *T = TL.getTypePtr(); 5238 RecordDecl *Record 5239 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5240 T->getDecl())); 5241 if (!Record) 5242 return QualType(); 5243 5244 QualType Result = TL.getType(); 5245 if (getDerived().AlwaysRebuild() || 5246 Record != T->getDecl()) { 5247 Result = getDerived().RebuildRecordType(Record); 5248 if (Result.isNull()) 5249 return QualType(); 5250 } 5251 5252 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5253 NewTL.setNameLoc(TL.getNameLoc()); 5254 5255 return Result; 5256 } 5257 5258 template<typename Derived> 5259 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5260 EnumTypeLoc TL) { 5261 const EnumType *T = TL.getTypePtr(); 5262 EnumDecl *Enum 5263 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5264 T->getDecl())); 5265 if (!Enum) 5266 return QualType(); 5267 5268 QualType Result = TL.getType(); 5269 if (getDerived().AlwaysRebuild() || 5270 Enum != T->getDecl()) { 5271 Result = getDerived().RebuildEnumType(Enum); 5272 if (Result.isNull()) 5273 return QualType(); 5274 } 5275 5276 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5277 NewTL.setNameLoc(TL.getNameLoc()); 5278 5279 return Result; 5280 } 5281 5282 template<typename Derived> 5283 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5284 TypeLocBuilder &TLB, 5285 InjectedClassNameTypeLoc TL) { 5286 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5287 TL.getTypePtr()->getDecl()); 5288 if (!D) return QualType(); 5289 5290 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5291 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5292 return T; 5293 } 5294 5295 template<typename Derived> 5296 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5297 TypeLocBuilder &TLB, 5298 TemplateTypeParmTypeLoc TL) { 5299 return TransformTypeSpecType(TLB, TL); 5300 } 5301 5302 template<typename Derived> 5303 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5304 TypeLocBuilder &TLB, 5305 SubstTemplateTypeParmTypeLoc TL) { 5306 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5307 5308 // Substitute into the replacement type, which itself might involve something 5309 // that needs to be transformed. This only tends to occur with default 5310 // template arguments of template template parameters. 5311 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5312 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5313 if (Replacement.isNull()) 5314 return QualType(); 5315 5316 // Always canonicalize the replacement type. 5317 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5318 QualType Result 5319 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5320 Replacement); 5321 5322 // Propagate type-source information. 5323 SubstTemplateTypeParmTypeLoc NewTL 5324 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5325 NewTL.setNameLoc(TL.getNameLoc()); 5326 return Result; 5327 5328 } 5329 5330 template<typename Derived> 5331 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5332 TypeLocBuilder &TLB, 5333 SubstTemplateTypeParmPackTypeLoc TL) { 5334 return TransformTypeSpecType(TLB, TL); 5335 } 5336 5337 template<typename Derived> 5338 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5339 TypeLocBuilder &TLB, 5340 TemplateSpecializationTypeLoc TL) { 5341 const TemplateSpecializationType *T = TL.getTypePtr(); 5342 5343 // The nested-name-specifier never matters in a TemplateSpecializationType, 5344 // because we can't have a dependent nested-name-specifier anyway. 5345 CXXScopeSpec SS; 5346 TemplateName Template 5347 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5348 TL.getTemplateNameLoc()); 5349 if (Template.isNull()) 5350 return QualType(); 5351 5352 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5353 } 5354 5355 template<typename Derived> 5356 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5357 AtomicTypeLoc TL) { 5358 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5359 if (ValueType.isNull()) 5360 return QualType(); 5361 5362 QualType Result = TL.getType(); 5363 if (getDerived().AlwaysRebuild() || 5364 ValueType != TL.getValueLoc().getType()) { 5365 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5366 if (Result.isNull()) 5367 return QualType(); 5368 } 5369 5370 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5371 NewTL.setKWLoc(TL.getKWLoc()); 5372 NewTL.setLParenLoc(TL.getLParenLoc()); 5373 NewTL.setRParenLoc(TL.getRParenLoc()); 5374 5375 return Result; 5376 } 5377 5378 template <typename Derived> 5379 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5380 PipeTypeLoc TL) { 5381 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5382 if (ValueType.isNull()) 5383 return QualType(); 5384 5385 QualType Result = TL.getType(); 5386 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5387 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc()); 5388 if (Result.isNull()) 5389 return QualType(); 5390 } 5391 5392 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5393 NewTL.setKWLoc(TL.getKWLoc()); 5394 5395 return Result; 5396 } 5397 5398 /// \brief Simple iterator that traverses the template arguments in a 5399 /// container that provides a \c getArgLoc() member function. 5400 /// 5401 /// This iterator is intended to be used with the iterator form of 5402 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5403 template<typename ArgLocContainer> 5404 class TemplateArgumentLocContainerIterator { 5405 ArgLocContainer *Container; 5406 unsigned Index; 5407 5408 public: 5409 typedef TemplateArgumentLoc value_type; 5410 typedef TemplateArgumentLoc reference; 5411 typedef int difference_type; 5412 typedef std::input_iterator_tag iterator_category; 5413 5414 class pointer { 5415 TemplateArgumentLoc Arg; 5416 5417 public: 5418 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5419 5420 const TemplateArgumentLoc *operator->() const { 5421 return &Arg; 5422 } 5423 }; 5424 5425 5426 TemplateArgumentLocContainerIterator() {} 5427 5428 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5429 unsigned Index) 5430 : Container(&Container), Index(Index) { } 5431 5432 TemplateArgumentLocContainerIterator &operator++() { 5433 ++Index; 5434 return *this; 5435 } 5436 5437 TemplateArgumentLocContainerIterator operator++(int) { 5438 TemplateArgumentLocContainerIterator Old(*this); 5439 ++(*this); 5440 return Old; 5441 } 5442 5443 TemplateArgumentLoc operator*() const { 5444 return Container->getArgLoc(Index); 5445 } 5446 5447 pointer operator->() const { 5448 return pointer(Container->getArgLoc(Index)); 5449 } 5450 5451 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5452 const TemplateArgumentLocContainerIterator &Y) { 5453 return X.Container == Y.Container && X.Index == Y.Index; 5454 } 5455 5456 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5457 const TemplateArgumentLocContainerIterator &Y) { 5458 return !(X == Y); 5459 } 5460 }; 5461 5462 5463 template <typename Derived> 5464 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5465 TypeLocBuilder &TLB, 5466 TemplateSpecializationTypeLoc TL, 5467 TemplateName Template) { 5468 TemplateArgumentListInfo NewTemplateArgs; 5469 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5470 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5471 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5472 ArgIterator; 5473 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5474 ArgIterator(TL, TL.getNumArgs()), 5475 NewTemplateArgs)) 5476 return QualType(); 5477 5478 // FIXME: maybe don't rebuild if all the template arguments are the same. 5479 5480 QualType Result = 5481 getDerived().RebuildTemplateSpecializationType(Template, 5482 TL.getTemplateNameLoc(), 5483 NewTemplateArgs); 5484 5485 if (!Result.isNull()) { 5486 // Specializations of template template parameters are represented as 5487 // TemplateSpecializationTypes, and substitution of type alias templates 5488 // within a dependent context can transform them into 5489 // DependentTemplateSpecializationTypes. 5490 if (isa<DependentTemplateSpecializationType>(Result)) { 5491 DependentTemplateSpecializationTypeLoc NewTL 5492 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5493 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5494 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5495 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5496 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5497 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5498 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5499 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5500 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5501 return Result; 5502 } 5503 5504 TemplateSpecializationTypeLoc NewTL 5505 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5506 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5507 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5508 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5509 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5510 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5511 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5512 } 5513 5514 return Result; 5515 } 5516 5517 template <typename Derived> 5518 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5519 TypeLocBuilder &TLB, 5520 DependentTemplateSpecializationTypeLoc TL, 5521 TemplateName Template, 5522 CXXScopeSpec &SS) { 5523 TemplateArgumentListInfo NewTemplateArgs; 5524 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5525 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5526 typedef TemplateArgumentLocContainerIterator< 5527 DependentTemplateSpecializationTypeLoc> ArgIterator; 5528 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5529 ArgIterator(TL, TL.getNumArgs()), 5530 NewTemplateArgs)) 5531 return QualType(); 5532 5533 // FIXME: maybe don't rebuild if all the template arguments are the same. 5534 5535 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 5536 QualType Result 5537 = getSema().Context.getDependentTemplateSpecializationType( 5538 TL.getTypePtr()->getKeyword(), 5539 DTN->getQualifier(), 5540 DTN->getIdentifier(), 5541 NewTemplateArgs); 5542 5543 DependentTemplateSpecializationTypeLoc NewTL 5544 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5545 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5546 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 5547 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5548 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5549 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5550 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5551 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5552 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5553 return Result; 5554 } 5555 5556 QualType Result 5557 = getDerived().RebuildTemplateSpecializationType(Template, 5558 TL.getTemplateNameLoc(), 5559 NewTemplateArgs); 5560 5561 if (!Result.isNull()) { 5562 /// FIXME: Wrap this in an elaborated-type-specifier? 5563 TemplateSpecializationTypeLoc NewTL 5564 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5565 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5566 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5567 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5568 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5569 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5570 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5571 } 5572 5573 return Result; 5574 } 5575 5576 template<typename Derived> 5577 QualType 5578 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 5579 ElaboratedTypeLoc TL) { 5580 const ElaboratedType *T = TL.getTypePtr(); 5581 5582 NestedNameSpecifierLoc QualifierLoc; 5583 // NOTE: the qualifier in an ElaboratedType is optional. 5584 if (TL.getQualifierLoc()) { 5585 QualifierLoc 5586 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5587 if (!QualifierLoc) 5588 return QualType(); 5589 } 5590 5591 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 5592 if (NamedT.isNull()) 5593 return QualType(); 5594 5595 // C++0x [dcl.type.elab]p2: 5596 // If the identifier resolves to a typedef-name or the simple-template-id 5597 // resolves to an alias template specialization, the 5598 // elaborated-type-specifier is ill-formed. 5599 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 5600 if (const TemplateSpecializationType *TST = 5601 NamedT->getAs<TemplateSpecializationType>()) { 5602 TemplateName Template = TST->getTemplateName(); 5603 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 5604 Template.getAsTemplateDecl())) { 5605 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 5606 diag::err_tag_reference_non_tag) << 4; 5607 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 5608 } 5609 } 5610 } 5611 5612 QualType Result = TL.getType(); 5613 if (getDerived().AlwaysRebuild() || 5614 QualifierLoc != TL.getQualifierLoc() || 5615 NamedT != T->getNamedType()) { 5616 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 5617 T->getKeyword(), 5618 QualifierLoc, NamedT); 5619 if (Result.isNull()) 5620 return QualType(); 5621 } 5622 5623 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5624 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5625 NewTL.setQualifierLoc(QualifierLoc); 5626 return Result; 5627 } 5628 5629 template<typename Derived> 5630 QualType TreeTransform<Derived>::TransformAttributedType( 5631 TypeLocBuilder &TLB, 5632 AttributedTypeLoc TL) { 5633 const AttributedType *oldType = TL.getTypePtr(); 5634 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 5635 if (modifiedType.isNull()) 5636 return QualType(); 5637 5638 QualType result = TL.getType(); 5639 5640 // FIXME: dependent operand expressions? 5641 if (getDerived().AlwaysRebuild() || 5642 modifiedType != oldType->getModifiedType()) { 5643 // TODO: this is really lame; we should really be rebuilding the 5644 // equivalent type from first principles. 5645 QualType equivalentType 5646 = getDerived().TransformType(oldType->getEquivalentType()); 5647 if (equivalentType.isNull()) 5648 return QualType(); 5649 5650 // Check whether we can add nullability; it is only represented as 5651 // type sugar, and therefore cannot be diagnosed in any other way. 5652 if (auto nullability = oldType->getImmediateNullability()) { 5653 if (!modifiedType->canHaveNullability()) { 5654 SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer) 5655 << DiagNullabilityKind(*nullability, false) << modifiedType; 5656 return QualType(); 5657 } 5658 } 5659 5660 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 5661 modifiedType, 5662 equivalentType); 5663 } 5664 5665 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 5666 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 5667 if (TL.hasAttrOperand()) 5668 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5669 if (TL.hasAttrExprOperand()) 5670 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 5671 else if (TL.hasAttrEnumOperand()) 5672 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 5673 5674 return result; 5675 } 5676 5677 template<typename Derived> 5678 QualType 5679 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 5680 ParenTypeLoc TL) { 5681 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 5682 if (Inner.isNull()) 5683 return QualType(); 5684 5685 QualType Result = TL.getType(); 5686 if (getDerived().AlwaysRebuild() || 5687 Inner != TL.getInnerLoc().getType()) { 5688 Result = getDerived().RebuildParenType(Inner); 5689 if (Result.isNull()) 5690 return QualType(); 5691 } 5692 5693 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 5694 NewTL.setLParenLoc(TL.getLParenLoc()); 5695 NewTL.setRParenLoc(TL.getRParenLoc()); 5696 return Result; 5697 } 5698 5699 template<typename Derived> 5700 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 5701 DependentNameTypeLoc TL) { 5702 const DependentNameType *T = TL.getTypePtr(); 5703 5704 NestedNameSpecifierLoc QualifierLoc 5705 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5706 if (!QualifierLoc) 5707 return QualType(); 5708 5709 QualType Result 5710 = getDerived().RebuildDependentNameType(T->getKeyword(), 5711 TL.getElaboratedKeywordLoc(), 5712 QualifierLoc, 5713 T->getIdentifier(), 5714 TL.getNameLoc()); 5715 if (Result.isNull()) 5716 return QualType(); 5717 5718 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 5719 QualType NamedT = ElabT->getNamedType(); 5720 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 5721 5722 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5723 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5724 NewTL.setQualifierLoc(QualifierLoc); 5725 } else { 5726 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 5727 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5728 NewTL.setQualifierLoc(QualifierLoc); 5729 NewTL.setNameLoc(TL.getNameLoc()); 5730 } 5731 return Result; 5732 } 5733 5734 template<typename Derived> 5735 QualType TreeTransform<Derived>:: 5736 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5737 DependentTemplateSpecializationTypeLoc TL) { 5738 NestedNameSpecifierLoc QualifierLoc; 5739 if (TL.getQualifierLoc()) { 5740 QualifierLoc 5741 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5742 if (!QualifierLoc) 5743 return QualType(); 5744 } 5745 5746 return getDerived() 5747 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 5748 } 5749 5750 template<typename Derived> 5751 QualType TreeTransform<Derived>:: 5752 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5753 DependentTemplateSpecializationTypeLoc TL, 5754 NestedNameSpecifierLoc QualifierLoc) { 5755 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 5756 5757 TemplateArgumentListInfo NewTemplateArgs; 5758 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5759 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5760 5761 typedef TemplateArgumentLocContainerIterator< 5762 DependentTemplateSpecializationTypeLoc> ArgIterator; 5763 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5764 ArgIterator(TL, TL.getNumArgs()), 5765 NewTemplateArgs)) 5766 return QualType(); 5767 5768 QualType Result 5769 = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 5770 QualifierLoc, 5771 T->getIdentifier(), 5772 TL.getTemplateNameLoc(), 5773 NewTemplateArgs); 5774 if (Result.isNull()) 5775 return QualType(); 5776 5777 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 5778 QualType NamedT = ElabT->getNamedType(); 5779 5780 // Copy information relevant to the template specialization. 5781 TemplateSpecializationTypeLoc NamedTL 5782 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 5783 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5784 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5785 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 5786 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 5787 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5788 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5789 5790 // Copy information relevant to the elaborated type. 5791 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5792 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5793 NewTL.setQualifierLoc(QualifierLoc); 5794 } else if (isa<DependentTemplateSpecializationType>(Result)) { 5795 DependentTemplateSpecializationTypeLoc SpecTL 5796 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5797 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5798 SpecTL.setQualifierLoc(QualifierLoc); 5799 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5800 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5801 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5802 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5803 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5804 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5805 } else { 5806 TemplateSpecializationTypeLoc SpecTL 5807 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5808 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5809 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5810 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5811 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5812 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5813 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5814 } 5815 return Result; 5816 } 5817 5818 template<typename Derived> 5819 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 5820 PackExpansionTypeLoc TL) { 5821 QualType Pattern 5822 = getDerived().TransformType(TLB, TL.getPatternLoc()); 5823 if (Pattern.isNull()) 5824 return QualType(); 5825 5826 QualType Result = TL.getType(); 5827 if (getDerived().AlwaysRebuild() || 5828 Pattern != TL.getPatternLoc().getType()) { 5829 Result = getDerived().RebuildPackExpansionType(Pattern, 5830 TL.getPatternLoc().getSourceRange(), 5831 TL.getEllipsisLoc(), 5832 TL.getTypePtr()->getNumExpansions()); 5833 if (Result.isNull()) 5834 return QualType(); 5835 } 5836 5837 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 5838 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 5839 return Result; 5840 } 5841 5842 template<typename Derived> 5843 QualType 5844 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 5845 ObjCInterfaceTypeLoc TL) { 5846 // ObjCInterfaceType is never dependent. 5847 TLB.pushFullCopy(TL); 5848 return TL.getType(); 5849 } 5850 5851 template<typename Derived> 5852 QualType 5853 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 5854 ObjCObjectTypeLoc TL) { 5855 // Transform base type. 5856 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 5857 if (BaseType.isNull()) 5858 return QualType(); 5859 5860 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 5861 5862 // Transform type arguments. 5863 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 5864 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 5865 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 5866 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 5867 QualType TypeArg = TypeArgInfo->getType(); 5868 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 5869 AnyChanged = true; 5870 5871 // We have a pack expansion. Instantiate it. 5872 const auto *PackExpansion = PackExpansionLoc.getType() 5873 ->castAs<PackExpansionType>(); 5874 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5875 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5876 Unexpanded); 5877 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5878 5879 // Determine whether the set of unexpanded parameter packs can 5880 // and should be expanded. 5881 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 5882 bool Expand = false; 5883 bool RetainExpansion = false; 5884 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5885 if (getDerived().TryExpandParameterPacks( 5886 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 5887 Unexpanded, Expand, RetainExpansion, NumExpansions)) 5888 return QualType(); 5889 5890 if (!Expand) { 5891 // We can't expand this pack expansion into separate arguments yet; 5892 // just substitute into the pattern and create a new pack expansion 5893 // type. 5894 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5895 5896 TypeLocBuilder TypeArgBuilder; 5897 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 5898 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 5899 PatternLoc); 5900 if (NewPatternType.isNull()) 5901 return QualType(); 5902 5903 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 5904 NewPatternType, NumExpansions); 5905 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 5906 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 5907 NewTypeArgInfos.push_back( 5908 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 5909 continue; 5910 } 5911 5912 // Substitute into the pack expansion pattern for each slice of the 5913 // pack. 5914 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5915 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5916 5917 TypeLocBuilder TypeArgBuilder; 5918 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 5919 5920 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 5921 PatternLoc); 5922 if (NewTypeArg.isNull()) 5923 return QualType(); 5924 5925 NewTypeArgInfos.push_back( 5926 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 5927 } 5928 5929 continue; 5930 } 5931 5932 TypeLocBuilder TypeArgBuilder; 5933 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 5934 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 5935 if (NewTypeArg.isNull()) 5936 return QualType(); 5937 5938 // If nothing changed, just keep the old TypeSourceInfo. 5939 if (NewTypeArg == TypeArg) { 5940 NewTypeArgInfos.push_back(TypeArgInfo); 5941 continue; 5942 } 5943 5944 NewTypeArgInfos.push_back( 5945 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 5946 AnyChanged = true; 5947 } 5948 5949 QualType Result = TL.getType(); 5950 if (getDerived().AlwaysRebuild() || AnyChanged) { 5951 // Rebuild the type. 5952 Result = getDerived().RebuildObjCObjectType( 5953 BaseType, 5954 TL.getLocStart(), 5955 TL.getTypeArgsLAngleLoc(), 5956 NewTypeArgInfos, 5957 TL.getTypeArgsRAngleLoc(), 5958 TL.getProtocolLAngleLoc(), 5959 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 5960 TL.getNumProtocols()), 5961 TL.getProtocolLocs(), 5962 TL.getProtocolRAngleLoc()); 5963 5964 if (Result.isNull()) 5965 return QualType(); 5966 } 5967 5968 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 5969 NewT.setHasBaseTypeAsWritten(true); 5970 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 5971 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 5972 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 5973 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 5974 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 5975 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 5976 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 5977 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 5978 return Result; 5979 } 5980 5981 template<typename Derived> 5982 QualType 5983 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 5984 ObjCObjectPointerTypeLoc TL) { 5985 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5986 if (PointeeType.isNull()) 5987 return QualType(); 5988 5989 QualType Result = TL.getType(); 5990 if (getDerived().AlwaysRebuild() || 5991 PointeeType != TL.getPointeeLoc().getType()) { 5992 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 5993 TL.getStarLoc()); 5994 if (Result.isNull()) 5995 return QualType(); 5996 } 5997 5998 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5999 NewT.setStarLoc(TL.getStarLoc()); 6000 return Result; 6001 } 6002 6003 //===----------------------------------------------------------------------===// 6004 // Statement transformation 6005 //===----------------------------------------------------------------------===// 6006 template<typename Derived> 6007 StmtResult 6008 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6009 return S; 6010 } 6011 6012 template<typename Derived> 6013 StmtResult 6014 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6015 return getDerived().TransformCompoundStmt(S, false); 6016 } 6017 6018 template<typename Derived> 6019 StmtResult 6020 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6021 bool IsStmtExpr) { 6022 Sema::CompoundScopeRAII CompoundScope(getSema()); 6023 6024 bool SubStmtInvalid = false; 6025 bool SubStmtChanged = false; 6026 SmallVector<Stmt*, 8> Statements; 6027 for (auto *B : S->body()) { 6028 StmtResult Result = getDerived().TransformStmt(B); 6029 if (Result.isInvalid()) { 6030 // Immediately fail if this was a DeclStmt, since it's very 6031 // likely that this will cause problems for future statements. 6032 if (isa<DeclStmt>(B)) 6033 return StmtError(); 6034 6035 // Otherwise, just keep processing substatements and fail later. 6036 SubStmtInvalid = true; 6037 continue; 6038 } 6039 6040 SubStmtChanged = SubStmtChanged || Result.get() != B; 6041 Statements.push_back(Result.getAs<Stmt>()); 6042 } 6043 6044 if (SubStmtInvalid) 6045 return StmtError(); 6046 6047 if (!getDerived().AlwaysRebuild() && 6048 !SubStmtChanged) 6049 return S; 6050 6051 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6052 Statements, 6053 S->getRBracLoc(), 6054 IsStmtExpr); 6055 } 6056 6057 template<typename Derived> 6058 StmtResult 6059 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6060 ExprResult LHS, RHS; 6061 { 6062 EnterExpressionEvaluationContext Unevaluated(SemaRef, 6063 Sema::ConstantEvaluated); 6064 6065 // Transform the left-hand case value. 6066 LHS = getDerived().TransformExpr(S->getLHS()); 6067 LHS = SemaRef.ActOnConstantExpression(LHS); 6068 if (LHS.isInvalid()) 6069 return StmtError(); 6070 6071 // Transform the right-hand case value (for the GNU case-range extension). 6072 RHS = getDerived().TransformExpr(S->getRHS()); 6073 RHS = SemaRef.ActOnConstantExpression(RHS); 6074 if (RHS.isInvalid()) 6075 return StmtError(); 6076 } 6077 6078 // Build the case statement. 6079 // Case statements are always rebuilt so that they will attached to their 6080 // transformed switch statement. 6081 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6082 LHS.get(), 6083 S->getEllipsisLoc(), 6084 RHS.get(), 6085 S->getColonLoc()); 6086 if (Case.isInvalid()) 6087 return StmtError(); 6088 6089 // Transform the statement following the case 6090 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6091 if (SubStmt.isInvalid()) 6092 return StmtError(); 6093 6094 // Attach the body to the case statement 6095 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6096 } 6097 6098 template<typename Derived> 6099 StmtResult 6100 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6101 // Transform the statement following the default case 6102 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6103 if (SubStmt.isInvalid()) 6104 return StmtError(); 6105 6106 // Default statements are always rebuilt 6107 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6108 SubStmt.get()); 6109 } 6110 6111 template<typename Derived> 6112 StmtResult 6113 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 6114 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6115 if (SubStmt.isInvalid()) 6116 return StmtError(); 6117 6118 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6119 S->getDecl()); 6120 if (!LD) 6121 return StmtError(); 6122 6123 6124 // FIXME: Pass the real colon location in. 6125 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6126 cast<LabelDecl>(LD), SourceLocation(), 6127 SubStmt.get()); 6128 } 6129 6130 template <typename Derived> 6131 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6132 if (!R) 6133 return R; 6134 6135 switch (R->getKind()) { 6136 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6137 #define ATTR(X) 6138 #define PRAGMA_SPELLING_ATTR(X) \ 6139 case attr::X: \ 6140 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6141 #include "clang/Basic/AttrList.inc" 6142 default: 6143 return R; 6144 } 6145 } 6146 6147 template <typename Derived> 6148 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 6149 bool AttrsChanged = false; 6150 SmallVector<const Attr *, 1> Attrs; 6151 6152 // Visit attributes and keep track if any are transformed. 6153 for (const auto *I : S->getAttrs()) { 6154 const Attr *R = getDerived().TransformAttr(I); 6155 AttrsChanged |= (I != R); 6156 Attrs.push_back(R); 6157 } 6158 6159 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6160 if (SubStmt.isInvalid()) 6161 return StmtError(); 6162 6163 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6164 return S; 6165 6166 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6167 SubStmt.get()); 6168 } 6169 6170 template<typename Derived> 6171 StmtResult 6172 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6173 // Transform the condition 6174 ExprResult Cond; 6175 VarDecl *ConditionVar = nullptr; 6176 if (S->getConditionVariable()) { 6177 ConditionVar 6178 = cast_or_null<VarDecl>( 6179 getDerived().TransformDefinition( 6180 S->getConditionVariable()->getLocation(), 6181 S->getConditionVariable())); 6182 if (!ConditionVar) 6183 return StmtError(); 6184 } else { 6185 Cond = getDerived().TransformExpr(S->getCond()); 6186 6187 if (Cond.isInvalid()) 6188 return StmtError(); 6189 6190 // Convert the condition to a boolean value. 6191 if (S->getCond()) { 6192 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, S->getIfLoc(), 6193 Cond.get()); 6194 if (CondE.isInvalid()) 6195 return StmtError(); 6196 6197 Cond = CondE.get(); 6198 } 6199 } 6200 6201 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get(), S->getIfLoc())); 6202 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 6203 return StmtError(); 6204 6205 // Transform the "then" branch. 6206 StmtResult Then = getDerived().TransformStmt(S->getThen()); 6207 if (Then.isInvalid()) 6208 return StmtError(); 6209 6210 // Transform the "else" branch. 6211 StmtResult Else = getDerived().TransformStmt(S->getElse()); 6212 if (Else.isInvalid()) 6213 return StmtError(); 6214 6215 if (!getDerived().AlwaysRebuild() && 6216 FullCond.get() == S->getCond() && 6217 ConditionVar == S->getConditionVariable() && 6218 Then.get() == S->getThen() && 6219 Else.get() == S->getElse()) 6220 return S; 6221 6222 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 6223 Then.get(), 6224 S->getElseLoc(), Else.get()); 6225 } 6226 6227 template<typename Derived> 6228 StmtResult 6229 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6230 // Transform the condition. 6231 ExprResult Cond; 6232 VarDecl *ConditionVar = nullptr; 6233 if (S->getConditionVariable()) { 6234 ConditionVar 6235 = cast_or_null<VarDecl>( 6236 getDerived().TransformDefinition( 6237 S->getConditionVariable()->getLocation(), 6238 S->getConditionVariable())); 6239 if (!ConditionVar) 6240 return StmtError(); 6241 } else { 6242 Cond = getDerived().TransformExpr(S->getCond()); 6243 6244 if (Cond.isInvalid()) 6245 return StmtError(); 6246 } 6247 6248 // Rebuild the switch statement. 6249 StmtResult Switch 6250 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 6251 ConditionVar); 6252 if (Switch.isInvalid()) 6253 return StmtError(); 6254 6255 // Transform the body of the switch statement. 6256 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6257 if (Body.isInvalid()) 6258 return StmtError(); 6259 6260 // Complete the switch statement. 6261 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6262 Body.get()); 6263 } 6264 6265 template<typename Derived> 6266 StmtResult 6267 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6268 // Transform the condition 6269 ExprResult Cond; 6270 VarDecl *ConditionVar = nullptr; 6271 if (S->getConditionVariable()) { 6272 ConditionVar 6273 = cast_or_null<VarDecl>( 6274 getDerived().TransformDefinition( 6275 S->getConditionVariable()->getLocation(), 6276 S->getConditionVariable())); 6277 if (!ConditionVar) 6278 return StmtError(); 6279 } else { 6280 Cond = getDerived().TransformExpr(S->getCond()); 6281 6282 if (Cond.isInvalid()) 6283 return StmtError(); 6284 6285 if (S->getCond()) { 6286 // Convert the condition to a boolean value. 6287 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, 6288 S->getWhileLoc(), 6289 Cond.get()); 6290 if (CondE.isInvalid()) 6291 return StmtError(); 6292 Cond = CondE; 6293 } 6294 } 6295 6296 Sema::FullExprArg FullCond( 6297 getSema().MakeFullExpr(Cond.get(), S->getWhileLoc())); 6298 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 6299 return StmtError(); 6300 6301 // Transform the body 6302 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6303 if (Body.isInvalid()) 6304 return StmtError(); 6305 6306 if (!getDerived().AlwaysRebuild() && 6307 FullCond.get() == S->getCond() && 6308 ConditionVar == S->getConditionVariable() && 6309 Body.get() == S->getBody()) 6310 return Owned(S); 6311 6312 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 6313 ConditionVar, Body.get()); 6314 } 6315 6316 template<typename Derived> 6317 StmtResult 6318 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6319 // Transform the body 6320 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6321 if (Body.isInvalid()) 6322 return StmtError(); 6323 6324 // Transform the condition 6325 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6326 if (Cond.isInvalid()) 6327 return StmtError(); 6328 6329 if (!getDerived().AlwaysRebuild() && 6330 Cond.get() == S->getCond() && 6331 Body.get() == S->getBody()) 6332 return S; 6333 6334 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6335 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6336 S->getRParenLoc()); 6337 } 6338 6339 template<typename Derived> 6340 StmtResult 6341 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6342 // Transform the initialization statement 6343 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6344 if (Init.isInvalid()) 6345 return StmtError(); 6346 6347 // In OpenMP loop region loop control variable must be captured and be 6348 // private. Perform analysis of first part (if any). 6349 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6350 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6351 6352 // Transform the condition 6353 ExprResult Cond; 6354 VarDecl *ConditionVar = nullptr; 6355 if (S->getConditionVariable()) { 6356 ConditionVar 6357 = cast_or_null<VarDecl>( 6358 getDerived().TransformDefinition( 6359 S->getConditionVariable()->getLocation(), 6360 S->getConditionVariable())); 6361 if (!ConditionVar) 6362 return StmtError(); 6363 } else { 6364 Cond = getDerived().TransformExpr(S->getCond()); 6365 6366 if (Cond.isInvalid()) 6367 return StmtError(); 6368 6369 if (S->getCond()) { 6370 // Convert the condition to a boolean value. 6371 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, 6372 S->getForLoc(), 6373 Cond.get()); 6374 if (CondE.isInvalid()) 6375 return StmtError(); 6376 6377 Cond = CondE.get(); 6378 } 6379 } 6380 6381 Sema::FullExprArg FullCond( 6382 getSema().MakeFullExpr(Cond.get(), S->getForLoc())); 6383 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 6384 return StmtError(); 6385 6386 // Transform the increment 6387 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6388 if (Inc.isInvalid()) 6389 return StmtError(); 6390 6391 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6392 if (S->getInc() && !FullInc.get()) 6393 return StmtError(); 6394 6395 // Transform the body 6396 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6397 if (Body.isInvalid()) 6398 return StmtError(); 6399 6400 if (!getDerived().AlwaysRebuild() && 6401 Init.get() == S->getInit() && 6402 FullCond.get() == S->getCond() && 6403 Inc.get() == S->getInc() && 6404 Body.get() == S->getBody()) 6405 return S; 6406 6407 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6408 Init.get(), FullCond, ConditionVar, 6409 FullInc, S->getRParenLoc(), Body.get()); 6410 } 6411 6412 template<typename Derived> 6413 StmtResult 6414 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6415 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6416 S->getLabel()); 6417 if (!LD) 6418 return StmtError(); 6419 6420 // Goto statements must always be rebuilt, to resolve the label. 6421 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6422 cast<LabelDecl>(LD)); 6423 } 6424 6425 template<typename Derived> 6426 StmtResult 6427 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6428 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6429 if (Target.isInvalid()) 6430 return StmtError(); 6431 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6432 6433 if (!getDerived().AlwaysRebuild() && 6434 Target.get() == S->getTarget()) 6435 return S; 6436 6437 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6438 Target.get()); 6439 } 6440 6441 template<typename Derived> 6442 StmtResult 6443 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6444 return S; 6445 } 6446 6447 template<typename Derived> 6448 StmtResult 6449 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6450 return S; 6451 } 6452 6453 template<typename Derived> 6454 StmtResult 6455 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6456 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6457 /*NotCopyInit*/false); 6458 if (Result.isInvalid()) 6459 return StmtError(); 6460 6461 // FIXME: We always rebuild the return statement because there is no way 6462 // to tell whether the return type of the function has changed. 6463 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6464 } 6465 6466 template<typename Derived> 6467 StmtResult 6468 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6469 bool DeclChanged = false; 6470 SmallVector<Decl *, 4> Decls; 6471 for (auto *D : S->decls()) { 6472 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6473 if (!Transformed) 6474 return StmtError(); 6475 6476 if (Transformed != D) 6477 DeclChanged = true; 6478 6479 Decls.push_back(Transformed); 6480 } 6481 6482 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6483 return S; 6484 6485 return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc()); 6486 } 6487 6488 template<typename Derived> 6489 StmtResult 6490 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6491 6492 SmallVector<Expr*, 8> Constraints; 6493 SmallVector<Expr*, 8> Exprs; 6494 SmallVector<IdentifierInfo *, 4> Names; 6495 6496 ExprResult AsmString; 6497 SmallVector<Expr*, 8> Clobbers; 6498 6499 bool ExprsChanged = false; 6500 6501 // Go through the outputs. 6502 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6503 Names.push_back(S->getOutputIdentifier(I)); 6504 6505 // No need to transform the constraint literal. 6506 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6507 6508 // Transform the output expr. 6509 Expr *OutputExpr = S->getOutputExpr(I); 6510 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6511 if (Result.isInvalid()) 6512 return StmtError(); 6513 6514 ExprsChanged |= Result.get() != OutputExpr; 6515 6516 Exprs.push_back(Result.get()); 6517 } 6518 6519 // Go through the inputs. 6520 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6521 Names.push_back(S->getInputIdentifier(I)); 6522 6523 // No need to transform the constraint literal. 6524 Constraints.push_back(S->getInputConstraintLiteral(I)); 6525 6526 // Transform the input expr. 6527 Expr *InputExpr = S->getInputExpr(I); 6528 ExprResult Result = getDerived().TransformExpr(InputExpr); 6529 if (Result.isInvalid()) 6530 return StmtError(); 6531 6532 ExprsChanged |= Result.get() != InputExpr; 6533 6534 Exprs.push_back(Result.get()); 6535 } 6536 6537 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6538 return S; 6539 6540 // Go through the clobbers. 6541 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6542 Clobbers.push_back(S->getClobberStringLiteral(I)); 6543 6544 // No need to transform the asm string literal. 6545 AsmString = S->getAsmString(); 6546 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6547 S->isVolatile(), S->getNumOutputs(), 6548 S->getNumInputs(), Names.data(), 6549 Constraints, Exprs, AsmString.get(), 6550 Clobbers, S->getRParenLoc()); 6551 } 6552 6553 template<typename Derived> 6554 StmtResult 6555 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 6556 ArrayRef<Token> AsmToks = 6557 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 6558 6559 bool HadError = false, HadChange = false; 6560 6561 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 6562 SmallVector<Expr*, 8> TransformedExprs; 6563 TransformedExprs.reserve(SrcExprs.size()); 6564 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 6565 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 6566 if (!Result.isUsable()) { 6567 HadError = true; 6568 } else { 6569 HadChange |= (Result.get() != SrcExprs[i]); 6570 TransformedExprs.push_back(Result.get()); 6571 } 6572 } 6573 6574 if (HadError) return StmtError(); 6575 if (!HadChange && !getDerived().AlwaysRebuild()) 6576 return Owned(S); 6577 6578 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 6579 AsmToks, S->getAsmString(), 6580 S->getNumOutputs(), S->getNumInputs(), 6581 S->getAllConstraints(), S->getClobbers(), 6582 TransformedExprs, S->getEndLoc()); 6583 } 6584 6585 // C++ Coroutines TS 6586 6587 template<typename Derived> 6588 StmtResult 6589 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 6590 // The coroutine body should be re-formed by the caller if necessary. 6591 return getDerived().TransformStmt(S->getBody()); 6592 } 6593 6594 template<typename Derived> 6595 StmtResult 6596 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 6597 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 6598 /*NotCopyInit*/false); 6599 if (Result.isInvalid()) 6600 return StmtError(); 6601 6602 // Always rebuild; we don't know if this needs to be injected into a new 6603 // context or if the promise type has changed. 6604 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get()); 6605 } 6606 6607 template<typename Derived> 6608 ExprResult 6609 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 6610 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 6611 /*NotCopyInit*/false); 6612 if (Result.isInvalid()) 6613 return ExprError(); 6614 6615 // Always rebuild; we don't know if this needs to be injected into a new 6616 // context or if the promise type has changed. 6617 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get()); 6618 } 6619 6620 template<typename Derived> 6621 ExprResult 6622 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 6623 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 6624 /*NotCopyInit*/false); 6625 if (Result.isInvalid()) 6626 return ExprError(); 6627 6628 // Always rebuild; we don't know if this needs to be injected into a new 6629 // context or if the promise type has changed. 6630 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 6631 } 6632 6633 // Objective-C Statements. 6634 6635 template<typename Derived> 6636 StmtResult 6637 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 6638 // Transform the body of the @try. 6639 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 6640 if (TryBody.isInvalid()) 6641 return StmtError(); 6642 6643 // Transform the @catch statements (if present). 6644 bool AnyCatchChanged = false; 6645 SmallVector<Stmt*, 8> CatchStmts; 6646 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 6647 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 6648 if (Catch.isInvalid()) 6649 return StmtError(); 6650 if (Catch.get() != S->getCatchStmt(I)) 6651 AnyCatchChanged = true; 6652 CatchStmts.push_back(Catch.get()); 6653 } 6654 6655 // Transform the @finally statement (if present). 6656 StmtResult Finally; 6657 if (S->getFinallyStmt()) { 6658 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 6659 if (Finally.isInvalid()) 6660 return StmtError(); 6661 } 6662 6663 // If nothing changed, just retain this statement. 6664 if (!getDerived().AlwaysRebuild() && 6665 TryBody.get() == S->getTryBody() && 6666 !AnyCatchChanged && 6667 Finally.get() == S->getFinallyStmt()) 6668 return S; 6669 6670 // Build a new statement. 6671 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 6672 CatchStmts, Finally.get()); 6673 } 6674 6675 template<typename Derived> 6676 StmtResult 6677 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 6678 // Transform the @catch parameter, if there is one. 6679 VarDecl *Var = nullptr; 6680 if (VarDecl *FromVar = S->getCatchParamDecl()) { 6681 TypeSourceInfo *TSInfo = nullptr; 6682 if (FromVar->getTypeSourceInfo()) { 6683 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 6684 if (!TSInfo) 6685 return StmtError(); 6686 } 6687 6688 QualType T; 6689 if (TSInfo) 6690 T = TSInfo->getType(); 6691 else { 6692 T = getDerived().TransformType(FromVar->getType()); 6693 if (T.isNull()) 6694 return StmtError(); 6695 } 6696 6697 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 6698 if (!Var) 6699 return StmtError(); 6700 } 6701 6702 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 6703 if (Body.isInvalid()) 6704 return StmtError(); 6705 6706 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 6707 S->getRParenLoc(), 6708 Var, Body.get()); 6709 } 6710 6711 template<typename Derived> 6712 StmtResult 6713 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 6714 // Transform the body. 6715 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 6716 if (Body.isInvalid()) 6717 return StmtError(); 6718 6719 // If nothing changed, just retain this statement. 6720 if (!getDerived().AlwaysRebuild() && 6721 Body.get() == S->getFinallyBody()) 6722 return S; 6723 6724 // Build a new statement. 6725 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 6726 Body.get()); 6727 } 6728 6729 template<typename Derived> 6730 StmtResult 6731 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 6732 ExprResult Operand; 6733 if (S->getThrowExpr()) { 6734 Operand = getDerived().TransformExpr(S->getThrowExpr()); 6735 if (Operand.isInvalid()) 6736 return StmtError(); 6737 } 6738 6739 if (!getDerived().AlwaysRebuild() && 6740 Operand.get() == S->getThrowExpr()) 6741 return S; 6742 6743 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 6744 } 6745 6746 template<typename Derived> 6747 StmtResult 6748 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 6749 ObjCAtSynchronizedStmt *S) { 6750 // Transform the object we are locking. 6751 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 6752 if (Object.isInvalid()) 6753 return StmtError(); 6754 Object = 6755 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 6756 Object.get()); 6757 if (Object.isInvalid()) 6758 return StmtError(); 6759 6760 // Transform the body. 6761 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 6762 if (Body.isInvalid()) 6763 return StmtError(); 6764 6765 // If nothing change, just retain the current statement. 6766 if (!getDerived().AlwaysRebuild() && 6767 Object.get() == S->getSynchExpr() && 6768 Body.get() == S->getSynchBody()) 6769 return S; 6770 6771 // Build a new statement. 6772 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 6773 Object.get(), Body.get()); 6774 } 6775 6776 template<typename Derived> 6777 StmtResult 6778 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 6779 ObjCAutoreleasePoolStmt *S) { 6780 // Transform the body. 6781 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 6782 if (Body.isInvalid()) 6783 return StmtError(); 6784 6785 // If nothing changed, just retain this statement. 6786 if (!getDerived().AlwaysRebuild() && 6787 Body.get() == S->getSubStmt()) 6788 return S; 6789 6790 // Build a new statement. 6791 return getDerived().RebuildObjCAutoreleasePoolStmt( 6792 S->getAtLoc(), Body.get()); 6793 } 6794 6795 template<typename Derived> 6796 StmtResult 6797 TreeTransform<Derived>::TransformObjCForCollectionStmt( 6798 ObjCForCollectionStmt *S) { 6799 // Transform the element statement. 6800 StmtResult Element = getDerived().TransformStmt(S->getElement()); 6801 if (Element.isInvalid()) 6802 return StmtError(); 6803 6804 // Transform the collection expression. 6805 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 6806 if (Collection.isInvalid()) 6807 return StmtError(); 6808 6809 // Transform the body. 6810 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6811 if (Body.isInvalid()) 6812 return StmtError(); 6813 6814 // If nothing changed, just retain this statement. 6815 if (!getDerived().AlwaysRebuild() && 6816 Element.get() == S->getElement() && 6817 Collection.get() == S->getCollection() && 6818 Body.get() == S->getBody()) 6819 return S; 6820 6821 // Build a new statement. 6822 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 6823 Element.get(), 6824 Collection.get(), 6825 S->getRParenLoc(), 6826 Body.get()); 6827 } 6828 6829 template <typename Derived> 6830 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 6831 // Transform the exception declaration, if any. 6832 VarDecl *Var = nullptr; 6833 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 6834 TypeSourceInfo *T = 6835 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 6836 if (!T) 6837 return StmtError(); 6838 6839 Var = getDerived().RebuildExceptionDecl( 6840 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 6841 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 6842 if (!Var || Var->isInvalidDecl()) 6843 return StmtError(); 6844 } 6845 6846 // Transform the actual exception handler. 6847 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 6848 if (Handler.isInvalid()) 6849 return StmtError(); 6850 6851 if (!getDerived().AlwaysRebuild() && !Var && 6852 Handler.get() == S->getHandlerBlock()) 6853 return S; 6854 6855 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 6856 } 6857 6858 template <typename Derived> 6859 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 6860 // Transform the try block itself. 6861 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 6862 if (TryBlock.isInvalid()) 6863 return StmtError(); 6864 6865 // Transform the handlers. 6866 bool HandlerChanged = false; 6867 SmallVector<Stmt *, 8> Handlers; 6868 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 6869 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 6870 if (Handler.isInvalid()) 6871 return StmtError(); 6872 6873 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 6874 Handlers.push_back(Handler.getAs<Stmt>()); 6875 } 6876 6877 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 6878 !HandlerChanged) 6879 return S; 6880 6881 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 6882 Handlers); 6883 } 6884 6885 template<typename Derived> 6886 StmtResult 6887 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 6888 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 6889 if (Range.isInvalid()) 6890 return StmtError(); 6891 6892 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 6893 if (Begin.isInvalid()) 6894 return StmtError(); 6895 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 6896 if (End.isInvalid()) 6897 return StmtError(); 6898 6899 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6900 if (Cond.isInvalid()) 6901 return StmtError(); 6902 if (Cond.get()) 6903 Cond = SemaRef.CheckBooleanCondition(Cond.get(), S->getColonLoc()); 6904 if (Cond.isInvalid()) 6905 return StmtError(); 6906 if (Cond.get()) 6907 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 6908 6909 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6910 if (Inc.isInvalid()) 6911 return StmtError(); 6912 if (Inc.get()) 6913 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 6914 6915 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 6916 if (LoopVar.isInvalid()) 6917 return StmtError(); 6918 6919 StmtResult NewStmt = S; 6920 if (getDerived().AlwaysRebuild() || 6921 Range.get() != S->getRangeStmt() || 6922 Begin.get() != S->getBeginStmt() || 6923 End.get() != S->getEndStmt() || 6924 Cond.get() != S->getCond() || 6925 Inc.get() != S->getInc() || 6926 LoopVar.get() != S->getLoopVarStmt()) { 6927 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 6928 S->getCoawaitLoc(), 6929 S->getColonLoc(), Range.get(), 6930 Begin.get(), End.get(), 6931 Cond.get(), 6932 Inc.get(), LoopVar.get(), 6933 S->getRParenLoc()); 6934 if (NewStmt.isInvalid()) 6935 return StmtError(); 6936 } 6937 6938 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6939 if (Body.isInvalid()) 6940 return StmtError(); 6941 6942 // Body has changed but we didn't rebuild the for-range statement. Rebuild 6943 // it now so we have a new statement to attach the body to. 6944 if (Body.get() != S->getBody() && NewStmt.get() == S) { 6945 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 6946 S->getCoawaitLoc(), 6947 S->getColonLoc(), Range.get(), 6948 Begin.get(), End.get(), 6949 Cond.get(), 6950 Inc.get(), LoopVar.get(), 6951 S->getRParenLoc()); 6952 if (NewStmt.isInvalid()) 6953 return StmtError(); 6954 } 6955 6956 if (NewStmt.get() == S) 6957 return S; 6958 6959 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 6960 } 6961 6962 template<typename Derived> 6963 StmtResult 6964 TreeTransform<Derived>::TransformMSDependentExistsStmt( 6965 MSDependentExistsStmt *S) { 6966 // Transform the nested-name-specifier, if any. 6967 NestedNameSpecifierLoc QualifierLoc; 6968 if (S->getQualifierLoc()) { 6969 QualifierLoc 6970 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 6971 if (!QualifierLoc) 6972 return StmtError(); 6973 } 6974 6975 // Transform the declaration name. 6976 DeclarationNameInfo NameInfo = S->getNameInfo(); 6977 if (NameInfo.getName()) { 6978 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 6979 if (!NameInfo.getName()) 6980 return StmtError(); 6981 } 6982 6983 // Check whether anything changed. 6984 if (!getDerived().AlwaysRebuild() && 6985 QualifierLoc == S->getQualifierLoc() && 6986 NameInfo.getName() == S->getNameInfo().getName()) 6987 return S; 6988 6989 // Determine whether this name exists, if we can. 6990 CXXScopeSpec SS; 6991 SS.Adopt(QualifierLoc); 6992 bool Dependent = false; 6993 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 6994 case Sema::IER_Exists: 6995 if (S->isIfExists()) 6996 break; 6997 6998 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 6999 7000 case Sema::IER_DoesNotExist: 7001 if (S->isIfNotExists()) 7002 break; 7003 7004 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7005 7006 case Sema::IER_Dependent: 7007 Dependent = true; 7008 break; 7009 7010 case Sema::IER_Error: 7011 return StmtError(); 7012 } 7013 7014 // We need to continue with the instantiation, so do so now. 7015 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7016 if (SubStmt.isInvalid()) 7017 return StmtError(); 7018 7019 // If we have resolved the name, just transform to the substatement. 7020 if (!Dependent) 7021 return SubStmt; 7022 7023 // The name is still dependent, so build a dependent expression again. 7024 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7025 S->isIfExists(), 7026 QualifierLoc, 7027 NameInfo, 7028 SubStmt.get()); 7029 } 7030 7031 template<typename Derived> 7032 ExprResult 7033 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7034 NestedNameSpecifierLoc QualifierLoc; 7035 if (E->getQualifierLoc()) { 7036 QualifierLoc 7037 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7038 if (!QualifierLoc) 7039 return ExprError(); 7040 } 7041 7042 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7043 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7044 if (!PD) 7045 return ExprError(); 7046 7047 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7048 if (Base.isInvalid()) 7049 return ExprError(); 7050 7051 return new (SemaRef.getASTContext()) 7052 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7053 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7054 QualifierLoc, E->getMemberLoc()); 7055 } 7056 7057 template <typename Derived> 7058 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7059 MSPropertySubscriptExpr *E) { 7060 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7061 if (BaseRes.isInvalid()) 7062 return ExprError(); 7063 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7064 if (IdxRes.isInvalid()) 7065 return ExprError(); 7066 7067 if (!getDerived().AlwaysRebuild() && 7068 BaseRes.get() == E->getBase() && 7069 IdxRes.get() == E->getIdx()) 7070 return E; 7071 7072 return getDerived().RebuildArraySubscriptExpr( 7073 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7074 } 7075 7076 template <typename Derived> 7077 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7078 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7079 if (TryBlock.isInvalid()) 7080 return StmtError(); 7081 7082 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7083 if (Handler.isInvalid()) 7084 return StmtError(); 7085 7086 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7087 Handler.get() == S->getHandler()) 7088 return S; 7089 7090 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7091 TryBlock.get(), Handler.get()); 7092 } 7093 7094 template <typename Derived> 7095 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7096 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7097 if (Block.isInvalid()) 7098 return StmtError(); 7099 7100 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7101 } 7102 7103 template <typename Derived> 7104 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7105 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7106 if (FilterExpr.isInvalid()) 7107 return StmtError(); 7108 7109 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7110 if (Block.isInvalid()) 7111 return StmtError(); 7112 7113 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7114 Block.get()); 7115 } 7116 7117 template <typename Derived> 7118 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7119 if (isa<SEHFinallyStmt>(Handler)) 7120 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7121 else 7122 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7123 } 7124 7125 template<typename Derived> 7126 StmtResult 7127 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7128 return S; 7129 } 7130 7131 //===----------------------------------------------------------------------===// 7132 // OpenMP directive transformation 7133 //===----------------------------------------------------------------------===// 7134 template <typename Derived> 7135 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7136 OMPExecutableDirective *D) { 7137 7138 // Transform the clauses 7139 llvm::SmallVector<OMPClause *, 16> TClauses; 7140 ArrayRef<OMPClause *> Clauses = D->clauses(); 7141 TClauses.reserve(Clauses.size()); 7142 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7143 I != E; ++I) { 7144 if (*I) { 7145 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7146 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7147 getDerived().getSema().EndOpenMPClause(); 7148 if (Clause) 7149 TClauses.push_back(Clause); 7150 } else { 7151 TClauses.push_back(nullptr); 7152 } 7153 } 7154 StmtResult AssociatedStmt; 7155 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7156 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7157 /*CurScope=*/nullptr); 7158 StmtResult Body; 7159 { 7160 Sema::CompoundScopeRAII CompoundScope(getSema()); 7161 Body = getDerived().TransformStmt( 7162 cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt()); 7163 } 7164 AssociatedStmt = 7165 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7166 if (AssociatedStmt.isInvalid()) { 7167 return StmtError(); 7168 } 7169 } 7170 if (TClauses.size() != Clauses.size()) { 7171 return StmtError(); 7172 } 7173 7174 // Transform directive name for 'omp critical' directive. 7175 DeclarationNameInfo DirName; 7176 if (D->getDirectiveKind() == OMPD_critical) { 7177 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7178 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7179 } 7180 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7181 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7182 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7183 } else if (D->getDirectiveKind() == OMPD_cancel) { 7184 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7185 } 7186 7187 return getDerived().RebuildOMPExecutableDirective( 7188 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7189 AssociatedStmt.get(), D->getLocStart(), D->getLocEnd()); 7190 } 7191 7192 template <typename Derived> 7193 StmtResult 7194 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7195 DeclarationNameInfo DirName; 7196 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7197 D->getLocStart()); 7198 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7199 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7200 return Res; 7201 } 7202 7203 template <typename Derived> 7204 StmtResult 7205 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7206 DeclarationNameInfo DirName; 7207 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7208 D->getLocStart()); 7209 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7210 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7211 return Res; 7212 } 7213 7214 template <typename Derived> 7215 StmtResult 7216 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7217 DeclarationNameInfo DirName; 7218 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7219 D->getLocStart()); 7220 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7221 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7222 return Res; 7223 } 7224 7225 template <typename Derived> 7226 StmtResult 7227 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7228 DeclarationNameInfo DirName; 7229 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7230 D->getLocStart()); 7231 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7232 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7233 return Res; 7234 } 7235 7236 template <typename Derived> 7237 StmtResult 7238 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7239 DeclarationNameInfo DirName; 7240 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7241 D->getLocStart()); 7242 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7243 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7244 return Res; 7245 } 7246 7247 template <typename Derived> 7248 StmtResult 7249 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7250 DeclarationNameInfo DirName; 7251 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7252 D->getLocStart()); 7253 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7254 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7255 return Res; 7256 } 7257 7258 template <typename Derived> 7259 StmtResult 7260 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7261 DeclarationNameInfo DirName; 7262 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7263 D->getLocStart()); 7264 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7265 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7266 return Res; 7267 } 7268 7269 template <typename Derived> 7270 StmtResult 7271 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7272 DeclarationNameInfo DirName; 7273 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7274 D->getLocStart()); 7275 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7276 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7277 return Res; 7278 } 7279 7280 template <typename Derived> 7281 StmtResult 7282 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7283 getDerived().getSema().StartOpenMPDSABlock( 7284 OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart()); 7285 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7286 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7287 return Res; 7288 } 7289 7290 template <typename Derived> 7291 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7292 OMPParallelForDirective *D) { 7293 DeclarationNameInfo DirName; 7294 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7295 nullptr, D->getLocStart()); 7296 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7297 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7298 return Res; 7299 } 7300 7301 template <typename Derived> 7302 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7303 OMPParallelForSimdDirective *D) { 7304 DeclarationNameInfo DirName; 7305 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7306 nullptr, D->getLocStart()); 7307 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7308 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7309 return Res; 7310 } 7311 7312 template <typename Derived> 7313 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7314 OMPParallelSectionsDirective *D) { 7315 DeclarationNameInfo DirName; 7316 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7317 nullptr, D->getLocStart()); 7318 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7319 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7320 return Res; 7321 } 7322 7323 template <typename Derived> 7324 StmtResult 7325 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7326 DeclarationNameInfo DirName; 7327 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7328 D->getLocStart()); 7329 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7330 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7331 return Res; 7332 } 7333 7334 template <typename Derived> 7335 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7336 OMPTaskyieldDirective *D) { 7337 DeclarationNameInfo DirName; 7338 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7339 D->getLocStart()); 7340 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7341 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7342 return Res; 7343 } 7344 7345 template <typename Derived> 7346 StmtResult 7347 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7348 DeclarationNameInfo DirName; 7349 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7350 D->getLocStart()); 7351 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7352 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7353 return Res; 7354 } 7355 7356 template <typename Derived> 7357 StmtResult 7358 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7359 DeclarationNameInfo DirName; 7360 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7361 D->getLocStart()); 7362 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7363 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7364 return Res; 7365 } 7366 7367 template <typename Derived> 7368 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7369 OMPTaskgroupDirective *D) { 7370 DeclarationNameInfo DirName; 7371 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7372 D->getLocStart()); 7373 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7374 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7375 return Res; 7376 } 7377 7378 template <typename Derived> 7379 StmtResult 7380 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7381 DeclarationNameInfo DirName; 7382 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7383 D->getLocStart()); 7384 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7385 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7386 return Res; 7387 } 7388 7389 template <typename Derived> 7390 StmtResult 7391 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7392 DeclarationNameInfo DirName; 7393 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7394 D->getLocStart()); 7395 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7396 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7397 return Res; 7398 } 7399 7400 template <typename Derived> 7401 StmtResult 7402 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7403 DeclarationNameInfo DirName; 7404 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7405 D->getLocStart()); 7406 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7407 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7408 return Res; 7409 } 7410 7411 template <typename Derived> 7412 StmtResult 7413 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 7414 DeclarationNameInfo DirName; 7415 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 7416 D->getLocStart()); 7417 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7418 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7419 return Res; 7420 } 7421 7422 template <typename Derived> 7423 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 7424 OMPTargetDataDirective *D) { 7425 DeclarationNameInfo DirName; 7426 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 7427 D->getLocStart()); 7428 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7429 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7430 return Res; 7431 } 7432 7433 template <typename Derived> 7434 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 7435 OMPTargetEnterDataDirective *D) { 7436 DeclarationNameInfo DirName; 7437 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 7438 nullptr, D->getLocStart()); 7439 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7440 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7441 return Res; 7442 } 7443 7444 template <typename Derived> 7445 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 7446 OMPTargetExitDataDirective *D) { 7447 DeclarationNameInfo DirName; 7448 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 7449 nullptr, D->getLocStart()); 7450 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7451 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7452 return Res; 7453 } 7454 7455 template <typename Derived> 7456 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 7457 OMPTargetParallelDirective *D) { 7458 DeclarationNameInfo DirName; 7459 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 7460 nullptr, D->getLocStart()); 7461 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7462 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7463 return Res; 7464 } 7465 7466 template <typename Derived> 7467 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 7468 OMPTargetParallelForDirective *D) { 7469 DeclarationNameInfo DirName; 7470 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 7471 nullptr, D->getLocStart()); 7472 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7473 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7474 return Res; 7475 } 7476 7477 template <typename Derived> 7478 StmtResult 7479 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 7480 DeclarationNameInfo DirName; 7481 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 7482 D->getLocStart()); 7483 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7484 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7485 return Res; 7486 } 7487 7488 template <typename Derived> 7489 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 7490 OMPCancellationPointDirective *D) { 7491 DeclarationNameInfo DirName; 7492 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 7493 nullptr, D->getLocStart()); 7494 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7495 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7496 return Res; 7497 } 7498 7499 template <typename Derived> 7500 StmtResult 7501 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 7502 DeclarationNameInfo DirName; 7503 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 7504 D->getLocStart()); 7505 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7506 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7507 return Res; 7508 } 7509 7510 template <typename Derived> 7511 StmtResult 7512 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 7513 DeclarationNameInfo DirName; 7514 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 7515 D->getLocStart()); 7516 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7517 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7518 return Res; 7519 } 7520 7521 template <typename Derived> 7522 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 7523 OMPTaskLoopSimdDirective *D) { 7524 DeclarationNameInfo DirName; 7525 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 7526 nullptr, D->getLocStart()); 7527 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7528 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7529 return Res; 7530 } 7531 7532 template <typename Derived> 7533 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 7534 OMPDistributeDirective *D) { 7535 DeclarationNameInfo DirName; 7536 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 7537 D->getLocStart()); 7538 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7539 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7540 return Res; 7541 } 7542 7543 //===----------------------------------------------------------------------===// 7544 // OpenMP clause transformation 7545 //===----------------------------------------------------------------------===// 7546 template <typename Derived> 7547 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 7548 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 7549 if (Cond.isInvalid()) 7550 return nullptr; 7551 return getDerived().RebuildOMPIfClause( 7552 C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(), 7553 C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd()); 7554 } 7555 7556 template <typename Derived> 7557 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 7558 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 7559 if (Cond.isInvalid()) 7560 return nullptr; 7561 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(), 7562 C->getLParenLoc(), C->getLocEnd()); 7563 } 7564 7565 template <typename Derived> 7566 OMPClause * 7567 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 7568 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 7569 if (NumThreads.isInvalid()) 7570 return nullptr; 7571 return getDerived().RebuildOMPNumThreadsClause( 7572 NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7573 } 7574 7575 template <typename Derived> 7576 OMPClause * 7577 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 7578 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 7579 if (E.isInvalid()) 7580 return nullptr; 7581 return getDerived().RebuildOMPSafelenClause( 7582 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7583 } 7584 7585 template <typename Derived> 7586 OMPClause * 7587 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 7588 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 7589 if (E.isInvalid()) 7590 return nullptr; 7591 return getDerived().RebuildOMPSimdlenClause( 7592 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7593 } 7594 7595 template <typename Derived> 7596 OMPClause * 7597 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 7598 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 7599 if (E.isInvalid()) 7600 return nullptr; 7601 return getDerived().RebuildOMPCollapseClause( 7602 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7603 } 7604 7605 template <typename Derived> 7606 OMPClause * 7607 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 7608 return getDerived().RebuildOMPDefaultClause( 7609 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(), 7610 C->getLParenLoc(), C->getLocEnd()); 7611 } 7612 7613 template <typename Derived> 7614 OMPClause * 7615 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 7616 return getDerived().RebuildOMPProcBindClause( 7617 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(), 7618 C->getLParenLoc(), C->getLocEnd()); 7619 } 7620 7621 template <typename Derived> 7622 OMPClause * 7623 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 7624 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 7625 if (E.isInvalid()) 7626 return nullptr; 7627 return getDerived().RebuildOMPScheduleClause( 7628 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 7629 C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 7630 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 7631 C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 7632 } 7633 7634 template <typename Derived> 7635 OMPClause * 7636 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 7637 ExprResult E; 7638 if (auto *Num = C->getNumForLoops()) { 7639 E = getDerived().TransformExpr(Num); 7640 if (E.isInvalid()) 7641 return nullptr; 7642 } 7643 return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(), 7644 C->getLParenLoc(), E.get()); 7645 } 7646 7647 template <typename Derived> 7648 OMPClause * 7649 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 7650 // No need to rebuild this clause, no template-dependent parameters. 7651 return C; 7652 } 7653 7654 template <typename Derived> 7655 OMPClause * 7656 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 7657 // No need to rebuild this clause, no template-dependent parameters. 7658 return C; 7659 } 7660 7661 template <typename Derived> 7662 OMPClause * 7663 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 7664 // No need to rebuild this clause, no template-dependent parameters. 7665 return C; 7666 } 7667 7668 template <typename Derived> 7669 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 7670 // No need to rebuild this clause, no template-dependent parameters. 7671 return C; 7672 } 7673 7674 template <typename Derived> 7675 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 7676 // No need to rebuild this clause, no template-dependent parameters. 7677 return C; 7678 } 7679 7680 template <typename Derived> 7681 OMPClause * 7682 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 7683 // No need to rebuild this clause, no template-dependent parameters. 7684 return C; 7685 } 7686 7687 template <typename Derived> 7688 OMPClause * 7689 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 7690 // No need to rebuild this clause, no template-dependent parameters. 7691 return C; 7692 } 7693 7694 template <typename Derived> 7695 OMPClause * 7696 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 7697 // No need to rebuild this clause, no template-dependent parameters. 7698 return C; 7699 } 7700 7701 template <typename Derived> 7702 OMPClause * 7703 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 7704 // No need to rebuild this clause, no template-dependent parameters. 7705 return C; 7706 } 7707 7708 template <typename Derived> 7709 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 7710 // No need to rebuild this clause, no template-dependent parameters. 7711 return C; 7712 } 7713 7714 template <typename Derived> 7715 OMPClause * 7716 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 7717 // No need to rebuild this clause, no template-dependent parameters. 7718 return C; 7719 } 7720 7721 template <typename Derived> 7722 OMPClause * 7723 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 7724 llvm::SmallVector<Expr *, 16> Vars; 7725 Vars.reserve(C->varlist_size()); 7726 for (auto *VE : C->varlists()) { 7727 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7728 if (EVar.isInvalid()) 7729 return nullptr; 7730 Vars.push_back(EVar.get()); 7731 } 7732 return getDerived().RebuildOMPPrivateClause( 7733 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7734 } 7735 7736 template <typename Derived> 7737 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 7738 OMPFirstprivateClause *C) { 7739 llvm::SmallVector<Expr *, 16> Vars; 7740 Vars.reserve(C->varlist_size()); 7741 for (auto *VE : C->varlists()) { 7742 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7743 if (EVar.isInvalid()) 7744 return nullptr; 7745 Vars.push_back(EVar.get()); 7746 } 7747 return getDerived().RebuildOMPFirstprivateClause( 7748 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7749 } 7750 7751 template <typename Derived> 7752 OMPClause * 7753 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 7754 llvm::SmallVector<Expr *, 16> Vars; 7755 Vars.reserve(C->varlist_size()); 7756 for (auto *VE : C->varlists()) { 7757 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7758 if (EVar.isInvalid()) 7759 return nullptr; 7760 Vars.push_back(EVar.get()); 7761 } 7762 return getDerived().RebuildOMPLastprivateClause( 7763 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7764 } 7765 7766 template <typename Derived> 7767 OMPClause * 7768 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 7769 llvm::SmallVector<Expr *, 16> Vars; 7770 Vars.reserve(C->varlist_size()); 7771 for (auto *VE : C->varlists()) { 7772 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7773 if (EVar.isInvalid()) 7774 return nullptr; 7775 Vars.push_back(EVar.get()); 7776 } 7777 return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(), 7778 C->getLParenLoc(), C->getLocEnd()); 7779 } 7780 7781 template <typename Derived> 7782 OMPClause * 7783 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 7784 llvm::SmallVector<Expr *, 16> Vars; 7785 Vars.reserve(C->varlist_size()); 7786 for (auto *VE : C->varlists()) { 7787 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7788 if (EVar.isInvalid()) 7789 return nullptr; 7790 Vars.push_back(EVar.get()); 7791 } 7792 CXXScopeSpec ReductionIdScopeSpec; 7793 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 7794 7795 DeclarationNameInfo NameInfo = C->getNameInfo(); 7796 if (NameInfo.getName()) { 7797 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7798 if (!NameInfo.getName()) 7799 return nullptr; 7800 } 7801 // Build a list of all UDR decls with the same names ranged by the Scopes. 7802 // The Scope boundary is a duplication of the previous decl. 7803 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 7804 for (auto *E : C->reduction_ops()) { 7805 // Transform all the decls. 7806 if (E) { 7807 auto *ULE = cast<UnresolvedLookupExpr>(E); 7808 UnresolvedSet<8> Decls; 7809 for (auto *D : ULE->decls()) { 7810 NamedDecl *InstD = 7811 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 7812 Decls.addDecl(InstD, InstD->getAccess()); 7813 } 7814 UnresolvedReductions.push_back( 7815 UnresolvedLookupExpr::Create( 7816 SemaRef.Context, /*NamingClass=*/nullptr, 7817 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 7818 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 7819 Decls.begin(), Decls.end())); 7820 } else 7821 UnresolvedReductions.push_back(nullptr); 7822 } 7823 return getDerived().RebuildOMPReductionClause( 7824 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(), 7825 C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 7826 } 7827 7828 template <typename Derived> 7829 OMPClause * 7830 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 7831 llvm::SmallVector<Expr *, 16> Vars; 7832 Vars.reserve(C->varlist_size()); 7833 for (auto *VE : C->varlists()) { 7834 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7835 if (EVar.isInvalid()) 7836 return nullptr; 7837 Vars.push_back(EVar.get()); 7838 } 7839 ExprResult Step = getDerived().TransformExpr(C->getStep()); 7840 if (Step.isInvalid()) 7841 return nullptr; 7842 return getDerived().RebuildOMPLinearClause( 7843 Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(), 7844 C->getModifierLoc(), C->getColonLoc(), C->getLocEnd()); 7845 } 7846 7847 template <typename Derived> 7848 OMPClause * 7849 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 7850 llvm::SmallVector<Expr *, 16> Vars; 7851 Vars.reserve(C->varlist_size()); 7852 for (auto *VE : C->varlists()) { 7853 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7854 if (EVar.isInvalid()) 7855 return nullptr; 7856 Vars.push_back(EVar.get()); 7857 } 7858 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 7859 if (Alignment.isInvalid()) 7860 return nullptr; 7861 return getDerived().RebuildOMPAlignedClause( 7862 Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(), 7863 C->getColonLoc(), C->getLocEnd()); 7864 } 7865 7866 template <typename Derived> 7867 OMPClause * 7868 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 7869 llvm::SmallVector<Expr *, 16> Vars; 7870 Vars.reserve(C->varlist_size()); 7871 for (auto *VE : C->varlists()) { 7872 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7873 if (EVar.isInvalid()) 7874 return nullptr; 7875 Vars.push_back(EVar.get()); 7876 } 7877 return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(), 7878 C->getLParenLoc(), C->getLocEnd()); 7879 } 7880 7881 template <typename Derived> 7882 OMPClause * 7883 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 7884 llvm::SmallVector<Expr *, 16> Vars; 7885 Vars.reserve(C->varlist_size()); 7886 for (auto *VE : C->varlists()) { 7887 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7888 if (EVar.isInvalid()) 7889 return nullptr; 7890 Vars.push_back(EVar.get()); 7891 } 7892 return getDerived().RebuildOMPCopyprivateClause( 7893 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7894 } 7895 7896 template <typename Derived> 7897 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 7898 llvm::SmallVector<Expr *, 16> Vars; 7899 Vars.reserve(C->varlist_size()); 7900 for (auto *VE : C->varlists()) { 7901 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7902 if (EVar.isInvalid()) 7903 return nullptr; 7904 Vars.push_back(EVar.get()); 7905 } 7906 return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(), 7907 C->getLParenLoc(), C->getLocEnd()); 7908 } 7909 7910 template <typename Derived> 7911 OMPClause * 7912 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 7913 llvm::SmallVector<Expr *, 16> Vars; 7914 Vars.reserve(C->varlist_size()); 7915 for (auto *VE : C->varlists()) { 7916 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7917 if (EVar.isInvalid()) 7918 return nullptr; 7919 Vars.push_back(EVar.get()); 7920 } 7921 return getDerived().RebuildOMPDependClause( 7922 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 7923 C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7924 } 7925 7926 template <typename Derived> 7927 OMPClause * 7928 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 7929 ExprResult E = getDerived().TransformExpr(C->getDevice()); 7930 if (E.isInvalid()) 7931 return nullptr; 7932 return getDerived().RebuildOMPDeviceClause( 7933 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7934 } 7935 7936 template <typename Derived> 7937 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 7938 llvm::SmallVector<Expr *, 16> Vars; 7939 Vars.reserve(C->varlist_size()); 7940 for (auto *VE : C->varlists()) { 7941 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7942 if (EVar.isInvalid()) 7943 return nullptr; 7944 Vars.push_back(EVar.get()); 7945 } 7946 return getDerived().RebuildOMPMapClause( 7947 C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(), 7948 C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(), 7949 C->getLParenLoc(), C->getLocEnd()); 7950 } 7951 7952 template <typename Derived> 7953 OMPClause * 7954 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 7955 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 7956 if (E.isInvalid()) 7957 return nullptr; 7958 return getDerived().RebuildOMPNumTeamsClause( 7959 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7960 } 7961 7962 template <typename Derived> 7963 OMPClause * 7964 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 7965 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 7966 if (E.isInvalid()) 7967 return nullptr; 7968 return getDerived().RebuildOMPThreadLimitClause( 7969 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7970 } 7971 7972 template <typename Derived> 7973 OMPClause * 7974 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 7975 ExprResult E = getDerived().TransformExpr(C->getPriority()); 7976 if (E.isInvalid()) 7977 return nullptr; 7978 return getDerived().RebuildOMPPriorityClause( 7979 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7980 } 7981 7982 template <typename Derived> 7983 OMPClause * 7984 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 7985 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 7986 if (E.isInvalid()) 7987 return nullptr; 7988 return getDerived().RebuildOMPGrainsizeClause( 7989 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7990 } 7991 7992 template <typename Derived> 7993 OMPClause * 7994 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 7995 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 7996 if (E.isInvalid()) 7997 return nullptr; 7998 return getDerived().RebuildOMPNumTasksClause( 7999 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8000 } 8001 8002 template <typename Derived> 8003 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8004 ExprResult E = getDerived().TransformExpr(C->getHint()); 8005 if (E.isInvalid()) 8006 return nullptr; 8007 return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(), 8008 C->getLParenLoc(), C->getLocEnd()); 8009 } 8010 8011 template <typename Derived> 8012 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8013 OMPDistScheduleClause *C) { 8014 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8015 if (E.isInvalid()) 8016 return nullptr; 8017 return getDerived().RebuildOMPDistScheduleClause( 8018 C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 8019 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 8020 } 8021 8022 template <typename Derived> 8023 OMPClause * 8024 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8025 return C; 8026 } 8027 8028 //===----------------------------------------------------------------------===// 8029 // Expression transformation 8030 //===----------------------------------------------------------------------===// 8031 template<typename Derived> 8032 ExprResult 8033 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 8034 if (!E->isTypeDependent()) 8035 return E; 8036 8037 return getDerived().RebuildPredefinedExpr(E->getLocation(), 8038 E->getIdentType()); 8039 } 8040 8041 template<typename Derived> 8042 ExprResult 8043 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 8044 NestedNameSpecifierLoc QualifierLoc; 8045 if (E->getQualifierLoc()) { 8046 QualifierLoc 8047 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8048 if (!QualifierLoc) 8049 return ExprError(); 8050 } 8051 8052 ValueDecl *ND 8053 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 8054 E->getDecl())); 8055 if (!ND) 8056 return ExprError(); 8057 8058 DeclarationNameInfo NameInfo = E->getNameInfo(); 8059 if (NameInfo.getName()) { 8060 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8061 if (!NameInfo.getName()) 8062 return ExprError(); 8063 } 8064 8065 if (!getDerived().AlwaysRebuild() && 8066 QualifierLoc == E->getQualifierLoc() && 8067 ND == E->getDecl() && 8068 NameInfo.getName() == E->getDecl()->getDeclName() && 8069 !E->hasExplicitTemplateArgs()) { 8070 8071 // Mark it referenced in the new context regardless. 8072 // FIXME: this is a bit instantiation-specific. 8073 SemaRef.MarkDeclRefReferenced(E); 8074 8075 return E; 8076 } 8077 8078 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 8079 if (E->hasExplicitTemplateArgs()) { 8080 TemplateArgs = &TransArgs; 8081 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8082 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8083 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8084 E->getNumTemplateArgs(), 8085 TransArgs)) 8086 return ExprError(); 8087 } 8088 8089 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 8090 TemplateArgs); 8091 } 8092 8093 template<typename Derived> 8094 ExprResult 8095 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 8096 return E; 8097 } 8098 8099 template<typename Derived> 8100 ExprResult 8101 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 8102 return E; 8103 } 8104 8105 template<typename Derived> 8106 ExprResult 8107 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 8108 return E; 8109 } 8110 8111 template<typename Derived> 8112 ExprResult 8113 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 8114 return E; 8115 } 8116 8117 template<typename Derived> 8118 ExprResult 8119 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 8120 return E; 8121 } 8122 8123 template<typename Derived> 8124 ExprResult 8125 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 8126 if (FunctionDecl *FD = E->getDirectCallee()) 8127 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 8128 return SemaRef.MaybeBindToTemporary(E); 8129 } 8130 8131 template<typename Derived> 8132 ExprResult 8133 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 8134 ExprResult ControllingExpr = 8135 getDerived().TransformExpr(E->getControllingExpr()); 8136 if (ControllingExpr.isInvalid()) 8137 return ExprError(); 8138 8139 SmallVector<Expr *, 4> AssocExprs; 8140 SmallVector<TypeSourceInfo *, 4> AssocTypes; 8141 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 8142 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 8143 if (TS) { 8144 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 8145 if (!AssocType) 8146 return ExprError(); 8147 AssocTypes.push_back(AssocType); 8148 } else { 8149 AssocTypes.push_back(nullptr); 8150 } 8151 8152 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 8153 if (AssocExpr.isInvalid()) 8154 return ExprError(); 8155 AssocExprs.push_back(AssocExpr.get()); 8156 } 8157 8158 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 8159 E->getDefaultLoc(), 8160 E->getRParenLoc(), 8161 ControllingExpr.get(), 8162 AssocTypes, 8163 AssocExprs); 8164 } 8165 8166 template<typename Derived> 8167 ExprResult 8168 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 8169 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8170 if (SubExpr.isInvalid()) 8171 return ExprError(); 8172 8173 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8174 return E; 8175 8176 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 8177 E->getRParen()); 8178 } 8179 8180 /// \brief The operand of a unary address-of operator has special rules: it's 8181 /// allowed to refer to a non-static member of a class even if there's no 'this' 8182 /// object available. 8183 template<typename Derived> 8184 ExprResult 8185 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 8186 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 8187 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 8188 else 8189 return getDerived().TransformExpr(E); 8190 } 8191 8192 template<typename Derived> 8193 ExprResult 8194 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 8195 ExprResult SubExpr; 8196 if (E->getOpcode() == UO_AddrOf) 8197 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 8198 else 8199 SubExpr = TransformExpr(E->getSubExpr()); 8200 if (SubExpr.isInvalid()) 8201 return ExprError(); 8202 8203 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8204 return E; 8205 8206 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 8207 E->getOpcode(), 8208 SubExpr.get()); 8209 } 8210 8211 template<typename Derived> 8212 ExprResult 8213 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 8214 // Transform the type. 8215 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 8216 if (!Type) 8217 return ExprError(); 8218 8219 // Transform all of the components into components similar to what the 8220 // parser uses. 8221 // FIXME: It would be slightly more efficient in the non-dependent case to 8222 // just map FieldDecls, rather than requiring the rebuilder to look for 8223 // the fields again. However, __builtin_offsetof is rare enough in 8224 // template code that we don't care. 8225 bool ExprChanged = false; 8226 typedef Sema::OffsetOfComponent Component; 8227 SmallVector<Component, 4> Components; 8228 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 8229 const OffsetOfNode &ON = E->getComponent(I); 8230 Component Comp; 8231 Comp.isBrackets = true; 8232 Comp.LocStart = ON.getSourceRange().getBegin(); 8233 Comp.LocEnd = ON.getSourceRange().getEnd(); 8234 switch (ON.getKind()) { 8235 case OffsetOfNode::Array: { 8236 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 8237 ExprResult Index = getDerived().TransformExpr(FromIndex); 8238 if (Index.isInvalid()) 8239 return ExprError(); 8240 8241 ExprChanged = ExprChanged || Index.get() != FromIndex; 8242 Comp.isBrackets = true; 8243 Comp.U.E = Index.get(); 8244 break; 8245 } 8246 8247 case OffsetOfNode::Field: 8248 case OffsetOfNode::Identifier: 8249 Comp.isBrackets = false; 8250 Comp.U.IdentInfo = ON.getFieldName(); 8251 if (!Comp.U.IdentInfo) 8252 continue; 8253 8254 break; 8255 8256 case OffsetOfNode::Base: 8257 // Will be recomputed during the rebuild. 8258 continue; 8259 } 8260 8261 Components.push_back(Comp); 8262 } 8263 8264 // If nothing changed, retain the existing expression. 8265 if (!getDerived().AlwaysRebuild() && 8266 Type == E->getTypeSourceInfo() && 8267 !ExprChanged) 8268 return E; 8269 8270 // Build a new offsetof expression. 8271 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 8272 Components, E->getRParenLoc()); 8273 } 8274 8275 template<typename Derived> 8276 ExprResult 8277 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 8278 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 8279 "opaque value expression requires transformation"); 8280 return E; 8281 } 8282 8283 template<typename Derived> 8284 ExprResult 8285 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 8286 return E; 8287 } 8288 8289 template<typename Derived> 8290 ExprResult 8291 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 8292 // Rebuild the syntactic form. The original syntactic form has 8293 // opaque-value expressions in it, so strip those away and rebuild 8294 // the result. This is a really awful way of doing this, but the 8295 // better solution (rebuilding the semantic expressions and 8296 // rebinding OVEs as necessary) doesn't work; we'd need 8297 // TreeTransform to not strip away implicit conversions. 8298 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 8299 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 8300 if (result.isInvalid()) return ExprError(); 8301 8302 // If that gives us a pseudo-object result back, the pseudo-object 8303 // expression must have been an lvalue-to-rvalue conversion which we 8304 // should reapply. 8305 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 8306 result = SemaRef.checkPseudoObjectRValue(result.get()); 8307 8308 return result; 8309 } 8310 8311 template<typename Derived> 8312 ExprResult 8313 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 8314 UnaryExprOrTypeTraitExpr *E) { 8315 if (E->isArgumentType()) { 8316 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 8317 8318 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 8319 if (!NewT) 8320 return ExprError(); 8321 8322 if (!getDerived().AlwaysRebuild() && OldT == NewT) 8323 return E; 8324 8325 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 8326 E->getKind(), 8327 E->getSourceRange()); 8328 } 8329 8330 // C++0x [expr.sizeof]p1: 8331 // The operand is either an expression, which is an unevaluated operand 8332 // [...] 8333 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 8334 Sema::ReuseLambdaContextDecl); 8335 8336 // Try to recover if we have something like sizeof(T::X) where X is a type. 8337 // Notably, there must be *exactly* one set of parens if X is a type. 8338 TypeSourceInfo *RecoveryTSI = nullptr; 8339 ExprResult SubExpr; 8340 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 8341 if (auto *DRE = 8342 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 8343 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 8344 PE, DRE, false, &RecoveryTSI); 8345 else 8346 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 8347 8348 if (RecoveryTSI) { 8349 return getDerived().RebuildUnaryExprOrTypeTrait( 8350 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 8351 } else if (SubExpr.isInvalid()) 8352 return ExprError(); 8353 8354 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 8355 return E; 8356 8357 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 8358 E->getOperatorLoc(), 8359 E->getKind(), 8360 E->getSourceRange()); 8361 } 8362 8363 template<typename Derived> 8364 ExprResult 8365 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 8366 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 8367 if (LHS.isInvalid()) 8368 return ExprError(); 8369 8370 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 8371 if (RHS.isInvalid()) 8372 return ExprError(); 8373 8374 8375 if (!getDerived().AlwaysRebuild() && 8376 LHS.get() == E->getLHS() && 8377 RHS.get() == E->getRHS()) 8378 return E; 8379 8380 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 8381 /*FIXME:*/E->getLHS()->getLocStart(), 8382 RHS.get(), 8383 E->getRBracketLoc()); 8384 } 8385 8386 template <typename Derived> 8387 ExprResult 8388 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 8389 ExprResult Base = getDerived().TransformExpr(E->getBase()); 8390 if (Base.isInvalid()) 8391 return ExprError(); 8392 8393 ExprResult LowerBound; 8394 if (E->getLowerBound()) { 8395 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 8396 if (LowerBound.isInvalid()) 8397 return ExprError(); 8398 } 8399 8400 ExprResult Length; 8401 if (E->getLength()) { 8402 Length = getDerived().TransformExpr(E->getLength()); 8403 if (Length.isInvalid()) 8404 return ExprError(); 8405 } 8406 8407 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 8408 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 8409 return E; 8410 8411 return getDerived().RebuildOMPArraySectionExpr( 8412 Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(), 8413 Length.get(), E->getRBracketLoc()); 8414 } 8415 8416 template<typename Derived> 8417 ExprResult 8418 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 8419 // Transform the callee. 8420 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 8421 if (Callee.isInvalid()) 8422 return ExprError(); 8423 8424 // Transform arguments. 8425 bool ArgChanged = false; 8426 SmallVector<Expr*, 8> Args; 8427 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 8428 &ArgChanged)) 8429 return ExprError(); 8430 8431 if (!getDerived().AlwaysRebuild() && 8432 Callee.get() == E->getCallee() && 8433 !ArgChanged) 8434 return SemaRef.MaybeBindToTemporary(E); 8435 8436 // FIXME: Wrong source location information for the '('. 8437 SourceLocation FakeLParenLoc 8438 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 8439 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 8440 Args, 8441 E->getRParenLoc()); 8442 } 8443 8444 template<typename Derived> 8445 ExprResult 8446 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 8447 ExprResult Base = getDerived().TransformExpr(E->getBase()); 8448 if (Base.isInvalid()) 8449 return ExprError(); 8450 8451 NestedNameSpecifierLoc QualifierLoc; 8452 if (E->hasQualifier()) { 8453 QualifierLoc 8454 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8455 8456 if (!QualifierLoc) 8457 return ExprError(); 8458 } 8459 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 8460 8461 ValueDecl *Member 8462 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 8463 E->getMemberDecl())); 8464 if (!Member) 8465 return ExprError(); 8466 8467 NamedDecl *FoundDecl = E->getFoundDecl(); 8468 if (FoundDecl == E->getMemberDecl()) { 8469 FoundDecl = Member; 8470 } else { 8471 FoundDecl = cast_or_null<NamedDecl>( 8472 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 8473 if (!FoundDecl) 8474 return ExprError(); 8475 } 8476 8477 if (!getDerived().AlwaysRebuild() && 8478 Base.get() == E->getBase() && 8479 QualifierLoc == E->getQualifierLoc() && 8480 Member == E->getMemberDecl() && 8481 FoundDecl == E->getFoundDecl() && 8482 !E->hasExplicitTemplateArgs()) { 8483 8484 // Mark it referenced in the new context regardless. 8485 // FIXME: this is a bit instantiation-specific. 8486 SemaRef.MarkMemberReferenced(E); 8487 8488 return E; 8489 } 8490 8491 TemplateArgumentListInfo TransArgs; 8492 if (E->hasExplicitTemplateArgs()) { 8493 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8494 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8495 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8496 E->getNumTemplateArgs(), 8497 TransArgs)) 8498 return ExprError(); 8499 } 8500 8501 // FIXME: Bogus source location for the operator 8502 SourceLocation FakeOperatorLoc = 8503 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 8504 8505 // FIXME: to do this check properly, we will need to preserve the 8506 // first-qualifier-in-scope here, just in case we had a dependent 8507 // base (and therefore couldn't do the check) and a 8508 // nested-name-qualifier (and therefore could do the lookup). 8509 NamedDecl *FirstQualifierInScope = nullptr; 8510 8511 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 8512 E->isArrow(), 8513 QualifierLoc, 8514 TemplateKWLoc, 8515 E->getMemberNameInfo(), 8516 Member, 8517 FoundDecl, 8518 (E->hasExplicitTemplateArgs() 8519 ? &TransArgs : nullptr), 8520 FirstQualifierInScope); 8521 } 8522 8523 template<typename Derived> 8524 ExprResult 8525 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 8526 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 8527 if (LHS.isInvalid()) 8528 return ExprError(); 8529 8530 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 8531 if (RHS.isInvalid()) 8532 return ExprError(); 8533 8534 if (!getDerived().AlwaysRebuild() && 8535 LHS.get() == E->getLHS() && 8536 RHS.get() == E->getRHS()) 8537 return E; 8538 8539 Sema::FPContractStateRAII FPContractState(getSema()); 8540 getSema().FPFeatures.fp_contract = E->isFPContractable(); 8541 8542 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 8543 LHS.get(), RHS.get()); 8544 } 8545 8546 template<typename Derived> 8547 ExprResult 8548 TreeTransform<Derived>::TransformCompoundAssignOperator( 8549 CompoundAssignOperator *E) { 8550 return getDerived().TransformBinaryOperator(E); 8551 } 8552 8553 template<typename Derived> 8554 ExprResult TreeTransform<Derived>:: 8555 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 8556 // Just rebuild the common and RHS expressions and see whether we 8557 // get any changes. 8558 8559 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 8560 if (commonExpr.isInvalid()) 8561 return ExprError(); 8562 8563 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 8564 if (rhs.isInvalid()) 8565 return ExprError(); 8566 8567 if (!getDerived().AlwaysRebuild() && 8568 commonExpr.get() == e->getCommon() && 8569 rhs.get() == e->getFalseExpr()) 8570 return e; 8571 8572 return getDerived().RebuildConditionalOperator(commonExpr.get(), 8573 e->getQuestionLoc(), 8574 nullptr, 8575 e->getColonLoc(), 8576 rhs.get()); 8577 } 8578 8579 template<typename Derived> 8580 ExprResult 8581 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 8582 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 8583 if (Cond.isInvalid()) 8584 return ExprError(); 8585 8586 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 8587 if (LHS.isInvalid()) 8588 return ExprError(); 8589 8590 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 8591 if (RHS.isInvalid()) 8592 return ExprError(); 8593 8594 if (!getDerived().AlwaysRebuild() && 8595 Cond.get() == E->getCond() && 8596 LHS.get() == E->getLHS() && 8597 RHS.get() == E->getRHS()) 8598 return E; 8599 8600 return getDerived().RebuildConditionalOperator(Cond.get(), 8601 E->getQuestionLoc(), 8602 LHS.get(), 8603 E->getColonLoc(), 8604 RHS.get()); 8605 } 8606 8607 template<typename Derived> 8608 ExprResult 8609 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 8610 // Implicit casts are eliminated during transformation, since they 8611 // will be recomputed by semantic analysis after transformation. 8612 return getDerived().TransformExpr(E->getSubExprAsWritten()); 8613 } 8614 8615 template<typename Derived> 8616 ExprResult 8617 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 8618 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 8619 if (!Type) 8620 return ExprError(); 8621 8622 ExprResult SubExpr 8623 = getDerived().TransformExpr(E->getSubExprAsWritten()); 8624 if (SubExpr.isInvalid()) 8625 return ExprError(); 8626 8627 if (!getDerived().AlwaysRebuild() && 8628 Type == E->getTypeInfoAsWritten() && 8629 SubExpr.get() == E->getSubExpr()) 8630 return E; 8631 8632 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 8633 Type, 8634 E->getRParenLoc(), 8635 SubExpr.get()); 8636 } 8637 8638 template<typename Derived> 8639 ExprResult 8640 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 8641 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 8642 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 8643 if (!NewT) 8644 return ExprError(); 8645 8646 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 8647 if (Init.isInvalid()) 8648 return ExprError(); 8649 8650 if (!getDerived().AlwaysRebuild() && 8651 OldT == NewT && 8652 Init.get() == E->getInitializer()) 8653 return SemaRef.MaybeBindToTemporary(E); 8654 8655 // Note: the expression type doesn't necessarily match the 8656 // type-as-written, but that's okay, because it should always be 8657 // derivable from the initializer. 8658 8659 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 8660 /*FIXME:*/E->getInitializer()->getLocEnd(), 8661 Init.get()); 8662 } 8663 8664 template<typename Derived> 8665 ExprResult 8666 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 8667 ExprResult Base = getDerived().TransformExpr(E->getBase()); 8668 if (Base.isInvalid()) 8669 return ExprError(); 8670 8671 if (!getDerived().AlwaysRebuild() && 8672 Base.get() == E->getBase()) 8673 return E; 8674 8675 // FIXME: Bad source location 8676 SourceLocation FakeOperatorLoc = 8677 SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd()); 8678 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 8679 E->getAccessorLoc(), 8680 E->getAccessor()); 8681 } 8682 8683 template<typename Derived> 8684 ExprResult 8685 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 8686 if (InitListExpr *Syntactic = E->getSyntacticForm()) 8687 E = Syntactic; 8688 8689 bool InitChanged = false; 8690 8691 SmallVector<Expr*, 4> Inits; 8692 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 8693 Inits, &InitChanged)) 8694 return ExprError(); 8695 8696 if (!getDerived().AlwaysRebuild() && !InitChanged) { 8697 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 8698 // in some cases. We can't reuse it in general, because the syntactic and 8699 // semantic forms are linked, and we can't know that semantic form will 8700 // match even if the syntactic form does. 8701 } 8702 8703 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 8704 E->getRBraceLoc(), E->getType()); 8705 } 8706 8707 template<typename Derived> 8708 ExprResult 8709 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 8710 Designation Desig; 8711 8712 // transform the initializer value 8713 ExprResult Init = getDerived().TransformExpr(E->getInit()); 8714 if (Init.isInvalid()) 8715 return ExprError(); 8716 8717 // transform the designators. 8718 SmallVector<Expr*, 4> ArrayExprs; 8719 bool ExprChanged = false; 8720 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 8721 DEnd = E->designators_end(); 8722 D != DEnd; ++D) { 8723 if (D->isFieldDesignator()) { 8724 Desig.AddDesignator(Designator::getField(D->getFieldName(), 8725 D->getDotLoc(), 8726 D->getFieldLoc())); 8727 continue; 8728 } 8729 8730 if (D->isArrayDesignator()) { 8731 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 8732 if (Index.isInvalid()) 8733 return ExprError(); 8734 8735 Desig.AddDesignator(Designator::getArray(Index.get(), 8736 D->getLBracketLoc())); 8737 8738 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 8739 ArrayExprs.push_back(Index.get()); 8740 continue; 8741 } 8742 8743 assert(D->isArrayRangeDesignator() && "New kind of designator?"); 8744 ExprResult Start 8745 = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 8746 if (Start.isInvalid()) 8747 return ExprError(); 8748 8749 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 8750 if (End.isInvalid()) 8751 return ExprError(); 8752 8753 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 8754 End.get(), 8755 D->getLBracketLoc(), 8756 D->getEllipsisLoc())); 8757 8758 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 8759 End.get() != E->getArrayRangeEnd(*D); 8760 8761 ArrayExprs.push_back(Start.get()); 8762 ArrayExprs.push_back(End.get()); 8763 } 8764 8765 if (!getDerived().AlwaysRebuild() && 8766 Init.get() == E->getInit() && 8767 !ExprChanged) 8768 return E; 8769 8770 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 8771 E->getEqualOrColonLoc(), 8772 E->usesGNUSyntax(), Init.get()); 8773 } 8774 8775 // Seems that if TransformInitListExpr() only works on the syntactic form of an 8776 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 8777 template<typename Derived> 8778 ExprResult 8779 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 8780 DesignatedInitUpdateExpr *E) { 8781 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 8782 "initializer"); 8783 return ExprError(); 8784 } 8785 8786 template<typename Derived> 8787 ExprResult 8788 TreeTransform<Derived>::TransformNoInitExpr( 8789 NoInitExpr *E) { 8790 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 8791 return ExprError(); 8792 } 8793 8794 template<typename Derived> 8795 ExprResult 8796 TreeTransform<Derived>::TransformImplicitValueInitExpr( 8797 ImplicitValueInitExpr *E) { 8798 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 8799 8800 // FIXME: Will we ever have proper type location here? Will we actually 8801 // need to transform the type? 8802 QualType T = getDerived().TransformType(E->getType()); 8803 if (T.isNull()) 8804 return ExprError(); 8805 8806 if (!getDerived().AlwaysRebuild() && 8807 T == E->getType()) 8808 return E; 8809 8810 return getDerived().RebuildImplicitValueInitExpr(T); 8811 } 8812 8813 template<typename Derived> 8814 ExprResult 8815 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 8816 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 8817 if (!TInfo) 8818 return ExprError(); 8819 8820 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8821 if (SubExpr.isInvalid()) 8822 return ExprError(); 8823 8824 if (!getDerived().AlwaysRebuild() && 8825 TInfo == E->getWrittenTypeInfo() && 8826 SubExpr.get() == E->getSubExpr()) 8827 return E; 8828 8829 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 8830 TInfo, E->getRParenLoc()); 8831 } 8832 8833 template<typename Derived> 8834 ExprResult 8835 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 8836 bool ArgumentChanged = false; 8837 SmallVector<Expr*, 4> Inits; 8838 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 8839 &ArgumentChanged)) 8840 return ExprError(); 8841 8842 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 8843 Inits, 8844 E->getRParenLoc()); 8845 } 8846 8847 /// \brief Transform an address-of-label expression. 8848 /// 8849 /// By default, the transformation of an address-of-label expression always 8850 /// rebuilds the expression, so that the label identifier can be resolved to 8851 /// the corresponding label statement by semantic analysis. 8852 template<typename Derived> 8853 ExprResult 8854 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 8855 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 8856 E->getLabel()); 8857 if (!LD) 8858 return ExprError(); 8859 8860 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 8861 cast<LabelDecl>(LD)); 8862 } 8863 8864 template<typename Derived> 8865 ExprResult 8866 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 8867 SemaRef.ActOnStartStmtExpr(); 8868 StmtResult SubStmt 8869 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 8870 if (SubStmt.isInvalid()) { 8871 SemaRef.ActOnStmtExprError(); 8872 return ExprError(); 8873 } 8874 8875 if (!getDerived().AlwaysRebuild() && 8876 SubStmt.get() == E->getSubStmt()) { 8877 // Calling this an 'error' is unintuitive, but it does the right thing. 8878 SemaRef.ActOnStmtExprError(); 8879 return SemaRef.MaybeBindToTemporary(E); 8880 } 8881 8882 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 8883 SubStmt.get(), 8884 E->getRParenLoc()); 8885 } 8886 8887 template<typename Derived> 8888 ExprResult 8889 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 8890 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 8891 if (Cond.isInvalid()) 8892 return ExprError(); 8893 8894 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 8895 if (LHS.isInvalid()) 8896 return ExprError(); 8897 8898 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 8899 if (RHS.isInvalid()) 8900 return ExprError(); 8901 8902 if (!getDerived().AlwaysRebuild() && 8903 Cond.get() == E->getCond() && 8904 LHS.get() == E->getLHS() && 8905 RHS.get() == E->getRHS()) 8906 return E; 8907 8908 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 8909 Cond.get(), LHS.get(), RHS.get(), 8910 E->getRParenLoc()); 8911 } 8912 8913 template<typename Derived> 8914 ExprResult 8915 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 8916 return E; 8917 } 8918 8919 template<typename Derived> 8920 ExprResult 8921 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 8922 switch (E->getOperator()) { 8923 case OO_New: 8924 case OO_Delete: 8925 case OO_Array_New: 8926 case OO_Array_Delete: 8927 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 8928 8929 case OO_Call: { 8930 // This is a call to an object's operator(). 8931 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 8932 8933 // Transform the object itself. 8934 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 8935 if (Object.isInvalid()) 8936 return ExprError(); 8937 8938 // FIXME: Poor location information 8939 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 8940 static_cast<Expr *>(Object.get())->getLocEnd()); 8941 8942 // Transform the call arguments. 8943 SmallVector<Expr*, 8> Args; 8944 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 8945 Args)) 8946 return ExprError(); 8947 8948 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 8949 Args, 8950 E->getLocEnd()); 8951 } 8952 8953 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 8954 case OO_##Name: 8955 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 8956 #include "clang/Basic/OperatorKinds.def" 8957 case OO_Subscript: 8958 // Handled below. 8959 break; 8960 8961 case OO_Conditional: 8962 llvm_unreachable("conditional operator is not actually overloadable"); 8963 8964 case OO_None: 8965 case NUM_OVERLOADED_OPERATORS: 8966 llvm_unreachable("not an overloaded operator?"); 8967 } 8968 8969 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 8970 if (Callee.isInvalid()) 8971 return ExprError(); 8972 8973 ExprResult First; 8974 if (E->getOperator() == OO_Amp) 8975 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 8976 else 8977 First = getDerived().TransformExpr(E->getArg(0)); 8978 if (First.isInvalid()) 8979 return ExprError(); 8980 8981 ExprResult Second; 8982 if (E->getNumArgs() == 2) { 8983 Second = getDerived().TransformExpr(E->getArg(1)); 8984 if (Second.isInvalid()) 8985 return ExprError(); 8986 } 8987 8988 if (!getDerived().AlwaysRebuild() && 8989 Callee.get() == E->getCallee() && 8990 First.get() == E->getArg(0) && 8991 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 8992 return SemaRef.MaybeBindToTemporary(E); 8993 8994 Sema::FPContractStateRAII FPContractState(getSema()); 8995 getSema().FPFeatures.fp_contract = E->isFPContractable(); 8996 8997 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 8998 E->getOperatorLoc(), 8999 Callee.get(), 9000 First.get(), 9001 Second.get()); 9002 } 9003 9004 template<typename Derived> 9005 ExprResult 9006 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9007 return getDerived().TransformCallExpr(E); 9008 } 9009 9010 template<typename Derived> 9011 ExprResult 9012 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9013 // Transform the callee. 9014 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9015 if (Callee.isInvalid()) 9016 return ExprError(); 9017 9018 // Transform exec config. 9019 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9020 if (EC.isInvalid()) 9021 return ExprError(); 9022 9023 // Transform arguments. 9024 bool ArgChanged = false; 9025 SmallVector<Expr*, 8> Args; 9026 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9027 &ArgChanged)) 9028 return ExprError(); 9029 9030 if (!getDerived().AlwaysRebuild() && 9031 Callee.get() == E->getCallee() && 9032 !ArgChanged) 9033 return SemaRef.MaybeBindToTemporary(E); 9034 9035 // FIXME: Wrong source location information for the '('. 9036 SourceLocation FakeLParenLoc 9037 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9038 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9039 Args, 9040 E->getRParenLoc(), EC.get()); 9041 } 9042 9043 template<typename Derived> 9044 ExprResult 9045 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9046 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9047 if (!Type) 9048 return ExprError(); 9049 9050 ExprResult SubExpr 9051 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9052 if (SubExpr.isInvalid()) 9053 return ExprError(); 9054 9055 if (!getDerived().AlwaysRebuild() && 9056 Type == E->getTypeInfoAsWritten() && 9057 SubExpr.get() == E->getSubExpr()) 9058 return E; 9059 return getDerived().RebuildCXXNamedCastExpr( 9060 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9061 Type, E->getAngleBrackets().getEnd(), 9062 // FIXME. this should be '(' location 9063 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 9064 } 9065 9066 template<typename Derived> 9067 ExprResult 9068 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 9069 return getDerived().TransformCXXNamedCastExpr(E); 9070 } 9071 9072 template<typename Derived> 9073 ExprResult 9074 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 9075 return getDerived().TransformCXXNamedCastExpr(E); 9076 } 9077 9078 template<typename Derived> 9079 ExprResult 9080 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 9081 CXXReinterpretCastExpr *E) { 9082 return getDerived().TransformCXXNamedCastExpr(E); 9083 } 9084 9085 template<typename Derived> 9086 ExprResult 9087 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 9088 return getDerived().TransformCXXNamedCastExpr(E); 9089 } 9090 9091 template<typename Derived> 9092 ExprResult 9093 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 9094 CXXFunctionalCastExpr *E) { 9095 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9096 if (!Type) 9097 return ExprError(); 9098 9099 ExprResult SubExpr 9100 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9101 if (SubExpr.isInvalid()) 9102 return ExprError(); 9103 9104 if (!getDerived().AlwaysRebuild() && 9105 Type == E->getTypeInfoAsWritten() && 9106 SubExpr.get() == E->getSubExpr()) 9107 return E; 9108 9109 return getDerived().RebuildCXXFunctionalCastExpr(Type, 9110 E->getLParenLoc(), 9111 SubExpr.get(), 9112 E->getRParenLoc()); 9113 } 9114 9115 template<typename Derived> 9116 ExprResult 9117 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 9118 if (E->isTypeOperand()) { 9119 TypeSourceInfo *TInfo 9120 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9121 if (!TInfo) 9122 return ExprError(); 9123 9124 if (!getDerived().AlwaysRebuild() && 9125 TInfo == E->getTypeOperandSourceInfo()) 9126 return E; 9127 9128 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9129 E->getLocStart(), 9130 TInfo, 9131 E->getLocEnd()); 9132 } 9133 9134 // We don't know whether the subexpression is potentially evaluated until 9135 // after we perform semantic analysis. We speculatively assume it is 9136 // unevaluated; it will get fixed later if the subexpression is in fact 9137 // potentially evaluated. 9138 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 9139 Sema::ReuseLambdaContextDecl); 9140 9141 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9142 if (SubExpr.isInvalid()) 9143 return ExprError(); 9144 9145 if (!getDerived().AlwaysRebuild() && 9146 SubExpr.get() == E->getExprOperand()) 9147 return E; 9148 9149 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9150 E->getLocStart(), 9151 SubExpr.get(), 9152 E->getLocEnd()); 9153 } 9154 9155 template<typename Derived> 9156 ExprResult 9157 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 9158 if (E->isTypeOperand()) { 9159 TypeSourceInfo *TInfo 9160 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9161 if (!TInfo) 9162 return ExprError(); 9163 9164 if (!getDerived().AlwaysRebuild() && 9165 TInfo == E->getTypeOperandSourceInfo()) 9166 return E; 9167 9168 return getDerived().RebuildCXXUuidofExpr(E->getType(), 9169 E->getLocStart(), 9170 TInfo, 9171 E->getLocEnd()); 9172 } 9173 9174 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 9175 9176 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9177 if (SubExpr.isInvalid()) 9178 return ExprError(); 9179 9180 if (!getDerived().AlwaysRebuild() && 9181 SubExpr.get() == E->getExprOperand()) 9182 return E; 9183 9184 return getDerived().RebuildCXXUuidofExpr(E->getType(), 9185 E->getLocStart(), 9186 SubExpr.get(), 9187 E->getLocEnd()); 9188 } 9189 9190 template<typename Derived> 9191 ExprResult 9192 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 9193 return E; 9194 } 9195 9196 template<typename Derived> 9197 ExprResult 9198 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 9199 CXXNullPtrLiteralExpr *E) { 9200 return E; 9201 } 9202 9203 template<typename Derived> 9204 ExprResult 9205 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 9206 QualType T = getSema().getCurrentThisType(); 9207 9208 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 9209 // Make sure that we capture 'this'. 9210 getSema().CheckCXXThisCapture(E->getLocStart()); 9211 return E; 9212 } 9213 9214 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 9215 } 9216 9217 template<typename Derived> 9218 ExprResult 9219 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 9220 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9221 if (SubExpr.isInvalid()) 9222 return ExprError(); 9223 9224 if (!getDerived().AlwaysRebuild() && 9225 SubExpr.get() == E->getSubExpr()) 9226 return E; 9227 9228 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 9229 E->isThrownVariableInScope()); 9230 } 9231 9232 template<typename Derived> 9233 ExprResult 9234 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 9235 ParmVarDecl *Param 9236 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 9237 E->getParam())); 9238 if (!Param) 9239 return ExprError(); 9240 9241 if (!getDerived().AlwaysRebuild() && 9242 Param == E->getParam()) 9243 return E; 9244 9245 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 9246 } 9247 9248 template<typename Derived> 9249 ExprResult 9250 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 9251 FieldDecl *Field 9252 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(), 9253 E->getField())); 9254 if (!Field) 9255 return ExprError(); 9256 9257 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 9258 return E; 9259 9260 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 9261 } 9262 9263 template<typename Derived> 9264 ExprResult 9265 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 9266 CXXScalarValueInitExpr *E) { 9267 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 9268 if (!T) 9269 return ExprError(); 9270 9271 if (!getDerived().AlwaysRebuild() && 9272 T == E->getTypeSourceInfo()) 9273 return E; 9274 9275 return getDerived().RebuildCXXScalarValueInitExpr(T, 9276 /*FIXME:*/T->getTypeLoc().getEndLoc(), 9277 E->getRParenLoc()); 9278 } 9279 9280 template<typename Derived> 9281 ExprResult 9282 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 9283 // Transform the type that we're allocating 9284 TypeSourceInfo *AllocTypeInfo 9285 = getDerived().TransformType(E->getAllocatedTypeSourceInfo()); 9286 if (!AllocTypeInfo) 9287 return ExprError(); 9288 9289 // Transform the size of the array we're allocating (if any). 9290 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 9291 if (ArraySize.isInvalid()) 9292 return ExprError(); 9293 9294 // Transform the placement arguments (if any). 9295 bool ArgumentChanged = false; 9296 SmallVector<Expr*, 8> PlacementArgs; 9297 if (getDerived().TransformExprs(E->getPlacementArgs(), 9298 E->getNumPlacementArgs(), true, 9299 PlacementArgs, &ArgumentChanged)) 9300 return ExprError(); 9301 9302 // Transform the initializer (if any). 9303 Expr *OldInit = E->getInitializer(); 9304 ExprResult NewInit; 9305 if (OldInit) 9306 NewInit = getDerived().TransformInitializer(OldInit, true); 9307 if (NewInit.isInvalid()) 9308 return ExprError(); 9309 9310 // Transform new operator and delete operator. 9311 FunctionDecl *OperatorNew = nullptr; 9312 if (E->getOperatorNew()) { 9313 OperatorNew = cast_or_null<FunctionDecl>( 9314 getDerived().TransformDecl(E->getLocStart(), 9315 E->getOperatorNew())); 9316 if (!OperatorNew) 9317 return ExprError(); 9318 } 9319 9320 FunctionDecl *OperatorDelete = nullptr; 9321 if (E->getOperatorDelete()) { 9322 OperatorDelete = cast_or_null<FunctionDecl>( 9323 getDerived().TransformDecl(E->getLocStart(), 9324 E->getOperatorDelete())); 9325 if (!OperatorDelete) 9326 return ExprError(); 9327 } 9328 9329 if (!getDerived().AlwaysRebuild() && 9330 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 9331 ArraySize.get() == E->getArraySize() && 9332 NewInit.get() == OldInit && 9333 OperatorNew == E->getOperatorNew() && 9334 OperatorDelete == E->getOperatorDelete() && 9335 !ArgumentChanged) { 9336 // Mark any declarations we need as referenced. 9337 // FIXME: instantiation-specific. 9338 if (OperatorNew) 9339 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 9340 if (OperatorDelete) 9341 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 9342 9343 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 9344 QualType ElementType 9345 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 9346 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 9347 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 9348 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 9349 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 9350 } 9351 } 9352 } 9353 9354 return E; 9355 } 9356 9357 QualType AllocType = AllocTypeInfo->getType(); 9358 if (!ArraySize.get()) { 9359 // If no array size was specified, but the new expression was 9360 // instantiated with an array type (e.g., "new T" where T is 9361 // instantiated with "int[4]"), extract the outer bound from the 9362 // array type as our array size. We do this with constant and 9363 // dependently-sized array types. 9364 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 9365 if (!ArrayT) { 9366 // Do nothing 9367 } else if (const ConstantArrayType *ConsArrayT 9368 = dyn_cast<ConstantArrayType>(ArrayT)) { 9369 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 9370 SemaRef.Context.getSizeType(), 9371 /*FIXME:*/ E->getLocStart()); 9372 AllocType = ConsArrayT->getElementType(); 9373 } else if (const DependentSizedArrayType *DepArrayT 9374 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 9375 if (DepArrayT->getSizeExpr()) { 9376 ArraySize = DepArrayT->getSizeExpr(); 9377 AllocType = DepArrayT->getElementType(); 9378 } 9379 } 9380 } 9381 9382 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 9383 E->isGlobalNew(), 9384 /*FIXME:*/E->getLocStart(), 9385 PlacementArgs, 9386 /*FIXME:*/E->getLocStart(), 9387 E->getTypeIdParens(), 9388 AllocType, 9389 AllocTypeInfo, 9390 ArraySize.get(), 9391 E->getDirectInitRange(), 9392 NewInit.get()); 9393 } 9394 9395 template<typename Derived> 9396 ExprResult 9397 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 9398 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 9399 if (Operand.isInvalid()) 9400 return ExprError(); 9401 9402 // Transform the delete operator, if known. 9403 FunctionDecl *OperatorDelete = nullptr; 9404 if (E->getOperatorDelete()) { 9405 OperatorDelete = cast_or_null<FunctionDecl>( 9406 getDerived().TransformDecl(E->getLocStart(), 9407 E->getOperatorDelete())); 9408 if (!OperatorDelete) 9409 return ExprError(); 9410 } 9411 9412 if (!getDerived().AlwaysRebuild() && 9413 Operand.get() == E->getArgument() && 9414 OperatorDelete == E->getOperatorDelete()) { 9415 // Mark any declarations we need as referenced. 9416 // FIXME: instantiation-specific. 9417 if (OperatorDelete) 9418 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 9419 9420 if (!E->getArgument()->isTypeDependent()) { 9421 QualType Destroyed = SemaRef.Context.getBaseElementType( 9422 E->getDestroyedType()); 9423 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 9424 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 9425 SemaRef.MarkFunctionReferenced(E->getLocStart(), 9426 SemaRef.LookupDestructor(Record)); 9427 } 9428 } 9429 9430 return E; 9431 } 9432 9433 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 9434 E->isGlobalDelete(), 9435 E->isArrayForm(), 9436 Operand.get()); 9437 } 9438 9439 template<typename Derived> 9440 ExprResult 9441 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 9442 CXXPseudoDestructorExpr *E) { 9443 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9444 if (Base.isInvalid()) 9445 return ExprError(); 9446 9447 ParsedType ObjectTypePtr; 9448 bool MayBePseudoDestructor = false; 9449 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 9450 E->getOperatorLoc(), 9451 E->isArrow()? tok::arrow : tok::period, 9452 ObjectTypePtr, 9453 MayBePseudoDestructor); 9454 if (Base.isInvalid()) 9455 return ExprError(); 9456 9457 QualType ObjectType = ObjectTypePtr.get(); 9458 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 9459 if (QualifierLoc) { 9460 QualifierLoc 9461 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 9462 if (!QualifierLoc) 9463 return ExprError(); 9464 } 9465 CXXScopeSpec SS; 9466 SS.Adopt(QualifierLoc); 9467 9468 PseudoDestructorTypeStorage Destroyed; 9469 if (E->getDestroyedTypeInfo()) { 9470 TypeSourceInfo *DestroyedTypeInfo 9471 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 9472 ObjectType, nullptr, SS); 9473 if (!DestroyedTypeInfo) 9474 return ExprError(); 9475 Destroyed = DestroyedTypeInfo; 9476 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 9477 // We aren't likely to be able to resolve the identifier down to a type 9478 // now anyway, so just retain the identifier. 9479 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 9480 E->getDestroyedTypeLoc()); 9481 } else { 9482 // Look for a destructor known with the given name. 9483 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 9484 *E->getDestroyedTypeIdentifier(), 9485 E->getDestroyedTypeLoc(), 9486 /*Scope=*/nullptr, 9487 SS, ObjectTypePtr, 9488 false); 9489 if (!T) 9490 return ExprError(); 9491 9492 Destroyed 9493 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 9494 E->getDestroyedTypeLoc()); 9495 } 9496 9497 TypeSourceInfo *ScopeTypeInfo = nullptr; 9498 if (E->getScopeTypeInfo()) { 9499 CXXScopeSpec EmptySS; 9500 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 9501 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 9502 if (!ScopeTypeInfo) 9503 return ExprError(); 9504 } 9505 9506 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 9507 E->getOperatorLoc(), 9508 E->isArrow(), 9509 SS, 9510 ScopeTypeInfo, 9511 E->getColonColonLoc(), 9512 E->getTildeLoc(), 9513 Destroyed); 9514 } 9515 9516 template<typename Derived> 9517 ExprResult 9518 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 9519 UnresolvedLookupExpr *Old) { 9520 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 9521 Sema::LookupOrdinaryName); 9522 9523 // Transform all the decls. 9524 for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 9525 E = Old->decls_end(); I != E; ++I) { 9526 NamedDecl *InstD = static_cast<NamedDecl*>( 9527 getDerived().TransformDecl(Old->getNameLoc(), 9528 *I)); 9529 if (!InstD) { 9530 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 9531 // This can happen because of dependent hiding. 9532 if (isa<UsingShadowDecl>(*I)) 9533 continue; 9534 else { 9535 R.clear(); 9536 return ExprError(); 9537 } 9538 } 9539 9540 // Expand using declarations. 9541 if (isa<UsingDecl>(InstD)) { 9542 UsingDecl *UD = cast<UsingDecl>(InstD); 9543 for (auto *I : UD->shadows()) 9544 R.addDecl(I); 9545 continue; 9546 } 9547 9548 R.addDecl(InstD); 9549 } 9550 9551 // Resolve a kind, but don't do any further analysis. If it's 9552 // ambiguous, the callee needs to deal with it. 9553 R.resolveKind(); 9554 9555 // Rebuild the nested-name qualifier, if present. 9556 CXXScopeSpec SS; 9557 if (Old->getQualifierLoc()) { 9558 NestedNameSpecifierLoc QualifierLoc 9559 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 9560 if (!QualifierLoc) 9561 return ExprError(); 9562 9563 SS.Adopt(QualifierLoc); 9564 } 9565 9566 if (Old->getNamingClass()) { 9567 CXXRecordDecl *NamingClass 9568 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 9569 Old->getNameLoc(), 9570 Old->getNamingClass())); 9571 if (!NamingClass) { 9572 R.clear(); 9573 return ExprError(); 9574 } 9575 9576 R.setNamingClass(NamingClass); 9577 } 9578 9579 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 9580 9581 // If we have neither explicit template arguments, nor the template keyword, 9582 // it's a normal declaration name or member reference. 9583 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 9584 NamedDecl *D = R.getAsSingle<NamedDecl>(); 9585 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 9586 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 9587 // give a good diagnostic. 9588 if (D && D->isCXXInstanceMember()) { 9589 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 9590 /*TemplateArgs=*/nullptr, 9591 /*Scope=*/nullptr); 9592 } 9593 9594 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 9595 } 9596 9597 // If we have template arguments, rebuild them, then rebuild the 9598 // templateid expression. 9599 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 9600 if (Old->hasExplicitTemplateArgs() && 9601 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 9602 Old->getNumTemplateArgs(), 9603 TransArgs)) { 9604 R.clear(); 9605 return ExprError(); 9606 } 9607 9608 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 9609 Old->requiresADL(), &TransArgs); 9610 } 9611 9612 template<typename Derived> 9613 ExprResult 9614 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 9615 bool ArgChanged = false; 9616 SmallVector<TypeSourceInfo *, 4> Args; 9617 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 9618 TypeSourceInfo *From = E->getArg(I); 9619 TypeLoc FromTL = From->getTypeLoc(); 9620 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 9621 TypeLocBuilder TLB; 9622 TLB.reserve(FromTL.getFullDataSize()); 9623 QualType To = getDerived().TransformType(TLB, FromTL); 9624 if (To.isNull()) 9625 return ExprError(); 9626 9627 if (To == From->getType()) 9628 Args.push_back(From); 9629 else { 9630 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 9631 ArgChanged = true; 9632 } 9633 continue; 9634 } 9635 9636 ArgChanged = true; 9637 9638 // We have a pack expansion. Instantiate it. 9639 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 9640 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 9641 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 9642 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 9643 9644 // Determine whether the set of unexpanded parameter packs can and should 9645 // be expanded. 9646 bool Expand = true; 9647 bool RetainExpansion = false; 9648 Optional<unsigned> OrigNumExpansions = 9649 ExpansionTL.getTypePtr()->getNumExpansions(); 9650 Optional<unsigned> NumExpansions = OrigNumExpansions; 9651 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 9652 PatternTL.getSourceRange(), 9653 Unexpanded, 9654 Expand, RetainExpansion, 9655 NumExpansions)) 9656 return ExprError(); 9657 9658 if (!Expand) { 9659 // The transform has determined that we should perform a simple 9660 // transformation on the pack expansion, producing another pack 9661 // expansion. 9662 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 9663 9664 TypeLocBuilder TLB; 9665 TLB.reserve(From->getTypeLoc().getFullDataSize()); 9666 9667 QualType To = getDerived().TransformType(TLB, PatternTL); 9668 if (To.isNull()) 9669 return ExprError(); 9670 9671 To = getDerived().RebuildPackExpansionType(To, 9672 PatternTL.getSourceRange(), 9673 ExpansionTL.getEllipsisLoc(), 9674 NumExpansions); 9675 if (To.isNull()) 9676 return ExprError(); 9677 9678 PackExpansionTypeLoc ToExpansionTL 9679 = TLB.push<PackExpansionTypeLoc>(To); 9680 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 9681 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 9682 continue; 9683 } 9684 9685 // Expand the pack expansion by substituting for each argument in the 9686 // pack(s). 9687 for (unsigned I = 0; I != *NumExpansions; ++I) { 9688 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 9689 TypeLocBuilder TLB; 9690 TLB.reserve(PatternTL.getFullDataSize()); 9691 QualType To = getDerived().TransformType(TLB, PatternTL); 9692 if (To.isNull()) 9693 return ExprError(); 9694 9695 if (To->containsUnexpandedParameterPack()) { 9696 To = getDerived().RebuildPackExpansionType(To, 9697 PatternTL.getSourceRange(), 9698 ExpansionTL.getEllipsisLoc(), 9699 NumExpansions); 9700 if (To.isNull()) 9701 return ExprError(); 9702 9703 PackExpansionTypeLoc ToExpansionTL 9704 = TLB.push<PackExpansionTypeLoc>(To); 9705 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 9706 } 9707 9708 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 9709 } 9710 9711 if (!RetainExpansion) 9712 continue; 9713 9714 // If we're supposed to retain a pack expansion, do so by temporarily 9715 // forgetting the partially-substituted parameter pack. 9716 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 9717 9718 TypeLocBuilder TLB; 9719 TLB.reserve(From->getTypeLoc().getFullDataSize()); 9720 9721 QualType To = getDerived().TransformType(TLB, PatternTL); 9722 if (To.isNull()) 9723 return ExprError(); 9724 9725 To = getDerived().RebuildPackExpansionType(To, 9726 PatternTL.getSourceRange(), 9727 ExpansionTL.getEllipsisLoc(), 9728 NumExpansions); 9729 if (To.isNull()) 9730 return ExprError(); 9731 9732 PackExpansionTypeLoc ToExpansionTL 9733 = TLB.push<PackExpansionTypeLoc>(To); 9734 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 9735 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 9736 } 9737 9738 if (!getDerived().AlwaysRebuild() && !ArgChanged) 9739 return E; 9740 9741 return getDerived().RebuildTypeTrait(E->getTrait(), 9742 E->getLocStart(), 9743 Args, 9744 E->getLocEnd()); 9745 } 9746 9747 template<typename Derived> 9748 ExprResult 9749 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 9750 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 9751 if (!T) 9752 return ExprError(); 9753 9754 if (!getDerived().AlwaysRebuild() && 9755 T == E->getQueriedTypeSourceInfo()) 9756 return E; 9757 9758 ExprResult SubExpr; 9759 { 9760 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 9761 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 9762 if (SubExpr.isInvalid()) 9763 return ExprError(); 9764 9765 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 9766 return E; 9767 } 9768 9769 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 9770 E->getLocStart(), 9771 T, 9772 SubExpr.get(), 9773 E->getLocEnd()); 9774 } 9775 9776 template<typename Derived> 9777 ExprResult 9778 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 9779 ExprResult SubExpr; 9780 { 9781 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 9782 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 9783 if (SubExpr.isInvalid()) 9784 return ExprError(); 9785 9786 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 9787 return E; 9788 } 9789 9790 return getDerived().RebuildExpressionTrait( 9791 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 9792 } 9793 9794 template <typename Derived> 9795 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 9796 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 9797 TypeSourceInfo **RecoveryTSI) { 9798 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 9799 DRE, AddrTaken, RecoveryTSI); 9800 9801 // Propagate both errors and recovered types, which return ExprEmpty. 9802 if (!NewDRE.isUsable()) 9803 return NewDRE; 9804 9805 // We got an expr, wrap it up in parens. 9806 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 9807 return PE; 9808 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 9809 PE->getRParen()); 9810 } 9811 9812 template <typename Derived> 9813 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 9814 DependentScopeDeclRefExpr *E) { 9815 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 9816 nullptr); 9817 } 9818 9819 template<typename Derived> 9820 ExprResult 9821 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 9822 DependentScopeDeclRefExpr *E, 9823 bool IsAddressOfOperand, 9824 TypeSourceInfo **RecoveryTSI) { 9825 assert(E->getQualifierLoc()); 9826 NestedNameSpecifierLoc QualifierLoc 9827 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9828 if (!QualifierLoc) 9829 return ExprError(); 9830 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9831 9832 // TODO: If this is a conversion-function-id, verify that the 9833 // destination type name (if present) resolves the same way after 9834 // instantiation as it did in the local scope. 9835 9836 DeclarationNameInfo NameInfo 9837 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 9838 if (!NameInfo.getName()) 9839 return ExprError(); 9840 9841 if (!E->hasExplicitTemplateArgs()) { 9842 if (!getDerived().AlwaysRebuild() && 9843 QualifierLoc == E->getQualifierLoc() && 9844 // Note: it is sufficient to compare the Name component of NameInfo: 9845 // if name has not changed, DNLoc has not changed either. 9846 NameInfo.getName() == E->getDeclName()) 9847 return E; 9848 9849 return getDerived().RebuildDependentScopeDeclRefExpr( 9850 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 9851 IsAddressOfOperand, RecoveryTSI); 9852 } 9853 9854 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 9855 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9856 E->getNumTemplateArgs(), 9857 TransArgs)) 9858 return ExprError(); 9859 9860 return getDerived().RebuildDependentScopeDeclRefExpr( 9861 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 9862 RecoveryTSI); 9863 } 9864 9865 template<typename Derived> 9866 ExprResult 9867 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 9868 // CXXConstructExprs other than for list-initialization and 9869 // CXXTemporaryObjectExpr are always implicit, so when we have 9870 // a 1-argument construction we just transform that argument. 9871 if ((E->getNumArgs() == 1 || 9872 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 9873 (!getDerived().DropCallArgument(E->getArg(0))) && 9874 !E->isListInitialization()) 9875 return getDerived().TransformExpr(E->getArg(0)); 9876 9877 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 9878 9879 QualType T = getDerived().TransformType(E->getType()); 9880 if (T.isNull()) 9881 return ExprError(); 9882 9883 CXXConstructorDecl *Constructor 9884 = cast_or_null<CXXConstructorDecl>( 9885 getDerived().TransformDecl(E->getLocStart(), 9886 E->getConstructor())); 9887 if (!Constructor) 9888 return ExprError(); 9889 9890 bool ArgumentChanged = false; 9891 SmallVector<Expr*, 8> Args; 9892 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9893 &ArgumentChanged)) 9894 return ExprError(); 9895 9896 if (!getDerived().AlwaysRebuild() && 9897 T == E->getType() && 9898 Constructor == E->getConstructor() && 9899 !ArgumentChanged) { 9900 // Mark the constructor as referenced. 9901 // FIXME: Instantiation-specific 9902 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 9903 return E; 9904 } 9905 9906 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 9907 Constructor, E->isElidable(), 9908 Args, 9909 E->hadMultipleCandidates(), 9910 E->isListInitialization(), 9911 E->isStdInitListInitialization(), 9912 E->requiresZeroInitialization(), 9913 E->getConstructionKind(), 9914 E->getParenOrBraceRange()); 9915 } 9916 9917 /// \brief Transform a C++ temporary-binding expression. 9918 /// 9919 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 9920 /// transform the subexpression and return that. 9921 template<typename Derived> 9922 ExprResult 9923 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 9924 return getDerived().TransformExpr(E->getSubExpr()); 9925 } 9926 9927 /// \brief Transform a C++ expression that contains cleanups that should 9928 /// be run after the expression is evaluated. 9929 /// 9930 /// Since ExprWithCleanups nodes are implicitly generated, we 9931 /// just transform the subexpression and return that. 9932 template<typename Derived> 9933 ExprResult 9934 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 9935 return getDerived().TransformExpr(E->getSubExpr()); 9936 } 9937 9938 template<typename Derived> 9939 ExprResult 9940 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 9941 CXXTemporaryObjectExpr *E) { 9942 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 9943 if (!T) 9944 return ExprError(); 9945 9946 CXXConstructorDecl *Constructor 9947 = cast_or_null<CXXConstructorDecl>( 9948 getDerived().TransformDecl(E->getLocStart(), 9949 E->getConstructor())); 9950 if (!Constructor) 9951 return ExprError(); 9952 9953 bool ArgumentChanged = false; 9954 SmallVector<Expr*, 8> Args; 9955 Args.reserve(E->getNumArgs()); 9956 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9957 &ArgumentChanged)) 9958 return ExprError(); 9959 9960 if (!getDerived().AlwaysRebuild() && 9961 T == E->getTypeSourceInfo() && 9962 Constructor == E->getConstructor() && 9963 !ArgumentChanged) { 9964 // FIXME: Instantiation-specific 9965 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 9966 return SemaRef.MaybeBindToTemporary(E); 9967 } 9968 9969 // FIXME: Pass in E->isListInitialization(). 9970 return getDerived().RebuildCXXTemporaryObjectExpr(T, 9971 /*FIXME:*/T->getTypeLoc().getEndLoc(), 9972 Args, 9973 E->getLocEnd()); 9974 } 9975 9976 template<typename Derived> 9977 ExprResult 9978 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 9979 // Transform any init-capture expressions before entering the scope of the 9980 // lambda body, because they are not semantically within that scope. 9981 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 9982 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 9983 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 9984 E->explicit_capture_begin()); 9985 for (LambdaExpr::capture_iterator C = E->capture_begin(), 9986 CEnd = E->capture_end(); 9987 C != CEnd; ++C) { 9988 if (!E->isInitCapture(C)) 9989 continue; 9990 EnterExpressionEvaluationContext EEEC(getSema(), 9991 Sema::PotentiallyEvaluated); 9992 ExprResult NewExprInitResult = getDerived().TransformInitializer( 9993 C->getCapturedVar()->getInit(), 9994 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 9995 9996 if (NewExprInitResult.isInvalid()) 9997 return ExprError(); 9998 Expr *NewExprInit = NewExprInitResult.get(); 9999 10000 VarDecl *OldVD = C->getCapturedVar(); 10001 QualType NewInitCaptureType = 10002 getSema().buildLambdaInitCaptureInitialization( 10003 C->getLocation(), OldVD->getType()->isReferenceType(), 10004 OldVD->getIdentifier(), 10005 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10006 NewExprInitResult = NewExprInit; 10007 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10008 std::make_pair(NewExprInitResult, NewInitCaptureType); 10009 } 10010 10011 // Transform the template parameters, and add them to the current 10012 // instantiation scope. The null case is handled correctly. 10013 auto TPL = getDerived().TransformTemplateParameterList( 10014 E->getTemplateParameterList()); 10015 10016 // Transform the type of the original lambda's call operator. 10017 // The transformation MUST be done in the CurrentInstantiationScope since 10018 // it introduces a mapping of the original to the newly created 10019 // transformed parameters. 10020 TypeSourceInfo *NewCallOpTSI = nullptr; 10021 { 10022 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10023 FunctionProtoTypeLoc OldCallOpFPTL = 10024 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 10025 10026 TypeLocBuilder NewCallOpTLBuilder; 10027 SmallVector<QualType, 4> ExceptionStorage; 10028 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 10029 QualType NewCallOpType = TransformFunctionProtoType( 10030 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 10031 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 10032 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 10033 ExceptionStorage, Changed); 10034 }); 10035 if (NewCallOpType.isNull()) 10036 return ExprError(); 10037 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 10038 NewCallOpType); 10039 } 10040 10041 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 10042 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 10043 LSI->GLTemplateParameterList = TPL; 10044 10045 // Create the local class that will describe the lambda. 10046 CXXRecordDecl *Class 10047 = getSema().createLambdaClosureType(E->getIntroducerRange(), 10048 NewCallOpTSI, 10049 /*KnownDependent=*/false, 10050 E->getCaptureDefault()); 10051 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 10052 10053 // Build the call operator. 10054 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 10055 Class, E->getIntroducerRange(), NewCallOpTSI, 10056 E->getCallOperator()->getLocEnd(), 10057 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 10058 E->getCallOperator()->isConstexpr()); 10059 10060 LSI->CallOperator = NewCallOperator; 10061 10062 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 10063 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 10064 10065 // Introduce the context of the call operator. 10066 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 10067 /*NewThisContext*/false); 10068 10069 // Enter the scope of the lambda. 10070 getSema().buildLambdaScope(LSI, NewCallOperator, 10071 E->getIntroducerRange(), 10072 E->getCaptureDefault(), 10073 E->getCaptureDefaultLoc(), 10074 E->hasExplicitParameters(), 10075 E->hasExplicitResultType(), 10076 E->isMutable()); 10077 10078 bool Invalid = false; 10079 10080 // Transform captures. 10081 bool FinishedExplicitCaptures = false; 10082 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10083 CEnd = E->capture_end(); 10084 C != CEnd; ++C) { 10085 // When we hit the first implicit capture, tell Sema that we've finished 10086 // the list of explicit captures. 10087 if (!FinishedExplicitCaptures && C->isImplicit()) { 10088 getSema().finishLambdaExplicitCaptures(LSI); 10089 FinishedExplicitCaptures = true; 10090 } 10091 10092 // Capturing 'this' is trivial. 10093 if (C->capturesThis()) { 10094 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 10095 /*BuildAndDiagnose*/ true, nullptr, 10096 C->getCaptureKind() == LCK_StarThis); 10097 continue; 10098 } 10099 // Captured expression will be recaptured during captured variables 10100 // rebuilding. 10101 if (C->capturesVLAType()) 10102 continue; 10103 10104 // Rebuild init-captures, including the implied field declaration. 10105 if (E->isInitCapture(C)) { 10106 InitCaptureInfoTy InitExprTypePair = 10107 InitCaptureExprsAndTypes[C - E->capture_begin()]; 10108 ExprResult Init = InitExprTypePair.first; 10109 QualType InitQualType = InitExprTypePair.second; 10110 if (Init.isInvalid() || InitQualType.isNull()) { 10111 Invalid = true; 10112 continue; 10113 } 10114 VarDecl *OldVD = C->getCapturedVar(); 10115 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 10116 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 10117 OldVD->getInitStyle(), Init.get()); 10118 if (!NewVD) 10119 Invalid = true; 10120 else { 10121 getDerived().transformedLocalDecl(OldVD, NewVD); 10122 } 10123 getSema().buildInitCaptureField(LSI, NewVD); 10124 continue; 10125 } 10126 10127 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 10128 10129 // Determine the capture kind for Sema. 10130 Sema::TryCaptureKind Kind 10131 = C->isImplicit()? Sema::TryCapture_Implicit 10132 : C->getCaptureKind() == LCK_ByCopy 10133 ? Sema::TryCapture_ExplicitByVal 10134 : Sema::TryCapture_ExplicitByRef; 10135 SourceLocation EllipsisLoc; 10136 if (C->isPackExpansion()) { 10137 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 10138 bool ShouldExpand = false; 10139 bool RetainExpansion = false; 10140 Optional<unsigned> NumExpansions; 10141 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 10142 C->getLocation(), 10143 Unexpanded, 10144 ShouldExpand, RetainExpansion, 10145 NumExpansions)) { 10146 Invalid = true; 10147 continue; 10148 } 10149 10150 if (ShouldExpand) { 10151 // The transform has determined that we should perform an expansion; 10152 // transform and capture each of the arguments. 10153 // expansion of the pattern. Do so. 10154 VarDecl *Pack = C->getCapturedVar(); 10155 for (unsigned I = 0; I != *NumExpansions; ++I) { 10156 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 10157 VarDecl *CapturedVar 10158 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 10159 Pack)); 10160 if (!CapturedVar) { 10161 Invalid = true; 10162 continue; 10163 } 10164 10165 // Capture the transformed variable. 10166 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 10167 } 10168 10169 // FIXME: Retain a pack expansion if RetainExpansion is true. 10170 10171 continue; 10172 } 10173 10174 EllipsisLoc = C->getEllipsisLoc(); 10175 } 10176 10177 // Transform the captured variable. 10178 VarDecl *CapturedVar 10179 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 10180 C->getCapturedVar())); 10181 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 10182 Invalid = true; 10183 continue; 10184 } 10185 10186 // Capture the transformed variable. 10187 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 10188 EllipsisLoc); 10189 } 10190 if (!FinishedExplicitCaptures) 10191 getSema().finishLambdaExplicitCaptures(LSI); 10192 10193 // Enter a new evaluation context to insulate the lambda from any 10194 // cleanups from the enclosing full-expression. 10195 getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated); 10196 10197 // Instantiate the body of the lambda expression. 10198 StmtResult Body = 10199 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 10200 10201 // ActOnLambda* will pop the function scope for us. 10202 FuncScopeCleanup.disable(); 10203 10204 if (Body.isInvalid()) { 10205 SavedContext.pop(); 10206 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr, 10207 /*IsInstantiation=*/true); 10208 return ExprError(); 10209 } 10210 10211 // Copy the LSI before ActOnFinishFunctionBody removes it. 10212 // FIXME: This is dumb. Store the lambda information somewhere that outlives 10213 // the call operator. 10214 auto LSICopy = *LSI; 10215 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 10216 /*IsInstantiation*/ true); 10217 SavedContext.pop(); 10218 10219 return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(), 10220 &LSICopy); 10221 } 10222 10223 template<typename Derived> 10224 ExprResult 10225 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 10226 CXXUnresolvedConstructExpr *E) { 10227 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10228 if (!T) 10229 return ExprError(); 10230 10231 bool ArgumentChanged = false; 10232 SmallVector<Expr*, 8> Args; 10233 Args.reserve(E->arg_size()); 10234 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 10235 &ArgumentChanged)) 10236 return ExprError(); 10237 10238 if (!getDerived().AlwaysRebuild() && 10239 T == E->getTypeSourceInfo() && 10240 !ArgumentChanged) 10241 return E; 10242 10243 // FIXME: we're faking the locations of the commas 10244 return getDerived().RebuildCXXUnresolvedConstructExpr(T, 10245 E->getLParenLoc(), 10246 Args, 10247 E->getRParenLoc()); 10248 } 10249 10250 template<typename Derived> 10251 ExprResult 10252 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 10253 CXXDependentScopeMemberExpr *E) { 10254 // Transform the base of the expression. 10255 ExprResult Base((Expr*) nullptr); 10256 Expr *OldBase; 10257 QualType BaseType; 10258 QualType ObjectType; 10259 if (!E->isImplicitAccess()) { 10260 OldBase = E->getBase(); 10261 Base = getDerived().TransformExpr(OldBase); 10262 if (Base.isInvalid()) 10263 return ExprError(); 10264 10265 // Start the member reference and compute the object's type. 10266 ParsedType ObjectTy; 10267 bool MayBePseudoDestructor = false; 10268 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10269 E->getOperatorLoc(), 10270 E->isArrow()? tok::arrow : tok::period, 10271 ObjectTy, 10272 MayBePseudoDestructor); 10273 if (Base.isInvalid()) 10274 return ExprError(); 10275 10276 ObjectType = ObjectTy.get(); 10277 BaseType = ((Expr*) Base.get())->getType(); 10278 } else { 10279 OldBase = nullptr; 10280 BaseType = getDerived().TransformType(E->getBaseType()); 10281 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 10282 } 10283 10284 // Transform the first part of the nested-name-specifier that qualifies 10285 // the member name. 10286 NamedDecl *FirstQualifierInScope 10287 = getDerived().TransformFirstQualifierInScope( 10288 E->getFirstQualifierFoundInScope(), 10289 E->getQualifierLoc().getBeginLoc()); 10290 10291 NestedNameSpecifierLoc QualifierLoc; 10292 if (E->getQualifier()) { 10293 QualifierLoc 10294 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 10295 ObjectType, 10296 FirstQualifierInScope); 10297 if (!QualifierLoc) 10298 return ExprError(); 10299 } 10300 10301 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10302 10303 // TODO: If this is a conversion-function-id, verify that the 10304 // destination type name (if present) resolves the same way after 10305 // instantiation as it did in the local scope. 10306 10307 DeclarationNameInfo NameInfo 10308 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 10309 if (!NameInfo.getName()) 10310 return ExprError(); 10311 10312 if (!E->hasExplicitTemplateArgs()) { 10313 // This is a reference to a member without an explicitly-specified 10314 // template argument list. Optimize for this common case. 10315 if (!getDerived().AlwaysRebuild() && 10316 Base.get() == OldBase && 10317 BaseType == E->getBaseType() && 10318 QualifierLoc == E->getQualifierLoc() && 10319 NameInfo.getName() == E->getMember() && 10320 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 10321 return E; 10322 10323 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 10324 BaseType, 10325 E->isArrow(), 10326 E->getOperatorLoc(), 10327 QualifierLoc, 10328 TemplateKWLoc, 10329 FirstQualifierInScope, 10330 NameInfo, 10331 /*TemplateArgs*/nullptr); 10332 } 10333 10334 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10335 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10336 E->getNumTemplateArgs(), 10337 TransArgs)) 10338 return ExprError(); 10339 10340 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 10341 BaseType, 10342 E->isArrow(), 10343 E->getOperatorLoc(), 10344 QualifierLoc, 10345 TemplateKWLoc, 10346 FirstQualifierInScope, 10347 NameInfo, 10348 &TransArgs); 10349 } 10350 10351 template<typename Derived> 10352 ExprResult 10353 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 10354 // Transform the base of the expression. 10355 ExprResult Base((Expr*) nullptr); 10356 QualType BaseType; 10357 if (!Old->isImplicitAccess()) { 10358 Base = getDerived().TransformExpr(Old->getBase()); 10359 if (Base.isInvalid()) 10360 return ExprError(); 10361 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 10362 Old->isArrow()); 10363 if (Base.isInvalid()) 10364 return ExprError(); 10365 BaseType = Base.get()->getType(); 10366 } else { 10367 BaseType = getDerived().TransformType(Old->getBaseType()); 10368 } 10369 10370 NestedNameSpecifierLoc QualifierLoc; 10371 if (Old->getQualifierLoc()) { 10372 QualifierLoc 10373 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10374 if (!QualifierLoc) 10375 return ExprError(); 10376 } 10377 10378 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10379 10380 LookupResult R(SemaRef, Old->getMemberNameInfo(), 10381 Sema::LookupOrdinaryName); 10382 10383 // Transform all the decls. 10384 for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 10385 E = Old->decls_end(); I != E; ++I) { 10386 NamedDecl *InstD = static_cast<NamedDecl*>( 10387 getDerived().TransformDecl(Old->getMemberLoc(), 10388 *I)); 10389 if (!InstD) { 10390 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10391 // This can happen because of dependent hiding. 10392 if (isa<UsingShadowDecl>(*I)) 10393 continue; 10394 else { 10395 R.clear(); 10396 return ExprError(); 10397 } 10398 } 10399 10400 // Expand using declarations. 10401 if (isa<UsingDecl>(InstD)) { 10402 UsingDecl *UD = cast<UsingDecl>(InstD); 10403 for (auto *I : UD->shadows()) 10404 R.addDecl(I); 10405 continue; 10406 } 10407 10408 R.addDecl(InstD); 10409 } 10410 10411 R.resolveKind(); 10412 10413 // Determine the naming class. 10414 if (Old->getNamingClass()) { 10415 CXXRecordDecl *NamingClass 10416 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10417 Old->getMemberLoc(), 10418 Old->getNamingClass())); 10419 if (!NamingClass) 10420 return ExprError(); 10421 10422 R.setNamingClass(NamingClass); 10423 } 10424 10425 TemplateArgumentListInfo TransArgs; 10426 if (Old->hasExplicitTemplateArgs()) { 10427 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 10428 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 10429 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10430 Old->getNumTemplateArgs(), 10431 TransArgs)) 10432 return ExprError(); 10433 } 10434 10435 // FIXME: to do this check properly, we will need to preserve the 10436 // first-qualifier-in-scope here, just in case we had a dependent 10437 // base (and therefore couldn't do the check) and a 10438 // nested-name-qualifier (and therefore could do the lookup). 10439 NamedDecl *FirstQualifierInScope = nullptr; 10440 10441 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 10442 BaseType, 10443 Old->getOperatorLoc(), 10444 Old->isArrow(), 10445 QualifierLoc, 10446 TemplateKWLoc, 10447 FirstQualifierInScope, 10448 R, 10449 (Old->hasExplicitTemplateArgs() 10450 ? &TransArgs : nullptr)); 10451 } 10452 10453 template<typename Derived> 10454 ExprResult 10455 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 10456 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 10457 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 10458 if (SubExpr.isInvalid()) 10459 return ExprError(); 10460 10461 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 10462 return E; 10463 10464 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 10465 } 10466 10467 template<typename Derived> 10468 ExprResult 10469 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 10470 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 10471 if (Pattern.isInvalid()) 10472 return ExprError(); 10473 10474 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 10475 return E; 10476 10477 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 10478 E->getNumExpansions()); 10479 } 10480 10481 template<typename Derived> 10482 ExprResult 10483 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 10484 // If E is not value-dependent, then nothing will change when we transform it. 10485 // Note: This is an instantiation-centric view. 10486 if (!E->isValueDependent()) 10487 return E; 10488 10489 EnterExpressionEvaluationContext Unevaluated(getSema(), Sema::Unevaluated); 10490 10491 ArrayRef<TemplateArgument> PackArgs; 10492 TemplateArgument ArgStorage; 10493 10494 // Find the argument list to transform. 10495 if (E->isPartiallySubstituted()) { 10496 PackArgs = E->getPartialArguments(); 10497 } else if (E->isValueDependent()) { 10498 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 10499 bool ShouldExpand = false; 10500 bool RetainExpansion = false; 10501 Optional<unsigned> NumExpansions; 10502 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 10503 Unexpanded, 10504 ShouldExpand, RetainExpansion, 10505 NumExpansions)) 10506 return ExprError(); 10507 10508 // If we need to expand the pack, build a template argument from it and 10509 // expand that. 10510 if (ShouldExpand) { 10511 auto *Pack = E->getPack(); 10512 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 10513 ArgStorage = getSema().Context.getPackExpansionType( 10514 getSema().Context.getTypeDeclType(TTPD), None); 10515 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 10516 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 10517 } else { 10518 auto *VD = cast<ValueDecl>(Pack); 10519 ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(), 10520 VK_RValue, E->getPackLoc()); 10521 if (DRE.isInvalid()) 10522 return ExprError(); 10523 ArgStorage = new (getSema().Context) PackExpansionExpr( 10524 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 10525 } 10526 PackArgs = ArgStorage; 10527 } 10528 } 10529 10530 // If we're not expanding the pack, just transform the decl. 10531 if (!PackArgs.size()) { 10532 auto *Pack = cast_or_null<NamedDecl>( 10533 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 10534 if (!Pack) 10535 return ExprError(); 10536 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 10537 E->getPackLoc(), 10538 E->getRParenLoc(), None, None); 10539 } 10540 10541 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 10542 E->getPackLoc()); 10543 { 10544 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 10545 typedef TemplateArgumentLocInventIterator< 10546 Derived, const TemplateArgument*> PackLocIterator; 10547 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 10548 PackLocIterator(*this, PackArgs.end()), 10549 TransformedPackArgs, /*Uneval*/true)) 10550 return ExprError(); 10551 } 10552 10553 SmallVector<TemplateArgument, 8> Args; 10554 bool PartialSubstitution = false; 10555 for (auto &Loc : TransformedPackArgs.arguments()) { 10556 Args.push_back(Loc.getArgument()); 10557 if (Loc.getArgument().isPackExpansion()) 10558 PartialSubstitution = true; 10559 } 10560 10561 if (PartialSubstitution) 10562 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 10563 E->getPackLoc(), 10564 E->getRParenLoc(), None, Args); 10565 10566 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 10567 E->getPackLoc(), E->getRParenLoc(), 10568 Args.size(), None); 10569 } 10570 10571 template<typename Derived> 10572 ExprResult 10573 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 10574 SubstNonTypeTemplateParmPackExpr *E) { 10575 // Default behavior is to do nothing with this transformation. 10576 return E; 10577 } 10578 10579 template<typename Derived> 10580 ExprResult 10581 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 10582 SubstNonTypeTemplateParmExpr *E) { 10583 // Default behavior is to do nothing with this transformation. 10584 return E; 10585 } 10586 10587 template<typename Derived> 10588 ExprResult 10589 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 10590 // Default behavior is to do nothing with this transformation. 10591 return E; 10592 } 10593 10594 template<typename Derived> 10595 ExprResult 10596 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 10597 MaterializeTemporaryExpr *E) { 10598 return getDerived().TransformExpr(E->GetTemporaryExpr()); 10599 } 10600 10601 template<typename Derived> 10602 ExprResult 10603 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 10604 Expr *Pattern = E->getPattern(); 10605 10606 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10607 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 10608 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 10609 10610 // Determine whether the set of unexpanded parameter packs can and should 10611 // be expanded. 10612 bool Expand = true; 10613 bool RetainExpansion = false; 10614 Optional<unsigned> NumExpansions; 10615 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 10616 Pattern->getSourceRange(), 10617 Unexpanded, 10618 Expand, RetainExpansion, 10619 NumExpansions)) 10620 return true; 10621 10622 if (!Expand) { 10623 // Do not expand any packs here, just transform and rebuild a fold 10624 // expression. 10625 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10626 10627 ExprResult LHS = 10628 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 10629 if (LHS.isInvalid()) 10630 return true; 10631 10632 ExprResult RHS = 10633 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 10634 if (RHS.isInvalid()) 10635 return true; 10636 10637 if (!getDerived().AlwaysRebuild() && 10638 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 10639 return E; 10640 10641 return getDerived().RebuildCXXFoldExpr( 10642 E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 10643 RHS.get(), E->getLocEnd()); 10644 } 10645 10646 // The transform has determined that we should perform an elementwise 10647 // expansion of the pattern. Do so. 10648 ExprResult Result = getDerived().TransformExpr(E->getInit()); 10649 if (Result.isInvalid()) 10650 return true; 10651 bool LeftFold = E->isLeftFold(); 10652 10653 // If we're retaining an expansion for a right fold, it is the innermost 10654 // component and takes the init (if any). 10655 if (!LeftFold && RetainExpansion) { 10656 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10657 10658 ExprResult Out = getDerived().TransformExpr(Pattern); 10659 if (Out.isInvalid()) 10660 return true; 10661 10662 Result = getDerived().RebuildCXXFoldExpr( 10663 E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 10664 Result.get(), E->getLocEnd()); 10665 if (Result.isInvalid()) 10666 return true; 10667 } 10668 10669 for (unsigned I = 0; I != *NumExpansions; ++I) { 10670 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 10671 getSema(), LeftFold ? I : *NumExpansions - I - 1); 10672 ExprResult Out = getDerived().TransformExpr(Pattern); 10673 if (Out.isInvalid()) 10674 return true; 10675 10676 if (Out.get()->containsUnexpandedParameterPack()) { 10677 // We still have a pack; retain a pack expansion for this slice. 10678 Result = getDerived().RebuildCXXFoldExpr( 10679 E->getLocStart(), 10680 LeftFold ? Result.get() : Out.get(), 10681 E->getOperator(), E->getEllipsisLoc(), 10682 LeftFold ? Out.get() : Result.get(), 10683 E->getLocEnd()); 10684 } else if (Result.isUsable()) { 10685 // We've got down to a single element; build a binary operator. 10686 Result = getDerived().RebuildBinaryOperator( 10687 E->getEllipsisLoc(), E->getOperator(), 10688 LeftFold ? Result.get() : Out.get(), 10689 LeftFold ? Out.get() : Result.get()); 10690 } else 10691 Result = Out; 10692 10693 if (Result.isInvalid()) 10694 return true; 10695 } 10696 10697 // If we're retaining an expansion for a left fold, it is the outermost 10698 // component and takes the complete expansion so far as its init (if any). 10699 if (LeftFold && RetainExpansion) { 10700 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10701 10702 ExprResult Out = getDerived().TransformExpr(Pattern); 10703 if (Out.isInvalid()) 10704 return true; 10705 10706 Result = getDerived().RebuildCXXFoldExpr( 10707 E->getLocStart(), Result.get(), 10708 E->getOperator(), E->getEllipsisLoc(), 10709 Out.get(), E->getLocEnd()); 10710 if (Result.isInvalid()) 10711 return true; 10712 } 10713 10714 // If we had no init and an empty pack, and we're not retaining an expansion, 10715 // then produce a fallback value or error. 10716 if (Result.isUnset()) 10717 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 10718 E->getOperator()); 10719 10720 return Result; 10721 } 10722 10723 template<typename Derived> 10724 ExprResult 10725 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 10726 CXXStdInitializerListExpr *E) { 10727 return getDerived().TransformExpr(E->getSubExpr()); 10728 } 10729 10730 template<typename Derived> 10731 ExprResult 10732 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 10733 return SemaRef.MaybeBindToTemporary(E); 10734 } 10735 10736 template<typename Derived> 10737 ExprResult 10738 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 10739 return E; 10740 } 10741 10742 template<typename Derived> 10743 ExprResult 10744 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 10745 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10746 if (SubExpr.isInvalid()) 10747 return ExprError(); 10748 10749 if (!getDerived().AlwaysRebuild() && 10750 SubExpr.get() == E->getSubExpr()) 10751 return E; 10752 10753 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 10754 } 10755 10756 template<typename Derived> 10757 ExprResult 10758 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 10759 // Transform each of the elements. 10760 SmallVector<Expr *, 8> Elements; 10761 bool ArgChanged = false; 10762 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 10763 /*IsCall=*/false, Elements, &ArgChanged)) 10764 return ExprError(); 10765 10766 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10767 return SemaRef.MaybeBindToTemporary(E); 10768 10769 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 10770 Elements.data(), 10771 Elements.size()); 10772 } 10773 10774 template<typename Derived> 10775 ExprResult 10776 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 10777 ObjCDictionaryLiteral *E) { 10778 // Transform each of the elements. 10779 SmallVector<ObjCDictionaryElement, 8> Elements; 10780 bool ArgChanged = false; 10781 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 10782 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 10783 10784 if (OrigElement.isPackExpansion()) { 10785 // This key/value element is a pack expansion. 10786 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10787 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 10788 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 10789 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 10790 10791 // Determine whether the set of unexpanded parameter packs can 10792 // and should be expanded. 10793 bool Expand = true; 10794 bool RetainExpansion = false; 10795 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 10796 Optional<unsigned> NumExpansions = OrigNumExpansions; 10797 SourceRange PatternRange(OrigElement.Key->getLocStart(), 10798 OrigElement.Value->getLocEnd()); 10799 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 10800 PatternRange, 10801 Unexpanded, 10802 Expand, RetainExpansion, 10803 NumExpansions)) 10804 return ExprError(); 10805 10806 if (!Expand) { 10807 // The transform has determined that we should perform a simple 10808 // transformation on the pack expansion, producing another pack 10809 // expansion. 10810 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10811 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 10812 if (Key.isInvalid()) 10813 return ExprError(); 10814 10815 if (Key.get() != OrigElement.Key) 10816 ArgChanged = true; 10817 10818 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 10819 if (Value.isInvalid()) 10820 return ExprError(); 10821 10822 if (Value.get() != OrigElement.Value) 10823 ArgChanged = true; 10824 10825 ObjCDictionaryElement Expansion = { 10826 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 10827 }; 10828 Elements.push_back(Expansion); 10829 continue; 10830 } 10831 10832 // Record right away that the argument was changed. This needs 10833 // to happen even if the array expands to nothing. 10834 ArgChanged = true; 10835 10836 // The transform has determined that we should perform an elementwise 10837 // expansion of the pattern. Do so. 10838 for (unsigned I = 0; I != *NumExpansions; ++I) { 10839 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 10840 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 10841 if (Key.isInvalid()) 10842 return ExprError(); 10843 10844 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 10845 if (Value.isInvalid()) 10846 return ExprError(); 10847 10848 ObjCDictionaryElement Element = { 10849 Key.get(), Value.get(), SourceLocation(), NumExpansions 10850 }; 10851 10852 // If any unexpanded parameter packs remain, we still have a 10853 // pack expansion. 10854 // FIXME: Can this really happen? 10855 if (Key.get()->containsUnexpandedParameterPack() || 10856 Value.get()->containsUnexpandedParameterPack()) 10857 Element.EllipsisLoc = OrigElement.EllipsisLoc; 10858 10859 Elements.push_back(Element); 10860 } 10861 10862 // FIXME: Retain a pack expansion if RetainExpansion is true. 10863 10864 // We've finished with this pack expansion. 10865 continue; 10866 } 10867 10868 // Transform and check key. 10869 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 10870 if (Key.isInvalid()) 10871 return ExprError(); 10872 10873 if (Key.get() != OrigElement.Key) 10874 ArgChanged = true; 10875 10876 // Transform and check value. 10877 ExprResult Value 10878 = getDerived().TransformExpr(OrigElement.Value); 10879 if (Value.isInvalid()) 10880 return ExprError(); 10881 10882 if (Value.get() != OrigElement.Value) 10883 ArgChanged = true; 10884 10885 ObjCDictionaryElement Element = { 10886 Key.get(), Value.get(), SourceLocation(), None 10887 }; 10888 Elements.push_back(Element); 10889 } 10890 10891 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10892 return SemaRef.MaybeBindToTemporary(E); 10893 10894 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 10895 Elements); 10896 } 10897 10898 template<typename Derived> 10899 ExprResult 10900 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 10901 TypeSourceInfo *EncodedTypeInfo 10902 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 10903 if (!EncodedTypeInfo) 10904 return ExprError(); 10905 10906 if (!getDerived().AlwaysRebuild() && 10907 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 10908 return E; 10909 10910 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 10911 EncodedTypeInfo, 10912 E->getRParenLoc()); 10913 } 10914 10915 template<typename Derived> 10916 ExprResult TreeTransform<Derived>:: 10917 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 10918 // This is a kind of implicit conversion, and it needs to get dropped 10919 // and recomputed for the same general reasons that ImplicitCastExprs 10920 // do, as well a more specific one: this expression is only valid when 10921 // it appears *immediately* as an argument expression. 10922 return getDerived().TransformExpr(E->getSubExpr()); 10923 } 10924 10925 template<typename Derived> 10926 ExprResult TreeTransform<Derived>:: 10927 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 10928 TypeSourceInfo *TSInfo 10929 = getDerived().TransformType(E->getTypeInfoAsWritten()); 10930 if (!TSInfo) 10931 return ExprError(); 10932 10933 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 10934 if (Result.isInvalid()) 10935 return ExprError(); 10936 10937 if (!getDerived().AlwaysRebuild() && 10938 TSInfo == E->getTypeInfoAsWritten() && 10939 Result.get() == E->getSubExpr()) 10940 return E; 10941 10942 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 10943 E->getBridgeKeywordLoc(), TSInfo, 10944 Result.get()); 10945 } 10946 10947 template<typename Derived> 10948 ExprResult 10949 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 10950 // Transform arguments. 10951 bool ArgChanged = false; 10952 SmallVector<Expr*, 8> Args; 10953 Args.reserve(E->getNumArgs()); 10954 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 10955 &ArgChanged)) 10956 return ExprError(); 10957 10958 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 10959 // Class message: transform the receiver type. 10960 TypeSourceInfo *ReceiverTypeInfo 10961 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 10962 if (!ReceiverTypeInfo) 10963 return ExprError(); 10964 10965 // If nothing changed, just retain the existing message send. 10966 if (!getDerived().AlwaysRebuild() && 10967 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 10968 return SemaRef.MaybeBindToTemporary(E); 10969 10970 // Build a new class message send. 10971 SmallVector<SourceLocation, 16> SelLocs; 10972 E->getSelectorLocs(SelLocs); 10973 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 10974 E->getSelector(), 10975 SelLocs, 10976 E->getMethodDecl(), 10977 E->getLeftLoc(), 10978 Args, 10979 E->getRightLoc()); 10980 } 10981 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 10982 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 10983 // Build a new class message send to 'super'. 10984 SmallVector<SourceLocation, 16> SelLocs; 10985 E->getSelectorLocs(SelLocs); 10986 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 10987 E->getSelector(), 10988 SelLocs, 10989 E->getReceiverType(), 10990 E->getMethodDecl(), 10991 E->getLeftLoc(), 10992 Args, 10993 E->getRightLoc()); 10994 } 10995 10996 // Instance message: transform the receiver 10997 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 10998 "Only class and instance messages may be instantiated"); 10999 ExprResult Receiver 11000 = getDerived().TransformExpr(E->getInstanceReceiver()); 11001 if (Receiver.isInvalid()) 11002 return ExprError(); 11003 11004 // If nothing changed, just retain the existing message send. 11005 if (!getDerived().AlwaysRebuild() && 11006 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 11007 return SemaRef.MaybeBindToTemporary(E); 11008 11009 // Build a new instance message send. 11010 SmallVector<SourceLocation, 16> SelLocs; 11011 E->getSelectorLocs(SelLocs); 11012 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 11013 E->getSelector(), 11014 SelLocs, 11015 E->getMethodDecl(), 11016 E->getLeftLoc(), 11017 Args, 11018 E->getRightLoc()); 11019 } 11020 11021 template<typename Derived> 11022 ExprResult 11023 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 11024 return E; 11025 } 11026 11027 template<typename Derived> 11028 ExprResult 11029 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 11030 return E; 11031 } 11032 11033 template<typename Derived> 11034 ExprResult 11035 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 11036 // Transform the base expression. 11037 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11038 if (Base.isInvalid()) 11039 return ExprError(); 11040 11041 // We don't need to transform the ivar; it will never change. 11042 11043 // If nothing changed, just retain the existing expression. 11044 if (!getDerived().AlwaysRebuild() && 11045 Base.get() == E->getBase()) 11046 return E; 11047 11048 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 11049 E->getLocation(), 11050 E->isArrow(), E->isFreeIvar()); 11051 } 11052 11053 template<typename Derived> 11054 ExprResult 11055 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 11056 // 'super' and types never change. Property never changes. Just 11057 // retain the existing expression. 11058 if (!E->isObjectReceiver()) 11059 return E; 11060 11061 // Transform the base expression. 11062 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11063 if (Base.isInvalid()) 11064 return ExprError(); 11065 11066 // We don't need to transform the property; it will never change. 11067 11068 // If nothing changed, just retain the existing expression. 11069 if (!getDerived().AlwaysRebuild() && 11070 Base.get() == E->getBase()) 11071 return E; 11072 11073 if (E->isExplicitProperty()) 11074 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 11075 E->getExplicitProperty(), 11076 E->getLocation()); 11077 11078 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 11079 SemaRef.Context.PseudoObjectTy, 11080 E->getImplicitPropertyGetter(), 11081 E->getImplicitPropertySetter(), 11082 E->getLocation()); 11083 } 11084 11085 template<typename Derived> 11086 ExprResult 11087 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 11088 // Transform the base expression. 11089 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 11090 if (Base.isInvalid()) 11091 return ExprError(); 11092 11093 // Transform the key expression. 11094 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 11095 if (Key.isInvalid()) 11096 return ExprError(); 11097 11098 // If nothing changed, just retain the existing expression. 11099 if (!getDerived().AlwaysRebuild() && 11100 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 11101 return E; 11102 11103 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 11104 Base.get(), Key.get(), 11105 E->getAtIndexMethodDecl(), 11106 E->setAtIndexMethodDecl()); 11107 } 11108 11109 template<typename Derived> 11110 ExprResult 11111 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 11112 // Transform the base expression. 11113 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11114 if (Base.isInvalid()) 11115 return ExprError(); 11116 11117 // If nothing changed, just retain the existing expression. 11118 if (!getDerived().AlwaysRebuild() && 11119 Base.get() == E->getBase()) 11120 return E; 11121 11122 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 11123 E->getOpLoc(), 11124 E->isArrow()); 11125 } 11126 11127 template<typename Derived> 11128 ExprResult 11129 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 11130 bool ArgumentChanged = false; 11131 SmallVector<Expr*, 8> SubExprs; 11132 SubExprs.reserve(E->getNumSubExprs()); 11133 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 11134 SubExprs, &ArgumentChanged)) 11135 return ExprError(); 11136 11137 if (!getDerived().AlwaysRebuild() && 11138 !ArgumentChanged) 11139 return E; 11140 11141 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 11142 SubExprs, 11143 E->getRParenLoc()); 11144 } 11145 11146 template<typename Derived> 11147 ExprResult 11148 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 11149 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 11150 if (SrcExpr.isInvalid()) 11151 return ExprError(); 11152 11153 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 11154 if (!Type) 11155 return ExprError(); 11156 11157 if (!getDerived().AlwaysRebuild() && 11158 Type == E->getTypeSourceInfo() && 11159 SrcExpr.get() == E->getSrcExpr()) 11160 return E; 11161 11162 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 11163 SrcExpr.get(), Type, 11164 E->getRParenLoc()); 11165 } 11166 11167 template<typename Derived> 11168 ExprResult 11169 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 11170 BlockDecl *oldBlock = E->getBlockDecl(); 11171 11172 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 11173 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 11174 11175 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 11176 blockScope->TheDecl->setBlockMissingReturnType( 11177 oldBlock->blockMissingReturnType()); 11178 11179 SmallVector<ParmVarDecl*, 4> params; 11180 SmallVector<QualType, 4> paramTypes; 11181 11182 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 11183 11184 // Parameter substitution. 11185 Sema::ExtParameterInfoBuilder extParamInfos; 11186 if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 11187 oldBlock->param_begin(), 11188 oldBlock->param_size(), 11189 nullptr, 11190 exprFunctionType->getExtParameterInfosOrNull(), 11191 paramTypes, ¶ms, 11192 extParamInfos)) { 11193 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 11194 return ExprError(); 11195 } 11196 11197 QualType exprResultType = 11198 getDerived().TransformType(exprFunctionType->getReturnType()); 11199 11200 auto epi = exprFunctionType->getExtProtoInfo(); 11201 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 11202 11203 QualType functionType = 11204 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 11205 blockScope->FunctionType = functionType; 11206 11207 // Set the parameters on the block decl. 11208 if (!params.empty()) 11209 blockScope->TheDecl->setParams(params); 11210 11211 if (!oldBlock->blockMissingReturnType()) { 11212 blockScope->HasImplicitReturnType = false; 11213 blockScope->ReturnType = exprResultType; 11214 } 11215 11216 // Transform the body 11217 StmtResult body = getDerived().TransformStmt(E->getBody()); 11218 if (body.isInvalid()) { 11219 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 11220 return ExprError(); 11221 } 11222 11223 #ifndef NDEBUG 11224 // In builds with assertions, make sure that we captured everything we 11225 // captured before. 11226 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 11227 for (const auto &I : oldBlock->captures()) { 11228 VarDecl *oldCapture = I.getVariable(); 11229 11230 // Ignore parameter packs. 11231 if (isa<ParmVarDecl>(oldCapture) && 11232 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 11233 continue; 11234 11235 VarDecl *newCapture = 11236 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 11237 oldCapture)); 11238 assert(blockScope->CaptureMap.count(newCapture)); 11239 } 11240 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 11241 } 11242 #endif 11243 11244 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 11245 /*Scope=*/nullptr); 11246 } 11247 11248 template<typename Derived> 11249 ExprResult 11250 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 11251 llvm_unreachable("Cannot transform asType expressions yet"); 11252 } 11253 11254 template<typename Derived> 11255 ExprResult 11256 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 11257 QualType RetTy = getDerived().TransformType(E->getType()); 11258 bool ArgumentChanged = false; 11259 SmallVector<Expr*, 8> SubExprs; 11260 SubExprs.reserve(E->getNumSubExprs()); 11261 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 11262 SubExprs, &ArgumentChanged)) 11263 return ExprError(); 11264 11265 if (!getDerived().AlwaysRebuild() && 11266 !ArgumentChanged) 11267 return E; 11268 11269 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 11270 RetTy, E->getOp(), E->getRParenLoc()); 11271 } 11272 11273 //===----------------------------------------------------------------------===// 11274 // Type reconstruction 11275 //===----------------------------------------------------------------------===// 11276 11277 template<typename Derived> 11278 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 11279 SourceLocation Star) { 11280 return SemaRef.BuildPointerType(PointeeType, Star, 11281 getDerived().getBaseEntity()); 11282 } 11283 11284 template<typename Derived> 11285 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 11286 SourceLocation Star) { 11287 return SemaRef.BuildBlockPointerType(PointeeType, Star, 11288 getDerived().getBaseEntity()); 11289 } 11290 11291 template<typename Derived> 11292 QualType 11293 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 11294 bool WrittenAsLValue, 11295 SourceLocation Sigil) { 11296 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 11297 Sigil, getDerived().getBaseEntity()); 11298 } 11299 11300 template<typename Derived> 11301 QualType 11302 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 11303 QualType ClassType, 11304 SourceLocation Sigil) { 11305 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 11306 getDerived().getBaseEntity()); 11307 } 11308 11309 template<typename Derived> 11310 QualType TreeTransform<Derived>::RebuildObjCObjectType( 11311 QualType BaseType, 11312 SourceLocation Loc, 11313 SourceLocation TypeArgsLAngleLoc, 11314 ArrayRef<TypeSourceInfo *> TypeArgs, 11315 SourceLocation TypeArgsRAngleLoc, 11316 SourceLocation ProtocolLAngleLoc, 11317 ArrayRef<ObjCProtocolDecl *> Protocols, 11318 ArrayRef<SourceLocation> ProtocolLocs, 11319 SourceLocation ProtocolRAngleLoc) { 11320 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 11321 TypeArgs, TypeArgsRAngleLoc, 11322 ProtocolLAngleLoc, Protocols, ProtocolLocs, 11323 ProtocolRAngleLoc, 11324 /*FailOnError=*/true); 11325 } 11326 11327 template<typename Derived> 11328 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 11329 QualType PointeeType, 11330 SourceLocation Star) { 11331 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 11332 } 11333 11334 template<typename Derived> 11335 QualType 11336 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 11337 ArrayType::ArraySizeModifier SizeMod, 11338 const llvm::APInt *Size, 11339 Expr *SizeExpr, 11340 unsigned IndexTypeQuals, 11341 SourceRange BracketsRange) { 11342 if (SizeExpr || !Size) 11343 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 11344 IndexTypeQuals, BracketsRange, 11345 getDerived().getBaseEntity()); 11346 11347 QualType Types[] = { 11348 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 11349 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 11350 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 11351 }; 11352 const unsigned NumTypes = llvm::array_lengthof(Types); 11353 QualType SizeType; 11354 for (unsigned I = 0; I != NumTypes; ++I) 11355 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 11356 SizeType = Types[I]; 11357 break; 11358 } 11359 11360 // Note that we can return a VariableArrayType here in the case where 11361 // the element type was a dependent VariableArrayType. 11362 IntegerLiteral *ArraySize 11363 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 11364 /*FIXME*/BracketsRange.getBegin()); 11365 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 11366 IndexTypeQuals, BracketsRange, 11367 getDerived().getBaseEntity()); 11368 } 11369 11370 template<typename Derived> 11371 QualType 11372 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 11373 ArrayType::ArraySizeModifier SizeMod, 11374 const llvm::APInt &Size, 11375 unsigned IndexTypeQuals, 11376 SourceRange BracketsRange) { 11377 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 11378 IndexTypeQuals, BracketsRange); 11379 } 11380 11381 template<typename Derived> 11382 QualType 11383 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 11384 ArrayType::ArraySizeModifier SizeMod, 11385 unsigned IndexTypeQuals, 11386 SourceRange BracketsRange) { 11387 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 11388 IndexTypeQuals, BracketsRange); 11389 } 11390 11391 template<typename Derived> 11392 QualType 11393 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 11394 ArrayType::ArraySizeModifier SizeMod, 11395 Expr *SizeExpr, 11396 unsigned IndexTypeQuals, 11397 SourceRange BracketsRange) { 11398 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 11399 SizeExpr, 11400 IndexTypeQuals, BracketsRange); 11401 } 11402 11403 template<typename Derived> 11404 QualType 11405 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 11406 ArrayType::ArraySizeModifier SizeMod, 11407 Expr *SizeExpr, 11408 unsigned IndexTypeQuals, 11409 SourceRange BracketsRange) { 11410 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 11411 SizeExpr, 11412 IndexTypeQuals, BracketsRange); 11413 } 11414 11415 template<typename Derived> 11416 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 11417 unsigned NumElements, 11418 VectorType::VectorKind VecKind) { 11419 // FIXME: semantic checking! 11420 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 11421 } 11422 11423 template<typename Derived> 11424 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 11425 unsigned NumElements, 11426 SourceLocation AttributeLoc) { 11427 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 11428 NumElements, true); 11429 IntegerLiteral *VectorSize 11430 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 11431 AttributeLoc); 11432 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 11433 } 11434 11435 template<typename Derived> 11436 QualType 11437 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 11438 Expr *SizeExpr, 11439 SourceLocation AttributeLoc) { 11440 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 11441 } 11442 11443 template<typename Derived> 11444 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 11445 QualType T, 11446 MutableArrayRef<QualType> ParamTypes, 11447 const FunctionProtoType::ExtProtoInfo &EPI) { 11448 return SemaRef.BuildFunctionType(T, ParamTypes, 11449 getDerived().getBaseLocation(), 11450 getDerived().getBaseEntity(), 11451 EPI); 11452 } 11453 11454 template<typename Derived> 11455 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 11456 return SemaRef.Context.getFunctionNoProtoType(T); 11457 } 11458 11459 template<typename Derived> 11460 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 11461 assert(D && "no decl found"); 11462 if (D->isInvalidDecl()) return QualType(); 11463 11464 // FIXME: Doesn't account for ObjCInterfaceDecl! 11465 TypeDecl *Ty; 11466 if (isa<UsingDecl>(D)) { 11467 UsingDecl *Using = cast<UsingDecl>(D); 11468 assert(Using->hasTypename() && 11469 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 11470 11471 // A valid resolved using typename decl points to exactly one type decl. 11472 assert(++Using->shadow_begin() == Using->shadow_end()); 11473 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 11474 11475 } else { 11476 assert(isa<UnresolvedUsingTypenameDecl>(D) && 11477 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 11478 Ty = cast<UnresolvedUsingTypenameDecl>(D); 11479 } 11480 11481 return SemaRef.Context.getTypeDeclType(Ty); 11482 } 11483 11484 template<typename Derived> 11485 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 11486 SourceLocation Loc) { 11487 return SemaRef.BuildTypeofExprType(E, Loc); 11488 } 11489 11490 template<typename Derived> 11491 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 11492 return SemaRef.Context.getTypeOfType(Underlying); 11493 } 11494 11495 template<typename Derived> 11496 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 11497 SourceLocation Loc) { 11498 return SemaRef.BuildDecltypeType(E, Loc); 11499 } 11500 11501 template<typename Derived> 11502 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 11503 UnaryTransformType::UTTKind UKind, 11504 SourceLocation Loc) { 11505 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 11506 } 11507 11508 template<typename Derived> 11509 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 11510 TemplateName Template, 11511 SourceLocation TemplateNameLoc, 11512 TemplateArgumentListInfo &TemplateArgs) { 11513 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 11514 } 11515 11516 template<typename Derived> 11517 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 11518 SourceLocation KWLoc) { 11519 return SemaRef.BuildAtomicType(ValueType, KWLoc); 11520 } 11521 11522 template<typename Derived> 11523 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 11524 SourceLocation KWLoc) { 11525 return SemaRef.BuildPipeType(ValueType, KWLoc); 11526 } 11527 11528 template<typename Derived> 11529 TemplateName 11530 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 11531 bool TemplateKW, 11532 TemplateDecl *Template) { 11533 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 11534 Template); 11535 } 11536 11537 template<typename Derived> 11538 TemplateName 11539 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 11540 const IdentifierInfo &Name, 11541 SourceLocation NameLoc, 11542 QualType ObjectType, 11543 NamedDecl *FirstQualifierInScope) { 11544 UnqualifiedId TemplateName; 11545 TemplateName.setIdentifier(&Name, NameLoc); 11546 Sema::TemplateTy Template; 11547 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 11548 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 11549 SS, TemplateKWLoc, TemplateName, 11550 ParsedType::make(ObjectType), 11551 /*EnteringContext=*/false, 11552 Template); 11553 return Template.get(); 11554 } 11555 11556 template<typename Derived> 11557 TemplateName 11558 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 11559 OverloadedOperatorKind Operator, 11560 SourceLocation NameLoc, 11561 QualType ObjectType) { 11562 UnqualifiedId Name; 11563 // FIXME: Bogus location information. 11564 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 11565 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 11566 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 11567 Sema::TemplateTy Template; 11568 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 11569 SS, TemplateKWLoc, Name, 11570 ParsedType::make(ObjectType), 11571 /*EnteringContext=*/false, 11572 Template); 11573 return Template.get(); 11574 } 11575 11576 template<typename Derived> 11577 ExprResult 11578 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 11579 SourceLocation OpLoc, 11580 Expr *OrigCallee, 11581 Expr *First, 11582 Expr *Second) { 11583 Expr *Callee = OrigCallee->IgnoreParenCasts(); 11584 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 11585 11586 if (First->getObjectKind() == OK_ObjCProperty) { 11587 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 11588 if (BinaryOperator::isAssignmentOp(Opc)) 11589 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 11590 First, Second); 11591 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 11592 if (Result.isInvalid()) 11593 return ExprError(); 11594 First = Result.get(); 11595 } 11596 11597 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 11598 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 11599 if (Result.isInvalid()) 11600 return ExprError(); 11601 Second = Result.get(); 11602 } 11603 11604 // Determine whether this should be a builtin operation. 11605 if (Op == OO_Subscript) { 11606 if (!First->getType()->isOverloadableType() && 11607 !Second->getType()->isOverloadableType()) 11608 return getSema().CreateBuiltinArraySubscriptExpr(First, 11609 Callee->getLocStart(), 11610 Second, OpLoc); 11611 } else if (Op == OO_Arrow) { 11612 // -> is never a builtin operation. 11613 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 11614 } else if (Second == nullptr || isPostIncDec) { 11615 if (!First->getType()->isOverloadableType()) { 11616 // The argument is not of overloadable type, so try to create a 11617 // built-in unary operation. 11618 UnaryOperatorKind Opc 11619 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 11620 11621 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 11622 } 11623 } else { 11624 if (!First->getType()->isOverloadableType() && 11625 !Second->getType()->isOverloadableType()) { 11626 // Neither of the arguments is an overloadable type, so try to 11627 // create a built-in binary operation. 11628 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 11629 ExprResult Result 11630 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 11631 if (Result.isInvalid()) 11632 return ExprError(); 11633 11634 return Result; 11635 } 11636 } 11637 11638 // Compute the transformed set of functions (and function templates) to be 11639 // used during overload resolution. 11640 UnresolvedSet<16> Functions; 11641 11642 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 11643 assert(ULE->requiresADL()); 11644 Functions.append(ULE->decls_begin(), ULE->decls_end()); 11645 } else { 11646 // If we've resolved this to a particular non-member function, just call 11647 // that function. If we resolved it to a member function, 11648 // CreateOverloaded* will find that function for us. 11649 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 11650 if (!isa<CXXMethodDecl>(ND)) 11651 Functions.addDecl(ND); 11652 } 11653 11654 // Add any functions found via argument-dependent lookup. 11655 Expr *Args[2] = { First, Second }; 11656 unsigned NumArgs = 1 + (Second != nullptr); 11657 11658 // Create the overloaded operator invocation for unary operators. 11659 if (NumArgs == 1 || isPostIncDec) { 11660 UnaryOperatorKind Opc 11661 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 11662 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 11663 } 11664 11665 if (Op == OO_Subscript) { 11666 SourceLocation LBrace; 11667 SourceLocation RBrace; 11668 11669 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 11670 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 11671 LBrace = SourceLocation::getFromRawEncoding( 11672 NameLoc.CXXOperatorName.BeginOpNameLoc); 11673 RBrace = SourceLocation::getFromRawEncoding( 11674 NameLoc.CXXOperatorName.EndOpNameLoc); 11675 } else { 11676 LBrace = Callee->getLocStart(); 11677 RBrace = OpLoc; 11678 } 11679 11680 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 11681 First, Second); 11682 } 11683 11684 // Create the overloaded operator invocation for binary operators. 11685 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 11686 ExprResult Result 11687 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 11688 if (Result.isInvalid()) 11689 return ExprError(); 11690 11691 return Result; 11692 } 11693 11694 template<typename Derived> 11695 ExprResult 11696 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 11697 SourceLocation OperatorLoc, 11698 bool isArrow, 11699 CXXScopeSpec &SS, 11700 TypeSourceInfo *ScopeType, 11701 SourceLocation CCLoc, 11702 SourceLocation TildeLoc, 11703 PseudoDestructorTypeStorage Destroyed) { 11704 QualType BaseType = Base->getType(); 11705 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 11706 (!isArrow && !BaseType->getAs<RecordType>()) || 11707 (isArrow && BaseType->getAs<PointerType>() && 11708 !BaseType->getAs<PointerType>()->getPointeeType() 11709 ->template getAs<RecordType>())){ 11710 // This pseudo-destructor expression is still a pseudo-destructor. 11711 return SemaRef.BuildPseudoDestructorExpr( 11712 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 11713 CCLoc, TildeLoc, Destroyed); 11714 } 11715 11716 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 11717 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 11718 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 11719 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 11720 NameInfo.setNamedTypeInfo(DestroyedType); 11721 11722 // The scope type is now known to be a valid nested name specifier 11723 // component. Tack it on to the end of the nested name specifier. 11724 if (ScopeType) { 11725 if (!ScopeType->getType()->getAs<TagType>()) { 11726 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 11727 diag::err_expected_class_or_namespace) 11728 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 11729 return ExprError(); 11730 } 11731 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 11732 CCLoc); 11733 } 11734 11735 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 11736 return getSema().BuildMemberReferenceExpr(Base, BaseType, 11737 OperatorLoc, isArrow, 11738 SS, TemplateKWLoc, 11739 /*FIXME: FirstQualifier*/ nullptr, 11740 NameInfo, 11741 /*TemplateArgs*/ nullptr, 11742 /*S*/nullptr); 11743 } 11744 11745 template<typename Derived> 11746 StmtResult 11747 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 11748 SourceLocation Loc = S->getLocStart(); 11749 CapturedDecl *CD = S->getCapturedDecl(); 11750 unsigned NumParams = CD->getNumParams(); 11751 unsigned ContextParamPos = CD->getContextParamPosition(); 11752 SmallVector<Sema::CapturedParamNameType, 4> Params; 11753 for (unsigned I = 0; I < NumParams; ++I) { 11754 if (I != ContextParamPos) { 11755 Params.push_back( 11756 std::make_pair( 11757 CD->getParam(I)->getName(), 11758 getDerived().TransformType(CD->getParam(I)->getType()))); 11759 } else { 11760 Params.push_back(std::make_pair(StringRef(), QualType())); 11761 } 11762 } 11763 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 11764 S->getCapturedRegionKind(), Params); 11765 StmtResult Body; 11766 { 11767 Sema::CompoundScopeRAII CompoundScope(getSema()); 11768 Body = getDerived().TransformStmt(S->getCapturedStmt()); 11769 } 11770 11771 if (Body.isInvalid()) { 11772 getSema().ActOnCapturedRegionError(); 11773 return StmtError(); 11774 } 11775 11776 return getSema().ActOnCapturedRegionEnd(Body.get()); 11777 } 11778 11779 } // end namespace clang 11780 11781 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 11782