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