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