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