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