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