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