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