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