1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 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 /// 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 /// overriding 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 /// 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 /// 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 /// Initializes a new tree transformer. 123 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 124 125 /// Retrieves a reference to the derived class. 126 Derived &getDerived() { return static_cast<Derived&>(*this); } 127 128 /// 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 /// Retrieves a reference to the semantic analysis object used for 137 /// this tree transform. 138 Sema &getSema() const { return SemaRef; } 139 140 /// 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 /// 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 /// 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 /// 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 /// 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 /// 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 /// 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 /// 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 /// "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 /// "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 /// Note to the derived class when a function parameter pack is 280 /// being expanded. 281 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 282 283 /// 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 /// 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 /// 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 /// Transform a type that is permitted to produce a 311 /// DeducedTemplateSpecializationType. 312 /// 313 /// This is used in the (relatively rare) contexts where it is acceptable 314 /// for transformation to produce a class template type with deduced 315 /// template arguments. 316 /// @{ 317 QualType TransformTypeWithDeducedTST(QualType T); 318 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 319 /// @} 320 321 /// The reason why the value of a statement is not discarded, if any. 322 enum StmtDiscardKind { 323 SDK_Discarded, 324 SDK_NotDiscarded, 325 SDK_StmtExprResult, 326 }; 327 328 /// Transform the given statement. 329 /// 330 /// By default, this routine transforms a statement by delegating to the 331 /// appropriate TransformXXXStmt function to transform a specific kind of 332 /// statement or the TransformExpr() function to transform an expression. 333 /// Subclasses may override this function to transform statements using some 334 /// other mechanism. 335 /// 336 /// \returns the transformed statement. 337 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 338 339 /// Transform the given statement. 340 /// 341 /// By default, this routine transforms a statement by delegating to the 342 /// appropriate TransformOMPXXXClause function to transform a specific kind 343 /// of clause. Subclasses may override this function to transform statements 344 /// using some other mechanism. 345 /// 346 /// \returns the transformed OpenMP clause. 347 OMPClause *TransformOMPClause(OMPClause *S); 348 349 /// Transform the given attribute. 350 /// 351 /// By default, this routine transforms a statement by delegating to the 352 /// appropriate TransformXXXAttr function to transform a specific kind 353 /// of attribute. Subclasses may override this function to transform 354 /// attributed statements using some other mechanism. 355 /// 356 /// \returns the transformed attribute 357 const Attr *TransformAttr(const Attr *S); 358 359 /// Transform the specified attribute. 360 /// 361 /// Subclasses should override the transformation of attributes with a pragma 362 /// spelling to transform expressions stored within the attribute. 363 /// 364 /// \returns the transformed attribute. 365 #define ATTR(X) 366 #define PRAGMA_SPELLING_ATTR(X) \ 367 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 368 #include "clang/Basic/AttrList.inc" 369 370 /// Transform the given expression. 371 /// 372 /// By default, this routine transforms an expression by delegating to the 373 /// appropriate TransformXXXExpr function to build a new expression. 374 /// Subclasses may override this function to transform expressions using some 375 /// other mechanism. 376 /// 377 /// \returns the transformed expression. 378 ExprResult TransformExpr(Expr *E); 379 380 /// Transform the given initializer. 381 /// 382 /// By default, this routine transforms an initializer by stripping off the 383 /// semantic nodes added by initialization, then passing the result to 384 /// TransformExpr or TransformExprs. 385 /// 386 /// \returns the transformed initializer. 387 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 388 389 /// Transform the given list of expressions. 390 /// 391 /// This routine transforms a list of expressions by invoking 392 /// \c TransformExpr() for each subexpression. However, it also provides 393 /// support for variadic templates by expanding any pack expansions (if the 394 /// derived class permits such expansion) along the way. When pack expansions 395 /// are present, the number of outputs may not equal the number of inputs. 396 /// 397 /// \param Inputs The set of expressions to be transformed. 398 /// 399 /// \param NumInputs The number of expressions in \c Inputs. 400 /// 401 /// \param IsCall If \c true, then this transform is being performed on 402 /// function-call arguments, and any arguments that should be dropped, will 403 /// be. 404 /// 405 /// \param Outputs The transformed input expressions will be added to this 406 /// vector. 407 /// 408 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 409 /// due to transformation. 410 /// 411 /// \returns true if an error occurred, false otherwise. 412 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 413 SmallVectorImpl<Expr *> &Outputs, 414 bool *ArgChanged = nullptr); 415 416 /// Transform the given declaration, which is referenced from a type 417 /// or expression. 418 /// 419 /// By default, acts as the identity function on declarations, unless the 420 /// transformer has had to transform the declaration itself. Subclasses 421 /// may override this function to provide alternate behavior. 422 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 423 llvm::DenseMap<Decl *, Decl *>::iterator Known 424 = TransformedLocalDecls.find(D); 425 if (Known != TransformedLocalDecls.end()) 426 return Known->second; 427 428 return D; 429 } 430 431 /// Transform the specified condition. 432 /// 433 /// By default, this transforms the variable and expression and rebuilds 434 /// the condition. 435 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 436 Expr *Expr, 437 Sema::ConditionKind Kind); 438 439 /// Transform the attributes associated with the given declaration and 440 /// place them on the new declaration. 441 /// 442 /// By default, this operation does nothing. Subclasses may override this 443 /// behavior to transform attributes. 444 void transformAttrs(Decl *Old, Decl *New) { } 445 446 /// Note that a local declaration has been transformed by this 447 /// transformer. 448 /// 449 /// Local declarations are typically transformed via a call to 450 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 451 /// the transformer itself has to transform the declarations. This routine 452 /// can be overridden by a subclass that keeps track of such mappings. 453 void transformedLocalDecl(Decl *Old, Decl *New) { 454 TransformedLocalDecls[Old] = New; 455 } 456 457 /// Transform the definition of the given declaration. 458 /// 459 /// By default, invokes TransformDecl() to transform the declaration. 460 /// Subclasses may override this function to provide alternate behavior. 461 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 462 return getDerived().TransformDecl(Loc, D); 463 } 464 465 /// Transform the given declaration, which was the first part of a 466 /// nested-name-specifier in a member access expression. 467 /// 468 /// This specific declaration transformation only applies to the first 469 /// identifier in a nested-name-specifier of a member access expression, e.g., 470 /// the \c T in \c x->T::member 471 /// 472 /// By default, invokes TransformDecl() to transform the declaration. 473 /// Subclasses may override this function to provide alternate behavior. 474 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 475 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 476 } 477 478 /// Transform the set of declarations in an OverloadExpr. 479 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 480 LookupResult &R); 481 482 /// Transform the given nested-name-specifier with source-location 483 /// information. 484 /// 485 /// By default, transforms all of the types and declarations within the 486 /// nested-name-specifier. Subclasses may override this function to provide 487 /// alternate behavior. 488 NestedNameSpecifierLoc 489 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 490 QualType ObjectType = QualType(), 491 NamedDecl *FirstQualifierInScope = nullptr); 492 493 /// Transform the given declaration name. 494 /// 495 /// By default, transforms the types of conversion function, constructor, 496 /// and destructor names and then (if needed) rebuilds the declaration name. 497 /// Identifiers and selectors are returned unmodified. Sublcasses may 498 /// override this function to provide alternate behavior. 499 DeclarationNameInfo 500 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 501 502 /// Transform the given template name. 503 /// 504 /// \param SS The nested-name-specifier that qualifies the template 505 /// name. This nested-name-specifier must already have been transformed. 506 /// 507 /// \param Name The template name to transform. 508 /// 509 /// \param NameLoc The source location of the template name. 510 /// 511 /// \param ObjectType If we're translating a template name within a member 512 /// access expression, this is the type of the object whose member template 513 /// is being referenced. 514 /// 515 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 516 /// also refers to a name within the current (lexical) scope, this is the 517 /// declaration it refers to. 518 /// 519 /// By default, transforms the template name by transforming the declarations 520 /// and nested-name-specifiers that occur within the template name. 521 /// Subclasses may override this function to provide alternate behavior. 522 TemplateName 523 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 524 SourceLocation NameLoc, 525 QualType ObjectType = QualType(), 526 NamedDecl *FirstQualifierInScope = nullptr, 527 bool AllowInjectedClassName = false); 528 529 /// Transform the given template argument. 530 /// 531 /// By default, this operation transforms the type, expression, or 532 /// declaration stored within the template argument and constructs a 533 /// new template argument from the transformed result. Subclasses may 534 /// override this function to provide alternate behavior. 535 /// 536 /// Returns true if there was an error. 537 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 538 TemplateArgumentLoc &Output, 539 bool Uneval = false); 540 541 /// Transform the given set of template arguments. 542 /// 543 /// By default, this operation transforms all of the template arguments 544 /// in the input set using \c TransformTemplateArgument(), and appends 545 /// the transformed arguments to the output list. 546 /// 547 /// Note that this overload of \c TransformTemplateArguments() is merely 548 /// a convenience function. Subclasses that wish to override this behavior 549 /// should override the iterator-based member template version. 550 /// 551 /// \param Inputs The set of template arguments to be transformed. 552 /// 553 /// \param NumInputs The number of template arguments in \p Inputs. 554 /// 555 /// \param Outputs The set of transformed template arguments output by this 556 /// routine. 557 /// 558 /// Returns true if an error occurred. 559 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 560 unsigned NumInputs, 561 TemplateArgumentListInfo &Outputs, 562 bool Uneval = false) { 563 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 564 Uneval); 565 } 566 567 /// Transform the given set of template arguments. 568 /// 569 /// By default, this operation transforms all of the template arguments 570 /// in the input set using \c TransformTemplateArgument(), and appends 571 /// the transformed arguments to the output list. 572 /// 573 /// \param First An iterator to the first template argument. 574 /// 575 /// \param Last An iterator one step past the last template argument. 576 /// 577 /// \param Outputs The set of transformed template arguments output by this 578 /// routine. 579 /// 580 /// Returns true if an error occurred. 581 template<typename InputIterator> 582 bool TransformTemplateArguments(InputIterator First, 583 InputIterator Last, 584 TemplateArgumentListInfo &Outputs, 585 bool Uneval = false); 586 587 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 588 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 589 TemplateArgumentLoc &ArgLoc); 590 591 /// Fakes up a TypeSourceInfo for a type. 592 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 593 return SemaRef.Context.getTrivialTypeSourceInfo(T, 594 getDerived().getBaseLocation()); 595 } 596 597 #define ABSTRACT_TYPELOC(CLASS, PARENT) 598 #define TYPELOC(CLASS, PARENT) \ 599 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 600 #include "clang/AST/TypeLocNodes.def" 601 602 template<typename Fn> 603 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 604 FunctionProtoTypeLoc TL, 605 CXXRecordDecl *ThisContext, 606 Qualifiers ThisTypeQuals, 607 Fn TransformExceptionSpec); 608 609 bool TransformExceptionSpec(SourceLocation Loc, 610 FunctionProtoType::ExceptionSpecInfo &ESI, 611 SmallVectorImpl<QualType> &Exceptions, 612 bool &Changed); 613 614 StmtResult TransformSEHHandler(Stmt *Handler); 615 616 QualType 617 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 618 TemplateSpecializationTypeLoc TL, 619 TemplateName Template); 620 621 QualType 622 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 623 DependentTemplateSpecializationTypeLoc TL, 624 TemplateName Template, 625 CXXScopeSpec &SS); 626 627 QualType TransformDependentTemplateSpecializationType( 628 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 629 NestedNameSpecifierLoc QualifierLoc); 630 631 /// Transforms the parameters of a function type into the 632 /// given vectors. 633 /// 634 /// The result vectors should be kept in sync; null entries in the 635 /// variables vector are acceptable. 636 /// 637 /// Return true on error. 638 bool TransformFunctionTypeParams( 639 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 640 const QualType *ParamTypes, 641 const FunctionProtoType::ExtParameterInfo *ParamInfos, 642 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 643 Sema::ExtParameterInfoBuilder &PInfos); 644 645 /// Transforms a single function-type parameter. Return null 646 /// on error. 647 /// 648 /// \param indexAdjustment - A number to add to the parameter's 649 /// scope index; can be negative 650 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 651 int indexAdjustment, 652 Optional<unsigned> NumExpansions, 653 bool ExpectParameterPack); 654 655 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 656 657 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 658 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 659 660 TemplateParameterList *TransformTemplateParameterList( 661 TemplateParameterList *TPL) { 662 return TPL; 663 } 664 665 ExprResult TransformAddressOfOperand(Expr *E); 666 667 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 668 bool IsAddressOfOperand, 669 TypeSourceInfo **RecoveryTSI); 670 671 ExprResult TransformParenDependentScopeDeclRefExpr( 672 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 673 TypeSourceInfo **RecoveryTSI); 674 675 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 676 677 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 678 // amount of stack usage with clang. 679 #define STMT(Node, Parent) \ 680 LLVM_ATTRIBUTE_NOINLINE \ 681 StmtResult Transform##Node(Node *S); 682 #define VALUESTMT(Node, Parent) \ 683 LLVM_ATTRIBUTE_NOINLINE \ 684 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 685 #define EXPR(Node, Parent) \ 686 LLVM_ATTRIBUTE_NOINLINE \ 687 ExprResult Transform##Node(Node *E); 688 #define ABSTRACT_STMT(Stmt) 689 #include "clang/AST/StmtNodes.inc" 690 691 #define OPENMP_CLAUSE(Name, Class) \ 692 LLVM_ATTRIBUTE_NOINLINE \ 693 OMPClause *Transform ## Class(Class *S); 694 #include "clang/Basic/OpenMPKinds.def" 695 696 /// Build a new qualified type given its unqualified type and type location. 697 /// 698 /// By default, this routine adds type qualifiers only to types that can 699 /// have qualifiers, and silently suppresses those qualifiers that are not 700 /// permitted. Subclasses may override this routine to provide different 701 /// behavior. 702 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 703 704 /// Build a new pointer type given its pointee type. 705 /// 706 /// By default, performs semantic analysis when building the pointer type. 707 /// Subclasses may override this routine to provide different behavior. 708 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 709 710 /// Build a new block pointer type given its pointee type. 711 /// 712 /// By default, performs semantic analysis when building the block pointer 713 /// type. Subclasses may override this routine to provide different behavior. 714 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 715 716 /// Build a new reference type given the type it references. 717 /// 718 /// By default, performs semantic analysis when building the 719 /// reference type. Subclasses may override this routine to provide 720 /// different behavior. 721 /// 722 /// \param LValue whether the type was written with an lvalue sigil 723 /// or an rvalue sigil. 724 QualType RebuildReferenceType(QualType ReferentType, 725 bool LValue, 726 SourceLocation Sigil); 727 728 /// Build a new member pointer type given the pointee type and the 729 /// class type it refers into. 730 /// 731 /// By default, performs semantic analysis when building the member pointer 732 /// type. Subclasses may override this routine to provide different behavior. 733 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 734 SourceLocation Sigil); 735 736 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 737 SourceLocation ProtocolLAngleLoc, 738 ArrayRef<ObjCProtocolDecl *> Protocols, 739 ArrayRef<SourceLocation> ProtocolLocs, 740 SourceLocation ProtocolRAngleLoc); 741 742 /// Build an Objective-C object type. 743 /// 744 /// By default, performs semantic analysis when building the object type. 745 /// Subclasses may override this routine to provide different behavior. 746 QualType RebuildObjCObjectType(QualType BaseType, 747 SourceLocation Loc, 748 SourceLocation TypeArgsLAngleLoc, 749 ArrayRef<TypeSourceInfo *> TypeArgs, 750 SourceLocation TypeArgsRAngleLoc, 751 SourceLocation ProtocolLAngleLoc, 752 ArrayRef<ObjCProtocolDecl *> Protocols, 753 ArrayRef<SourceLocation> ProtocolLocs, 754 SourceLocation ProtocolRAngleLoc); 755 756 /// Build a new Objective-C object pointer type given the pointee type. 757 /// 758 /// By default, directly builds the pointer type, with no additional semantic 759 /// analysis. 760 QualType RebuildObjCObjectPointerType(QualType PointeeType, 761 SourceLocation Star); 762 763 /// Build a new array type given the element type, size 764 /// modifier, size of the array (if known), size expression, and index type 765 /// qualifiers. 766 /// 767 /// By default, performs semantic analysis when building the array type. 768 /// Subclasses may override this routine to provide different behavior. 769 /// Also by default, all of the other Rebuild*Array 770 QualType RebuildArrayType(QualType ElementType, 771 ArrayType::ArraySizeModifier SizeMod, 772 const llvm::APInt *Size, 773 Expr *SizeExpr, 774 unsigned IndexTypeQuals, 775 SourceRange BracketsRange); 776 777 /// Build a new constant array type given the element type, size 778 /// modifier, (known) size of the array, and index type qualifiers. 779 /// 780 /// By default, performs semantic analysis when building the array type. 781 /// Subclasses may override this routine to provide different behavior. 782 QualType RebuildConstantArrayType(QualType ElementType, 783 ArrayType::ArraySizeModifier SizeMod, 784 const llvm::APInt &Size, 785 unsigned IndexTypeQuals, 786 SourceRange BracketsRange); 787 788 /// Build a new incomplete array type given the element type, size 789 /// modifier, and index type qualifiers. 790 /// 791 /// By default, performs semantic analysis when building the array type. 792 /// Subclasses may override this routine to provide different behavior. 793 QualType RebuildIncompleteArrayType(QualType ElementType, 794 ArrayType::ArraySizeModifier SizeMod, 795 unsigned IndexTypeQuals, 796 SourceRange BracketsRange); 797 798 /// Build a new variable-length array type given the element type, 799 /// size modifier, size expression, and index type qualifiers. 800 /// 801 /// By default, performs semantic analysis when building the array type. 802 /// Subclasses may override this routine to provide different behavior. 803 QualType RebuildVariableArrayType(QualType ElementType, 804 ArrayType::ArraySizeModifier SizeMod, 805 Expr *SizeExpr, 806 unsigned IndexTypeQuals, 807 SourceRange BracketsRange); 808 809 /// Build a new dependent-sized array type given the element type, 810 /// size modifier, size expression, and index type qualifiers. 811 /// 812 /// By default, performs semantic analysis when building the array type. 813 /// Subclasses may override this routine to provide different behavior. 814 QualType RebuildDependentSizedArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 Expr *SizeExpr, 817 unsigned IndexTypeQuals, 818 SourceRange BracketsRange); 819 820 /// Build a new vector type given the element type and 821 /// number of elements. 822 /// 823 /// By default, performs semantic analysis when building the vector type. 824 /// Subclasses may override this routine to provide different behavior. 825 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 826 VectorType::VectorKind VecKind); 827 828 /// Build a new potentially dependently-sized extended vector type 829 /// given the element type and number of elements. 830 /// 831 /// By default, performs semantic analysis when building the vector type. 832 /// Subclasses may override this routine to provide different behavior. 833 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 834 SourceLocation AttributeLoc, 835 VectorType::VectorKind); 836 837 /// Build a new extended vector type given the element type and 838 /// number of elements. 839 /// 840 /// By default, performs semantic analysis when building the vector type. 841 /// Subclasses may override this routine to provide different behavior. 842 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 843 SourceLocation AttributeLoc); 844 845 /// Build a new potentially dependently-sized extended vector type 846 /// given the element type and number of elements. 847 /// 848 /// By default, performs semantic analysis when building the vector type. 849 /// Subclasses may override this routine to provide different behavior. 850 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 851 Expr *SizeExpr, 852 SourceLocation AttributeLoc); 853 854 /// Build a new DependentAddressSpaceType or return the pointee 855 /// type variable with the correct address space (retrieved from 856 /// AddrSpaceExpr) applied to it. The former will be returned in cases 857 /// where the address space remains dependent. 858 /// 859 /// By default, performs semantic analysis when building the type with address 860 /// space applied. Subclasses may override this routine to provide different 861 /// behavior. 862 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 863 Expr *AddrSpaceExpr, 864 SourceLocation AttributeLoc); 865 866 /// Build a new function type. 867 /// 868 /// By default, performs semantic analysis when building the function type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildFunctionProtoType(QualType T, 871 MutableArrayRef<QualType> ParamTypes, 872 const FunctionProtoType::ExtProtoInfo &EPI); 873 874 /// Build a new unprototyped function type. 875 QualType RebuildFunctionNoProtoType(QualType ResultType); 876 877 /// Rebuild an unresolved typename type, given the decl that 878 /// the UnresolvedUsingTypenameDecl was transformed to. 879 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 880 881 /// Build a new typedef type. 882 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 883 return SemaRef.Context.getTypeDeclType(Typedef); 884 } 885 886 /// Build a new class/struct/union type. 887 QualType RebuildRecordType(RecordDecl *Record) { 888 return SemaRef.Context.getTypeDeclType(Record); 889 } 890 891 /// Build a new Enum type. 892 QualType RebuildEnumType(EnumDecl *Enum) { 893 return SemaRef.Context.getTypeDeclType(Enum); 894 } 895 896 /// Build a new typeof(expr) type. 897 /// 898 /// By default, performs semantic analysis when building the typeof type. 899 /// Subclasses may override this routine to provide different behavior. 900 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 901 902 /// Build a new typeof(type) type. 903 /// 904 /// By default, builds a new TypeOfType with the given underlying type. 905 QualType RebuildTypeOfType(QualType Underlying); 906 907 /// Build a new unary transform type. 908 QualType RebuildUnaryTransformType(QualType BaseType, 909 UnaryTransformType::UTTKind UKind, 910 SourceLocation Loc); 911 912 /// Build a new C++11 decltype type. 913 /// 914 /// By default, performs semantic analysis when building the decltype type. 915 /// Subclasses may override this routine to provide different behavior. 916 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 917 918 /// Build a new C++11 auto type. 919 /// 920 /// By default, builds a new AutoType with the given deduced type. 921 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 922 // Note, IsDependent is always false here: we implicitly convert an 'auto' 923 // which has been deduced to a dependent type into an undeduced 'auto', so 924 // that we'll retry deduction after the transformation. 925 return SemaRef.Context.getAutoType(Deduced, Keyword, 926 /*IsDependent*/ false); 927 } 928 929 /// By default, builds a new DeducedTemplateSpecializationType with the given 930 /// deduced type. 931 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 932 QualType Deduced) { 933 return SemaRef.Context.getDeducedTemplateSpecializationType( 934 Template, Deduced, /*IsDependent*/ false); 935 } 936 937 /// Build a new template specialization type. 938 /// 939 /// By default, performs semantic analysis when building the template 940 /// specialization type. Subclasses may override this routine to provide 941 /// different behavior. 942 QualType RebuildTemplateSpecializationType(TemplateName Template, 943 SourceLocation TemplateLoc, 944 TemplateArgumentListInfo &Args); 945 946 /// Build a new parenthesized type. 947 /// 948 /// By default, builds a new ParenType type from the inner type. 949 /// Subclasses may override this routine to provide different behavior. 950 QualType RebuildParenType(QualType InnerType) { 951 return SemaRef.BuildParenType(InnerType); 952 } 953 954 /// Build a new qualified name type. 955 /// 956 /// By default, builds a new ElaboratedType type from the keyword, 957 /// the nested-name-specifier and the named type. 958 /// Subclasses may override this routine to provide different behavior. 959 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 960 ElaboratedTypeKeyword Keyword, 961 NestedNameSpecifierLoc QualifierLoc, 962 QualType Named) { 963 return SemaRef.Context.getElaboratedType(Keyword, 964 QualifierLoc.getNestedNameSpecifier(), 965 Named); 966 } 967 968 /// Build a new typename type that refers to a template-id. 969 /// 970 /// By default, builds a new DependentNameType type from the 971 /// nested-name-specifier and the given type. Subclasses may override 972 /// this routine to provide different behavior. 973 QualType RebuildDependentTemplateSpecializationType( 974 ElaboratedTypeKeyword Keyword, 975 NestedNameSpecifierLoc QualifierLoc, 976 SourceLocation TemplateKWLoc, 977 const IdentifierInfo *Name, 978 SourceLocation NameLoc, 979 TemplateArgumentListInfo &Args, 980 bool AllowInjectedClassName) { 981 // Rebuild the template name. 982 // TODO: avoid TemplateName abstraction 983 CXXScopeSpec SS; 984 SS.Adopt(QualifierLoc); 985 TemplateName InstName = getDerived().RebuildTemplateName( 986 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 987 AllowInjectedClassName); 988 989 if (InstName.isNull()) 990 return QualType(); 991 992 // If it's still dependent, make a dependent specialization. 993 if (InstName.getAsDependentTemplateName()) 994 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 995 QualifierLoc.getNestedNameSpecifier(), 996 Name, 997 Args); 998 999 // Otherwise, make an elaborated type wrapping a non-dependent 1000 // specialization. 1001 QualType T = 1002 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1003 if (T.isNull()) return QualType(); 1004 1005 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1006 return T; 1007 1008 return SemaRef.Context.getElaboratedType(Keyword, 1009 QualifierLoc.getNestedNameSpecifier(), 1010 T); 1011 } 1012 1013 /// Build a new typename type that refers to an identifier. 1014 /// 1015 /// By default, performs semantic analysis when building the typename type 1016 /// (or elaborated type). Subclasses may override this routine to provide 1017 /// different behavior. 1018 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1019 SourceLocation KeywordLoc, 1020 NestedNameSpecifierLoc QualifierLoc, 1021 const IdentifierInfo *Id, 1022 SourceLocation IdLoc, 1023 bool DeducedTSTContext) { 1024 CXXScopeSpec SS; 1025 SS.Adopt(QualifierLoc); 1026 1027 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1028 // If the name is still dependent, just build a new dependent name type. 1029 if (!SemaRef.computeDeclContext(SS)) 1030 return SemaRef.Context.getDependentNameType(Keyword, 1031 QualifierLoc.getNestedNameSpecifier(), 1032 Id); 1033 } 1034 1035 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1036 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1037 *Id, IdLoc); 1038 // If a dependent name resolves to a deduced template specialization type, 1039 // check that we're in one of the syntactic contexts permitting it. 1040 if (!DeducedTSTContext) { 1041 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1042 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1043 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1044 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1045 Deduced->getTemplateName()) 1046 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1047 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1048 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1049 return QualType(); 1050 } 1051 } 1052 return T; 1053 } 1054 1055 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1056 1057 // We had a dependent elaborated-type-specifier that has been transformed 1058 // into a non-dependent elaborated-type-specifier. Find the tag we're 1059 // referring to. 1060 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1061 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1062 if (!DC) 1063 return QualType(); 1064 1065 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1066 return QualType(); 1067 1068 TagDecl *Tag = nullptr; 1069 SemaRef.LookupQualifiedName(Result, DC); 1070 switch (Result.getResultKind()) { 1071 case LookupResult::NotFound: 1072 case LookupResult::NotFoundInCurrentInstantiation: 1073 break; 1074 1075 case LookupResult::Found: 1076 Tag = Result.getAsSingle<TagDecl>(); 1077 break; 1078 1079 case LookupResult::FoundOverloaded: 1080 case LookupResult::FoundUnresolvedValue: 1081 llvm_unreachable("Tag lookup cannot find non-tags"); 1082 1083 case LookupResult::Ambiguous: 1084 // Let the LookupResult structure handle ambiguities. 1085 return QualType(); 1086 } 1087 1088 if (!Tag) { 1089 // Check where the name exists but isn't a tag type and use that to emit 1090 // better diagnostics. 1091 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1092 SemaRef.LookupQualifiedName(Result, DC); 1093 switch (Result.getResultKind()) { 1094 case LookupResult::Found: 1095 case LookupResult::FoundOverloaded: 1096 case LookupResult::FoundUnresolvedValue: { 1097 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1098 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1099 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1100 << NTK << Kind; 1101 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1102 break; 1103 } 1104 default: 1105 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1106 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1107 break; 1108 } 1109 return QualType(); 1110 } 1111 1112 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1113 IdLoc, Id)) { 1114 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1115 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1116 return QualType(); 1117 } 1118 1119 // Build the elaborated-type-specifier type. 1120 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1121 return SemaRef.Context.getElaboratedType(Keyword, 1122 QualifierLoc.getNestedNameSpecifier(), 1123 T); 1124 } 1125 1126 /// Build a new pack expansion type. 1127 /// 1128 /// By default, builds a new PackExpansionType type from the given pattern. 1129 /// Subclasses may override this routine to provide different behavior. 1130 QualType RebuildPackExpansionType(QualType Pattern, 1131 SourceRange PatternRange, 1132 SourceLocation EllipsisLoc, 1133 Optional<unsigned> NumExpansions) { 1134 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1135 NumExpansions); 1136 } 1137 1138 /// Build a new atomic type given its value type. 1139 /// 1140 /// By default, performs semantic analysis when building the atomic type. 1141 /// Subclasses may override this routine to provide different behavior. 1142 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1143 1144 /// Build a new pipe type given its value type. 1145 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1146 bool isReadPipe); 1147 1148 /// Build a new template name given a nested name specifier, a flag 1149 /// indicating whether the "template" keyword was provided, and the template 1150 /// that the template name refers to. 1151 /// 1152 /// By default, builds the new template name directly. Subclasses may override 1153 /// this routine to provide different behavior. 1154 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1155 bool TemplateKW, 1156 TemplateDecl *Template); 1157 1158 /// Build a new template name given a nested name specifier and the 1159 /// name that is referred to as a template. 1160 /// 1161 /// By default, performs semantic analysis to determine whether the name can 1162 /// be resolved to a specific template, then builds the appropriate kind of 1163 /// template name. Subclasses may override this routine to provide different 1164 /// behavior. 1165 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1166 SourceLocation TemplateKWLoc, 1167 const IdentifierInfo &Name, 1168 SourceLocation NameLoc, QualType ObjectType, 1169 NamedDecl *FirstQualifierInScope, 1170 bool AllowInjectedClassName); 1171 1172 /// Build a new template name given a nested name specifier and the 1173 /// overloaded operator name that is referred to as a template. 1174 /// 1175 /// By default, performs semantic analysis to determine whether the name can 1176 /// be resolved to a specific template, then builds the appropriate kind of 1177 /// template name. Subclasses may override this routine to provide different 1178 /// behavior. 1179 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1180 SourceLocation TemplateKWLoc, 1181 OverloadedOperatorKind Operator, 1182 SourceLocation NameLoc, QualType ObjectType, 1183 bool AllowInjectedClassName); 1184 1185 /// Build a new template name given a template template parameter pack 1186 /// and the 1187 /// 1188 /// By default, performs semantic analysis to determine whether the name can 1189 /// be resolved to a specific template, then builds the appropriate kind of 1190 /// template name. Subclasses may override this routine to provide different 1191 /// behavior. 1192 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1193 const TemplateArgument &ArgPack) { 1194 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1195 } 1196 1197 /// Build a new compound statement. 1198 /// 1199 /// By default, performs semantic analysis to build the new statement. 1200 /// Subclasses may override this routine to provide different behavior. 1201 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1202 MultiStmtArg Statements, 1203 SourceLocation RBraceLoc, 1204 bool IsStmtExpr) { 1205 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1206 IsStmtExpr); 1207 } 1208 1209 /// Build a new case statement. 1210 /// 1211 /// By default, performs semantic analysis to build the new statement. 1212 /// Subclasses may override this routine to provide different behavior. 1213 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1214 Expr *LHS, 1215 SourceLocation EllipsisLoc, 1216 Expr *RHS, 1217 SourceLocation ColonLoc) { 1218 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1219 ColonLoc); 1220 } 1221 1222 /// Attach the body to a new case statement. 1223 /// 1224 /// By default, performs semantic analysis to build the new statement. 1225 /// Subclasses may override this routine to provide different behavior. 1226 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1227 getSema().ActOnCaseStmtBody(S, Body); 1228 return S; 1229 } 1230 1231 /// Build a new default statement. 1232 /// 1233 /// By default, performs semantic analysis to build the new statement. 1234 /// Subclasses may override this routine to provide different behavior. 1235 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1236 SourceLocation ColonLoc, 1237 Stmt *SubStmt) { 1238 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1239 /*CurScope=*/nullptr); 1240 } 1241 1242 /// Build a new label 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 RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1247 SourceLocation ColonLoc, Stmt *SubStmt) { 1248 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1249 } 1250 1251 /// Build a new label statement. 1252 /// 1253 /// By default, performs semantic analysis to build the new statement. 1254 /// Subclasses may override this routine to provide different behavior. 1255 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1256 ArrayRef<const Attr*> Attrs, 1257 Stmt *SubStmt) { 1258 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1259 } 1260 1261 /// Build a new "if" statement. 1262 /// 1263 /// By default, performs semantic analysis to build the new statement. 1264 /// Subclasses may override this routine to provide different behavior. 1265 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1266 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1267 SourceLocation ElseLoc, Stmt *Else) { 1268 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1269 ElseLoc, Else); 1270 } 1271 1272 /// Start building a new switch statement. 1273 /// 1274 /// By default, performs semantic analysis to build the new statement. 1275 /// Subclasses may override this routine to provide different behavior. 1276 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1277 Sema::ConditionResult Cond) { 1278 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1279 } 1280 1281 /// Attach the body to the switch statement. 1282 /// 1283 /// By default, performs semantic analysis to build the new statement. 1284 /// Subclasses may override this routine to provide different behavior. 1285 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1286 Stmt *Switch, Stmt *Body) { 1287 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1288 } 1289 1290 /// Build a new while statement. 1291 /// 1292 /// By default, performs semantic analysis to build the new statement. 1293 /// Subclasses may override this routine to provide different behavior. 1294 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1295 Sema::ConditionResult Cond, Stmt *Body) { 1296 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1297 } 1298 1299 /// Build a new do-while statement. 1300 /// 1301 /// By default, performs semantic analysis to build the new statement. 1302 /// Subclasses may override this routine to provide different behavior. 1303 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1304 SourceLocation WhileLoc, SourceLocation LParenLoc, 1305 Expr *Cond, SourceLocation RParenLoc) { 1306 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1307 Cond, RParenLoc); 1308 } 1309 1310 /// Build a new for statement. 1311 /// 1312 /// By default, performs semantic analysis to build the new statement. 1313 /// Subclasses may override this routine to provide different behavior. 1314 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1315 Stmt *Init, Sema::ConditionResult Cond, 1316 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1317 Stmt *Body) { 1318 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1319 Inc, RParenLoc, Body); 1320 } 1321 1322 /// Build a new goto statement. 1323 /// 1324 /// By default, performs semantic analysis to build the new statement. 1325 /// Subclasses may override this routine to provide different behavior. 1326 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1327 LabelDecl *Label) { 1328 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1329 } 1330 1331 /// Build a new indirect goto statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1336 SourceLocation StarLoc, 1337 Expr *Target) { 1338 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1339 } 1340 1341 /// Build a new return statement. 1342 /// 1343 /// By default, performs semantic analysis to build the new statement. 1344 /// Subclasses may override this routine to provide different behavior. 1345 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1346 return getSema().BuildReturnStmt(ReturnLoc, Result); 1347 } 1348 1349 /// Build a new declaration statement. 1350 /// 1351 /// By default, performs semantic analysis to build the new statement. 1352 /// Subclasses may override this routine to provide different behavior. 1353 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1354 SourceLocation StartLoc, SourceLocation EndLoc) { 1355 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1356 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1357 } 1358 1359 /// Build a new inline asm statement. 1360 /// 1361 /// By default, performs semantic analysis to build the new statement. 1362 /// Subclasses may override this routine to provide different behavior. 1363 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1364 bool IsVolatile, unsigned NumOutputs, 1365 unsigned NumInputs, IdentifierInfo **Names, 1366 MultiExprArg Constraints, MultiExprArg Exprs, 1367 Expr *AsmString, MultiExprArg Clobbers, 1368 SourceLocation RParenLoc) { 1369 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1370 NumInputs, Names, Constraints, Exprs, 1371 AsmString, Clobbers, RParenLoc); 1372 } 1373 1374 /// Build a new MS style inline asm statement. 1375 /// 1376 /// By default, performs semantic analysis to build the new statement. 1377 /// Subclasses may override this routine to provide different behavior. 1378 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1379 ArrayRef<Token> AsmToks, 1380 StringRef AsmString, 1381 unsigned NumOutputs, unsigned NumInputs, 1382 ArrayRef<StringRef> Constraints, 1383 ArrayRef<StringRef> Clobbers, 1384 ArrayRef<Expr*> Exprs, 1385 SourceLocation EndLoc) { 1386 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1387 NumOutputs, NumInputs, 1388 Constraints, Clobbers, Exprs, EndLoc); 1389 } 1390 1391 /// Build a new co_return statement. 1392 /// 1393 /// By default, performs semantic analysis to build the new statement. 1394 /// Subclasses may override this routine to provide different behavior. 1395 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1396 bool IsImplicit) { 1397 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1398 } 1399 1400 /// Build a new co_await expression. 1401 /// 1402 /// By default, performs semantic analysis to build the new expression. 1403 /// Subclasses may override this routine to provide different behavior. 1404 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1405 bool IsImplicit) { 1406 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1407 } 1408 1409 /// Build a new co_await expression. 1410 /// 1411 /// By default, performs semantic analysis to build the new expression. 1412 /// Subclasses may override this routine to provide different behavior. 1413 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1414 Expr *Result, 1415 UnresolvedLookupExpr *Lookup) { 1416 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1417 } 1418 1419 /// Build a new co_yield expression. 1420 /// 1421 /// By default, performs semantic analysis to build the new expression. 1422 /// Subclasses may override this routine to provide different behavior. 1423 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1424 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1425 } 1426 1427 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1428 return getSema().BuildCoroutineBodyStmt(Args); 1429 } 1430 1431 /// Build a new Objective-C \@try statement. 1432 /// 1433 /// By default, performs semantic analysis to build the new statement. 1434 /// Subclasses may override this routine to provide different behavior. 1435 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1436 Stmt *TryBody, 1437 MultiStmtArg CatchStmts, 1438 Stmt *Finally) { 1439 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1440 Finally); 1441 } 1442 1443 /// Rebuild an Objective-C exception declaration. 1444 /// 1445 /// By default, performs semantic analysis to build the new declaration. 1446 /// Subclasses may override this routine to provide different behavior. 1447 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1448 TypeSourceInfo *TInfo, QualType T) { 1449 return getSema().BuildObjCExceptionDecl(TInfo, T, 1450 ExceptionDecl->getInnerLocStart(), 1451 ExceptionDecl->getLocation(), 1452 ExceptionDecl->getIdentifier()); 1453 } 1454 1455 /// Build a new Objective-C \@catch statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1460 SourceLocation RParenLoc, 1461 VarDecl *Var, 1462 Stmt *Body) { 1463 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1464 Var, Body); 1465 } 1466 1467 /// Build a new Objective-C \@finally statement. 1468 /// 1469 /// By default, performs semantic analysis to build the new statement. 1470 /// Subclasses may override this routine to provide different behavior. 1471 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1472 Stmt *Body) { 1473 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1474 } 1475 1476 /// Build a new Objective-C \@throw statement. 1477 /// 1478 /// By default, performs semantic analysis to build the new statement. 1479 /// Subclasses may override this routine to provide different behavior. 1480 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1481 Expr *Operand) { 1482 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1483 } 1484 1485 /// Build a new OpenMP executable directive. 1486 /// 1487 /// By default, performs semantic analysis to build the new statement. 1488 /// Subclasses may override this routine to provide different behavior. 1489 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1490 DeclarationNameInfo DirName, 1491 OpenMPDirectiveKind CancelRegion, 1492 ArrayRef<OMPClause *> Clauses, 1493 Stmt *AStmt, SourceLocation StartLoc, 1494 SourceLocation EndLoc) { 1495 return getSema().ActOnOpenMPExecutableDirective( 1496 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1497 } 1498 1499 /// Build a new OpenMP 'if' clause. 1500 /// 1501 /// By default, performs semantic analysis to build the new OpenMP clause. 1502 /// Subclasses may override this routine to provide different behavior. 1503 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1504 Expr *Condition, SourceLocation StartLoc, 1505 SourceLocation LParenLoc, 1506 SourceLocation NameModifierLoc, 1507 SourceLocation ColonLoc, 1508 SourceLocation EndLoc) { 1509 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1510 LParenLoc, NameModifierLoc, ColonLoc, 1511 EndLoc); 1512 } 1513 1514 /// Build a new OpenMP 'final' clause. 1515 /// 1516 /// By default, performs semantic analysis to build the new OpenMP clause. 1517 /// Subclasses may override this routine to provide different behavior. 1518 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1519 SourceLocation LParenLoc, 1520 SourceLocation EndLoc) { 1521 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1522 EndLoc); 1523 } 1524 1525 /// Build a new OpenMP 'num_threads' 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 *RebuildOMPNumThreadsClause(Expr *NumThreads, 1530 SourceLocation StartLoc, 1531 SourceLocation LParenLoc, 1532 SourceLocation EndLoc) { 1533 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1534 LParenLoc, EndLoc); 1535 } 1536 1537 /// Build a new OpenMP 'safelen' 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 *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1542 SourceLocation LParenLoc, 1543 SourceLocation EndLoc) { 1544 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1545 } 1546 1547 /// Build a new OpenMP 'simdlen' clause. 1548 /// 1549 /// By default, performs semantic analysis to build the new OpenMP clause. 1550 /// Subclasses may override this routine to provide different behavior. 1551 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1552 SourceLocation LParenLoc, 1553 SourceLocation EndLoc) { 1554 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1555 } 1556 1557 /// Build a new OpenMP 'collapse' clause. 1558 /// 1559 /// By default, performs semantic analysis to build the new OpenMP clause. 1560 /// Subclasses may override this routine to provide different behavior. 1561 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1562 SourceLocation LParenLoc, 1563 SourceLocation EndLoc) { 1564 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1565 EndLoc); 1566 } 1567 1568 /// Build a new OpenMP 'default' clause. 1569 /// 1570 /// By default, performs semantic analysis to build the new OpenMP clause. 1571 /// Subclasses may override this routine to provide different behavior. 1572 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1573 SourceLocation KindKwLoc, 1574 SourceLocation StartLoc, 1575 SourceLocation LParenLoc, 1576 SourceLocation EndLoc) { 1577 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1578 StartLoc, LParenLoc, EndLoc); 1579 } 1580 1581 /// Build a new OpenMP 'proc_bind' clause. 1582 /// 1583 /// By default, performs semantic analysis to build the new OpenMP clause. 1584 /// Subclasses may override this routine to provide different behavior. 1585 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1586 SourceLocation KindKwLoc, 1587 SourceLocation StartLoc, 1588 SourceLocation LParenLoc, 1589 SourceLocation EndLoc) { 1590 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1591 StartLoc, LParenLoc, EndLoc); 1592 } 1593 1594 /// Build a new OpenMP 'schedule' 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 *RebuildOMPScheduleClause( 1599 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1600 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1601 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1602 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1603 return getSema().ActOnOpenMPScheduleClause( 1604 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1605 CommaLoc, EndLoc); 1606 } 1607 1608 /// Build a new OpenMP 'ordered' clause. 1609 /// 1610 /// By default, performs semantic analysis to build the new OpenMP clause. 1611 /// Subclasses may override this routine to provide different behavior. 1612 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1613 SourceLocation EndLoc, 1614 SourceLocation LParenLoc, Expr *Num) { 1615 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1616 } 1617 1618 /// Build a new OpenMP 'private' clause. 1619 /// 1620 /// By default, performs semantic analysis to build the new OpenMP clause. 1621 /// Subclasses may override this routine to provide different behavior. 1622 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1623 SourceLocation StartLoc, 1624 SourceLocation LParenLoc, 1625 SourceLocation EndLoc) { 1626 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1627 EndLoc); 1628 } 1629 1630 /// Build a new OpenMP 'firstprivate' clause. 1631 /// 1632 /// By default, performs semantic analysis to build the new OpenMP clause. 1633 /// Subclasses may override this routine to provide different behavior. 1634 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1635 SourceLocation StartLoc, 1636 SourceLocation LParenLoc, 1637 SourceLocation EndLoc) { 1638 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1639 EndLoc); 1640 } 1641 1642 /// Build a new OpenMP 'lastprivate' clause. 1643 /// 1644 /// By default, performs semantic analysis to build the new OpenMP clause. 1645 /// Subclasses may override this routine to provide different behavior. 1646 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1647 SourceLocation StartLoc, 1648 SourceLocation LParenLoc, 1649 SourceLocation EndLoc) { 1650 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1651 EndLoc); 1652 } 1653 1654 /// Build a new OpenMP 'shared' clause. 1655 /// 1656 /// By default, performs semantic analysis to build the new OpenMP clause. 1657 /// Subclasses may override this routine to provide different behavior. 1658 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1659 SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 SourceLocation EndLoc) { 1662 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1663 EndLoc); 1664 } 1665 1666 /// Build a new OpenMP 'reduction' clause. 1667 /// 1668 /// By default, performs semantic analysis to build the new statement. 1669 /// Subclasses may override this routine to provide different behavior. 1670 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1671 SourceLocation StartLoc, 1672 SourceLocation LParenLoc, 1673 SourceLocation ColonLoc, 1674 SourceLocation EndLoc, 1675 CXXScopeSpec &ReductionIdScopeSpec, 1676 const DeclarationNameInfo &ReductionId, 1677 ArrayRef<Expr *> UnresolvedReductions) { 1678 return getSema().ActOnOpenMPReductionClause( 1679 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1680 ReductionId, UnresolvedReductions); 1681 } 1682 1683 /// Build a new OpenMP 'task_reduction' clause. 1684 /// 1685 /// By default, performs semantic analysis to build the new statement. 1686 /// Subclasses may override this routine to provide different behavior. 1687 OMPClause *RebuildOMPTaskReductionClause( 1688 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1689 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1690 CXXScopeSpec &ReductionIdScopeSpec, 1691 const DeclarationNameInfo &ReductionId, 1692 ArrayRef<Expr *> UnresolvedReductions) { 1693 return getSema().ActOnOpenMPTaskReductionClause( 1694 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1695 ReductionId, UnresolvedReductions); 1696 } 1697 1698 /// Build a new OpenMP 'in_reduction' clause. 1699 /// 1700 /// By default, performs semantic analysis to build the new statement. 1701 /// Subclasses may override this routine to provide different behavior. 1702 OMPClause * 1703 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1704 SourceLocation LParenLoc, SourceLocation ColonLoc, 1705 SourceLocation EndLoc, 1706 CXXScopeSpec &ReductionIdScopeSpec, 1707 const DeclarationNameInfo &ReductionId, 1708 ArrayRef<Expr *> UnresolvedReductions) { 1709 return getSema().ActOnOpenMPInReductionClause( 1710 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1711 ReductionId, UnresolvedReductions); 1712 } 1713 1714 /// Build a new OpenMP 'linear' clause. 1715 /// 1716 /// By default, performs semantic analysis to build the new OpenMP clause. 1717 /// Subclasses may override this routine to provide different behavior. 1718 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1719 SourceLocation StartLoc, 1720 SourceLocation LParenLoc, 1721 OpenMPLinearClauseKind Modifier, 1722 SourceLocation ModifierLoc, 1723 SourceLocation ColonLoc, 1724 SourceLocation EndLoc) { 1725 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1726 Modifier, ModifierLoc, ColonLoc, 1727 EndLoc); 1728 } 1729 1730 /// Build a new OpenMP 'aligned' clause. 1731 /// 1732 /// By default, performs semantic analysis to build the new OpenMP clause. 1733 /// Subclasses may override this routine to provide different behavior. 1734 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1735 SourceLocation StartLoc, 1736 SourceLocation LParenLoc, 1737 SourceLocation ColonLoc, 1738 SourceLocation EndLoc) { 1739 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1740 LParenLoc, ColonLoc, EndLoc); 1741 } 1742 1743 /// Build a new OpenMP 'copyin' clause. 1744 /// 1745 /// By default, performs semantic analysis to build the new OpenMP clause. 1746 /// Subclasses may override this routine to provide different behavior. 1747 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1748 SourceLocation StartLoc, 1749 SourceLocation LParenLoc, 1750 SourceLocation EndLoc) { 1751 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1752 EndLoc); 1753 } 1754 1755 /// Build a new OpenMP 'copyprivate' clause. 1756 /// 1757 /// By default, performs semantic analysis to build the new OpenMP clause. 1758 /// Subclasses may override this routine to provide different behavior. 1759 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1760 SourceLocation StartLoc, 1761 SourceLocation LParenLoc, 1762 SourceLocation EndLoc) { 1763 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1764 EndLoc); 1765 } 1766 1767 /// Build a new OpenMP 'flush' pseudo clause. 1768 /// 1769 /// By default, performs semantic analysis to build the new OpenMP clause. 1770 /// Subclasses may override this routine to provide different behavior. 1771 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1772 SourceLocation StartLoc, 1773 SourceLocation LParenLoc, 1774 SourceLocation EndLoc) { 1775 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1776 EndLoc); 1777 } 1778 1779 /// Build a new OpenMP 'depend' pseudo clause. 1780 /// 1781 /// By default, performs semantic analysis to build the new OpenMP clause. 1782 /// Subclasses may override this routine to provide different behavior. 1783 OMPClause * 1784 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1785 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1786 SourceLocation StartLoc, SourceLocation LParenLoc, 1787 SourceLocation EndLoc) { 1788 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1789 StartLoc, LParenLoc, EndLoc); 1790 } 1791 1792 /// Build a new OpenMP 'device' clause. 1793 /// 1794 /// By default, performs semantic analysis to build the new statement. 1795 /// Subclasses may override this routine to provide different behavior. 1796 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1797 SourceLocation LParenLoc, 1798 SourceLocation EndLoc) { 1799 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1800 EndLoc); 1801 } 1802 1803 /// Build a new OpenMP 'map' clause. 1804 /// 1805 /// By default, performs semantic analysis to build the new OpenMP clause. 1806 /// Subclasses may override this routine to provide different behavior. 1807 OMPClause *RebuildOMPMapClause( 1808 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1809 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1810 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1811 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1812 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1813 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1814 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1815 MapperIdScopeSpec, MapperId, MapType, 1816 IsMapTypeImplicit, MapLoc, ColonLoc, 1817 VarList, Locs, UnresolvedMappers); 1818 } 1819 1820 /// Build a new OpenMP 'num_teams' clause. 1821 /// 1822 /// By default, performs semantic analysis to build the new statement. 1823 /// Subclasses may override this routine to provide different behavior. 1824 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1825 SourceLocation LParenLoc, 1826 SourceLocation EndLoc) { 1827 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1828 EndLoc); 1829 } 1830 1831 /// Build a new OpenMP 'thread_limit' clause. 1832 /// 1833 /// By default, performs semantic analysis to build the new statement. 1834 /// Subclasses may override this routine to provide different behavior. 1835 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1836 SourceLocation StartLoc, 1837 SourceLocation LParenLoc, 1838 SourceLocation EndLoc) { 1839 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1840 LParenLoc, EndLoc); 1841 } 1842 1843 /// Build a new OpenMP 'priority' clause. 1844 /// 1845 /// By default, performs semantic analysis to build the new statement. 1846 /// Subclasses may override this routine to provide different behavior. 1847 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1848 SourceLocation LParenLoc, 1849 SourceLocation EndLoc) { 1850 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1851 EndLoc); 1852 } 1853 1854 /// Build a new OpenMP 'grainsize' clause. 1855 /// 1856 /// By default, performs semantic analysis to build the new statement. 1857 /// Subclasses may override this routine to provide different behavior. 1858 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1859 SourceLocation LParenLoc, 1860 SourceLocation EndLoc) { 1861 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1862 EndLoc); 1863 } 1864 1865 /// Build a new OpenMP 'num_tasks' clause. 1866 /// 1867 /// By default, performs semantic analysis to build the new statement. 1868 /// Subclasses may override this routine to provide different behavior. 1869 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1870 SourceLocation LParenLoc, 1871 SourceLocation EndLoc) { 1872 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1873 EndLoc); 1874 } 1875 1876 /// Build a new OpenMP 'hint' clause. 1877 /// 1878 /// By default, performs semantic analysis to build the new statement. 1879 /// Subclasses may override this routine to provide different behavior. 1880 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1881 SourceLocation LParenLoc, 1882 SourceLocation EndLoc) { 1883 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1884 } 1885 1886 /// Build a new OpenMP 'dist_schedule' clause. 1887 /// 1888 /// By default, performs semantic analysis to build the new OpenMP clause. 1889 /// Subclasses may override this routine to provide different behavior. 1890 OMPClause * 1891 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1892 Expr *ChunkSize, SourceLocation StartLoc, 1893 SourceLocation LParenLoc, SourceLocation KindLoc, 1894 SourceLocation CommaLoc, SourceLocation EndLoc) { 1895 return getSema().ActOnOpenMPDistScheduleClause( 1896 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'to' clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new statement. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1904 CXXScopeSpec &MapperIdScopeSpec, 1905 DeclarationNameInfo &MapperId, 1906 const OMPVarListLocTy &Locs, 1907 ArrayRef<Expr *> UnresolvedMappers) { 1908 return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, 1909 Locs, UnresolvedMappers); 1910 } 1911 1912 /// Build a new OpenMP 'from' clause. 1913 /// 1914 /// By default, performs semantic analysis to build the new statement. 1915 /// Subclasses may override this routine to provide different behavior. 1916 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1917 CXXScopeSpec &MapperIdScopeSpec, 1918 DeclarationNameInfo &MapperId, 1919 const OMPVarListLocTy &Locs, 1920 ArrayRef<Expr *> UnresolvedMappers) { 1921 return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, 1922 Locs, UnresolvedMappers); 1923 } 1924 1925 /// Build a new OpenMP 'use_device_ptr' clause. 1926 /// 1927 /// By default, performs semantic analysis to build the new OpenMP clause. 1928 /// Subclasses may override this routine to provide different behavior. 1929 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1930 const OMPVarListLocTy &Locs) { 1931 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 1932 } 1933 1934 /// Build a new OpenMP 'is_device_ptr' clause. 1935 /// 1936 /// By default, performs semantic analysis to build the new OpenMP clause. 1937 /// Subclasses may override this routine to provide different behavior. 1938 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1939 const OMPVarListLocTy &Locs) { 1940 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 1941 } 1942 1943 /// Rebuild the operand to an Objective-C \@synchronized statement. 1944 /// 1945 /// By default, performs semantic analysis to build the new statement. 1946 /// Subclasses may override this routine to provide different behavior. 1947 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1948 Expr *object) { 1949 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1950 } 1951 1952 /// Build a new Objective-C \@synchronized statement. 1953 /// 1954 /// By default, performs semantic analysis to build the new statement. 1955 /// Subclasses may override this routine to provide different behavior. 1956 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1957 Expr *Object, Stmt *Body) { 1958 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1959 } 1960 1961 /// Build a new Objective-C \@autoreleasepool statement. 1962 /// 1963 /// By default, performs semantic analysis to build the new statement. 1964 /// Subclasses may override this routine to provide different behavior. 1965 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1966 Stmt *Body) { 1967 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1968 } 1969 1970 /// Build a new Objective-C fast enumeration statement. 1971 /// 1972 /// By default, performs semantic analysis to build the new statement. 1973 /// Subclasses may override this routine to provide different behavior. 1974 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1975 Stmt *Element, 1976 Expr *Collection, 1977 SourceLocation RParenLoc, 1978 Stmt *Body) { 1979 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1980 Element, 1981 Collection, 1982 RParenLoc); 1983 if (ForEachStmt.isInvalid()) 1984 return StmtError(); 1985 1986 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1987 } 1988 1989 /// Build a new C++ exception declaration. 1990 /// 1991 /// By default, performs semantic analysis to build the new decaration. 1992 /// Subclasses may override this routine to provide different behavior. 1993 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1994 TypeSourceInfo *Declarator, 1995 SourceLocation StartLoc, 1996 SourceLocation IdLoc, 1997 IdentifierInfo *Id) { 1998 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1999 StartLoc, IdLoc, Id); 2000 if (Var) 2001 getSema().CurContext->addDecl(Var); 2002 return Var; 2003 } 2004 2005 /// Build a new C++ catch statement. 2006 /// 2007 /// By default, performs semantic analysis to build the new statement. 2008 /// Subclasses may override this routine to provide different behavior. 2009 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2010 VarDecl *ExceptionDecl, 2011 Stmt *Handler) { 2012 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2013 Handler)); 2014 } 2015 2016 /// Build a new C++ try statement. 2017 /// 2018 /// By default, performs semantic analysis to build the new statement. 2019 /// Subclasses may override this routine to provide different behavior. 2020 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2021 ArrayRef<Stmt *> Handlers) { 2022 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2023 } 2024 2025 /// Build a new C++0x range-based for statement. 2026 /// 2027 /// By default, performs semantic analysis to build the new statement. 2028 /// Subclasses may override this routine to provide different behavior. 2029 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2030 SourceLocation CoawaitLoc, Stmt *Init, 2031 SourceLocation ColonLoc, Stmt *Range, 2032 Stmt *Begin, Stmt *End, Expr *Cond, 2033 Expr *Inc, Stmt *LoopVar, 2034 SourceLocation RParenLoc) { 2035 // If we've just learned that the range is actually an Objective-C 2036 // collection, treat this as an Objective-C fast enumeration loop. 2037 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2038 if (RangeStmt->isSingleDecl()) { 2039 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2040 if (RangeVar->isInvalidDecl()) 2041 return StmtError(); 2042 2043 Expr *RangeExpr = RangeVar->getInit(); 2044 if (!RangeExpr->isTypeDependent() && 2045 RangeExpr->getType()->isObjCObjectPointerType()) { 2046 // FIXME: Support init-statements in Objective-C++20 ranged for 2047 // statement. 2048 if (Init) { 2049 return SemaRef.Diag(Init->getBeginLoc(), 2050 diag::err_objc_for_range_init_stmt) 2051 << Init->getSourceRange(); 2052 } 2053 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2054 RangeExpr, RParenLoc); 2055 } 2056 } 2057 } 2058 } 2059 2060 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2061 Range, Begin, End, Cond, Inc, LoopVar, 2062 RParenLoc, Sema::BFRK_Rebuild); 2063 } 2064 2065 /// Build a new C++0x range-based for statement. 2066 /// 2067 /// By default, performs semantic analysis to build the new statement. 2068 /// Subclasses may override this routine to provide different behavior. 2069 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2070 bool IsIfExists, 2071 NestedNameSpecifierLoc QualifierLoc, 2072 DeclarationNameInfo NameInfo, 2073 Stmt *Nested) { 2074 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2075 QualifierLoc, NameInfo, Nested); 2076 } 2077 2078 /// Attach body to a C++0x range-based for statement. 2079 /// 2080 /// By default, performs semantic analysis to finish the new statement. 2081 /// Subclasses may override this routine to provide different behavior. 2082 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2083 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2084 } 2085 2086 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2087 Stmt *TryBlock, Stmt *Handler) { 2088 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2089 } 2090 2091 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2092 Stmt *Block) { 2093 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2094 } 2095 2096 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2097 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2098 } 2099 2100 /// Build a new predefined expression. 2101 /// 2102 /// By default, performs semantic analysis to build the new expression. 2103 /// Subclasses may override this routine to provide different behavior. 2104 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2105 PredefinedExpr::IdentKind IK) { 2106 return getSema().BuildPredefinedExpr(Loc, IK); 2107 } 2108 2109 /// Build a new expression that references a declaration. 2110 /// 2111 /// By default, performs semantic analysis to build the new expression. 2112 /// Subclasses may override this routine to provide different behavior. 2113 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2114 LookupResult &R, 2115 bool RequiresADL) { 2116 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2117 } 2118 2119 2120 /// Build a new expression that references a declaration. 2121 /// 2122 /// By default, performs semantic analysis to build the new expression. 2123 /// Subclasses may override this routine to provide different behavior. 2124 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2125 ValueDecl *VD, 2126 const DeclarationNameInfo &NameInfo, 2127 TemplateArgumentListInfo *TemplateArgs) { 2128 CXXScopeSpec SS; 2129 SS.Adopt(QualifierLoc); 2130 2131 // FIXME: loses template args. 2132 2133 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2134 } 2135 2136 /// Build a new expression in parentheses. 2137 /// 2138 /// By default, performs semantic analysis to build the new expression. 2139 /// Subclasses may override this routine to provide different behavior. 2140 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2141 SourceLocation RParen) { 2142 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2143 } 2144 2145 /// Build a new pseudo-destructor expression. 2146 /// 2147 /// By default, performs semantic analysis to build the new expression. 2148 /// Subclasses may override this routine to provide different behavior. 2149 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2150 SourceLocation OperatorLoc, 2151 bool isArrow, 2152 CXXScopeSpec &SS, 2153 TypeSourceInfo *ScopeType, 2154 SourceLocation CCLoc, 2155 SourceLocation TildeLoc, 2156 PseudoDestructorTypeStorage Destroyed); 2157 2158 /// Build a new unary operator expression. 2159 /// 2160 /// By default, performs semantic analysis to build the new expression. 2161 /// Subclasses may override this routine to provide different behavior. 2162 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2163 UnaryOperatorKind Opc, 2164 Expr *SubExpr) { 2165 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2166 } 2167 2168 /// Build a new builtin offsetof expression. 2169 /// 2170 /// By default, performs semantic analysis to build the new expression. 2171 /// Subclasses may override this routine to provide different behavior. 2172 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2173 TypeSourceInfo *Type, 2174 ArrayRef<Sema::OffsetOfComponent> Components, 2175 SourceLocation RParenLoc) { 2176 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2177 RParenLoc); 2178 } 2179 2180 /// Build a new sizeof, alignof or vec_step expression with a 2181 /// type argument. 2182 /// 2183 /// By default, performs semantic analysis to build the new expression. 2184 /// Subclasses may override this routine to provide different behavior. 2185 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2186 SourceLocation OpLoc, 2187 UnaryExprOrTypeTrait ExprKind, 2188 SourceRange R) { 2189 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2190 } 2191 2192 /// Build a new sizeof, alignof or vec step expression with an 2193 /// expression argument. 2194 /// 2195 /// By default, performs semantic analysis to build the new expression. 2196 /// Subclasses may override this routine to provide different behavior. 2197 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2198 UnaryExprOrTypeTrait ExprKind, 2199 SourceRange R) { 2200 ExprResult Result 2201 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2202 if (Result.isInvalid()) 2203 return ExprError(); 2204 2205 return Result; 2206 } 2207 2208 /// Build a new array subscript expression. 2209 /// 2210 /// By default, performs semantic analysis to build the new expression. 2211 /// Subclasses may override this routine to provide different behavior. 2212 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2213 SourceLocation LBracketLoc, 2214 Expr *RHS, 2215 SourceLocation RBracketLoc) { 2216 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2217 LBracketLoc, RHS, 2218 RBracketLoc); 2219 } 2220 2221 /// Build a new array section expression. 2222 /// 2223 /// By default, performs semantic analysis to build the new expression. 2224 /// Subclasses may override this routine to provide different behavior. 2225 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2226 Expr *LowerBound, 2227 SourceLocation ColonLoc, Expr *Length, 2228 SourceLocation RBracketLoc) { 2229 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2230 ColonLoc, Length, RBracketLoc); 2231 } 2232 2233 /// Build a new call expression. 2234 /// 2235 /// By default, performs semantic analysis to build the new expression. 2236 /// Subclasses may override this routine to provide different behavior. 2237 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2238 MultiExprArg Args, 2239 SourceLocation RParenLoc, 2240 Expr *ExecConfig = nullptr) { 2241 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2242 Args, RParenLoc, ExecConfig); 2243 } 2244 2245 /// Build a new member access expression. 2246 /// 2247 /// By default, performs semantic analysis to build the new expression. 2248 /// Subclasses may override this routine to provide different behavior. 2249 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2250 bool isArrow, 2251 NestedNameSpecifierLoc QualifierLoc, 2252 SourceLocation TemplateKWLoc, 2253 const DeclarationNameInfo &MemberNameInfo, 2254 ValueDecl *Member, 2255 NamedDecl *FoundDecl, 2256 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2257 NamedDecl *FirstQualifierInScope) { 2258 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2259 isArrow); 2260 if (!Member->getDeclName()) { 2261 // We have a reference to an unnamed field. This is always the 2262 // base of an anonymous struct/union member access, i.e. the 2263 // field is always of record type. 2264 assert(Member->getType()->isRecordType() && 2265 "unnamed member not of record type?"); 2266 2267 BaseResult = 2268 getSema().PerformObjectMemberConversion(BaseResult.get(), 2269 QualifierLoc.getNestedNameSpecifier(), 2270 FoundDecl, Member); 2271 if (BaseResult.isInvalid()) 2272 return ExprError(); 2273 Base = BaseResult.get(); 2274 2275 CXXScopeSpec EmptySS; 2276 return getSema().BuildFieldReferenceExpr( 2277 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2278 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2279 } 2280 2281 CXXScopeSpec SS; 2282 SS.Adopt(QualifierLoc); 2283 2284 Base = BaseResult.get(); 2285 QualType BaseType = Base->getType(); 2286 2287 if (isArrow && !BaseType->isPointerType()) 2288 return ExprError(); 2289 2290 // FIXME: this involves duplicating earlier analysis in a lot of 2291 // cases; we should avoid this when possible. 2292 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2293 R.addDecl(FoundDecl); 2294 R.resolveKind(); 2295 2296 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2297 SS, TemplateKWLoc, 2298 FirstQualifierInScope, 2299 R, ExplicitTemplateArgs, 2300 /*S*/nullptr); 2301 } 2302 2303 /// Build a new binary operator expression. 2304 /// 2305 /// By default, performs semantic analysis to build the new expression. 2306 /// Subclasses may override this routine to provide different behavior. 2307 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2308 BinaryOperatorKind Opc, 2309 Expr *LHS, Expr *RHS) { 2310 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2311 } 2312 2313 /// Build a new conditional operator expression. 2314 /// 2315 /// By default, performs semantic analysis to build the new expression. 2316 /// Subclasses may override this routine to provide different behavior. 2317 ExprResult RebuildConditionalOperator(Expr *Cond, 2318 SourceLocation QuestionLoc, 2319 Expr *LHS, 2320 SourceLocation ColonLoc, 2321 Expr *RHS) { 2322 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2323 LHS, RHS); 2324 } 2325 2326 /// Build a new C-style cast expression. 2327 /// 2328 /// By default, performs semantic analysis to build the new expression. 2329 /// Subclasses may override this routine to provide different behavior. 2330 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2331 TypeSourceInfo *TInfo, 2332 SourceLocation RParenLoc, 2333 Expr *SubExpr) { 2334 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2335 SubExpr); 2336 } 2337 2338 /// Build a new compound literal expression. 2339 /// 2340 /// By default, performs semantic analysis to build the new expression. 2341 /// Subclasses may override this routine to provide different behavior. 2342 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2343 TypeSourceInfo *TInfo, 2344 SourceLocation RParenLoc, 2345 Expr *Init) { 2346 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2347 Init); 2348 } 2349 2350 /// Build a new extended vector element access expression. 2351 /// 2352 /// By default, performs semantic analysis to build the new expression. 2353 /// Subclasses may override this routine to provide different behavior. 2354 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2355 SourceLocation OpLoc, 2356 SourceLocation AccessorLoc, 2357 IdentifierInfo &Accessor) { 2358 2359 CXXScopeSpec SS; 2360 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2361 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2362 OpLoc, /*IsArrow*/ false, 2363 SS, SourceLocation(), 2364 /*FirstQualifierInScope*/ nullptr, 2365 NameInfo, 2366 /* TemplateArgs */ nullptr, 2367 /*S*/ nullptr); 2368 } 2369 2370 /// Build a new initializer list expression. 2371 /// 2372 /// By default, performs semantic analysis to build the new expression. 2373 /// Subclasses may override this routine to provide different behavior. 2374 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2375 MultiExprArg Inits, 2376 SourceLocation RBraceLoc) { 2377 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2378 } 2379 2380 /// Build a new designated initializer expression. 2381 /// 2382 /// By default, performs semantic analysis to build the new expression. 2383 /// Subclasses may override this routine to provide different behavior. 2384 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2385 MultiExprArg ArrayExprs, 2386 SourceLocation EqualOrColonLoc, 2387 bool GNUSyntax, 2388 Expr *Init) { 2389 ExprResult Result 2390 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2391 Init); 2392 if (Result.isInvalid()) 2393 return ExprError(); 2394 2395 return Result; 2396 } 2397 2398 /// Build a new value-initialized expression. 2399 /// 2400 /// By default, builds the implicit value initialization without performing 2401 /// any semantic analysis. Subclasses may override this routine to provide 2402 /// different behavior. 2403 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2404 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2405 } 2406 2407 /// Build a new \c va_arg expression. 2408 /// 2409 /// By default, performs semantic analysis to build the new expression. 2410 /// Subclasses may override this routine to provide different behavior. 2411 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2412 Expr *SubExpr, TypeSourceInfo *TInfo, 2413 SourceLocation RParenLoc) { 2414 return getSema().BuildVAArgExpr(BuiltinLoc, 2415 SubExpr, TInfo, 2416 RParenLoc); 2417 } 2418 2419 /// Build a new expression list in parentheses. 2420 /// 2421 /// By default, performs semantic analysis to build the new expression. 2422 /// Subclasses may override this routine to provide different behavior. 2423 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2424 MultiExprArg SubExprs, 2425 SourceLocation RParenLoc) { 2426 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2427 } 2428 2429 /// Build a new address-of-label expression. 2430 /// 2431 /// By default, performs semantic analysis, using the name of the label 2432 /// rather than attempting to map the label statement itself. 2433 /// Subclasses may override this routine to provide different behavior. 2434 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2435 SourceLocation LabelLoc, LabelDecl *Label) { 2436 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2437 } 2438 2439 /// Build a new GNU statement expression. 2440 /// 2441 /// By default, performs semantic analysis to build the new expression. 2442 /// Subclasses may override this routine to provide different behavior. 2443 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2444 Stmt *SubStmt, 2445 SourceLocation RParenLoc) { 2446 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2447 } 2448 2449 /// Build a new __builtin_choose_expr expression. 2450 /// 2451 /// By default, performs semantic analysis to build the new expression. 2452 /// Subclasses may override this routine to provide different behavior. 2453 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2454 Expr *Cond, Expr *LHS, Expr *RHS, 2455 SourceLocation RParenLoc) { 2456 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2457 Cond, LHS, RHS, 2458 RParenLoc); 2459 } 2460 2461 /// Build a new generic selection expression. 2462 /// 2463 /// By default, performs semantic analysis to build the new expression. 2464 /// Subclasses may override this routine to provide different behavior. 2465 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2466 SourceLocation DefaultLoc, 2467 SourceLocation RParenLoc, 2468 Expr *ControllingExpr, 2469 ArrayRef<TypeSourceInfo *> Types, 2470 ArrayRef<Expr *> Exprs) { 2471 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2472 ControllingExpr, Types, Exprs); 2473 } 2474 2475 /// Build a new overloaded operator call expression. 2476 /// 2477 /// By default, performs semantic analysis to build the new expression. 2478 /// The semantic analysis provides the behavior of template instantiation, 2479 /// copying with transformations that turn what looks like an overloaded 2480 /// operator call into a use of a builtin operator, performing 2481 /// argument-dependent lookup, etc. Subclasses may override this routine to 2482 /// provide different behavior. 2483 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2484 SourceLocation OpLoc, 2485 Expr *Callee, 2486 Expr *First, 2487 Expr *Second); 2488 2489 /// Build a new C++ "named" cast expression, such as static_cast or 2490 /// reinterpret_cast. 2491 /// 2492 /// By default, this routine dispatches to one of the more-specific routines 2493 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2494 /// Subclasses may override this routine to provide different behavior. 2495 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2496 Stmt::StmtClass Class, 2497 SourceLocation LAngleLoc, 2498 TypeSourceInfo *TInfo, 2499 SourceLocation RAngleLoc, 2500 SourceLocation LParenLoc, 2501 Expr *SubExpr, 2502 SourceLocation RParenLoc) { 2503 switch (Class) { 2504 case Stmt::CXXStaticCastExprClass: 2505 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2506 RAngleLoc, LParenLoc, 2507 SubExpr, RParenLoc); 2508 2509 case Stmt::CXXDynamicCastExprClass: 2510 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2511 RAngleLoc, LParenLoc, 2512 SubExpr, RParenLoc); 2513 2514 case Stmt::CXXReinterpretCastExprClass: 2515 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2516 RAngleLoc, LParenLoc, 2517 SubExpr, 2518 RParenLoc); 2519 2520 case Stmt::CXXConstCastExprClass: 2521 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2522 RAngleLoc, LParenLoc, 2523 SubExpr, RParenLoc); 2524 2525 default: 2526 llvm_unreachable("Invalid C++ named cast"); 2527 } 2528 } 2529 2530 /// Build a new C++ static_cast expression. 2531 /// 2532 /// By default, performs semantic analysis to build the new expression. 2533 /// Subclasses may override this routine to provide different behavior. 2534 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2535 SourceLocation LAngleLoc, 2536 TypeSourceInfo *TInfo, 2537 SourceLocation RAngleLoc, 2538 SourceLocation LParenLoc, 2539 Expr *SubExpr, 2540 SourceLocation RParenLoc) { 2541 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2542 TInfo, SubExpr, 2543 SourceRange(LAngleLoc, RAngleLoc), 2544 SourceRange(LParenLoc, RParenLoc)); 2545 } 2546 2547 /// Build a new C++ dynamic_cast expression. 2548 /// 2549 /// By default, performs semantic analysis to build the new expression. 2550 /// Subclasses may override this routine to provide different behavior. 2551 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2552 SourceLocation LAngleLoc, 2553 TypeSourceInfo *TInfo, 2554 SourceLocation RAngleLoc, 2555 SourceLocation LParenLoc, 2556 Expr *SubExpr, 2557 SourceLocation RParenLoc) { 2558 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2559 TInfo, SubExpr, 2560 SourceRange(LAngleLoc, RAngleLoc), 2561 SourceRange(LParenLoc, RParenLoc)); 2562 } 2563 2564 /// Build a new C++ reinterpret_cast expression. 2565 /// 2566 /// By default, performs semantic analysis to build the new expression. 2567 /// Subclasses may override this routine to provide different behavior. 2568 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2569 SourceLocation LAngleLoc, 2570 TypeSourceInfo *TInfo, 2571 SourceLocation RAngleLoc, 2572 SourceLocation LParenLoc, 2573 Expr *SubExpr, 2574 SourceLocation RParenLoc) { 2575 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2576 TInfo, SubExpr, 2577 SourceRange(LAngleLoc, RAngleLoc), 2578 SourceRange(LParenLoc, RParenLoc)); 2579 } 2580 2581 /// Build a new C++ const_cast expression. 2582 /// 2583 /// By default, performs semantic analysis to build the new expression. 2584 /// Subclasses may override this routine to provide different behavior. 2585 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2586 SourceLocation LAngleLoc, 2587 TypeSourceInfo *TInfo, 2588 SourceLocation RAngleLoc, 2589 SourceLocation LParenLoc, 2590 Expr *SubExpr, 2591 SourceLocation RParenLoc) { 2592 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2593 TInfo, SubExpr, 2594 SourceRange(LAngleLoc, RAngleLoc), 2595 SourceRange(LParenLoc, RParenLoc)); 2596 } 2597 2598 /// Build a new C++ functional-style cast expression. 2599 /// 2600 /// By default, performs semantic analysis to build the new expression. 2601 /// Subclasses may override this routine to provide different behavior. 2602 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2603 SourceLocation LParenLoc, 2604 Expr *Sub, 2605 SourceLocation RParenLoc, 2606 bool ListInitialization) { 2607 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2608 MultiExprArg(&Sub, 1), RParenLoc, 2609 ListInitialization); 2610 } 2611 2612 /// Build a new C++ typeid(type) expression. 2613 /// 2614 /// By default, performs semantic analysis to build the new expression. 2615 /// Subclasses may override this routine to provide different behavior. 2616 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2617 SourceLocation TypeidLoc, 2618 TypeSourceInfo *Operand, 2619 SourceLocation RParenLoc) { 2620 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2621 RParenLoc); 2622 } 2623 2624 2625 /// Build a new C++ typeid(expr) expression. 2626 /// 2627 /// By default, performs semantic analysis to build the new expression. 2628 /// Subclasses may override this routine to provide different behavior. 2629 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2630 SourceLocation TypeidLoc, 2631 Expr *Operand, 2632 SourceLocation RParenLoc) { 2633 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2634 RParenLoc); 2635 } 2636 2637 /// Build a new C++ __uuidof(type) expression. 2638 /// 2639 /// By default, performs semantic analysis to build the new expression. 2640 /// Subclasses may override this routine to provide different behavior. 2641 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2642 SourceLocation TypeidLoc, 2643 TypeSourceInfo *Operand, 2644 SourceLocation RParenLoc) { 2645 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2646 RParenLoc); 2647 } 2648 2649 /// Build a new C++ __uuidof(expr) expression. 2650 /// 2651 /// By default, performs semantic analysis to build the new expression. 2652 /// Subclasses may override this routine to provide different behavior. 2653 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2654 SourceLocation TypeidLoc, 2655 Expr *Operand, 2656 SourceLocation RParenLoc) { 2657 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2658 RParenLoc); 2659 } 2660 2661 /// Build a new C++ "this" expression. 2662 /// 2663 /// By default, builds a new "this" expression without performing any 2664 /// semantic analysis. Subclasses may override this routine to provide 2665 /// different behavior. 2666 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2667 QualType ThisType, 2668 bool isImplicit) { 2669 getSema().CheckCXXThisCapture(ThisLoc); 2670 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2671 } 2672 2673 /// Build a new C++ throw expression. 2674 /// 2675 /// By default, performs semantic analysis to build the new expression. 2676 /// Subclasses may override this routine to provide different behavior. 2677 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2678 bool IsThrownVariableInScope) { 2679 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2680 } 2681 2682 /// Build a new C++ default-argument expression. 2683 /// 2684 /// By default, builds a new default-argument expression, which does not 2685 /// require any semantic analysis. Subclasses may override this routine to 2686 /// provide different behavior. 2687 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2688 ParmVarDecl *Param) { 2689 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2690 } 2691 2692 /// Build a new C++11 default-initialization expression. 2693 /// 2694 /// By default, builds a new default field initialization expression, which 2695 /// does not require any semantic analysis. Subclasses may override this 2696 /// routine to provide different behavior. 2697 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2698 FieldDecl *Field) { 2699 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2700 } 2701 2702 /// Build a new C++ zero-initialization expression. 2703 /// 2704 /// By default, performs semantic analysis to build the new expression. 2705 /// Subclasses may override this routine to provide different behavior. 2706 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2707 SourceLocation LParenLoc, 2708 SourceLocation RParenLoc) { 2709 return getSema().BuildCXXTypeConstructExpr( 2710 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2711 } 2712 2713 /// Build a new C++ "new" expression. 2714 /// 2715 /// By default, performs semantic analysis to build the new expression. 2716 /// Subclasses may override this routine to provide different behavior. 2717 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2718 bool UseGlobal, 2719 SourceLocation PlacementLParen, 2720 MultiExprArg PlacementArgs, 2721 SourceLocation PlacementRParen, 2722 SourceRange TypeIdParens, 2723 QualType AllocatedType, 2724 TypeSourceInfo *AllocatedTypeInfo, 2725 Expr *ArraySize, 2726 SourceRange DirectInitRange, 2727 Expr *Initializer) { 2728 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2729 PlacementLParen, 2730 PlacementArgs, 2731 PlacementRParen, 2732 TypeIdParens, 2733 AllocatedType, 2734 AllocatedTypeInfo, 2735 ArraySize, 2736 DirectInitRange, 2737 Initializer); 2738 } 2739 2740 /// Build a new C++ "delete" expression. 2741 /// 2742 /// By default, performs semantic analysis to build the new expression. 2743 /// Subclasses may override this routine to provide different behavior. 2744 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2745 bool IsGlobalDelete, 2746 bool IsArrayForm, 2747 Expr *Operand) { 2748 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2749 Operand); 2750 } 2751 2752 /// Build a new type trait expression. 2753 /// 2754 /// By default, performs semantic analysis to build the new expression. 2755 /// Subclasses may override this routine to provide different behavior. 2756 ExprResult RebuildTypeTrait(TypeTrait Trait, 2757 SourceLocation StartLoc, 2758 ArrayRef<TypeSourceInfo *> Args, 2759 SourceLocation RParenLoc) { 2760 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2761 } 2762 2763 /// Build a new array type trait expression. 2764 /// 2765 /// By default, performs semantic analysis to build the new expression. 2766 /// Subclasses may override this routine to provide different behavior. 2767 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2768 SourceLocation StartLoc, 2769 TypeSourceInfo *TSInfo, 2770 Expr *DimExpr, 2771 SourceLocation RParenLoc) { 2772 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2773 } 2774 2775 /// Build a new expression trait expression. 2776 /// 2777 /// By default, performs semantic analysis to build the new expression. 2778 /// Subclasses may override this routine to provide different behavior. 2779 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2780 SourceLocation StartLoc, 2781 Expr *Queried, 2782 SourceLocation RParenLoc) { 2783 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2784 } 2785 2786 /// Build a new (previously unresolved) declaration reference 2787 /// expression. 2788 /// 2789 /// By default, performs semantic analysis to build the new expression. 2790 /// Subclasses may override this routine to provide different behavior. 2791 ExprResult RebuildDependentScopeDeclRefExpr( 2792 NestedNameSpecifierLoc QualifierLoc, 2793 SourceLocation TemplateKWLoc, 2794 const DeclarationNameInfo &NameInfo, 2795 const TemplateArgumentListInfo *TemplateArgs, 2796 bool IsAddressOfOperand, 2797 TypeSourceInfo **RecoveryTSI) { 2798 CXXScopeSpec SS; 2799 SS.Adopt(QualifierLoc); 2800 2801 if (TemplateArgs || TemplateKWLoc.isValid()) 2802 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2803 TemplateArgs); 2804 2805 return getSema().BuildQualifiedDeclarationNameExpr( 2806 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2807 } 2808 2809 /// Build a new template-id expression. 2810 /// 2811 /// By default, performs semantic analysis to build the new expression. 2812 /// Subclasses may override this routine to provide different behavior. 2813 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2814 SourceLocation TemplateKWLoc, 2815 LookupResult &R, 2816 bool RequiresADL, 2817 const TemplateArgumentListInfo *TemplateArgs) { 2818 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2819 TemplateArgs); 2820 } 2821 2822 /// Build a new object-construction expression. 2823 /// 2824 /// By default, performs semantic analysis to build the new expression. 2825 /// Subclasses may override this routine to provide different behavior. 2826 ExprResult RebuildCXXConstructExpr(QualType T, 2827 SourceLocation Loc, 2828 CXXConstructorDecl *Constructor, 2829 bool IsElidable, 2830 MultiExprArg Args, 2831 bool HadMultipleCandidates, 2832 bool ListInitialization, 2833 bool StdInitListInitialization, 2834 bool RequiresZeroInit, 2835 CXXConstructExpr::ConstructionKind ConstructKind, 2836 SourceRange ParenRange) { 2837 SmallVector<Expr*, 8> ConvertedArgs; 2838 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2839 ConvertedArgs)) 2840 return ExprError(); 2841 2842 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2843 IsElidable, 2844 ConvertedArgs, 2845 HadMultipleCandidates, 2846 ListInitialization, 2847 StdInitListInitialization, 2848 RequiresZeroInit, ConstructKind, 2849 ParenRange); 2850 } 2851 2852 /// Build a new implicit construction via inherited constructor 2853 /// expression. 2854 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2855 CXXConstructorDecl *Constructor, 2856 bool ConstructsVBase, 2857 bool InheritedFromVBase) { 2858 return new (getSema().Context) CXXInheritedCtorInitExpr( 2859 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2860 } 2861 2862 /// Build a new object-construction expression. 2863 /// 2864 /// By default, performs semantic analysis to build the new expression. 2865 /// Subclasses may override this routine to provide different behavior. 2866 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2867 SourceLocation LParenOrBraceLoc, 2868 MultiExprArg Args, 2869 SourceLocation RParenOrBraceLoc, 2870 bool ListInitialization) { 2871 return getSema().BuildCXXTypeConstructExpr( 2872 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2873 } 2874 2875 /// Build a new object-construction expression. 2876 /// 2877 /// By default, performs semantic analysis to build the new expression. 2878 /// Subclasses may override this routine to provide different behavior. 2879 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2880 SourceLocation LParenLoc, 2881 MultiExprArg Args, 2882 SourceLocation RParenLoc, 2883 bool ListInitialization) { 2884 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2885 RParenLoc, ListInitialization); 2886 } 2887 2888 /// Build a new member reference expression. 2889 /// 2890 /// By default, performs semantic analysis to build the new expression. 2891 /// Subclasses may override this routine to provide different behavior. 2892 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2893 QualType BaseType, 2894 bool IsArrow, 2895 SourceLocation OperatorLoc, 2896 NestedNameSpecifierLoc QualifierLoc, 2897 SourceLocation TemplateKWLoc, 2898 NamedDecl *FirstQualifierInScope, 2899 const DeclarationNameInfo &MemberNameInfo, 2900 const TemplateArgumentListInfo *TemplateArgs) { 2901 CXXScopeSpec SS; 2902 SS.Adopt(QualifierLoc); 2903 2904 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2905 OperatorLoc, IsArrow, 2906 SS, TemplateKWLoc, 2907 FirstQualifierInScope, 2908 MemberNameInfo, 2909 TemplateArgs, /*S*/nullptr); 2910 } 2911 2912 /// Build a new member reference expression. 2913 /// 2914 /// By default, performs semantic analysis to build the new expression. 2915 /// Subclasses may override this routine to provide different behavior. 2916 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2917 SourceLocation OperatorLoc, 2918 bool IsArrow, 2919 NestedNameSpecifierLoc QualifierLoc, 2920 SourceLocation TemplateKWLoc, 2921 NamedDecl *FirstQualifierInScope, 2922 LookupResult &R, 2923 const TemplateArgumentListInfo *TemplateArgs) { 2924 CXXScopeSpec SS; 2925 SS.Adopt(QualifierLoc); 2926 2927 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2928 OperatorLoc, IsArrow, 2929 SS, TemplateKWLoc, 2930 FirstQualifierInScope, 2931 R, TemplateArgs, /*S*/nullptr); 2932 } 2933 2934 /// Build a new noexcept expression. 2935 /// 2936 /// By default, performs semantic analysis to build the new expression. 2937 /// Subclasses may override this routine to provide different behavior. 2938 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2939 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2940 } 2941 2942 /// Build a new expression to compute the length of a parameter pack. 2943 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2944 NamedDecl *Pack, 2945 SourceLocation PackLoc, 2946 SourceLocation RParenLoc, 2947 Optional<unsigned> Length, 2948 ArrayRef<TemplateArgument> PartialArgs) { 2949 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2950 RParenLoc, Length, PartialArgs); 2951 } 2952 2953 /// Build a new Objective-C boxed expression. 2954 /// 2955 /// By default, performs semantic analysis to build the new expression. 2956 /// Subclasses may override this routine to provide different behavior. 2957 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2958 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2959 } 2960 2961 /// Build a new Objective-C array literal. 2962 /// 2963 /// By default, performs semantic analysis to build the new expression. 2964 /// Subclasses may override this routine to provide different behavior. 2965 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2966 Expr **Elements, unsigned NumElements) { 2967 return getSema().BuildObjCArrayLiteral(Range, 2968 MultiExprArg(Elements, NumElements)); 2969 } 2970 2971 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2972 Expr *Base, Expr *Key, 2973 ObjCMethodDecl *getterMethod, 2974 ObjCMethodDecl *setterMethod) { 2975 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2976 getterMethod, setterMethod); 2977 } 2978 2979 /// Build a new Objective-C dictionary literal. 2980 /// 2981 /// By default, performs semantic analysis to build the new expression. 2982 /// Subclasses may override this routine to provide different behavior. 2983 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2984 MutableArrayRef<ObjCDictionaryElement> Elements) { 2985 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2986 } 2987 2988 /// Build a new Objective-C \@encode expression. 2989 /// 2990 /// By default, performs semantic analysis to build the new expression. 2991 /// Subclasses may override this routine to provide different behavior. 2992 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2993 TypeSourceInfo *EncodeTypeInfo, 2994 SourceLocation RParenLoc) { 2995 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2996 } 2997 2998 /// Build a new Objective-C class message. 2999 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3000 Selector Sel, 3001 ArrayRef<SourceLocation> SelectorLocs, 3002 ObjCMethodDecl *Method, 3003 SourceLocation LBracLoc, 3004 MultiExprArg Args, 3005 SourceLocation RBracLoc) { 3006 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3007 ReceiverTypeInfo->getType(), 3008 /*SuperLoc=*/SourceLocation(), 3009 Sel, Method, LBracLoc, SelectorLocs, 3010 RBracLoc, Args); 3011 } 3012 3013 /// Build a new Objective-C instance message. 3014 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3015 Selector Sel, 3016 ArrayRef<SourceLocation> SelectorLocs, 3017 ObjCMethodDecl *Method, 3018 SourceLocation LBracLoc, 3019 MultiExprArg Args, 3020 SourceLocation RBracLoc) { 3021 return SemaRef.BuildInstanceMessage(Receiver, 3022 Receiver->getType(), 3023 /*SuperLoc=*/SourceLocation(), 3024 Sel, Method, LBracLoc, SelectorLocs, 3025 RBracLoc, Args); 3026 } 3027 3028 /// Build a new Objective-C instance/class message to 'super'. 3029 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3030 Selector Sel, 3031 ArrayRef<SourceLocation> SelectorLocs, 3032 QualType SuperType, 3033 ObjCMethodDecl *Method, 3034 SourceLocation LBracLoc, 3035 MultiExprArg Args, 3036 SourceLocation RBracLoc) { 3037 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3038 SuperType, 3039 SuperLoc, 3040 Sel, Method, LBracLoc, SelectorLocs, 3041 RBracLoc, Args) 3042 : SemaRef.BuildClassMessage(nullptr, 3043 SuperType, 3044 SuperLoc, 3045 Sel, Method, LBracLoc, SelectorLocs, 3046 RBracLoc, Args); 3047 3048 3049 } 3050 3051 /// Build a new Objective-C ivar reference expression. 3052 /// 3053 /// By default, performs semantic analysis to build the new expression. 3054 /// Subclasses may override this routine to provide different behavior. 3055 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3056 SourceLocation IvarLoc, 3057 bool IsArrow, bool IsFreeIvar) { 3058 CXXScopeSpec SS; 3059 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3060 ExprResult Result = getSema().BuildMemberReferenceExpr( 3061 BaseArg, BaseArg->getType(), 3062 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3063 /*FirstQualifierInScope=*/nullptr, NameInfo, 3064 /*TemplateArgs=*/nullptr, 3065 /*S=*/nullptr); 3066 if (IsFreeIvar && Result.isUsable()) 3067 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3068 return Result; 3069 } 3070 3071 /// Build a new Objective-C property reference expression. 3072 /// 3073 /// By default, performs semantic analysis to build the new expression. 3074 /// Subclasses may override this routine to provide different behavior. 3075 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3076 ObjCPropertyDecl *Property, 3077 SourceLocation PropertyLoc) { 3078 CXXScopeSpec SS; 3079 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3080 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3081 /*FIXME:*/PropertyLoc, 3082 /*IsArrow=*/false, 3083 SS, SourceLocation(), 3084 /*FirstQualifierInScope=*/nullptr, 3085 NameInfo, 3086 /*TemplateArgs=*/nullptr, 3087 /*S=*/nullptr); 3088 } 3089 3090 /// Build a new Objective-C property reference expression. 3091 /// 3092 /// By default, performs semantic analysis to build the new expression. 3093 /// Subclasses may override this routine to provide different behavior. 3094 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3095 ObjCMethodDecl *Getter, 3096 ObjCMethodDecl *Setter, 3097 SourceLocation PropertyLoc) { 3098 // Since these expressions can only be value-dependent, we do not 3099 // need to perform semantic analysis again. 3100 return Owned( 3101 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3102 VK_LValue, OK_ObjCProperty, 3103 PropertyLoc, Base)); 3104 } 3105 3106 /// Build a new Objective-C "isa" expression. 3107 /// 3108 /// By default, performs semantic analysis to build the new expression. 3109 /// Subclasses may override this routine to provide different behavior. 3110 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3111 SourceLocation OpLoc, bool IsArrow) { 3112 CXXScopeSpec SS; 3113 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3114 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3115 OpLoc, IsArrow, 3116 SS, SourceLocation(), 3117 /*FirstQualifierInScope=*/nullptr, 3118 NameInfo, 3119 /*TemplateArgs=*/nullptr, 3120 /*S=*/nullptr); 3121 } 3122 3123 /// Build a new shuffle vector expression. 3124 /// 3125 /// By default, performs semantic analysis to build the new expression. 3126 /// Subclasses may override this routine to provide different behavior. 3127 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3128 MultiExprArg SubExprs, 3129 SourceLocation RParenLoc) { 3130 // Find the declaration for __builtin_shufflevector 3131 const IdentifierInfo &Name 3132 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3133 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3134 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3135 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3136 3137 // Build a reference to the __builtin_shufflevector builtin 3138 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3139 Expr *Callee = new (SemaRef.Context) 3140 DeclRefExpr(SemaRef.Context, Builtin, false, 3141 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3142 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3143 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3144 CK_BuiltinFnToFnPtr).get(); 3145 3146 // Build the CallExpr 3147 ExprResult TheCall = CallExpr::Create( 3148 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3149 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3150 3151 // Type-check the __builtin_shufflevector expression. 3152 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3153 } 3154 3155 /// Build a new convert vector expression. 3156 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3157 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3158 SourceLocation RParenLoc) { 3159 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3160 BuiltinLoc, RParenLoc); 3161 } 3162 3163 /// Build a new template argument pack expansion. 3164 /// 3165 /// By default, performs semantic analysis to build a new pack expansion 3166 /// for a template argument. Subclasses may override this routine to provide 3167 /// different behavior. 3168 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3169 SourceLocation EllipsisLoc, 3170 Optional<unsigned> NumExpansions) { 3171 switch (Pattern.getArgument().getKind()) { 3172 case TemplateArgument::Expression: { 3173 ExprResult Result 3174 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3175 EllipsisLoc, NumExpansions); 3176 if (Result.isInvalid()) 3177 return TemplateArgumentLoc(); 3178 3179 return TemplateArgumentLoc(Result.get(), Result.get()); 3180 } 3181 3182 case TemplateArgument::Template: 3183 return TemplateArgumentLoc(TemplateArgument( 3184 Pattern.getArgument().getAsTemplate(), 3185 NumExpansions), 3186 Pattern.getTemplateQualifierLoc(), 3187 Pattern.getTemplateNameLoc(), 3188 EllipsisLoc); 3189 3190 case TemplateArgument::Null: 3191 case TemplateArgument::Integral: 3192 case TemplateArgument::Declaration: 3193 case TemplateArgument::Pack: 3194 case TemplateArgument::TemplateExpansion: 3195 case TemplateArgument::NullPtr: 3196 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3197 3198 case TemplateArgument::Type: 3199 if (TypeSourceInfo *Expansion 3200 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3201 EllipsisLoc, 3202 NumExpansions)) 3203 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3204 Expansion); 3205 break; 3206 } 3207 3208 return TemplateArgumentLoc(); 3209 } 3210 3211 /// Build a new expression pack expansion. 3212 /// 3213 /// By default, performs semantic analysis to build a new pack expansion 3214 /// for an expression. Subclasses may override this routine to provide 3215 /// different behavior. 3216 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3217 Optional<unsigned> NumExpansions) { 3218 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3219 } 3220 3221 /// Build a new C++1z fold-expression. 3222 /// 3223 /// By default, performs semantic analysis in order to build a new fold 3224 /// expression. 3225 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3226 BinaryOperatorKind Operator, 3227 SourceLocation EllipsisLoc, Expr *RHS, 3228 SourceLocation RParenLoc) { 3229 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3230 RHS, RParenLoc); 3231 } 3232 3233 /// Build an empty C++1z fold-expression with the given operator. 3234 /// 3235 /// By default, produces the fallback value for the fold-expression, or 3236 /// produce an error if there is no fallback value. 3237 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3238 BinaryOperatorKind Operator) { 3239 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3240 } 3241 3242 /// Build a new atomic operation expression. 3243 /// 3244 /// By default, performs semantic analysis to build the new expression. 3245 /// Subclasses may override this routine to provide different behavior. 3246 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3247 MultiExprArg SubExprs, 3248 QualType RetTy, 3249 AtomicExpr::AtomicOp Op, 3250 SourceLocation RParenLoc) { 3251 // Just create the expression; there is not any interesting semantic 3252 // analysis here because we can't actually build an AtomicExpr until 3253 // we are sure it is semantically sound. 3254 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3255 RParenLoc); 3256 } 3257 3258 private: 3259 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3260 QualType ObjectType, 3261 NamedDecl *FirstQualifierInScope, 3262 CXXScopeSpec &SS); 3263 3264 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3265 QualType ObjectType, 3266 NamedDecl *FirstQualifierInScope, 3267 CXXScopeSpec &SS); 3268 3269 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3270 NamedDecl *FirstQualifierInScope, 3271 CXXScopeSpec &SS); 3272 3273 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3274 DependentNameTypeLoc TL, 3275 bool DeducibleTSTContext); 3276 }; 3277 3278 template <typename Derived> 3279 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3280 if (!S) 3281 return S; 3282 3283 switch (S->getStmtClass()) { 3284 case Stmt::NoStmtClass: break; 3285 3286 // Transform individual statement nodes 3287 // Pass SDK into statements that can produce a value 3288 #define STMT(Node, Parent) \ 3289 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3290 #define VALUESTMT(Node, Parent) \ 3291 case Stmt::Node##Class: \ 3292 return getDerived().Transform##Node(cast<Node>(S), SDK); 3293 #define ABSTRACT_STMT(Node) 3294 #define EXPR(Node, Parent) 3295 #include "clang/AST/StmtNodes.inc" 3296 3297 // Transform expressions by calling TransformExpr. 3298 #define STMT(Node, Parent) 3299 #define ABSTRACT_STMT(Stmt) 3300 #define EXPR(Node, Parent) case Stmt::Node##Class: 3301 #include "clang/AST/StmtNodes.inc" 3302 { 3303 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3304 3305 if (SDK == SDK_StmtExprResult) 3306 E = getSema().ActOnStmtExprResult(E); 3307 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3308 } 3309 } 3310 3311 return S; 3312 } 3313 3314 template<typename Derived> 3315 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3316 if (!S) 3317 return S; 3318 3319 switch (S->getClauseKind()) { 3320 default: break; 3321 // Transform individual clause nodes 3322 #define OPENMP_CLAUSE(Name, Class) \ 3323 case OMPC_ ## Name : \ 3324 return getDerived().Transform ## Class(cast<Class>(S)); 3325 #include "clang/Basic/OpenMPKinds.def" 3326 } 3327 3328 return S; 3329 } 3330 3331 3332 template<typename Derived> 3333 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3334 if (!E) 3335 return E; 3336 3337 switch (E->getStmtClass()) { 3338 case Stmt::NoStmtClass: break; 3339 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3340 #define ABSTRACT_STMT(Stmt) 3341 #define EXPR(Node, Parent) \ 3342 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3343 #include "clang/AST/StmtNodes.inc" 3344 } 3345 3346 return E; 3347 } 3348 3349 template<typename Derived> 3350 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3351 bool NotCopyInit) { 3352 // Initializers are instantiated like expressions, except that various outer 3353 // layers are stripped. 3354 if (!Init) 3355 return Init; 3356 3357 if (auto *FE = dyn_cast<FullExpr>(Init)) 3358 Init = FE->getSubExpr(); 3359 3360 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3361 Init = AIL->getCommonExpr(); 3362 3363 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3364 Init = MTE->GetTemporaryExpr(); 3365 3366 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3367 Init = Binder->getSubExpr(); 3368 3369 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3370 Init = ICE->getSubExprAsWritten(); 3371 3372 if (CXXStdInitializerListExpr *ILE = 3373 dyn_cast<CXXStdInitializerListExpr>(Init)) 3374 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3375 3376 // If this is copy-initialization, we only need to reconstruct 3377 // InitListExprs. Other forms of copy-initialization will be a no-op if 3378 // the initializer is already the right type. 3379 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3380 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3381 return getDerived().TransformExpr(Init); 3382 3383 // Revert value-initialization back to empty parens. 3384 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3385 SourceRange Parens = VIE->getSourceRange(); 3386 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3387 Parens.getEnd()); 3388 } 3389 3390 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3391 if (isa<ImplicitValueInitExpr>(Init)) 3392 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3393 SourceLocation()); 3394 3395 // Revert initialization by constructor back to a parenthesized or braced list 3396 // of expressions. Any other form of initializer can just be reused directly. 3397 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3398 return getDerived().TransformExpr(Init); 3399 3400 // If the initialization implicitly converted an initializer list to a 3401 // std::initializer_list object, unwrap the std::initializer_list too. 3402 if (Construct && Construct->isStdInitListInitialization()) 3403 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3404 3405 // Enter a list-init context if this was list initialization. 3406 EnterExpressionEvaluationContext Context( 3407 getSema(), EnterExpressionEvaluationContext::InitList, 3408 Construct->isListInitialization()); 3409 3410 SmallVector<Expr*, 8> NewArgs; 3411 bool ArgChanged = false; 3412 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3413 /*IsCall*/true, NewArgs, &ArgChanged)) 3414 return ExprError(); 3415 3416 // If this was list initialization, revert to syntactic list form. 3417 if (Construct->isListInitialization()) 3418 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3419 Construct->getEndLoc()); 3420 3421 // Build a ParenListExpr to represent anything else. 3422 SourceRange Parens = Construct->getParenOrBraceRange(); 3423 if (Parens.isInvalid()) { 3424 // This was a variable declaration's initialization for which no initializer 3425 // was specified. 3426 assert(NewArgs.empty() && 3427 "no parens or braces but have direct init with arguments?"); 3428 return ExprEmpty(); 3429 } 3430 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3431 Parens.getEnd()); 3432 } 3433 3434 template<typename Derived> 3435 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3436 unsigned NumInputs, 3437 bool IsCall, 3438 SmallVectorImpl<Expr *> &Outputs, 3439 bool *ArgChanged) { 3440 for (unsigned I = 0; I != NumInputs; ++I) { 3441 // If requested, drop call arguments that need to be dropped. 3442 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3443 if (ArgChanged) 3444 *ArgChanged = true; 3445 3446 break; 3447 } 3448 3449 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3450 Expr *Pattern = Expansion->getPattern(); 3451 3452 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3453 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3454 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3455 3456 // Determine whether the set of unexpanded parameter packs can and should 3457 // be expanded. 3458 bool Expand = true; 3459 bool RetainExpansion = false; 3460 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3461 Optional<unsigned> NumExpansions = OrigNumExpansions; 3462 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3463 Pattern->getSourceRange(), 3464 Unexpanded, 3465 Expand, RetainExpansion, 3466 NumExpansions)) 3467 return true; 3468 3469 if (!Expand) { 3470 // The transform has determined that we should perform a simple 3471 // transformation on the pack expansion, producing another pack 3472 // expansion. 3473 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3474 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3475 if (OutPattern.isInvalid()) 3476 return true; 3477 3478 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3479 Expansion->getEllipsisLoc(), 3480 NumExpansions); 3481 if (Out.isInvalid()) 3482 return true; 3483 3484 if (ArgChanged) 3485 *ArgChanged = true; 3486 Outputs.push_back(Out.get()); 3487 continue; 3488 } 3489 3490 // Record right away that the argument was changed. This needs 3491 // to happen even if the array expands to nothing. 3492 if (ArgChanged) *ArgChanged = true; 3493 3494 // The transform has determined that we should perform an elementwise 3495 // expansion of the pattern. Do so. 3496 for (unsigned I = 0; I != *NumExpansions; ++I) { 3497 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3498 ExprResult Out = getDerived().TransformExpr(Pattern); 3499 if (Out.isInvalid()) 3500 return true; 3501 3502 if (Out.get()->containsUnexpandedParameterPack()) { 3503 Out = getDerived().RebuildPackExpansion( 3504 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3505 if (Out.isInvalid()) 3506 return true; 3507 } 3508 3509 Outputs.push_back(Out.get()); 3510 } 3511 3512 // If we're supposed to retain a pack expansion, do so by temporarily 3513 // forgetting the partially-substituted parameter pack. 3514 if (RetainExpansion) { 3515 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3516 3517 ExprResult Out = getDerived().TransformExpr(Pattern); 3518 if (Out.isInvalid()) 3519 return true; 3520 3521 Out = getDerived().RebuildPackExpansion( 3522 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3523 if (Out.isInvalid()) 3524 return true; 3525 3526 Outputs.push_back(Out.get()); 3527 } 3528 3529 continue; 3530 } 3531 3532 ExprResult Result = 3533 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3534 : getDerived().TransformExpr(Inputs[I]); 3535 if (Result.isInvalid()) 3536 return true; 3537 3538 if (Result.get() != Inputs[I] && ArgChanged) 3539 *ArgChanged = true; 3540 3541 Outputs.push_back(Result.get()); 3542 } 3543 3544 return false; 3545 } 3546 3547 template <typename Derived> 3548 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3549 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3550 if (Var) { 3551 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3552 getDerived().TransformDefinition(Var->getLocation(), Var)); 3553 3554 if (!ConditionVar) 3555 return Sema::ConditionError(); 3556 3557 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3558 } 3559 3560 if (Expr) { 3561 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3562 3563 if (CondExpr.isInvalid()) 3564 return Sema::ConditionError(); 3565 3566 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3567 } 3568 3569 return Sema::ConditionResult(); 3570 } 3571 3572 template<typename Derived> 3573 NestedNameSpecifierLoc 3574 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3575 NestedNameSpecifierLoc NNS, 3576 QualType ObjectType, 3577 NamedDecl *FirstQualifierInScope) { 3578 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3579 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3580 Qualifier = Qualifier.getPrefix()) 3581 Qualifiers.push_back(Qualifier); 3582 3583 CXXScopeSpec SS; 3584 while (!Qualifiers.empty()) { 3585 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3586 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3587 3588 switch (QNNS->getKind()) { 3589 case NestedNameSpecifier::Identifier: { 3590 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3591 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3592 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3593 SS, FirstQualifierInScope, false)) 3594 return NestedNameSpecifierLoc(); 3595 } 3596 break; 3597 3598 case NestedNameSpecifier::Namespace: { 3599 NamespaceDecl *NS 3600 = cast_or_null<NamespaceDecl>( 3601 getDerived().TransformDecl( 3602 Q.getLocalBeginLoc(), 3603 QNNS->getAsNamespace())); 3604 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3605 break; 3606 } 3607 3608 case NestedNameSpecifier::NamespaceAlias: { 3609 NamespaceAliasDecl *Alias 3610 = cast_or_null<NamespaceAliasDecl>( 3611 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3612 QNNS->getAsNamespaceAlias())); 3613 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3614 Q.getLocalEndLoc()); 3615 break; 3616 } 3617 3618 case NestedNameSpecifier::Global: 3619 // There is no meaningful transformation that one could perform on the 3620 // global scope. 3621 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3622 break; 3623 3624 case NestedNameSpecifier::Super: { 3625 CXXRecordDecl *RD = 3626 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3627 SourceLocation(), QNNS->getAsRecordDecl())); 3628 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3629 break; 3630 } 3631 3632 case NestedNameSpecifier::TypeSpecWithTemplate: 3633 case NestedNameSpecifier::TypeSpec: { 3634 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3635 FirstQualifierInScope, SS); 3636 3637 if (!TL) 3638 return NestedNameSpecifierLoc(); 3639 3640 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3641 (SemaRef.getLangOpts().CPlusPlus11 && 3642 TL.getType()->isEnumeralType())) { 3643 assert(!TL.getType().hasLocalQualifiers() && 3644 "Can't get cv-qualifiers here"); 3645 if (TL.getType()->isEnumeralType()) 3646 SemaRef.Diag(TL.getBeginLoc(), 3647 diag::warn_cxx98_compat_enum_nested_name_spec); 3648 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3649 Q.getLocalEndLoc()); 3650 break; 3651 } 3652 // If the nested-name-specifier is an invalid type def, don't emit an 3653 // error because a previous error should have already been emitted. 3654 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3655 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3656 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3657 << TL.getType() << SS.getRange(); 3658 } 3659 return NestedNameSpecifierLoc(); 3660 } 3661 } 3662 3663 // The qualifier-in-scope and object type only apply to the leftmost entity. 3664 FirstQualifierInScope = nullptr; 3665 ObjectType = QualType(); 3666 } 3667 3668 // Don't rebuild the nested-name-specifier if we don't have to. 3669 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3670 !getDerived().AlwaysRebuild()) 3671 return NNS; 3672 3673 // If we can re-use the source-location data from the original 3674 // nested-name-specifier, do so. 3675 if (SS.location_size() == NNS.getDataLength() && 3676 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3677 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3678 3679 // Allocate new nested-name-specifier location information. 3680 return SS.getWithLocInContext(SemaRef.Context); 3681 } 3682 3683 template<typename Derived> 3684 DeclarationNameInfo 3685 TreeTransform<Derived> 3686 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3687 DeclarationName Name = NameInfo.getName(); 3688 if (!Name) 3689 return DeclarationNameInfo(); 3690 3691 switch (Name.getNameKind()) { 3692 case DeclarationName::Identifier: 3693 case DeclarationName::ObjCZeroArgSelector: 3694 case DeclarationName::ObjCOneArgSelector: 3695 case DeclarationName::ObjCMultiArgSelector: 3696 case DeclarationName::CXXOperatorName: 3697 case DeclarationName::CXXLiteralOperatorName: 3698 case DeclarationName::CXXUsingDirective: 3699 return NameInfo; 3700 3701 case DeclarationName::CXXDeductionGuideName: { 3702 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3703 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3704 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3705 if (!NewTemplate) 3706 return DeclarationNameInfo(); 3707 3708 DeclarationNameInfo NewNameInfo(NameInfo); 3709 NewNameInfo.setName( 3710 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3711 return NewNameInfo; 3712 } 3713 3714 case DeclarationName::CXXConstructorName: 3715 case DeclarationName::CXXDestructorName: 3716 case DeclarationName::CXXConversionFunctionName: { 3717 TypeSourceInfo *NewTInfo; 3718 CanQualType NewCanTy; 3719 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3720 NewTInfo = getDerived().TransformType(OldTInfo); 3721 if (!NewTInfo) 3722 return DeclarationNameInfo(); 3723 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3724 } 3725 else { 3726 NewTInfo = nullptr; 3727 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3728 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3729 if (NewT.isNull()) 3730 return DeclarationNameInfo(); 3731 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3732 } 3733 3734 DeclarationName NewName 3735 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3736 NewCanTy); 3737 DeclarationNameInfo NewNameInfo(NameInfo); 3738 NewNameInfo.setName(NewName); 3739 NewNameInfo.setNamedTypeInfo(NewTInfo); 3740 return NewNameInfo; 3741 } 3742 } 3743 3744 llvm_unreachable("Unknown name kind."); 3745 } 3746 3747 template<typename Derived> 3748 TemplateName 3749 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3750 TemplateName Name, 3751 SourceLocation NameLoc, 3752 QualType ObjectType, 3753 NamedDecl *FirstQualifierInScope, 3754 bool AllowInjectedClassName) { 3755 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3756 TemplateDecl *Template = QTN->getTemplateDecl(); 3757 assert(Template && "qualified template name must refer to a template"); 3758 3759 TemplateDecl *TransTemplate 3760 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3761 Template)); 3762 if (!TransTemplate) 3763 return TemplateName(); 3764 3765 if (!getDerived().AlwaysRebuild() && 3766 SS.getScopeRep() == QTN->getQualifier() && 3767 TransTemplate == Template) 3768 return Name; 3769 3770 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3771 TransTemplate); 3772 } 3773 3774 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3775 if (SS.getScopeRep()) { 3776 // These apply to the scope specifier, not the template. 3777 ObjectType = QualType(); 3778 FirstQualifierInScope = nullptr; 3779 } 3780 3781 if (!getDerived().AlwaysRebuild() && 3782 SS.getScopeRep() == DTN->getQualifier() && 3783 ObjectType.isNull()) 3784 return Name; 3785 3786 // FIXME: Preserve the location of the "template" keyword. 3787 SourceLocation TemplateKWLoc = NameLoc; 3788 3789 if (DTN->isIdentifier()) { 3790 return getDerived().RebuildTemplateName(SS, 3791 TemplateKWLoc, 3792 *DTN->getIdentifier(), 3793 NameLoc, 3794 ObjectType, 3795 FirstQualifierInScope, 3796 AllowInjectedClassName); 3797 } 3798 3799 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3800 DTN->getOperator(), NameLoc, 3801 ObjectType, AllowInjectedClassName); 3802 } 3803 3804 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3805 TemplateDecl *TransTemplate 3806 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3807 Template)); 3808 if (!TransTemplate) 3809 return TemplateName(); 3810 3811 if (!getDerived().AlwaysRebuild() && 3812 TransTemplate == Template) 3813 return Name; 3814 3815 return TemplateName(TransTemplate); 3816 } 3817 3818 if (SubstTemplateTemplateParmPackStorage *SubstPack 3819 = Name.getAsSubstTemplateTemplateParmPack()) { 3820 TemplateTemplateParmDecl *TransParam 3821 = cast_or_null<TemplateTemplateParmDecl>( 3822 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3823 if (!TransParam) 3824 return TemplateName(); 3825 3826 if (!getDerived().AlwaysRebuild() && 3827 TransParam == SubstPack->getParameterPack()) 3828 return Name; 3829 3830 return getDerived().RebuildTemplateName(TransParam, 3831 SubstPack->getArgumentPack()); 3832 } 3833 3834 // These should be getting filtered out before they reach the AST. 3835 llvm_unreachable("overloaded function decl survived to here"); 3836 } 3837 3838 template<typename Derived> 3839 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3840 const TemplateArgument &Arg, 3841 TemplateArgumentLoc &Output) { 3842 SourceLocation Loc = getDerived().getBaseLocation(); 3843 switch (Arg.getKind()) { 3844 case TemplateArgument::Null: 3845 llvm_unreachable("null template argument in TreeTransform"); 3846 break; 3847 3848 case TemplateArgument::Type: 3849 Output = TemplateArgumentLoc(Arg, 3850 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3851 3852 break; 3853 3854 case TemplateArgument::Template: 3855 case TemplateArgument::TemplateExpansion: { 3856 NestedNameSpecifierLocBuilder Builder; 3857 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3858 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3859 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3860 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3861 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3862 3863 if (Arg.getKind() == TemplateArgument::Template) 3864 Output = TemplateArgumentLoc(Arg, 3865 Builder.getWithLocInContext(SemaRef.Context), 3866 Loc); 3867 else 3868 Output = TemplateArgumentLoc(Arg, 3869 Builder.getWithLocInContext(SemaRef.Context), 3870 Loc, Loc); 3871 3872 break; 3873 } 3874 3875 case TemplateArgument::Expression: 3876 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3877 break; 3878 3879 case TemplateArgument::Declaration: 3880 case TemplateArgument::Integral: 3881 case TemplateArgument::Pack: 3882 case TemplateArgument::NullPtr: 3883 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3884 break; 3885 } 3886 } 3887 3888 template<typename Derived> 3889 bool TreeTransform<Derived>::TransformTemplateArgument( 3890 const TemplateArgumentLoc &Input, 3891 TemplateArgumentLoc &Output, bool Uneval) { 3892 EnterExpressionEvaluationContext EEEC( 3893 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated, 3894 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 3895 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 3896 const TemplateArgument &Arg = Input.getArgument(); 3897 switch (Arg.getKind()) { 3898 case TemplateArgument::Null: 3899 case TemplateArgument::Integral: 3900 case TemplateArgument::Pack: 3901 case TemplateArgument::Declaration: 3902 case TemplateArgument::NullPtr: 3903 llvm_unreachable("Unexpected TemplateArgument"); 3904 3905 case TemplateArgument::Type: { 3906 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3907 if (!DI) 3908 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3909 3910 DI = getDerived().TransformType(DI); 3911 if (!DI) return true; 3912 3913 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3914 return false; 3915 } 3916 3917 case TemplateArgument::Template: { 3918 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3919 if (QualifierLoc) { 3920 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3921 if (!QualifierLoc) 3922 return true; 3923 } 3924 3925 CXXScopeSpec SS; 3926 SS.Adopt(QualifierLoc); 3927 TemplateName Template 3928 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3929 Input.getTemplateNameLoc()); 3930 if (Template.isNull()) 3931 return true; 3932 3933 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3934 Input.getTemplateNameLoc()); 3935 return false; 3936 } 3937 3938 case TemplateArgument::TemplateExpansion: 3939 llvm_unreachable("Caller should expand pack expansions"); 3940 3941 case TemplateArgument::Expression: { 3942 // Template argument expressions are constant expressions. 3943 EnterExpressionEvaluationContext Unevaluated( 3944 getSema(), Uneval 3945 ? Sema::ExpressionEvaluationContext::Unevaluated 3946 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3947 3948 Expr *InputExpr = Input.getSourceExpression(); 3949 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3950 3951 ExprResult E = getDerived().TransformExpr(InputExpr); 3952 E = SemaRef.ActOnConstantExpression(E); 3953 if (E.isInvalid()) return true; 3954 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3955 return false; 3956 } 3957 } 3958 3959 // Work around bogus GCC warning 3960 return true; 3961 } 3962 3963 /// Iterator adaptor that invents template argument location information 3964 /// for each of the template arguments in its underlying iterator. 3965 template<typename Derived, typename InputIterator> 3966 class TemplateArgumentLocInventIterator { 3967 TreeTransform<Derived> &Self; 3968 InputIterator Iter; 3969 3970 public: 3971 typedef TemplateArgumentLoc value_type; 3972 typedef TemplateArgumentLoc reference; 3973 typedef typename std::iterator_traits<InputIterator>::difference_type 3974 difference_type; 3975 typedef std::input_iterator_tag iterator_category; 3976 3977 class pointer { 3978 TemplateArgumentLoc Arg; 3979 3980 public: 3981 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3982 3983 const TemplateArgumentLoc *operator->() const { return &Arg; } 3984 }; 3985 3986 TemplateArgumentLocInventIterator() { } 3987 3988 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3989 InputIterator Iter) 3990 : Self(Self), Iter(Iter) { } 3991 3992 TemplateArgumentLocInventIterator &operator++() { 3993 ++Iter; 3994 return *this; 3995 } 3996 3997 TemplateArgumentLocInventIterator operator++(int) { 3998 TemplateArgumentLocInventIterator Old(*this); 3999 ++(*this); 4000 return Old; 4001 } 4002 4003 reference operator*() const { 4004 TemplateArgumentLoc Result; 4005 Self.InventTemplateArgumentLoc(*Iter, Result); 4006 return Result; 4007 } 4008 4009 pointer operator->() const { return pointer(**this); } 4010 4011 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4012 const TemplateArgumentLocInventIterator &Y) { 4013 return X.Iter == Y.Iter; 4014 } 4015 4016 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4017 const TemplateArgumentLocInventIterator &Y) { 4018 return X.Iter != Y.Iter; 4019 } 4020 }; 4021 4022 template<typename Derived> 4023 template<typename InputIterator> 4024 bool TreeTransform<Derived>::TransformTemplateArguments( 4025 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4026 bool Uneval) { 4027 for (; First != Last; ++First) { 4028 TemplateArgumentLoc Out; 4029 TemplateArgumentLoc In = *First; 4030 4031 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4032 // Unpack argument packs, which we translate them into separate 4033 // arguments. 4034 // FIXME: We could do much better if we could guarantee that the 4035 // TemplateArgumentLocInfo for the pack expansion would be usable for 4036 // all of the template arguments in the argument pack. 4037 typedef TemplateArgumentLocInventIterator<Derived, 4038 TemplateArgument::pack_iterator> 4039 PackLocIterator; 4040 if (TransformTemplateArguments(PackLocIterator(*this, 4041 In.getArgument().pack_begin()), 4042 PackLocIterator(*this, 4043 In.getArgument().pack_end()), 4044 Outputs, Uneval)) 4045 return true; 4046 4047 continue; 4048 } 4049 4050 if (In.getArgument().isPackExpansion()) { 4051 // We have a pack expansion, for which we will be substituting into 4052 // the pattern. 4053 SourceLocation Ellipsis; 4054 Optional<unsigned> OrigNumExpansions; 4055 TemplateArgumentLoc Pattern 4056 = getSema().getTemplateArgumentPackExpansionPattern( 4057 In, Ellipsis, OrigNumExpansions); 4058 4059 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4060 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4061 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4062 4063 // Determine whether the set of unexpanded parameter packs can and should 4064 // be expanded. 4065 bool Expand = true; 4066 bool RetainExpansion = false; 4067 Optional<unsigned> NumExpansions = OrigNumExpansions; 4068 if (getDerived().TryExpandParameterPacks(Ellipsis, 4069 Pattern.getSourceRange(), 4070 Unexpanded, 4071 Expand, 4072 RetainExpansion, 4073 NumExpansions)) 4074 return true; 4075 4076 if (!Expand) { 4077 // The transform has determined that we should perform a simple 4078 // transformation on the pack expansion, producing another pack 4079 // expansion. 4080 TemplateArgumentLoc OutPattern; 4081 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4082 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4083 return true; 4084 4085 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4086 NumExpansions); 4087 if (Out.getArgument().isNull()) 4088 return true; 4089 4090 Outputs.addArgument(Out); 4091 continue; 4092 } 4093 4094 // The transform has determined that we should perform an elementwise 4095 // expansion of the pattern. Do so. 4096 for (unsigned I = 0; I != *NumExpansions; ++I) { 4097 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4098 4099 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4100 return true; 4101 4102 if (Out.getArgument().containsUnexpandedParameterPack()) { 4103 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4104 OrigNumExpansions); 4105 if (Out.getArgument().isNull()) 4106 return true; 4107 } 4108 4109 Outputs.addArgument(Out); 4110 } 4111 4112 // If we're supposed to retain a pack expansion, do so by temporarily 4113 // forgetting the partially-substituted parameter pack. 4114 if (RetainExpansion) { 4115 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4116 4117 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4118 return true; 4119 4120 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4121 OrigNumExpansions); 4122 if (Out.getArgument().isNull()) 4123 return true; 4124 4125 Outputs.addArgument(Out); 4126 } 4127 4128 continue; 4129 } 4130 4131 // The simple case: 4132 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4133 return true; 4134 4135 Outputs.addArgument(Out); 4136 } 4137 4138 return false; 4139 4140 } 4141 4142 //===----------------------------------------------------------------------===// 4143 // Type transformation 4144 //===----------------------------------------------------------------------===// 4145 4146 template<typename Derived> 4147 QualType TreeTransform<Derived>::TransformType(QualType T) { 4148 if (getDerived().AlreadyTransformed(T)) 4149 return T; 4150 4151 // Temporary workaround. All of these transformations should 4152 // eventually turn into transformations on TypeLocs. 4153 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4154 getDerived().getBaseLocation()); 4155 4156 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4157 4158 if (!NewDI) 4159 return QualType(); 4160 4161 return NewDI->getType(); 4162 } 4163 4164 template<typename Derived> 4165 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4166 // Refine the base location to the type's location. 4167 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4168 getDerived().getBaseEntity()); 4169 if (getDerived().AlreadyTransformed(DI->getType())) 4170 return DI; 4171 4172 TypeLocBuilder TLB; 4173 4174 TypeLoc TL = DI->getTypeLoc(); 4175 TLB.reserve(TL.getFullDataSize()); 4176 4177 QualType Result = getDerived().TransformType(TLB, TL); 4178 if (Result.isNull()) 4179 return nullptr; 4180 4181 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4182 } 4183 4184 template<typename Derived> 4185 QualType 4186 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4187 switch (T.getTypeLocClass()) { 4188 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4189 #define TYPELOC(CLASS, PARENT) \ 4190 case TypeLoc::CLASS: \ 4191 return getDerived().Transform##CLASS##Type(TLB, \ 4192 T.castAs<CLASS##TypeLoc>()); 4193 #include "clang/AST/TypeLocNodes.def" 4194 } 4195 4196 llvm_unreachable("unhandled type loc!"); 4197 } 4198 4199 template<typename Derived> 4200 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4201 if (!isa<DependentNameType>(T)) 4202 return TransformType(T); 4203 4204 if (getDerived().AlreadyTransformed(T)) 4205 return T; 4206 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4207 getDerived().getBaseLocation()); 4208 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4209 return NewDI ? NewDI->getType() : QualType(); 4210 } 4211 4212 template<typename Derived> 4213 TypeSourceInfo * 4214 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4215 if (!isa<DependentNameType>(DI->getType())) 4216 return TransformType(DI); 4217 4218 // Refine the base location to the type's location. 4219 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4220 getDerived().getBaseEntity()); 4221 if (getDerived().AlreadyTransformed(DI->getType())) 4222 return DI; 4223 4224 TypeLocBuilder TLB; 4225 4226 TypeLoc TL = DI->getTypeLoc(); 4227 TLB.reserve(TL.getFullDataSize()); 4228 4229 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4230 if (QTL) 4231 TL = QTL.getUnqualifiedLoc(); 4232 4233 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4234 4235 QualType Result = getDerived().TransformDependentNameType( 4236 TLB, DNTL, /*DeducedTSTContext*/true); 4237 if (Result.isNull()) 4238 return nullptr; 4239 4240 if (QTL) { 4241 Result = getDerived().RebuildQualifiedType(Result, QTL); 4242 if (Result.isNull()) 4243 return nullptr; 4244 TLB.TypeWasModifiedSafely(Result); 4245 } 4246 4247 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4248 } 4249 4250 template<typename Derived> 4251 QualType 4252 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4253 QualifiedTypeLoc T) { 4254 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4255 if (Result.isNull()) 4256 return QualType(); 4257 4258 Result = getDerived().RebuildQualifiedType(Result, T); 4259 4260 if (Result.isNull()) 4261 return QualType(); 4262 4263 // RebuildQualifiedType might have updated the type, but not in a way 4264 // that invalidates the TypeLoc. (There's no location information for 4265 // qualifiers.) 4266 TLB.TypeWasModifiedSafely(Result); 4267 4268 return Result; 4269 } 4270 4271 template <typename Derived> 4272 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4273 QualifiedTypeLoc TL) { 4274 4275 SourceLocation Loc = TL.getBeginLoc(); 4276 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4277 4278 if (((T.getAddressSpace() != LangAS::Default && 4279 Quals.getAddressSpace() != LangAS::Default)) && 4280 T.getAddressSpace() != Quals.getAddressSpace()) { 4281 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4282 << TL.getType() << T; 4283 return QualType(); 4284 } 4285 4286 // C++ [dcl.fct]p7: 4287 // [When] adding cv-qualifications on top of the function type [...] the 4288 // cv-qualifiers are ignored. 4289 if (T->isFunctionType()) { 4290 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4291 Quals.getAddressSpace()); 4292 return T; 4293 } 4294 4295 // C++ [dcl.ref]p1: 4296 // when the cv-qualifiers are introduced through the use of a typedef-name 4297 // or decltype-specifier [...] the cv-qualifiers are ignored. 4298 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4299 // applied to a reference type. 4300 if (T->isReferenceType()) { 4301 // The only qualifier that applies to a reference type is restrict. 4302 if (!Quals.hasRestrict()) 4303 return T; 4304 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4305 } 4306 4307 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4308 // resulting type. 4309 if (Quals.hasObjCLifetime()) { 4310 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4311 Quals.removeObjCLifetime(); 4312 else if (T.getObjCLifetime()) { 4313 // Objective-C ARC: 4314 // A lifetime qualifier applied to a substituted template parameter 4315 // overrides the lifetime qualifier from the template argument. 4316 const AutoType *AutoTy; 4317 if (const SubstTemplateTypeParmType *SubstTypeParam 4318 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4319 QualType Replacement = SubstTypeParam->getReplacementType(); 4320 Qualifiers Qs = Replacement.getQualifiers(); 4321 Qs.removeObjCLifetime(); 4322 Replacement = SemaRef.Context.getQualifiedType( 4323 Replacement.getUnqualifiedType(), Qs); 4324 T = SemaRef.Context.getSubstTemplateTypeParmType( 4325 SubstTypeParam->getReplacedParameter(), Replacement); 4326 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4327 // 'auto' types behave the same way as template parameters. 4328 QualType Deduced = AutoTy->getDeducedType(); 4329 Qualifiers Qs = Deduced.getQualifiers(); 4330 Qs.removeObjCLifetime(); 4331 Deduced = 4332 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4333 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4334 AutoTy->isDependentType()); 4335 } else { 4336 // Otherwise, complain about the addition of a qualifier to an 4337 // already-qualified type. 4338 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4339 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4340 Quals.removeObjCLifetime(); 4341 } 4342 } 4343 } 4344 4345 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4346 } 4347 4348 template<typename Derived> 4349 TypeLoc 4350 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4351 QualType ObjectType, 4352 NamedDecl *UnqualLookup, 4353 CXXScopeSpec &SS) { 4354 if (getDerived().AlreadyTransformed(TL.getType())) 4355 return TL; 4356 4357 TypeSourceInfo *TSI = 4358 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4359 if (TSI) 4360 return TSI->getTypeLoc(); 4361 return TypeLoc(); 4362 } 4363 4364 template<typename Derived> 4365 TypeSourceInfo * 4366 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4367 QualType ObjectType, 4368 NamedDecl *UnqualLookup, 4369 CXXScopeSpec &SS) { 4370 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4371 return TSInfo; 4372 4373 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4374 UnqualLookup, SS); 4375 } 4376 4377 template <typename Derived> 4378 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4379 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4380 CXXScopeSpec &SS) { 4381 QualType T = TL.getType(); 4382 assert(!getDerived().AlreadyTransformed(T)); 4383 4384 TypeLocBuilder TLB; 4385 QualType Result; 4386 4387 if (isa<TemplateSpecializationType>(T)) { 4388 TemplateSpecializationTypeLoc SpecTL = 4389 TL.castAs<TemplateSpecializationTypeLoc>(); 4390 4391 TemplateName Template = getDerived().TransformTemplateName( 4392 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4393 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4394 if (Template.isNull()) 4395 return nullptr; 4396 4397 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4398 Template); 4399 } else if (isa<DependentTemplateSpecializationType>(T)) { 4400 DependentTemplateSpecializationTypeLoc SpecTL = 4401 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4402 4403 TemplateName Template 4404 = getDerived().RebuildTemplateName(SS, 4405 SpecTL.getTemplateKeywordLoc(), 4406 *SpecTL.getTypePtr()->getIdentifier(), 4407 SpecTL.getTemplateNameLoc(), 4408 ObjectType, UnqualLookup, 4409 /*AllowInjectedClassName*/true); 4410 if (Template.isNull()) 4411 return nullptr; 4412 4413 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4414 SpecTL, 4415 Template, 4416 SS); 4417 } else { 4418 // Nothing special needs to be done for these. 4419 Result = getDerived().TransformType(TLB, TL); 4420 } 4421 4422 if (Result.isNull()) 4423 return nullptr; 4424 4425 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4426 } 4427 4428 template <class TyLoc> static inline 4429 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4430 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4431 NewT.setNameLoc(T.getNameLoc()); 4432 return T.getType(); 4433 } 4434 4435 template<typename Derived> 4436 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4437 BuiltinTypeLoc T) { 4438 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4439 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4440 if (T.needsExtraLocalData()) 4441 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4442 return T.getType(); 4443 } 4444 4445 template<typename Derived> 4446 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4447 ComplexTypeLoc T) { 4448 // FIXME: recurse? 4449 return TransformTypeSpecType(TLB, T); 4450 } 4451 4452 template <typename Derived> 4453 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4454 AdjustedTypeLoc TL) { 4455 // Adjustments applied during transformation are handled elsewhere. 4456 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4457 } 4458 4459 template<typename Derived> 4460 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4461 DecayedTypeLoc TL) { 4462 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4463 if (OriginalType.isNull()) 4464 return QualType(); 4465 4466 QualType Result = TL.getType(); 4467 if (getDerived().AlwaysRebuild() || 4468 OriginalType != TL.getOriginalLoc().getType()) 4469 Result = SemaRef.Context.getDecayedType(OriginalType); 4470 TLB.push<DecayedTypeLoc>(Result); 4471 // Nothing to set for DecayedTypeLoc. 4472 return Result; 4473 } 4474 4475 template<typename Derived> 4476 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4477 PointerTypeLoc TL) { 4478 QualType PointeeType 4479 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4480 if (PointeeType.isNull()) 4481 return QualType(); 4482 4483 QualType Result = TL.getType(); 4484 if (PointeeType->getAs<ObjCObjectType>()) { 4485 // A dependent pointer type 'T *' has is being transformed such 4486 // that an Objective-C class type is being replaced for 'T'. The 4487 // resulting pointer type is an ObjCObjectPointerType, not a 4488 // PointerType. 4489 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4490 4491 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4492 NewT.setStarLoc(TL.getStarLoc()); 4493 return Result; 4494 } 4495 4496 if (getDerived().AlwaysRebuild() || 4497 PointeeType != TL.getPointeeLoc().getType()) { 4498 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4499 if (Result.isNull()) 4500 return QualType(); 4501 } 4502 4503 // Objective-C ARC can add lifetime qualifiers to the type that we're 4504 // pointing to. 4505 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4506 4507 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4508 NewT.setSigilLoc(TL.getSigilLoc()); 4509 return Result; 4510 } 4511 4512 template<typename Derived> 4513 QualType 4514 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4515 BlockPointerTypeLoc TL) { 4516 QualType PointeeType 4517 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4518 if (PointeeType.isNull()) 4519 return QualType(); 4520 4521 QualType Result = TL.getType(); 4522 if (getDerived().AlwaysRebuild() || 4523 PointeeType != TL.getPointeeLoc().getType()) { 4524 Result = getDerived().RebuildBlockPointerType(PointeeType, 4525 TL.getSigilLoc()); 4526 if (Result.isNull()) 4527 return QualType(); 4528 } 4529 4530 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4531 NewT.setSigilLoc(TL.getSigilLoc()); 4532 return Result; 4533 } 4534 4535 /// Transforms a reference type. Note that somewhat paradoxically we 4536 /// don't care whether the type itself is an l-value type or an r-value 4537 /// type; we only care if the type was *written* as an l-value type 4538 /// or an r-value type. 4539 template<typename Derived> 4540 QualType 4541 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4542 ReferenceTypeLoc TL) { 4543 const ReferenceType *T = TL.getTypePtr(); 4544 4545 // Note that this works with the pointee-as-written. 4546 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4547 if (PointeeType.isNull()) 4548 return QualType(); 4549 4550 QualType Result = TL.getType(); 4551 if (getDerived().AlwaysRebuild() || 4552 PointeeType != T->getPointeeTypeAsWritten()) { 4553 Result = getDerived().RebuildReferenceType(PointeeType, 4554 T->isSpelledAsLValue(), 4555 TL.getSigilLoc()); 4556 if (Result.isNull()) 4557 return QualType(); 4558 } 4559 4560 // Objective-C ARC can add lifetime qualifiers to the type that we're 4561 // referring to. 4562 TLB.TypeWasModifiedSafely( 4563 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4564 4565 // r-value references can be rebuilt as l-value references. 4566 ReferenceTypeLoc NewTL; 4567 if (isa<LValueReferenceType>(Result)) 4568 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4569 else 4570 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4571 NewTL.setSigilLoc(TL.getSigilLoc()); 4572 4573 return Result; 4574 } 4575 4576 template<typename Derived> 4577 QualType 4578 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4579 LValueReferenceTypeLoc TL) { 4580 return TransformReferenceType(TLB, TL); 4581 } 4582 4583 template<typename Derived> 4584 QualType 4585 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4586 RValueReferenceTypeLoc TL) { 4587 return TransformReferenceType(TLB, TL); 4588 } 4589 4590 template<typename Derived> 4591 QualType 4592 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4593 MemberPointerTypeLoc TL) { 4594 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4595 if (PointeeType.isNull()) 4596 return QualType(); 4597 4598 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4599 TypeSourceInfo *NewClsTInfo = nullptr; 4600 if (OldClsTInfo) { 4601 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4602 if (!NewClsTInfo) 4603 return QualType(); 4604 } 4605 4606 const MemberPointerType *T = TL.getTypePtr(); 4607 QualType OldClsType = QualType(T->getClass(), 0); 4608 QualType NewClsType; 4609 if (NewClsTInfo) 4610 NewClsType = NewClsTInfo->getType(); 4611 else { 4612 NewClsType = getDerived().TransformType(OldClsType); 4613 if (NewClsType.isNull()) 4614 return QualType(); 4615 } 4616 4617 QualType Result = TL.getType(); 4618 if (getDerived().AlwaysRebuild() || 4619 PointeeType != T->getPointeeType() || 4620 NewClsType != OldClsType) { 4621 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4622 TL.getStarLoc()); 4623 if (Result.isNull()) 4624 return QualType(); 4625 } 4626 4627 // If we had to adjust the pointee type when building a member pointer, make 4628 // sure to push TypeLoc info for it. 4629 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4630 if (MPT && PointeeType != MPT->getPointeeType()) { 4631 assert(isa<AdjustedType>(MPT->getPointeeType())); 4632 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4633 } 4634 4635 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4636 NewTL.setSigilLoc(TL.getSigilLoc()); 4637 NewTL.setClassTInfo(NewClsTInfo); 4638 4639 return Result; 4640 } 4641 4642 template<typename Derived> 4643 QualType 4644 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4645 ConstantArrayTypeLoc TL) { 4646 const ConstantArrayType *T = TL.getTypePtr(); 4647 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4648 if (ElementType.isNull()) 4649 return QualType(); 4650 4651 QualType Result = TL.getType(); 4652 if (getDerived().AlwaysRebuild() || 4653 ElementType != T->getElementType()) { 4654 Result = getDerived().RebuildConstantArrayType(ElementType, 4655 T->getSizeModifier(), 4656 T->getSize(), 4657 T->getIndexTypeCVRQualifiers(), 4658 TL.getBracketsRange()); 4659 if (Result.isNull()) 4660 return QualType(); 4661 } 4662 4663 // We might have either a ConstantArrayType or a VariableArrayType now: 4664 // a ConstantArrayType is allowed to have an element type which is a 4665 // VariableArrayType if the type is dependent. Fortunately, all array 4666 // types have the same location layout. 4667 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4668 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4669 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4670 4671 Expr *Size = TL.getSizeExpr(); 4672 if (Size) { 4673 EnterExpressionEvaluationContext Unevaluated( 4674 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4675 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4676 Size = SemaRef.ActOnConstantExpression(Size).get(); 4677 } 4678 NewTL.setSizeExpr(Size); 4679 4680 return Result; 4681 } 4682 4683 template<typename Derived> 4684 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4685 TypeLocBuilder &TLB, 4686 IncompleteArrayTypeLoc TL) { 4687 const IncompleteArrayType *T = TL.getTypePtr(); 4688 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4689 if (ElementType.isNull()) 4690 return QualType(); 4691 4692 QualType Result = TL.getType(); 4693 if (getDerived().AlwaysRebuild() || 4694 ElementType != T->getElementType()) { 4695 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4696 T->getSizeModifier(), 4697 T->getIndexTypeCVRQualifiers(), 4698 TL.getBracketsRange()); 4699 if (Result.isNull()) 4700 return QualType(); 4701 } 4702 4703 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4704 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4705 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4706 NewTL.setSizeExpr(nullptr); 4707 4708 return Result; 4709 } 4710 4711 template<typename Derived> 4712 QualType 4713 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4714 VariableArrayTypeLoc TL) { 4715 const VariableArrayType *T = TL.getTypePtr(); 4716 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4717 if (ElementType.isNull()) 4718 return QualType(); 4719 4720 ExprResult SizeResult; 4721 { 4722 EnterExpressionEvaluationContext Context( 4723 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4724 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4725 } 4726 if (SizeResult.isInvalid()) 4727 return QualType(); 4728 SizeResult = 4729 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 4730 if (SizeResult.isInvalid()) 4731 return QualType(); 4732 4733 Expr *Size = SizeResult.get(); 4734 4735 QualType Result = TL.getType(); 4736 if (getDerived().AlwaysRebuild() || 4737 ElementType != T->getElementType() || 4738 Size != T->getSizeExpr()) { 4739 Result = getDerived().RebuildVariableArrayType(ElementType, 4740 T->getSizeModifier(), 4741 Size, 4742 T->getIndexTypeCVRQualifiers(), 4743 TL.getBracketsRange()); 4744 if (Result.isNull()) 4745 return QualType(); 4746 } 4747 4748 // We might have constant size array now, but fortunately it has the same 4749 // location layout. 4750 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4751 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4752 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4753 NewTL.setSizeExpr(Size); 4754 4755 return Result; 4756 } 4757 4758 template<typename Derived> 4759 QualType 4760 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4761 DependentSizedArrayTypeLoc TL) { 4762 const DependentSizedArrayType *T = TL.getTypePtr(); 4763 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4764 if (ElementType.isNull()) 4765 return QualType(); 4766 4767 // Array bounds are constant expressions. 4768 EnterExpressionEvaluationContext Unevaluated( 4769 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4770 4771 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4772 Expr *origSize = TL.getSizeExpr(); 4773 if (!origSize) origSize = T->getSizeExpr(); 4774 4775 ExprResult sizeResult 4776 = getDerived().TransformExpr(origSize); 4777 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4778 if (sizeResult.isInvalid()) 4779 return QualType(); 4780 4781 Expr *size = sizeResult.get(); 4782 4783 QualType Result = TL.getType(); 4784 if (getDerived().AlwaysRebuild() || 4785 ElementType != T->getElementType() || 4786 size != origSize) { 4787 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4788 T->getSizeModifier(), 4789 size, 4790 T->getIndexTypeCVRQualifiers(), 4791 TL.getBracketsRange()); 4792 if (Result.isNull()) 4793 return QualType(); 4794 } 4795 4796 // We might have any sort of array type now, but fortunately they 4797 // all have the same location layout. 4798 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4799 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4800 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4801 NewTL.setSizeExpr(size); 4802 4803 return Result; 4804 } 4805 4806 template <typename Derived> 4807 QualType TreeTransform<Derived>::TransformDependentVectorType( 4808 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 4809 const DependentVectorType *T = TL.getTypePtr(); 4810 QualType ElementType = getDerived().TransformType(T->getElementType()); 4811 if (ElementType.isNull()) 4812 return QualType(); 4813 4814 EnterExpressionEvaluationContext Unevaluated( 4815 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4816 4817 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4818 Size = SemaRef.ActOnConstantExpression(Size); 4819 if (Size.isInvalid()) 4820 return QualType(); 4821 4822 QualType Result = TL.getType(); 4823 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 4824 Size.get() != T->getSizeExpr()) { 4825 Result = getDerived().RebuildDependentVectorType( 4826 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 4827 if (Result.isNull()) 4828 return QualType(); 4829 } 4830 4831 // Result might be dependent or not. 4832 if (isa<DependentVectorType>(Result)) { 4833 DependentVectorTypeLoc NewTL = 4834 TLB.push<DependentVectorTypeLoc>(Result); 4835 NewTL.setNameLoc(TL.getNameLoc()); 4836 } else { 4837 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4838 NewTL.setNameLoc(TL.getNameLoc()); 4839 } 4840 4841 return Result; 4842 } 4843 4844 template<typename Derived> 4845 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4846 TypeLocBuilder &TLB, 4847 DependentSizedExtVectorTypeLoc TL) { 4848 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4849 4850 // FIXME: ext vector locs should be nested 4851 QualType ElementType = getDerived().TransformType(T->getElementType()); 4852 if (ElementType.isNull()) 4853 return QualType(); 4854 4855 // Vector sizes are constant expressions. 4856 EnterExpressionEvaluationContext Unevaluated( 4857 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4858 4859 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4860 Size = SemaRef.ActOnConstantExpression(Size); 4861 if (Size.isInvalid()) 4862 return QualType(); 4863 4864 QualType Result = TL.getType(); 4865 if (getDerived().AlwaysRebuild() || 4866 ElementType != T->getElementType() || 4867 Size.get() != T->getSizeExpr()) { 4868 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4869 Size.get(), 4870 T->getAttributeLoc()); 4871 if (Result.isNull()) 4872 return QualType(); 4873 } 4874 4875 // Result might be dependent or not. 4876 if (isa<DependentSizedExtVectorType>(Result)) { 4877 DependentSizedExtVectorTypeLoc NewTL 4878 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4879 NewTL.setNameLoc(TL.getNameLoc()); 4880 } else { 4881 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4882 NewTL.setNameLoc(TL.getNameLoc()); 4883 } 4884 4885 return Result; 4886 } 4887 4888 template <typename Derived> 4889 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4890 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4891 const DependentAddressSpaceType *T = TL.getTypePtr(); 4892 4893 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4894 4895 if (pointeeType.isNull()) 4896 return QualType(); 4897 4898 // Address spaces are constant expressions. 4899 EnterExpressionEvaluationContext Unevaluated( 4900 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4901 4902 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4903 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4904 if (AddrSpace.isInvalid()) 4905 return QualType(); 4906 4907 QualType Result = TL.getType(); 4908 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4909 AddrSpace.get() != T->getAddrSpaceExpr()) { 4910 Result = getDerived().RebuildDependentAddressSpaceType( 4911 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4912 if (Result.isNull()) 4913 return QualType(); 4914 } 4915 4916 // Result might be dependent or not. 4917 if (isa<DependentAddressSpaceType>(Result)) { 4918 DependentAddressSpaceTypeLoc NewTL = 4919 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4920 4921 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4922 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4923 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4924 4925 } else { 4926 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4927 Result, getDerived().getBaseLocation()); 4928 TransformType(TLB, DI->getTypeLoc()); 4929 } 4930 4931 return Result; 4932 } 4933 4934 template <typename Derived> 4935 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4936 VectorTypeLoc TL) { 4937 const VectorType *T = TL.getTypePtr(); 4938 QualType ElementType = getDerived().TransformType(T->getElementType()); 4939 if (ElementType.isNull()) 4940 return QualType(); 4941 4942 QualType Result = TL.getType(); 4943 if (getDerived().AlwaysRebuild() || 4944 ElementType != T->getElementType()) { 4945 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4946 T->getVectorKind()); 4947 if (Result.isNull()) 4948 return QualType(); 4949 } 4950 4951 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4952 NewTL.setNameLoc(TL.getNameLoc()); 4953 4954 return Result; 4955 } 4956 4957 template<typename Derived> 4958 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4959 ExtVectorTypeLoc TL) { 4960 const VectorType *T = TL.getTypePtr(); 4961 QualType ElementType = getDerived().TransformType(T->getElementType()); 4962 if (ElementType.isNull()) 4963 return QualType(); 4964 4965 QualType Result = TL.getType(); 4966 if (getDerived().AlwaysRebuild() || 4967 ElementType != T->getElementType()) { 4968 Result = getDerived().RebuildExtVectorType(ElementType, 4969 T->getNumElements(), 4970 /*FIXME*/ SourceLocation()); 4971 if (Result.isNull()) 4972 return QualType(); 4973 } 4974 4975 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4976 NewTL.setNameLoc(TL.getNameLoc()); 4977 4978 return Result; 4979 } 4980 4981 template <typename Derived> 4982 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4983 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4984 bool ExpectParameterPack) { 4985 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4986 TypeSourceInfo *NewDI = nullptr; 4987 4988 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4989 // If we're substituting into a pack expansion type and we know the 4990 // length we want to expand to, just substitute for the pattern. 4991 TypeLoc OldTL = OldDI->getTypeLoc(); 4992 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4993 4994 TypeLocBuilder TLB; 4995 TypeLoc NewTL = OldDI->getTypeLoc(); 4996 TLB.reserve(NewTL.getFullDataSize()); 4997 4998 QualType Result = getDerived().TransformType(TLB, 4999 OldExpansionTL.getPatternLoc()); 5000 if (Result.isNull()) 5001 return nullptr; 5002 5003 Result = RebuildPackExpansionType(Result, 5004 OldExpansionTL.getPatternLoc().getSourceRange(), 5005 OldExpansionTL.getEllipsisLoc(), 5006 NumExpansions); 5007 if (Result.isNull()) 5008 return nullptr; 5009 5010 PackExpansionTypeLoc NewExpansionTL 5011 = TLB.push<PackExpansionTypeLoc>(Result); 5012 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5013 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5014 } else 5015 NewDI = getDerived().TransformType(OldDI); 5016 if (!NewDI) 5017 return nullptr; 5018 5019 if (NewDI == OldDI && indexAdjustment == 0) 5020 return OldParm; 5021 5022 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5023 OldParm->getDeclContext(), 5024 OldParm->getInnerLocStart(), 5025 OldParm->getLocation(), 5026 OldParm->getIdentifier(), 5027 NewDI->getType(), 5028 NewDI, 5029 OldParm->getStorageClass(), 5030 /* DefArg */ nullptr); 5031 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5032 OldParm->getFunctionScopeIndex() + indexAdjustment); 5033 return newParm; 5034 } 5035 5036 template <typename Derived> 5037 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5038 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5039 const QualType *ParamTypes, 5040 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5041 SmallVectorImpl<QualType> &OutParamTypes, 5042 SmallVectorImpl<ParmVarDecl *> *PVars, 5043 Sema::ExtParameterInfoBuilder &PInfos) { 5044 int indexAdjustment = 0; 5045 5046 unsigned NumParams = Params.size(); 5047 for (unsigned i = 0; i != NumParams; ++i) { 5048 if (ParmVarDecl *OldParm = Params[i]) { 5049 assert(OldParm->getFunctionScopeIndex() == i); 5050 5051 Optional<unsigned> NumExpansions; 5052 ParmVarDecl *NewParm = nullptr; 5053 if (OldParm->isParameterPack()) { 5054 // We have a function parameter pack that may need to be expanded. 5055 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5056 5057 // Find the parameter packs that could be expanded. 5058 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5059 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5060 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5061 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5062 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 5063 5064 // Determine whether we should expand the parameter packs. 5065 bool ShouldExpand = false; 5066 bool RetainExpansion = false; 5067 Optional<unsigned> OrigNumExpansions = 5068 ExpansionTL.getTypePtr()->getNumExpansions(); 5069 NumExpansions = OrigNumExpansions; 5070 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5071 Pattern.getSourceRange(), 5072 Unexpanded, 5073 ShouldExpand, 5074 RetainExpansion, 5075 NumExpansions)) { 5076 return true; 5077 } 5078 5079 if (ShouldExpand) { 5080 // Expand the function parameter pack into multiple, separate 5081 // parameters. 5082 getDerived().ExpandingFunctionParameterPack(OldParm); 5083 for (unsigned I = 0; I != *NumExpansions; ++I) { 5084 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5085 ParmVarDecl *NewParm 5086 = getDerived().TransformFunctionTypeParam(OldParm, 5087 indexAdjustment++, 5088 OrigNumExpansions, 5089 /*ExpectParameterPack=*/false); 5090 if (!NewParm) 5091 return true; 5092 5093 if (ParamInfos) 5094 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5095 OutParamTypes.push_back(NewParm->getType()); 5096 if (PVars) 5097 PVars->push_back(NewParm); 5098 } 5099 5100 // If we're supposed to retain a pack expansion, do so by temporarily 5101 // forgetting the partially-substituted parameter pack. 5102 if (RetainExpansion) { 5103 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5104 ParmVarDecl *NewParm 5105 = getDerived().TransformFunctionTypeParam(OldParm, 5106 indexAdjustment++, 5107 OrigNumExpansions, 5108 /*ExpectParameterPack=*/false); 5109 if (!NewParm) 5110 return true; 5111 5112 if (ParamInfos) 5113 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5114 OutParamTypes.push_back(NewParm->getType()); 5115 if (PVars) 5116 PVars->push_back(NewParm); 5117 } 5118 5119 // The next parameter should have the same adjustment as the 5120 // last thing we pushed, but we post-incremented indexAdjustment 5121 // on every push. Also, if we push nothing, the adjustment should 5122 // go down by one. 5123 indexAdjustment--; 5124 5125 // We're done with the pack expansion. 5126 continue; 5127 } 5128 5129 // We'll substitute the parameter now without expanding the pack 5130 // expansion. 5131 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5132 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5133 indexAdjustment, 5134 NumExpansions, 5135 /*ExpectParameterPack=*/true); 5136 } else { 5137 NewParm = getDerived().TransformFunctionTypeParam( 5138 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5139 } 5140 5141 if (!NewParm) 5142 return true; 5143 5144 if (ParamInfos) 5145 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5146 OutParamTypes.push_back(NewParm->getType()); 5147 if (PVars) 5148 PVars->push_back(NewParm); 5149 continue; 5150 } 5151 5152 // Deal with the possibility that we don't have a parameter 5153 // declaration for this parameter. 5154 QualType OldType = ParamTypes[i]; 5155 bool IsPackExpansion = false; 5156 Optional<unsigned> NumExpansions; 5157 QualType NewType; 5158 if (const PackExpansionType *Expansion 5159 = dyn_cast<PackExpansionType>(OldType)) { 5160 // We have a function parameter pack that may need to be expanded. 5161 QualType Pattern = Expansion->getPattern(); 5162 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5163 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5164 5165 // Determine whether we should expand the parameter packs. 5166 bool ShouldExpand = false; 5167 bool RetainExpansion = false; 5168 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5169 Unexpanded, 5170 ShouldExpand, 5171 RetainExpansion, 5172 NumExpansions)) { 5173 return true; 5174 } 5175 5176 if (ShouldExpand) { 5177 // Expand the function parameter pack into multiple, separate 5178 // parameters. 5179 for (unsigned I = 0; I != *NumExpansions; ++I) { 5180 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5181 QualType NewType = getDerived().TransformType(Pattern); 5182 if (NewType.isNull()) 5183 return true; 5184 5185 if (NewType->containsUnexpandedParameterPack()) { 5186 NewType = 5187 getSema().getASTContext().getPackExpansionType(NewType, None); 5188 5189 if (NewType.isNull()) 5190 return true; 5191 } 5192 5193 if (ParamInfos) 5194 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5195 OutParamTypes.push_back(NewType); 5196 if (PVars) 5197 PVars->push_back(nullptr); 5198 } 5199 5200 // We're done with the pack expansion. 5201 continue; 5202 } 5203 5204 // If we're supposed to retain a pack expansion, do so by temporarily 5205 // forgetting the partially-substituted parameter pack. 5206 if (RetainExpansion) { 5207 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5208 QualType NewType = getDerived().TransformType(Pattern); 5209 if (NewType.isNull()) 5210 return true; 5211 5212 if (ParamInfos) 5213 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5214 OutParamTypes.push_back(NewType); 5215 if (PVars) 5216 PVars->push_back(nullptr); 5217 } 5218 5219 // We'll substitute the parameter now without expanding the pack 5220 // expansion. 5221 OldType = Expansion->getPattern(); 5222 IsPackExpansion = true; 5223 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5224 NewType = getDerived().TransformType(OldType); 5225 } else { 5226 NewType = getDerived().TransformType(OldType); 5227 } 5228 5229 if (NewType.isNull()) 5230 return true; 5231 5232 if (IsPackExpansion) 5233 NewType = getSema().Context.getPackExpansionType(NewType, 5234 NumExpansions); 5235 5236 if (ParamInfos) 5237 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5238 OutParamTypes.push_back(NewType); 5239 if (PVars) 5240 PVars->push_back(nullptr); 5241 } 5242 5243 #ifndef NDEBUG 5244 if (PVars) { 5245 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5246 if (ParmVarDecl *parm = (*PVars)[i]) 5247 assert(parm->getFunctionScopeIndex() == i); 5248 } 5249 #endif 5250 5251 return false; 5252 } 5253 5254 template<typename Derived> 5255 QualType 5256 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5257 FunctionProtoTypeLoc TL) { 5258 SmallVector<QualType, 4> ExceptionStorage; 5259 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5260 return getDerived().TransformFunctionProtoType( 5261 TLB, TL, nullptr, Qualifiers(), 5262 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5263 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5264 ExceptionStorage, Changed); 5265 }); 5266 } 5267 5268 template<typename Derived> template<typename Fn> 5269 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5270 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5271 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5272 5273 // Transform the parameters and return type. 5274 // 5275 // We are required to instantiate the params and return type in source order. 5276 // When the function has a trailing return type, we instantiate the 5277 // parameters before the return type, since the return type can then refer 5278 // to the parameters themselves (via decltype, sizeof, etc.). 5279 // 5280 SmallVector<QualType, 4> ParamTypes; 5281 SmallVector<ParmVarDecl*, 4> ParamDecls; 5282 Sema::ExtParameterInfoBuilder ExtParamInfos; 5283 const FunctionProtoType *T = TL.getTypePtr(); 5284 5285 QualType ResultType; 5286 5287 if (T->hasTrailingReturn()) { 5288 if (getDerived().TransformFunctionTypeParams( 5289 TL.getBeginLoc(), TL.getParams(), 5290 TL.getTypePtr()->param_type_begin(), 5291 T->getExtParameterInfosOrNull(), 5292 ParamTypes, &ParamDecls, ExtParamInfos)) 5293 return QualType(); 5294 5295 { 5296 // C++11 [expr.prim.general]p3: 5297 // If a declaration declares a member function or member function 5298 // template of a class X, the expression this is a prvalue of type 5299 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5300 // and the end of the function-definition, member-declarator, or 5301 // declarator. 5302 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5303 5304 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5305 if (ResultType.isNull()) 5306 return QualType(); 5307 } 5308 } 5309 else { 5310 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5311 if (ResultType.isNull()) 5312 return QualType(); 5313 5314 // Return type can not be qualified with an address space. 5315 if (ResultType.getAddressSpace() != LangAS::Default) { 5316 SemaRef.Diag(TL.getReturnLoc().getBeginLoc(), 5317 diag::err_attribute_address_function_type); 5318 return QualType(); 5319 } 5320 5321 if (getDerived().TransformFunctionTypeParams( 5322 TL.getBeginLoc(), TL.getParams(), 5323 TL.getTypePtr()->param_type_begin(), 5324 T->getExtParameterInfosOrNull(), 5325 ParamTypes, &ParamDecls, ExtParamInfos)) 5326 return QualType(); 5327 } 5328 5329 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5330 5331 bool EPIChanged = false; 5332 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5333 return QualType(); 5334 5335 // Handle extended parameter information. 5336 if (auto NewExtParamInfos = 5337 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5338 if (!EPI.ExtParameterInfos || 5339 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5340 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5341 EPIChanged = true; 5342 } 5343 EPI.ExtParameterInfos = NewExtParamInfos; 5344 } else if (EPI.ExtParameterInfos) { 5345 EPIChanged = true; 5346 EPI.ExtParameterInfos = nullptr; 5347 } 5348 5349 QualType Result = TL.getType(); 5350 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5351 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5352 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5353 if (Result.isNull()) 5354 return QualType(); 5355 } 5356 5357 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5358 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5359 NewTL.setLParenLoc(TL.getLParenLoc()); 5360 NewTL.setRParenLoc(TL.getRParenLoc()); 5361 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5362 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5363 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5364 NewTL.setParam(i, ParamDecls[i]); 5365 5366 return Result; 5367 } 5368 5369 template<typename Derived> 5370 bool TreeTransform<Derived>::TransformExceptionSpec( 5371 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5372 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5373 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5374 5375 // Instantiate a dynamic noexcept expression, if any. 5376 if (isComputedNoexcept(ESI.Type)) { 5377 EnterExpressionEvaluationContext Unevaluated( 5378 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5379 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5380 if (NoexceptExpr.isInvalid()) 5381 return true; 5382 5383 ExceptionSpecificationType EST = ESI.Type; 5384 NoexceptExpr = 5385 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5386 if (NoexceptExpr.isInvalid()) 5387 return true; 5388 5389 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5390 Changed = true; 5391 ESI.NoexceptExpr = NoexceptExpr.get(); 5392 ESI.Type = EST; 5393 } 5394 5395 if (ESI.Type != EST_Dynamic) 5396 return false; 5397 5398 // Instantiate a dynamic exception specification's type. 5399 for (QualType T : ESI.Exceptions) { 5400 if (const PackExpansionType *PackExpansion = 5401 T->getAs<PackExpansionType>()) { 5402 Changed = true; 5403 5404 // We have a pack expansion. Instantiate it. 5405 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5406 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5407 Unexpanded); 5408 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5409 5410 // Determine whether the set of unexpanded parameter packs can and 5411 // should 5412 // be expanded. 5413 bool Expand = false; 5414 bool RetainExpansion = false; 5415 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5416 // FIXME: Track the location of the ellipsis (and track source location 5417 // information for the types in the exception specification in general). 5418 if (getDerived().TryExpandParameterPacks( 5419 Loc, SourceRange(), Unexpanded, Expand, 5420 RetainExpansion, NumExpansions)) 5421 return true; 5422 5423 if (!Expand) { 5424 // We can't expand this pack expansion into separate arguments yet; 5425 // just substitute into the pattern and create a new pack expansion 5426 // type. 5427 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5428 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5429 if (U.isNull()) 5430 return true; 5431 5432 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5433 Exceptions.push_back(U); 5434 continue; 5435 } 5436 5437 // Substitute into the pack expansion pattern for each slice of the 5438 // pack. 5439 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5440 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5441 5442 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5443 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5444 return true; 5445 5446 Exceptions.push_back(U); 5447 } 5448 } else { 5449 QualType U = getDerived().TransformType(T); 5450 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5451 return true; 5452 if (T != U) 5453 Changed = true; 5454 5455 Exceptions.push_back(U); 5456 } 5457 } 5458 5459 ESI.Exceptions = Exceptions; 5460 if (ESI.Exceptions.empty()) 5461 ESI.Type = EST_DynamicNone; 5462 return false; 5463 } 5464 5465 template<typename Derived> 5466 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5467 TypeLocBuilder &TLB, 5468 FunctionNoProtoTypeLoc TL) { 5469 const FunctionNoProtoType *T = TL.getTypePtr(); 5470 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5471 if (ResultType.isNull()) 5472 return QualType(); 5473 5474 QualType Result = TL.getType(); 5475 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5476 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5477 5478 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5479 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5480 NewTL.setLParenLoc(TL.getLParenLoc()); 5481 NewTL.setRParenLoc(TL.getRParenLoc()); 5482 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5483 5484 return Result; 5485 } 5486 5487 template<typename Derived> QualType 5488 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5489 UnresolvedUsingTypeLoc TL) { 5490 const UnresolvedUsingType *T = TL.getTypePtr(); 5491 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5492 if (!D) 5493 return QualType(); 5494 5495 QualType Result = TL.getType(); 5496 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5497 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5498 if (Result.isNull()) 5499 return QualType(); 5500 } 5501 5502 // We might get an arbitrary type spec type back. We should at 5503 // least always get a type spec type, though. 5504 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5505 NewTL.setNameLoc(TL.getNameLoc()); 5506 5507 return Result; 5508 } 5509 5510 template<typename Derived> 5511 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5512 TypedefTypeLoc TL) { 5513 const TypedefType *T = TL.getTypePtr(); 5514 TypedefNameDecl *Typedef 5515 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5516 T->getDecl())); 5517 if (!Typedef) 5518 return QualType(); 5519 5520 QualType Result = TL.getType(); 5521 if (getDerived().AlwaysRebuild() || 5522 Typedef != T->getDecl()) { 5523 Result = getDerived().RebuildTypedefType(Typedef); 5524 if (Result.isNull()) 5525 return QualType(); 5526 } 5527 5528 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5529 NewTL.setNameLoc(TL.getNameLoc()); 5530 5531 return Result; 5532 } 5533 5534 template<typename Derived> 5535 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5536 TypeOfExprTypeLoc TL) { 5537 // typeof expressions are not potentially evaluated contexts 5538 EnterExpressionEvaluationContext Unevaluated( 5539 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5540 Sema::ReuseLambdaContextDecl); 5541 5542 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5543 if (E.isInvalid()) 5544 return QualType(); 5545 5546 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5547 if (E.isInvalid()) 5548 return QualType(); 5549 5550 QualType Result = TL.getType(); 5551 if (getDerived().AlwaysRebuild() || 5552 E.get() != TL.getUnderlyingExpr()) { 5553 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5554 if (Result.isNull()) 5555 return QualType(); 5556 } 5557 else E.get(); 5558 5559 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5560 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5561 NewTL.setLParenLoc(TL.getLParenLoc()); 5562 NewTL.setRParenLoc(TL.getRParenLoc()); 5563 5564 return Result; 5565 } 5566 5567 template<typename Derived> 5568 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5569 TypeOfTypeLoc TL) { 5570 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5571 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5572 if (!New_Under_TI) 5573 return QualType(); 5574 5575 QualType Result = TL.getType(); 5576 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5577 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5578 if (Result.isNull()) 5579 return QualType(); 5580 } 5581 5582 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5583 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5584 NewTL.setLParenLoc(TL.getLParenLoc()); 5585 NewTL.setRParenLoc(TL.getRParenLoc()); 5586 NewTL.setUnderlyingTInfo(New_Under_TI); 5587 5588 return Result; 5589 } 5590 5591 template<typename Derived> 5592 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5593 DecltypeTypeLoc TL) { 5594 const DecltypeType *T = TL.getTypePtr(); 5595 5596 // decltype expressions are not potentially evaluated contexts 5597 EnterExpressionEvaluationContext Unevaluated( 5598 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5599 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5600 5601 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5602 if (E.isInvalid()) 5603 return QualType(); 5604 5605 E = getSema().ActOnDecltypeExpression(E.get()); 5606 if (E.isInvalid()) 5607 return QualType(); 5608 5609 QualType Result = TL.getType(); 5610 if (getDerived().AlwaysRebuild() || 5611 E.get() != T->getUnderlyingExpr()) { 5612 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5613 if (Result.isNull()) 5614 return QualType(); 5615 } 5616 else E.get(); 5617 5618 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5619 NewTL.setNameLoc(TL.getNameLoc()); 5620 5621 return Result; 5622 } 5623 5624 template<typename Derived> 5625 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5626 TypeLocBuilder &TLB, 5627 UnaryTransformTypeLoc TL) { 5628 QualType Result = TL.getType(); 5629 if (Result->isDependentType()) { 5630 const UnaryTransformType *T = TL.getTypePtr(); 5631 QualType NewBase = 5632 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5633 Result = getDerived().RebuildUnaryTransformType(NewBase, 5634 T->getUTTKind(), 5635 TL.getKWLoc()); 5636 if (Result.isNull()) 5637 return QualType(); 5638 } 5639 5640 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5641 NewTL.setKWLoc(TL.getKWLoc()); 5642 NewTL.setParensRange(TL.getParensRange()); 5643 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5644 return Result; 5645 } 5646 5647 template<typename Derived> 5648 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5649 AutoTypeLoc TL) { 5650 const AutoType *T = TL.getTypePtr(); 5651 QualType OldDeduced = T->getDeducedType(); 5652 QualType NewDeduced; 5653 if (!OldDeduced.isNull()) { 5654 NewDeduced = getDerived().TransformType(OldDeduced); 5655 if (NewDeduced.isNull()) 5656 return QualType(); 5657 } 5658 5659 QualType Result = TL.getType(); 5660 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5661 T->isDependentType()) { 5662 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5663 if (Result.isNull()) 5664 return QualType(); 5665 } 5666 5667 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5668 NewTL.setNameLoc(TL.getNameLoc()); 5669 5670 return Result; 5671 } 5672 5673 template<typename Derived> 5674 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5675 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5676 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5677 5678 CXXScopeSpec SS; 5679 TemplateName TemplateName = getDerived().TransformTemplateName( 5680 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5681 if (TemplateName.isNull()) 5682 return QualType(); 5683 5684 QualType OldDeduced = T->getDeducedType(); 5685 QualType NewDeduced; 5686 if (!OldDeduced.isNull()) { 5687 NewDeduced = getDerived().TransformType(OldDeduced); 5688 if (NewDeduced.isNull()) 5689 return QualType(); 5690 } 5691 5692 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5693 TemplateName, NewDeduced); 5694 if (Result.isNull()) 5695 return QualType(); 5696 5697 DeducedTemplateSpecializationTypeLoc NewTL = 5698 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5699 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5700 5701 return Result; 5702 } 5703 5704 template<typename Derived> 5705 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5706 RecordTypeLoc TL) { 5707 const RecordType *T = TL.getTypePtr(); 5708 RecordDecl *Record 5709 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5710 T->getDecl())); 5711 if (!Record) 5712 return QualType(); 5713 5714 QualType Result = TL.getType(); 5715 if (getDerived().AlwaysRebuild() || 5716 Record != T->getDecl()) { 5717 Result = getDerived().RebuildRecordType(Record); 5718 if (Result.isNull()) 5719 return QualType(); 5720 } 5721 5722 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5723 NewTL.setNameLoc(TL.getNameLoc()); 5724 5725 return Result; 5726 } 5727 5728 template<typename Derived> 5729 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5730 EnumTypeLoc TL) { 5731 const EnumType *T = TL.getTypePtr(); 5732 EnumDecl *Enum 5733 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5734 T->getDecl())); 5735 if (!Enum) 5736 return QualType(); 5737 5738 QualType Result = TL.getType(); 5739 if (getDerived().AlwaysRebuild() || 5740 Enum != T->getDecl()) { 5741 Result = getDerived().RebuildEnumType(Enum); 5742 if (Result.isNull()) 5743 return QualType(); 5744 } 5745 5746 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5747 NewTL.setNameLoc(TL.getNameLoc()); 5748 5749 return Result; 5750 } 5751 5752 template<typename Derived> 5753 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5754 TypeLocBuilder &TLB, 5755 InjectedClassNameTypeLoc TL) { 5756 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5757 TL.getTypePtr()->getDecl()); 5758 if (!D) return QualType(); 5759 5760 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5761 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5762 return T; 5763 } 5764 5765 template<typename Derived> 5766 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5767 TypeLocBuilder &TLB, 5768 TemplateTypeParmTypeLoc TL) { 5769 return TransformTypeSpecType(TLB, TL); 5770 } 5771 5772 template<typename Derived> 5773 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5774 TypeLocBuilder &TLB, 5775 SubstTemplateTypeParmTypeLoc TL) { 5776 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5777 5778 // Substitute into the replacement type, which itself might involve something 5779 // that needs to be transformed. This only tends to occur with default 5780 // template arguments of template template parameters. 5781 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5782 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5783 if (Replacement.isNull()) 5784 return QualType(); 5785 5786 // Always canonicalize the replacement type. 5787 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5788 QualType Result 5789 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5790 Replacement); 5791 5792 // Propagate type-source information. 5793 SubstTemplateTypeParmTypeLoc NewTL 5794 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5795 NewTL.setNameLoc(TL.getNameLoc()); 5796 return Result; 5797 5798 } 5799 5800 template<typename Derived> 5801 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5802 TypeLocBuilder &TLB, 5803 SubstTemplateTypeParmPackTypeLoc TL) { 5804 return TransformTypeSpecType(TLB, TL); 5805 } 5806 5807 template<typename Derived> 5808 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5809 TypeLocBuilder &TLB, 5810 TemplateSpecializationTypeLoc TL) { 5811 const TemplateSpecializationType *T = TL.getTypePtr(); 5812 5813 // The nested-name-specifier never matters in a TemplateSpecializationType, 5814 // because we can't have a dependent nested-name-specifier anyway. 5815 CXXScopeSpec SS; 5816 TemplateName Template 5817 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5818 TL.getTemplateNameLoc()); 5819 if (Template.isNull()) 5820 return QualType(); 5821 5822 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5823 } 5824 5825 template<typename Derived> 5826 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5827 AtomicTypeLoc TL) { 5828 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5829 if (ValueType.isNull()) 5830 return QualType(); 5831 5832 QualType Result = TL.getType(); 5833 if (getDerived().AlwaysRebuild() || 5834 ValueType != TL.getValueLoc().getType()) { 5835 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5836 if (Result.isNull()) 5837 return QualType(); 5838 } 5839 5840 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5841 NewTL.setKWLoc(TL.getKWLoc()); 5842 NewTL.setLParenLoc(TL.getLParenLoc()); 5843 NewTL.setRParenLoc(TL.getRParenLoc()); 5844 5845 return Result; 5846 } 5847 5848 template <typename Derived> 5849 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5850 PipeTypeLoc TL) { 5851 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5852 if (ValueType.isNull()) 5853 return QualType(); 5854 5855 QualType Result = TL.getType(); 5856 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5857 const PipeType *PT = Result->getAs<PipeType>(); 5858 bool isReadPipe = PT->isReadOnly(); 5859 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5860 if (Result.isNull()) 5861 return QualType(); 5862 } 5863 5864 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5865 NewTL.setKWLoc(TL.getKWLoc()); 5866 5867 return Result; 5868 } 5869 5870 /// Simple iterator that traverses the template arguments in a 5871 /// container that provides a \c getArgLoc() member function. 5872 /// 5873 /// This iterator is intended to be used with the iterator form of 5874 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5875 template<typename ArgLocContainer> 5876 class TemplateArgumentLocContainerIterator { 5877 ArgLocContainer *Container; 5878 unsigned Index; 5879 5880 public: 5881 typedef TemplateArgumentLoc value_type; 5882 typedef TemplateArgumentLoc reference; 5883 typedef int difference_type; 5884 typedef std::input_iterator_tag iterator_category; 5885 5886 class pointer { 5887 TemplateArgumentLoc Arg; 5888 5889 public: 5890 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5891 5892 const TemplateArgumentLoc *operator->() const { 5893 return &Arg; 5894 } 5895 }; 5896 5897 5898 TemplateArgumentLocContainerIterator() {} 5899 5900 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5901 unsigned Index) 5902 : Container(&Container), Index(Index) { } 5903 5904 TemplateArgumentLocContainerIterator &operator++() { 5905 ++Index; 5906 return *this; 5907 } 5908 5909 TemplateArgumentLocContainerIterator operator++(int) { 5910 TemplateArgumentLocContainerIterator Old(*this); 5911 ++(*this); 5912 return Old; 5913 } 5914 5915 TemplateArgumentLoc operator*() const { 5916 return Container->getArgLoc(Index); 5917 } 5918 5919 pointer operator->() const { 5920 return pointer(Container->getArgLoc(Index)); 5921 } 5922 5923 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5924 const TemplateArgumentLocContainerIterator &Y) { 5925 return X.Container == Y.Container && X.Index == Y.Index; 5926 } 5927 5928 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5929 const TemplateArgumentLocContainerIterator &Y) { 5930 return !(X == Y); 5931 } 5932 }; 5933 5934 5935 template <typename Derived> 5936 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5937 TypeLocBuilder &TLB, 5938 TemplateSpecializationTypeLoc TL, 5939 TemplateName Template) { 5940 TemplateArgumentListInfo NewTemplateArgs; 5941 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5942 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5943 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5944 ArgIterator; 5945 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5946 ArgIterator(TL, TL.getNumArgs()), 5947 NewTemplateArgs)) 5948 return QualType(); 5949 5950 // FIXME: maybe don't rebuild if all the template arguments are the same. 5951 5952 QualType Result = 5953 getDerived().RebuildTemplateSpecializationType(Template, 5954 TL.getTemplateNameLoc(), 5955 NewTemplateArgs); 5956 5957 if (!Result.isNull()) { 5958 // Specializations of template template parameters are represented as 5959 // TemplateSpecializationTypes, and substitution of type alias templates 5960 // within a dependent context can transform them into 5961 // DependentTemplateSpecializationTypes. 5962 if (isa<DependentTemplateSpecializationType>(Result)) { 5963 DependentTemplateSpecializationTypeLoc NewTL 5964 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5965 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5966 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5967 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5968 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5969 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5970 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5971 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5972 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5973 return Result; 5974 } 5975 5976 TemplateSpecializationTypeLoc NewTL 5977 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5978 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5979 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5980 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5981 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5982 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5983 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5984 } 5985 5986 return Result; 5987 } 5988 5989 template <typename Derived> 5990 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5991 TypeLocBuilder &TLB, 5992 DependentTemplateSpecializationTypeLoc TL, 5993 TemplateName Template, 5994 CXXScopeSpec &SS) { 5995 TemplateArgumentListInfo NewTemplateArgs; 5996 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5997 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5998 typedef TemplateArgumentLocContainerIterator< 5999 DependentTemplateSpecializationTypeLoc> ArgIterator; 6000 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6001 ArgIterator(TL, TL.getNumArgs()), 6002 NewTemplateArgs)) 6003 return QualType(); 6004 6005 // FIXME: maybe don't rebuild if all the template arguments are the same. 6006 6007 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6008 QualType Result 6009 = getSema().Context.getDependentTemplateSpecializationType( 6010 TL.getTypePtr()->getKeyword(), 6011 DTN->getQualifier(), 6012 DTN->getIdentifier(), 6013 NewTemplateArgs); 6014 6015 DependentTemplateSpecializationTypeLoc NewTL 6016 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6017 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6018 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6019 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6020 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6021 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6022 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6023 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6024 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6025 return Result; 6026 } 6027 6028 QualType Result 6029 = getDerived().RebuildTemplateSpecializationType(Template, 6030 TL.getTemplateNameLoc(), 6031 NewTemplateArgs); 6032 6033 if (!Result.isNull()) { 6034 /// FIXME: Wrap this in an elaborated-type-specifier? 6035 TemplateSpecializationTypeLoc NewTL 6036 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6037 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6038 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6039 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6040 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6041 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6042 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6043 } 6044 6045 return Result; 6046 } 6047 6048 template<typename Derived> 6049 QualType 6050 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6051 ElaboratedTypeLoc TL) { 6052 const ElaboratedType *T = TL.getTypePtr(); 6053 6054 NestedNameSpecifierLoc QualifierLoc; 6055 // NOTE: the qualifier in an ElaboratedType is optional. 6056 if (TL.getQualifierLoc()) { 6057 QualifierLoc 6058 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6059 if (!QualifierLoc) 6060 return QualType(); 6061 } 6062 6063 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6064 if (NamedT.isNull()) 6065 return QualType(); 6066 6067 // C++0x [dcl.type.elab]p2: 6068 // If the identifier resolves to a typedef-name or the simple-template-id 6069 // resolves to an alias template specialization, the 6070 // elaborated-type-specifier is ill-formed. 6071 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6072 if (const TemplateSpecializationType *TST = 6073 NamedT->getAs<TemplateSpecializationType>()) { 6074 TemplateName Template = TST->getTemplateName(); 6075 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6076 Template.getAsTemplateDecl())) { 6077 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6078 diag::err_tag_reference_non_tag) 6079 << TAT << Sema::NTK_TypeAliasTemplate 6080 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6081 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6082 } 6083 } 6084 } 6085 6086 QualType Result = TL.getType(); 6087 if (getDerived().AlwaysRebuild() || 6088 QualifierLoc != TL.getQualifierLoc() || 6089 NamedT != T->getNamedType()) { 6090 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6091 T->getKeyword(), 6092 QualifierLoc, NamedT); 6093 if (Result.isNull()) 6094 return QualType(); 6095 } 6096 6097 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6098 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6099 NewTL.setQualifierLoc(QualifierLoc); 6100 return Result; 6101 } 6102 6103 template<typename Derived> 6104 QualType TreeTransform<Derived>::TransformAttributedType( 6105 TypeLocBuilder &TLB, 6106 AttributedTypeLoc TL) { 6107 const AttributedType *oldType = TL.getTypePtr(); 6108 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6109 if (modifiedType.isNull()) 6110 return QualType(); 6111 6112 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6113 const Attr *oldAttr = TL.getAttr(); 6114 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6115 if (oldAttr && !newAttr) 6116 return QualType(); 6117 6118 QualType result = TL.getType(); 6119 6120 // FIXME: dependent operand expressions? 6121 if (getDerived().AlwaysRebuild() || 6122 modifiedType != oldType->getModifiedType()) { 6123 // TODO: this is really lame; we should really be rebuilding the 6124 // equivalent type from first principles. 6125 QualType equivalentType 6126 = getDerived().TransformType(oldType->getEquivalentType()); 6127 if (equivalentType.isNull()) 6128 return QualType(); 6129 6130 // Check whether we can add nullability; it is only represented as 6131 // type sugar, and therefore cannot be diagnosed in any other way. 6132 if (auto nullability = oldType->getImmediateNullability()) { 6133 if (!modifiedType->canHaveNullability()) { 6134 SemaRef.Diag(TL.getAttr()->getLocation(), 6135 diag::err_nullability_nonpointer) 6136 << DiagNullabilityKind(*nullability, false) << modifiedType; 6137 return QualType(); 6138 } 6139 } 6140 6141 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6142 modifiedType, 6143 equivalentType); 6144 } 6145 6146 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6147 newTL.setAttr(newAttr); 6148 return result; 6149 } 6150 6151 template<typename Derived> 6152 QualType 6153 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6154 ParenTypeLoc TL) { 6155 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6156 if (Inner.isNull()) 6157 return QualType(); 6158 6159 QualType Result = TL.getType(); 6160 if (getDerived().AlwaysRebuild() || 6161 Inner != TL.getInnerLoc().getType()) { 6162 Result = getDerived().RebuildParenType(Inner); 6163 if (Result.isNull()) 6164 return QualType(); 6165 } 6166 6167 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6168 NewTL.setLParenLoc(TL.getLParenLoc()); 6169 NewTL.setRParenLoc(TL.getRParenLoc()); 6170 return Result; 6171 } 6172 6173 template<typename Derived> 6174 QualType TreeTransform<Derived>::TransformDependentNameType( 6175 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6176 return TransformDependentNameType(TLB, TL, false); 6177 } 6178 6179 template<typename Derived> 6180 QualType TreeTransform<Derived>::TransformDependentNameType( 6181 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6182 const DependentNameType *T = TL.getTypePtr(); 6183 6184 NestedNameSpecifierLoc QualifierLoc 6185 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6186 if (!QualifierLoc) 6187 return QualType(); 6188 6189 QualType Result 6190 = getDerived().RebuildDependentNameType(T->getKeyword(), 6191 TL.getElaboratedKeywordLoc(), 6192 QualifierLoc, 6193 T->getIdentifier(), 6194 TL.getNameLoc(), 6195 DeducedTSTContext); 6196 if (Result.isNull()) 6197 return QualType(); 6198 6199 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6200 QualType NamedT = ElabT->getNamedType(); 6201 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6202 6203 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6204 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6205 NewTL.setQualifierLoc(QualifierLoc); 6206 } else { 6207 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6208 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6209 NewTL.setQualifierLoc(QualifierLoc); 6210 NewTL.setNameLoc(TL.getNameLoc()); 6211 } 6212 return Result; 6213 } 6214 6215 template<typename Derived> 6216 QualType TreeTransform<Derived>:: 6217 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6218 DependentTemplateSpecializationTypeLoc TL) { 6219 NestedNameSpecifierLoc QualifierLoc; 6220 if (TL.getQualifierLoc()) { 6221 QualifierLoc 6222 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6223 if (!QualifierLoc) 6224 return QualType(); 6225 } 6226 6227 return getDerived() 6228 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6229 } 6230 6231 template<typename Derived> 6232 QualType TreeTransform<Derived>:: 6233 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6234 DependentTemplateSpecializationTypeLoc TL, 6235 NestedNameSpecifierLoc QualifierLoc) { 6236 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6237 6238 TemplateArgumentListInfo NewTemplateArgs; 6239 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6240 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6241 6242 typedef TemplateArgumentLocContainerIterator< 6243 DependentTemplateSpecializationTypeLoc> ArgIterator; 6244 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6245 ArgIterator(TL, TL.getNumArgs()), 6246 NewTemplateArgs)) 6247 return QualType(); 6248 6249 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6250 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6251 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6252 /*AllowInjectedClassName*/ false); 6253 if (Result.isNull()) 6254 return QualType(); 6255 6256 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6257 QualType NamedT = ElabT->getNamedType(); 6258 6259 // Copy information relevant to the template specialization. 6260 TemplateSpecializationTypeLoc NamedTL 6261 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6262 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6263 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6264 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6265 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6266 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6267 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6268 6269 // Copy information relevant to the elaborated type. 6270 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6271 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6272 NewTL.setQualifierLoc(QualifierLoc); 6273 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6274 DependentTemplateSpecializationTypeLoc SpecTL 6275 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6276 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6277 SpecTL.setQualifierLoc(QualifierLoc); 6278 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6279 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6280 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6281 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6282 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6283 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6284 } else { 6285 TemplateSpecializationTypeLoc SpecTL 6286 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6287 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6288 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6289 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6290 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6291 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6292 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6293 } 6294 return Result; 6295 } 6296 6297 template<typename Derived> 6298 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6299 PackExpansionTypeLoc TL) { 6300 QualType Pattern 6301 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6302 if (Pattern.isNull()) 6303 return QualType(); 6304 6305 QualType Result = TL.getType(); 6306 if (getDerived().AlwaysRebuild() || 6307 Pattern != TL.getPatternLoc().getType()) { 6308 Result = getDerived().RebuildPackExpansionType(Pattern, 6309 TL.getPatternLoc().getSourceRange(), 6310 TL.getEllipsisLoc(), 6311 TL.getTypePtr()->getNumExpansions()); 6312 if (Result.isNull()) 6313 return QualType(); 6314 } 6315 6316 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6317 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6318 return Result; 6319 } 6320 6321 template<typename Derived> 6322 QualType 6323 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6324 ObjCInterfaceTypeLoc TL) { 6325 // ObjCInterfaceType is never dependent. 6326 TLB.pushFullCopy(TL); 6327 return TL.getType(); 6328 } 6329 6330 template<typename Derived> 6331 QualType 6332 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6333 ObjCTypeParamTypeLoc TL) { 6334 const ObjCTypeParamType *T = TL.getTypePtr(); 6335 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6336 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6337 if (!OTP) 6338 return QualType(); 6339 6340 QualType Result = TL.getType(); 6341 if (getDerived().AlwaysRebuild() || 6342 OTP != T->getDecl()) { 6343 Result = getDerived().RebuildObjCTypeParamType(OTP, 6344 TL.getProtocolLAngleLoc(), 6345 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6346 TL.getNumProtocols()), 6347 TL.getProtocolLocs(), 6348 TL.getProtocolRAngleLoc()); 6349 if (Result.isNull()) 6350 return QualType(); 6351 } 6352 6353 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6354 if (TL.getNumProtocols()) { 6355 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6356 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6357 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6358 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6359 } 6360 return Result; 6361 } 6362 6363 template<typename Derived> 6364 QualType 6365 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6366 ObjCObjectTypeLoc TL) { 6367 // Transform base type. 6368 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6369 if (BaseType.isNull()) 6370 return QualType(); 6371 6372 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6373 6374 // Transform type arguments. 6375 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6376 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6377 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6378 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6379 QualType TypeArg = TypeArgInfo->getType(); 6380 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6381 AnyChanged = true; 6382 6383 // We have a pack expansion. Instantiate it. 6384 const auto *PackExpansion = PackExpansionLoc.getType() 6385 ->castAs<PackExpansionType>(); 6386 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6387 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6388 Unexpanded); 6389 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6390 6391 // Determine whether the set of unexpanded parameter packs can 6392 // and should be expanded. 6393 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6394 bool Expand = false; 6395 bool RetainExpansion = false; 6396 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6397 if (getDerived().TryExpandParameterPacks( 6398 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6399 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6400 return QualType(); 6401 6402 if (!Expand) { 6403 // We can't expand this pack expansion into separate arguments yet; 6404 // just substitute into the pattern and create a new pack expansion 6405 // type. 6406 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6407 6408 TypeLocBuilder TypeArgBuilder; 6409 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6410 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6411 PatternLoc); 6412 if (NewPatternType.isNull()) 6413 return QualType(); 6414 6415 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6416 NewPatternType, NumExpansions); 6417 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6418 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6419 NewTypeArgInfos.push_back( 6420 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6421 continue; 6422 } 6423 6424 // Substitute into the pack expansion pattern for each slice of the 6425 // pack. 6426 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6427 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6428 6429 TypeLocBuilder TypeArgBuilder; 6430 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6431 6432 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6433 PatternLoc); 6434 if (NewTypeArg.isNull()) 6435 return QualType(); 6436 6437 NewTypeArgInfos.push_back( 6438 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6439 } 6440 6441 continue; 6442 } 6443 6444 TypeLocBuilder TypeArgBuilder; 6445 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6446 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6447 if (NewTypeArg.isNull()) 6448 return QualType(); 6449 6450 // If nothing changed, just keep the old TypeSourceInfo. 6451 if (NewTypeArg == TypeArg) { 6452 NewTypeArgInfos.push_back(TypeArgInfo); 6453 continue; 6454 } 6455 6456 NewTypeArgInfos.push_back( 6457 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6458 AnyChanged = true; 6459 } 6460 6461 QualType Result = TL.getType(); 6462 if (getDerived().AlwaysRebuild() || AnyChanged) { 6463 // Rebuild the type. 6464 Result = getDerived().RebuildObjCObjectType( 6465 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6466 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6467 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6468 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6469 6470 if (Result.isNull()) 6471 return QualType(); 6472 } 6473 6474 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6475 NewT.setHasBaseTypeAsWritten(true); 6476 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6477 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6478 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6479 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6480 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6481 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6482 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6483 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6484 return Result; 6485 } 6486 6487 template<typename Derived> 6488 QualType 6489 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6490 ObjCObjectPointerTypeLoc TL) { 6491 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6492 if (PointeeType.isNull()) 6493 return QualType(); 6494 6495 QualType Result = TL.getType(); 6496 if (getDerived().AlwaysRebuild() || 6497 PointeeType != TL.getPointeeLoc().getType()) { 6498 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6499 TL.getStarLoc()); 6500 if (Result.isNull()) 6501 return QualType(); 6502 } 6503 6504 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6505 NewT.setStarLoc(TL.getStarLoc()); 6506 return Result; 6507 } 6508 6509 //===----------------------------------------------------------------------===// 6510 // Statement transformation 6511 //===----------------------------------------------------------------------===// 6512 template<typename Derived> 6513 StmtResult 6514 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6515 return S; 6516 } 6517 6518 template<typename Derived> 6519 StmtResult 6520 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6521 return getDerived().TransformCompoundStmt(S, false); 6522 } 6523 6524 template<typename Derived> 6525 StmtResult 6526 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6527 bool IsStmtExpr) { 6528 Sema::CompoundScopeRAII CompoundScope(getSema()); 6529 6530 bool SubStmtInvalid = false; 6531 bool SubStmtChanged = false; 6532 SmallVector<Stmt*, 8> Statements; 6533 for (auto *B : S->body()) { 6534 StmtResult Result = getDerived().TransformStmt( 6535 B, 6536 IsStmtExpr && B == S->body_back() ? SDK_StmtExprResult : SDK_Discarded); 6537 6538 if (Result.isInvalid()) { 6539 // Immediately fail if this was a DeclStmt, since it's very 6540 // likely that this will cause problems for future statements. 6541 if (isa<DeclStmt>(B)) 6542 return StmtError(); 6543 6544 // Otherwise, just keep processing substatements and fail later. 6545 SubStmtInvalid = true; 6546 continue; 6547 } 6548 6549 SubStmtChanged = SubStmtChanged || Result.get() != B; 6550 Statements.push_back(Result.getAs<Stmt>()); 6551 } 6552 6553 if (SubStmtInvalid) 6554 return StmtError(); 6555 6556 if (!getDerived().AlwaysRebuild() && 6557 !SubStmtChanged) 6558 return S; 6559 6560 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6561 Statements, 6562 S->getRBracLoc(), 6563 IsStmtExpr); 6564 } 6565 6566 template<typename Derived> 6567 StmtResult 6568 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6569 ExprResult LHS, RHS; 6570 { 6571 EnterExpressionEvaluationContext Unevaluated( 6572 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6573 6574 // Transform the left-hand case value. 6575 LHS = getDerived().TransformExpr(S->getLHS()); 6576 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6577 if (LHS.isInvalid()) 6578 return StmtError(); 6579 6580 // Transform the right-hand case value (for the GNU case-range extension). 6581 RHS = getDerived().TransformExpr(S->getRHS()); 6582 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6583 if (RHS.isInvalid()) 6584 return StmtError(); 6585 } 6586 6587 // Build the case statement. 6588 // Case statements are always rebuilt so that they will attached to their 6589 // transformed switch statement. 6590 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6591 LHS.get(), 6592 S->getEllipsisLoc(), 6593 RHS.get(), 6594 S->getColonLoc()); 6595 if (Case.isInvalid()) 6596 return StmtError(); 6597 6598 // Transform the statement following the case 6599 StmtResult SubStmt = 6600 getDerived().TransformStmt(S->getSubStmt()); 6601 if (SubStmt.isInvalid()) 6602 return StmtError(); 6603 6604 // Attach the body to the case statement 6605 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6606 } 6607 6608 template <typename Derived> 6609 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6610 // Transform the statement following the default case 6611 StmtResult SubStmt = 6612 getDerived().TransformStmt(S->getSubStmt()); 6613 if (SubStmt.isInvalid()) 6614 return StmtError(); 6615 6616 // Default statements are always rebuilt 6617 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6618 SubStmt.get()); 6619 } 6620 6621 template<typename Derived> 6622 StmtResult 6623 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 6624 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6625 if (SubStmt.isInvalid()) 6626 return StmtError(); 6627 6628 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6629 S->getDecl()); 6630 if (!LD) 6631 return StmtError(); 6632 6633 // If we're transforming "in-place" (we're not creating new local 6634 // declarations), assume we're replacing the old label statement 6635 // and clear out the reference to it. 6636 if (LD == S->getDecl()) 6637 S->getDecl()->setStmt(nullptr); 6638 6639 // FIXME: Pass the real colon location in. 6640 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6641 cast<LabelDecl>(LD), SourceLocation(), 6642 SubStmt.get()); 6643 } 6644 6645 template <typename Derived> 6646 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6647 if (!R) 6648 return R; 6649 6650 switch (R->getKind()) { 6651 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6652 #define ATTR(X) 6653 #define PRAGMA_SPELLING_ATTR(X) \ 6654 case attr::X: \ 6655 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6656 #include "clang/Basic/AttrList.inc" 6657 default: 6658 return R; 6659 } 6660 } 6661 6662 template <typename Derived> 6663 StmtResult 6664 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 6665 StmtDiscardKind SDK) { 6666 bool AttrsChanged = false; 6667 SmallVector<const Attr *, 1> Attrs; 6668 6669 // Visit attributes and keep track if any are transformed. 6670 for (const auto *I : S->getAttrs()) { 6671 const Attr *R = getDerived().TransformAttr(I); 6672 AttrsChanged |= (I != R); 6673 Attrs.push_back(R); 6674 } 6675 6676 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6677 if (SubStmt.isInvalid()) 6678 return StmtError(); 6679 6680 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6681 return S; 6682 6683 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6684 SubStmt.get()); 6685 } 6686 6687 template<typename Derived> 6688 StmtResult 6689 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6690 // Transform the initialization statement 6691 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6692 if (Init.isInvalid()) 6693 return StmtError(); 6694 6695 // Transform the condition 6696 Sema::ConditionResult Cond = getDerived().TransformCondition( 6697 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6698 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6699 : Sema::ConditionKind::Boolean); 6700 if (Cond.isInvalid()) 6701 return StmtError(); 6702 6703 // If this is a constexpr if, determine which arm we should instantiate. 6704 llvm::Optional<bool> ConstexprConditionValue; 6705 if (S->isConstexpr()) 6706 ConstexprConditionValue = Cond.getKnownValue(); 6707 6708 // Transform the "then" branch. 6709 StmtResult Then; 6710 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6711 Then = getDerived().TransformStmt(S->getThen()); 6712 if (Then.isInvalid()) 6713 return StmtError(); 6714 } else { 6715 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 6716 } 6717 6718 // Transform the "else" branch. 6719 StmtResult Else; 6720 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6721 Else = getDerived().TransformStmt(S->getElse()); 6722 if (Else.isInvalid()) 6723 return StmtError(); 6724 } 6725 6726 if (!getDerived().AlwaysRebuild() && 6727 Init.get() == S->getInit() && 6728 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6729 Then.get() == S->getThen() && 6730 Else.get() == S->getElse()) 6731 return S; 6732 6733 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6734 Init.get(), Then.get(), S->getElseLoc(), 6735 Else.get()); 6736 } 6737 6738 template<typename Derived> 6739 StmtResult 6740 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6741 // Transform the initialization statement 6742 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6743 if (Init.isInvalid()) 6744 return StmtError(); 6745 6746 // Transform the condition. 6747 Sema::ConditionResult Cond = getDerived().TransformCondition( 6748 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6749 Sema::ConditionKind::Switch); 6750 if (Cond.isInvalid()) 6751 return StmtError(); 6752 6753 // Rebuild the switch statement. 6754 StmtResult Switch 6755 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 6756 if (Switch.isInvalid()) 6757 return StmtError(); 6758 6759 // Transform the body of the switch statement. 6760 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6761 if (Body.isInvalid()) 6762 return StmtError(); 6763 6764 // Complete the switch statement. 6765 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6766 Body.get()); 6767 } 6768 6769 template<typename Derived> 6770 StmtResult 6771 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6772 // Transform the condition 6773 Sema::ConditionResult Cond = getDerived().TransformCondition( 6774 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6775 Sema::ConditionKind::Boolean); 6776 if (Cond.isInvalid()) 6777 return StmtError(); 6778 6779 // Transform the body 6780 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6781 if (Body.isInvalid()) 6782 return StmtError(); 6783 6784 if (!getDerived().AlwaysRebuild() && 6785 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6786 Body.get() == S->getBody()) 6787 return Owned(S); 6788 6789 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6790 } 6791 6792 template<typename Derived> 6793 StmtResult 6794 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6795 // Transform the body 6796 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6797 if (Body.isInvalid()) 6798 return StmtError(); 6799 6800 // Transform the condition 6801 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6802 if (Cond.isInvalid()) 6803 return StmtError(); 6804 6805 if (!getDerived().AlwaysRebuild() && 6806 Cond.get() == S->getCond() && 6807 Body.get() == S->getBody()) 6808 return S; 6809 6810 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6811 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6812 S->getRParenLoc()); 6813 } 6814 6815 template<typename Derived> 6816 StmtResult 6817 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6818 if (getSema().getLangOpts().OpenMP) 6819 getSema().startOpenMPLoop(); 6820 6821 // Transform the initialization statement 6822 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6823 if (Init.isInvalid()) 6824 return StmtError(); 6825 6826 // In OpenMP loop region loop control variable must be captured and be 6827 // private. Perform analysis of first part (if any). 6828 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6829 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6830 6831 // Transform the condition 6832 Sema::ConditionResult Cond = getDerived().TransformCondition( 6833 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6834 Sema::ConditionKind::Boolean); 6835 if (Cond.isInvalid()) 6836 return StmtError(); 6837 6838 // Transform the increment 6839 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6840 if (Inc.isInvalid()) 6841 return StmtError(); 6842 6843 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6844 if (S->getInc() && !FullInc.get()) 6845 return StmtError(); 6846 6847 // Transform the body 6848 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6849 if (Body.isInvalid()) 6850 return StmtError(); 6851 6852 if (!getDerived().AlwaysRebuild() && 6853 Init.get() == S->getInit() && 6854 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6855 Inc.get() == S->getInc() && 6856 Body.get() == S->getBody()) 6857 return S; 6858 6859 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6860 Init.get(), Cond, FullInc, 6861 S->getRParenLoc(), Body.get()); 6862 } 6863 6864 template<typename Derived> 6865 StmtResult 6866 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6867 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6868 S->getLabel()); 6869 if (!LD) 6870 return StmtError(); 6871 6872 // Goto statements must always be rebuilt, to resolve the label. 6873 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6874 cast<LabelDecl>(LD)); 6875 } 6876 6877 template<typename Derived> 6878 StmtResult 6879 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6880 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6881 if (Target.isInvalid()) 6882 return StmtError(); 6883 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6884 6885 if (!getDerived().AlwaysRebuild() && 6886 Target.get() == S->getTarget()) 6887 return S; 6888 6889 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6890 Target.get()); 6891 } 6892 6893 template<typename Derived> 6894 StmtResult 6895 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6896 return S; 6897 } 6898 6899 template<typename Derived> 6900 StmtResult 6901 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6902 return S; 6903 } 6904 6905 template<typename Derived> 6906 StmtResult 6907 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6908 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6909 /*NotCopyInit*/false); 6910 if (Result.isInvalid()) 6911 return StmtError(); 6912 6913 // FIXME: We always rebuild the return statement because there is no way 6914 // to tell whether the return type of the function has changed. 6915 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6916 } 6917 6918 template<typename Derived> 6919 StmtResult 6920 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6921 bool DeclChanged = false; 6922 SmallVector<Decl *, 4> Decls; 6923 for (auto *D : S->decls()) { 6924 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6925 if (!Transformed) 6926 return StmtError(); 6927 6928 if (Transformed != D) 6929 DeclChanged = true; 6930 6931 Decls.push_back(Transformed); 6932 } 6933 6934 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6935 return S; 6936 6937 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 6938 } 6939 6940 template<typename Derived> 6941 StmtResult 6942 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6943 6944 SmallVector<Expr*, 8> Constraints; 6945 SmallVector<Expr*, 8> Exprs; 6946 SmallVector<IdentifierInfo *, 4> Names; 6947 6948 ExprResult AsmString; 6949 SmallVector<Expr*, 8> Clobbers; 6950 6951 bool ExprsChanged = false; 6952 6953 // Go through the outputs. 6954 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6955 Names.push_back(S->getOutputIdentifier(I)); 6956 6957 // No need to transform the constraint literal. 6958 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6959 6960 // Transform the output expr. 6961 Expr *OutputExpr = S->getOutputExpr(I); 6962 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6963 if (Result.isInvalid()) 6964 return StmtError(); 6965 6966 ExprsChanged |= Result.get() != OutputExpr; 6967 6968 Exprs.push_back(Result.get()); 6969 } 6970 6971 // Go through the inputs. 6972 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6973 Names.push_back(S->getInputIdentifier(I)); 6974 6975 // No need to transform the constraint literal. 6976 Constraints.push_back(S->getInputConstraintLiteral(I)); 6977 6978 // Transform the input expr. 6979 Expr *InputExpr = S->getInputExpr(I); 6980 ExprResult Result = getDerived().TransformExpr(InputExpr); 6981 if (Result.isInvalid()) 6982 return StmtError(); 6983 6984 ExprsChanged |= Result.get() != InputExpr; 6985 6986 Exprs.push_back(Result.get()); 6987 } 6988 6989 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6990 return S; 6991 6992 // Go through the clobbers. 6993 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6994 Clobbers.push_back(S->getClobberStringLiteral(I)); 6995 6996 // No need to transform the asm string literal. 6997 AsmString = S->getAsmString(); 6998 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6999 S->isVolatile(), S->getNumOutputs(), 7000 S->getNumInputs(), Names.data(), 7001 Constraints, Exprs, AsmString.get(), 7002 Clobbers, S->getRParenLoc()); 7003 } 7004 7005 template<typename Derived> 7006 StmtResult 7007 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7008 ArrayRef<Token> AsmToks = 7009 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7010 7011 bool HadError = false, HadChange = false; 7012 7013 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7014 SmallVector<Expr*, 8> TransformedExprs; 7015 TransformedExprs.reserve(SrcExprs.size()); 7016 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7017 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7018 if (!Result.isUsable()) { 7019 HadError = true; 7020 } else { 7021 HadChange |= (Result.get() != SrcExprs[i]); 7022 TransformedExprs.push_back(Result.get()); 7023 } 7024 } 7025 7026 if (HadError) return StmtError(); 7027 if (!HadChange && !getDerived().AlwaysRebuild()) 7028 return Owned(S); 7029 7030 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7031 AsmToks, S->getAsmString(), 7032 S->getNumOutputs(), S->getNumInputs(), 7033 S->getAllConstraints(), S->getClobbers(), 7034 TransformedExprs, S->getEndLoc()); 7035 } 7036 7037 // C++ Coroutines TS 7038 7039 template<typename Derived> 7040 StmtResult 7041 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7042 auto *ScopeInfo = SemaRef.getCurFunction(); 7043 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7044 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7045 ScopeInfo->NeedsCoroutineSuspends && 7046 ScopeInfo->CoroutineSuspends.first == nullptr && 7047 ScopeInfo->CoroutineSuspends.second == nullptr && 7048 "expected clean scope info"); 7049 7050 // Set that we have (possibly-invalid) suspend points before we do anything 7051 // that may fail. 7052 ScopeInfo->setNeedsCoroutineSuspends(false); 7053 7054 // The new CoroutinePromise object needs to be built and put into the current 7055 // FunctionScopeInfo before any transformations or rebuilding occurs. 7056 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7057 return StmtError(); 7058 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7059 if (!Promise) 7060 return StmtError(); 7061 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 7062 ScopeInfo->CoroutinePromise = Promise; 7063 7064 // Transform the implicit coroutine statements we built during the initial 7065 // parse. 7066 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7067 if (InitSuspend.isInvalid()) 7068 return StmtError(); 7069 StmtResult FinalSuspend = 7070 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7071 if (FinalSuspend.isInvalid()) 7072 return StmtError(); 7073 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7074 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7075 7076 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7077 if (BodyRes.isInvalid()) 7078 return StmtError(); 7079 7080 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7081 if (Builder.isInvalid()) 7082 return StmtError(); 7083 7084 Expr *ReturnObject = S->getReturnValueInit(); 7085 assert(ReturnObject && "the return object is expected to be valid"); 7086 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7087 /*NoCopyInit*/ false); 7088 if (Res.isInvalid()) 7089 return StmtError(); 7090 Builder.ReturnValue = Res.get(); 7091 7092 if (S->hasDependentPromiseType()) { 7093 assert(!Promise->getType()->isDependentType() && 7094 "the promise type must no longer be dependent"); 7095 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7096 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7097 "these nodes should not have been built yet"); 7098 if (!Builder.buildDependentStatements()) 7099 return StmtError(); 7100 } else { 7101 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7102 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7103 if (Res.isInvalid()) 7104 return StmtError(); 7105 Builder.OnFallthrough = Res.get(); 7106 } 7107 7108 if (auto *OnException = S->getExceptionHandler()) { 7109 StmtResult Res = getDerived().TransformStmt(OnException); 7110 if (Res.isInvalid()) 7111 return StmtError(); 7112 Builder.OnException = Res.get(); 7113 } 7114 7115 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7116 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7117 if (Res.isInvalid()) 7118 return StmtError(); 7119 Builder.ReturnStmtOnAllocFailure = Res.get(); 7120 } 7121 7122 // Transform any additional statements we may have already built 7123 assert(S->getAllocate() && S->getDeallocate() && 7124 "allocation and deallocation calls must already be built"); 7125 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7126 if (AllocRes.isInvalid()) 7127 return StmtError(); 7128 Builder.Allocate = AllocRes.get(); 7129 7130 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7131 if (DeallocRes.isInvalid()) 7132 return StmtError(); 7133 Builder.Deallocate = DeallocRes.get(); 7134 7135 assert(S->getResultDecl() && "ResultDecl must already be built"); 7136 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7137 if (ResultDecl.isInvalid()) 7138 return StmtError(); 7139 Builder.ResultDecl = ResultDecl.get(); 7140 7141 if (auto *ReturnStmt = S->getReturnStmt()) { 7142 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7143 if (Res.isInvalid()) 7144 return StmtError(); 7145 Builder.ReturnStmt = Res.get(); 7146 } 7147 } 7148 7149 return getDerived().RebuildCoroutineBodyStmt(Builder); 7150 } 7151 7152 template<typename Derived> 7153 StmtResult 7154 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7155 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7156 /*NotCopyInit*/false); 7157 if (Result.isInvalid()) 7158 return StmtError(); 7159 7160 // Always rebuild; we don't know if this needs to be injected into a new 7161 // context or if the promise type has changed. 7162 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7163 S->isImplicit()); 7164 } 7165 7166 template<typename Derived> 7167 ExprResult 7168 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7169 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7170 /*NotCopyInit*/false); 7171 if (Result.isInvalid()) 7172 return ExprError(); 7173 7174 // Always rebuild; we don't know if this needs to be injected into a new 7175 // context or if the promise type has changed. 7176 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7177 E->isImplicit()); 7178 } 7179 7180 template <typename Derived> 7181 ExprResult 7182 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7183 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7184 /*NotCopyInit*/ false); 7185 if (OperandResult.isInvalid()) 7186 return ExprError(); 7187 7188 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7189 E->getOperatorCoawaitLookup()); 7190 7191 if (LookupResult.isInvalid()) 7192 return ExprError(); 7193 7194 // Always rebuild; we don't know if this needs to be injected into a new 7195 // context or if the promise type has changed. 7196 return getDerived().RebuildDependentCoawaitExpr( 7197 E->getKeywordLoc(), OperandResult.get(), 7198 cast<UnresolvedLookupExpr>(LookupResult.get())); 7199 } 7200 7201 template<typename Derived> 7202 ExprResult 7203 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7204 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7205 /*NotCopyInit*/false); 7206 if (Result.isInvalid()) 7207 return ExprError(); 7208 7209 // Always rebuild; we don't know if this needs to be injected into a new 7210 // context or if the promise type has changed. 7211 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7212 } 7213 7214 // Objective-C Statements. 7215 7216 template<typename Derived> 7217 StmtResult 7218 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7219 // Transform the body of the @try. 7220 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7221 if (TryBody.isInvalid()) 7222 return StmtError(); 7223 7224 // Transform the @catch statements (if present). 7225 bool AnyCatchChanged = false; 7226 SmallVector<Stmt*, 8> CatchStmts; 7227 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7228 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7229 if (Catch.isInvalid()) 7230 return StmtError(); 7231 if (Catch.get() != S->getCatchStmt(I)) 7232 AnyCatchChanged = true; 7233 CatchStmts.push_back(Catch.get()); 7234 } 7235 7236 // Transform the @finally statement (if present). 7237 StmtResult Finally; 7238 if (S->getFinallyStmt()) { 7239 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7240 if (Finally.isInvalid()) 7241 return StmtError(); 7242 } 7243 7244 // If nothing changed, just retain this statement. 7245 if (!getDerived().AlwaysRebuild() && 7246 TryBody.get() == S->getTryBody() && 7247 !AnyCatchChanged && 7248 Finally.get() == S->getFinallyStmt()) 7249 return S; 7250 7251 // Build a new statement. 7252 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7253 CatchStmts, Finally.get()); 7254 } 7255 7256 template<typename Derived> 7257 StmtResult 7258 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7259 // Transform the @catch parameter, if there is one. 7260 VarDecl *Var = nullptr; 7261 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7262 TypeSourceInfo *TSInfo = nullptr; 7263 if (FromVar->getTypeSourceInfo()) { 7264 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7265 if (!TSInfo) 7266 return StmtError(); 7267 } 7268 7269 QualType T; 7270 if (TSInfo) 7271 T = TSInfo->getType(); 7272 else { 7273 T = getDerived().TransformType(FromVar->getType()); 7274 if (T.isNull()) 7275 return StmtError(); 7276 } 7277 7278 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7279 if (!Var) 7280 return StmtError(); 7281 } 7282 7283 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7284 if (Body.isInvalid()) 7285 return StmtError(); 7286 7287 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7288 S->getRParenLoc(), 7289 Var, Body.get()); 7290 } 7291 7292 template<typename Derived> 7293 StmtResult 7294 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7295 // Transform the body. 7296 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7297 if (Body.isInvalid()) 7298 return StmtError(); 7299 7300 // If nothing changed, just retain this statement. 7301 if (!getDerived().AlwaysRebuild() && 7302 Body.get() == S->getFinallyBody()) 7303 return S; 7304 7305 // Build a new statement. 7306 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7307 Body.get()); 7308 } 7309 7310 template<typename Derived> 7311 StmtResult 7312 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7313 ExprResult Operand; 7314 if (S->getThrowExpr()) { 7315 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7316 if (Operand.isInvalid()) 7317 return StmtError(); 7318 } 7319 7320 if (!getDerived().AlwaysRebuild() && 7321 Operand.get() == S->getThrowExpr()) 7322 return S; 7323 7324 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7325 } 7326 7327 template<typename Derived> 7328 StmtResult 7329 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7330 ObjCAtSynchronizedStmt *S) { 7331 // Transform the object we are locking. 7332 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7333 if (Object.isInvalid()) 7334 return StmtError(); 7335 Object = 7336 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7337 Object.get()); 7338 if (Object.isInvalid()) 7339 return StmtError(); 7340 7341 // Transform the body. 7342 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7343 if (Body.isInvalid()) 7344 return StmtError(); 7345 7346 // If nothing change, just retain the current statement. 7347 if (!getDerived().AlwaysRebuild() && 7348 Object.get() == S->getSynchExpr() && 7349 Body.get() == S->getSynchBody()) 7350 return S; 7351 7352 // Build a new statement. 7353 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7354 Object.get(), Body.get()); 7355 } 7356 7357 template<typename Derived> 7358 StmtResult 7359 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7360 ObjCAutoreleasePoolStmt *S) { 7361 // Transform the body. 7362 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7363 if (Body.isInvalid()) 7364 return StmtError(); 7365 7366 // If nothing changed, just retain this statement. 7367 if (!getDerived().AlwaysRebuild() && 7368 Body.get() == S->getSubStmt()) 7369 return S; 7370 7371 // Build a new statement. 7372 return getDerived().RebuildObjCAutoreleasePoolStmt( 7373 S->getAtLoc(), Body.get()); 7374 } 7375 7376 template<typename Derived> 7377 StmtResult 7378 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7379 ObjCForCollectionStmt *S) { 7380 // Transform the element statement. 7381 StmtResult Element = 7382 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7383 if (Element.isInvalid()) 7384 return StmtError(); 7385 7386 // Transform the collection expression. 7387 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7388 if (Collection.isInvalid()) 7389 return StmtError(); 7390 7391 // Transform the body. 7392 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7393 if (Body.isInvalid()) 7394 return StmtError(); 7395 7396 // If nothing changed, just retain this statement. 7397 if (!getDerived().AlwaysRebuild() && 7398 Element.get() == S->getElement() && 7399 Collection.get() == S->getCollection() && 7400 Body.get() == S->getBody()) 7401 return S; 7402 7403 // Build a new statement. 7404 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7405 Element.get(), 7406 Collection.get(), 7407 S->getRParenLoc(), 7408 Body.get()); 7409 } 7410 7411 template <typename Derived> 7412 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7413 // Transform the exception declaration, if any. 7414 VarDecl *Var = nullptr; 7415 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7416 TypeSourceInfo *T = 7417 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7418 if (!T) 7419 return StmtError(); 7420 7421 Var = getDerived().RebuildExceptionDecl( 7422 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7423 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7424 if (!Var || Var->isInvalidDecl()) 7425 return StmtError(); 7426 } 7427 7428 // Transform the actual exception handler. 7429 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7430 if (Handler.isInvalid()) 7431 return StmtError(); 7432 7433 if (!getDerived().AlwaysRebuild() && !Var && 7434 Handler.get() == S->getHandlerBlock()) 7435 return S; 7436 7437 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7438 } 7439 7440 template <typename Derived> 7441 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7442 // Transform the try block itself. 7443 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7444 if (TryBlock.isInvalid()) 7445 return StmtError(); 7446 7447 // Transform the handlers. 7448 bool HandlerChanged = false; 7449 SmallVector<Stmt *, 8> Handlers; 7450 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7451 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7452 if (Handler.isInvalid()) 7453 return StmtError(); 7454 7455 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7456 Handlers.push_back(Handler.getAs<Stmt>()); 7457 } 7458 7459 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7460 !HandlerChanged) 7461 return S; 7462 7463 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7464 Handlers); 7465 } 7466 7467 template<typename Derived> 7468 StmtResult 7469 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7470 StmtResult Init = 7471 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7472 if (Init.isInvalid()) 7473 return StmtError(); 7474 7475 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7476 if (Range.isInvalid()) 7477 return StmtError(); 7478 7479 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7480 if (Begin.isInvalid()) 7481 return StmtError(); 7482 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7483 if (End.isInvalid()) 7484 return StmtError(); 7485 7486 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7487 if (Cond.isInvalid()) 7488 return StmtError(); 7489 if (Cond.get()) 7490 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7491 if (Cond.isInvalid()) 7492 return StmtError(); 7493 if (Cond.get()) 7494 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7495 7496 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7497 if (Inc.isInvalid()) 7498 return StmtError(); 7499 if (Inc.get()) 7500 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7501 7502 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7503 if (LoopVar.isInvalid()) 7504 return StmtError(); 7505 7506 StmtResult NewStmt = S; 7507 if (getDerived().AlwaysRebuild() || 7508 Init.get() != S->getInit() || 7509 Range.get() != S->getRangeStmt() || 7510 Begin.get() != S->getBeginStmt() || 7511 End.get() != S->getEndStmt() || 7512 Cond.get() != S->getCond() || 7513 Inc.get() != S->getInc() || 7514 LoopVar.get() != S->getLoopVarStmt()) { 7515 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7516 S->getCoawaitLoc(), Init.get(), 7517 S->getColonLoc(), Range.get(), 7518 Begin.get(), End.get(), 7519 Cond.get(), 7520 Inc.get(), LoopVar.get(), 7521 S->getRParenLoc()); 7522 if (NewStmt.isInvalid()) 7523 return StmtError(); 7524 } 7525 7526 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7527 if (Body.isInvalid()) 7528 return StmtError(); 7529 7530 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7531 // it now so we have a new statement to attach the body to. 7532 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7533 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7534 S->getCoawaitLoc(), Init.get(), 7535 S->getColonLoc(), Range.get(), 7536 Begin.get(), End.get(), 7537 Cond.get(), 7538 Inc.get(), LoopVar.get(), 7539 S->getRParenLoc()); 7540 if (NewStmt.isInvalid()) 7541 return StmtError(); 7542 } 7543 7544 if (NewStmt.get() == S) 7545 return S; 7546 7547 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7548 } 7549 7550 template<typename Derived> 7551 StmtResult 7552 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7553 MSDependentExistsStmt *S) { 7554 // Transform the nested-name-specifier, if any. 7555 NestedNameSpecifierLoc QualifierLoc; 7556 if (S->getQualifierLoc()) { 7557 QualifierLoc 7558 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7559 if (!QualifierLoc) 7560 return StmtError(); 7561 } 7562 7563 // Transform the declaration name. 7564 DeclarationNameInfo NameInfo = S->getNameInfo(); 7565 if (NameInfo.getName()) { 7566 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7567 if (!NameInfo.getName()) 7568 return StmtError(); 7569 } 7570 7571 // Check whether anything changed. 7572 if (!getDerived().AlwaysRebuild() && 7573 QualifierLoc == S->getQualifierLoc() && 7574 NameInfo.getName() == S->getNameInfo().getName()) 7575 return S; 7576 7577 // Determine whether this name exists, if we can. 7578 CXXScopeSpec SS; 7579 SS.Adopt(QualifierLoc); 7580 bool Dependent = false; 7581 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7582 case Sema::IER_Exists: 7583 if (S->isIfExists()) 7584 break; 7585 7586 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7587 7588 case Sema::IER_DoesNotExist: 7589 if (S->isIfNotExists()) 7590 break; 7591 7592 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7593 7594 case Sema::IER_Dependent: 7595 Dependent = true; 7596 break; 7597 7598 case Sema::IER_Error: 7599 return StmtError(); 7600 } 7601 7602 // We need to continue with the instantiation, so do so now. 7603 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7604 if (SubStmt.isInvalid()) 7605 return StmtError(); 7606 7607 // If we have resolved the name, just transform to the substatement. 7608 if (!Dependent) 7609 return SubStmt; 7610 7611 // The name is still dependent, so build a dependent expression again. 7612 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7613 S->isIfExists(), 7614 QualifierLoc, 7615 NameInfo, 7616 SubStmt.get()); 7617 } 7618 7619 template<typename Derived> 7620 ExprResult 7621 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7622 NestedNameSpecifierLoc QualifierLoc; 7623 if (E->getQualifierLoc()) { 7624 QualifierLoc 7625 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7626 if (!QualifierLoc) 7627 return ExprError(); 7628 } 7629 7630 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7631 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7632 if (!PD) 7633 return ExprError(); 7634 7635 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7636 if (Base.isInvalid()) 7637 return ExprError(); 7638 7639 return new (SemaRef.getASTContext()) 7640 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7641 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7642 QualifierLoc, E->getMemberLoc()); 7643 } 7644 7645 template <typename Derived> 7646 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7647 MSPropertySubscriptExpr *E) { 7648 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7649 if (BaseRes.isInvalid()) 7650 return ExprError(); 7651 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7652 if (IdxRes.isInvalid()) 7653 return ExprError(); 7654 7655 if (!getDerived().AlwaysRebuild() && 7656 BaseRes.get() == E->getBase() && 7657 IdxRes.get() == E->getIdx()) 7658 return E; 7659 7660 return getDerived().RebuildArraySubscriptExpr( 7661 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7662 } 7663 7664 template <typename Derived> 7665 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7666 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7667 if (TryBlock.isInvalid()) 7668 return StmtError(); 7669 7670 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7671 if (Handler.isInvalid()) 7672 return StmtError(); 7673 7674 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7675 Handler.get() == S->getHandler()) 7676 return S; 7677 7678 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7679 TryBlock.get(), Handler.get()); 7680 } 7681 7682 template <typename Derived> 7683 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7684 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7685 if (Block.isInvalid()) 7686 return StmtError(); 7687 7688 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7689 } 7690 7691 template <typename Derived> 7692 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7693 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7694 if (FilterExpr.isInvalid()) 7695 return StmtError(); 7696 7697 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7698 if (Block.isInvalid()) 7699 return StmtError(); 7700 7701 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7702 Block.get()); 7703 } 7704 7705 template <typename Derived> 7706 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7707 if (isa<SEHFinallyStmt>(Handler)) 7708 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7709 else 7710 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7711 } 7712 7713 template<typename Derived> 7714 StmtResult 7715 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7716 return S; 7717 } 7718 7719 //===----------------------------------------------------------------------===// 7720 // OpenMP directive transformation 7721 //===----------------------------------------------------------------------===// 7722 template <typename Derived> 7723 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7724 OMPExecutableDirective *D) { 7725 7726 // Transform the clauses 7727 llvm::SmallVector<OMPClause *, 16> TClauses; 7728 ArrayRef<OMPClause *> Clauses = D->clauses(); 7729 TClauses.reserve(Clauses.size()); 7730 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7731 I != E; ++I) { 7732 if (*I) { 7733 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7734 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7735 getDerived().getSema().EndOpenMPClause(); 7736 if (Clause) 7737 TClauses.push_back(Clause); 7738 } else { 7739 TClauses.push_back(nullptr); 7740 } 7741 } 7742 StmtResult AssociatedStmt; 7743 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7744 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7745 /*CurScope=*/nullptr); 7746 StmtResult Body; 7747 { 7748 Sema::CompoundScopeRAII CompoundScope(getSema()); 7749 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 7750 Body = getDerived().TransformStmt(CS); 7751 } 7752 AssociatedStmt = 7753 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7754 if (AssociatedStmt.isInvalid()) { 7755 return StmtError(); 7756 } 7757 } 7758 if (TClauses.size() != Clauses.size()) { 7759 return StmtError(); 7760 } 7761 7762 // Transform directive name for 'omp critical' directive. 7763 DeclarationNameInfo DirName; 7764 if (D->getDirectiveKind() == OMPD_critical) { 7765 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7766 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7767 } 7768 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7769 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7770 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7771 } else if (D->getDirectiveKind() == OMPD_cancel) { 7772 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7773 } 7774 7775 return getDerived().RebuildOMPExecutableDirective( 7776 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7777 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 7778 } 7779 7780 template <typename Derived> 7781 StmtResult 7782 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7783 DeclarationNameInfo DirName; 7784 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7785 D->getBeginLoc()); 7786 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7787 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7788 return Res; 7789 } 7790 7791 template <typename Derived> 7792 StmtResult 7793 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7794 DeclarationNameInfo DirName; 7795 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7796 D->getBeginLoc()); 7797 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7798 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7799 return Res; 7800 } 7801 7802 template <typename Derived> 7803 StmtResult 7804 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7805 DeclarationNameInfo DirName; 7806 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7807 D->getBeginLoc()); 7808 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7809 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7810 return Res; 7811 } 7812 7813 template <typename Derived> 7814 StmtResult 7815 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7816 DeclarationNameInfo DirName; 7817 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7818 D->getBeginLoc()); 7819 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7820 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7821 return Res; 7822 } 7823 7824 template <typename Derived> 7825 StmtResult 7826 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7827 DeclarationNameInfo DirName; 7828 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7829 D->getBeginLoc()); 7830 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7831 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7832 return Res; 7833 } 7834 7835 template <typename Derived> 7836 StmtResult 7837 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7838 DeclarationNameInfo DirName; 7839 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7840 D->getBeginLoc()); 7841 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7842 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7843 return Res; 7844 } 7845 7846 template <typename Derived> 7847 StmtResult 7848 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7849 DeclarationNameInfo DirName; 7850 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7851 D->getBeginLoc()); 7852 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7853 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7854 return Res; 7855 } 7856 7857 template <typename Derived> 7858 StmtResult 7859 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7860 DeclarationNameInfo DirName; 7861 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7862 D->getBeginLoc()); 7863 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7864 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7865 return Res; 7866 } 7867 7868 template <typename Derived> 7869 StmtResult 7870 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7871 getDerived().getSema().StartOpenMPDSABlock( 7872 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 7873 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7874 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7875 return Res; 7876 } 7877 7878 template <typename Derived> 7879 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7880 OMPParallelForDirective *D) { 7881 DeclarationNameInfo DirName; 7882 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7883 nullptr, D->getBeginLoc()); 7884 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7885 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7886 return Res; 7887 } 7888 7889 template <typename Derived> 7890 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7891 OMPParallelForSimdDirective *D) { 7892 DeclarationNameInfo DirName; 7893 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7894 nullptr, D->getBeginLoc()); 7895 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7896 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7897 return Res; 7898 } 7899 7900 template <typename Derived> 7901 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7902 OMPParallelSectionsDirective *D) { 7903 DeclarationNameInfo DirName; 7904 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7905 nullptr, D->getBeginLoc()); 7906 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7907 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7908 return Res; 7909 } 7910 7911 template <typename Derived> 7912 StmtResult 7913 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7914 DeclarationNameInfo DirName; 7915 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7916 D->getBeginLoc()); 7917 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7918 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7919 return Res; 7920 } 7921 7922 template <typename Derived> 7923 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7924 OMPTaskyieldDirective *D) { 7925 DeclarationNameInfo DirName; 7926 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7927 D->getBeginLoc()); 7928 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7929 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7930 return Res; 7931 } 7932 7933 template <typename Derived> 7934 StmtResult 7935 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7936 DeclarationNameInfo DirName; 7937 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7938 D->getBeginLoc()); 7939 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7940 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7941 return Res; 7942 } 7943 7944 template <typename Derived> 7945 StmtResult 7946 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7947 DeclarationNameInfo DirName; 7948 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7949 D->getBeginLoc()); 7950 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7951 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7952 return Res; 7953 } 7954 7955 template <typename Derived> 7956 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7957 OMPTaskgroupDirective *D) { 7958 DeclarationNameInfo DirName; 7959 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7960 D->getBeginLoc()); 7961 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7962 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7963 return Res; 7964 } 7965 7966 template <typename Derived> 7967 StmtResult 7968 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7969 DeclarationNameInfo DirName; 7970 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7971 D->getBeginLoc()); 7972 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7973 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7974 return Res; 7975 } 7976 7977 template <typename Derived> 7978 StmtResult 7979 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7980 DeclarationNameInfo DirName; 7981 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7982 D->getBeginLoc()); 7983 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7984 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7985 return Res; 7986 } 7987 7988 template <typename Derived> 7989 StmtResult 7990 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7991 DeclarationNameInfo DirName; 7992 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7993 D->getBeginLoc()); 7994 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7995 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7996 return Res; 7997 } 7998 7999 template <typename Derived> 8000 StmtResult 8001 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8002 DeclarationNameInfo DirName; 8003 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8004 D->getBeginLoc()); 8005 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8006 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8007 return Res; 8008 } 8009 8010 template <typename Derived> 8011 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8012 OMPTargetDataDirective *D) { 8013 DeclarationNameInfo DirName; 8014 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8015 D->getBeginLoc()); 8016 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8017 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8018 return Res; 8019 } 8020 8021 template <typename Derived> 8022 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8023 OMPTargetEnterDataDirective *D) { 8024 DeclarationNameInfo DirName; 8025 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8026 nullptr, D->getBeginLoc()); 8027 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8028 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8029 return Res; 8030 } 8031 8032 template <typename Derived> 8033 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8034 OMPTargetExitDataDirective *D) { 8035 DeclarationNameInfo DirName; 8036 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8037 nullptr, D->getBeginLoc()); 8038 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8039 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8040 return Res; 8041 } 8042 8043 template <typename Derived> 8044 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8045 OMPTargetParallelDirective *D) { 8046 DeclarationNameInfo DirName; 8047 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8048 nullptr, D->getBeginLoc()); 8049 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8050 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8051 return Res; 8052 } 8053 8054 template <typename Derived> 8055 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8056 OMPTargetParallelForDirective *D) { 8057 DeclarationNameInfo DirName; 8058 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8059 nullptr, D->getBeginLoc()); 8060 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8061 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8062 return Res; 8063 } 8064 8065 template <typename Derived> 8066 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8067 OMPTargetUpdateDirective *D) { 8068 DeclarationNameInfo DirName; 8069 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8070 nullptr, D->getBeginLoc()); 8071 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8072 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8073 return Res; 8074 } 8075 8076 template <typename Derived> 8077 StmtResult 8078 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8079 DeclarationNameInfo DirName; 8080 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8081 D->getBeginLoc()); 8082 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8083 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8084 return Res; 8085 } 8086 8087 template <typename Derived> 8088 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8089 OMPCancellationPointDirective *D) { 8090 DeclarationNameInfo DirName; 8091 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8092 nullptr, D->getBeginLoc()); 8093 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8094 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8095 return Res; 8096 } 8097 8098 template <typename Derived> 8099 StmtResult 8100 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8101 DeclarationNameInfo DirName; 8102 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8103 D->getBeginLoc()); 8104 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8105 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8106 return Res; 8107 } 8108 8109 template <typename Derived> 8110 StmtResult 8111 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8112 DeclarationNameInfo DirName; 8113 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8114 D->getBeginLoc()); 8115 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8116 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8117 return Res; 8118 } 8119 8120 template <typename Derived> 8121 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8122 OMPTaskLoopSimdDirective *D) { 8123 DeclarationNameInfo DirName; 8124 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8125 nullptr, D->getBeginLoc()); 8126 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8127 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8128 return Res; 8129 } 8130 8131 template <typename Derived> 8132 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8133 OMPDistributeDirective *D) { 8134 DeclarationNameInfo DirName; 8135 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8136 D->getBeginLoc()); 8137 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8138 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8139 return Res; 8140 } 8141 8142 template <typename Derived> 8143 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8144 OMPDistributeParallelForDirective *D) { 8145 DeclarationNameInfo DirName; 8146 getDerived().getSema().StartOpenMPDSABlock( 8147 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8148 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8149 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8150 return Res; 8151 } 8152 8153 template <typename Derived> 8154 StmtResult 8155 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8156 OMPDistributeParallelForSimdDirective *D) { 8157 DeclarationNameInfo DirName; 8158 getDerived().getSema().StartOpenMPDSABlock( 8159 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8160 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8161 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8162 return Res; 8163 } 8164 8165 template <typename Derived> 8166 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8167 OMPDistributeSimdDirective *D) { 8168 DeclarationNameInfo DirName; 8169 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8170 nullptr, D->getBeginLoc()); 8171 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8172 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8173 return Res; 8174 } 8175 8176 template <typename Derived> 8177 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8178 OMPTargetParallelForSimdDirective *D) { 8179 DeclarationNameInfo DirName; 8180 getDerived().getSema().StartOpenMPDSABlock( 8181 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8182 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8183 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8184 return Res; 8185 } 8186 8187 template <typename Derived> 8188 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8189 OMPTargetSimdDirective *D) { 8190 DeclarationNameInfo DirName; 8191 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8192 D->getBeginLoc()); 8193 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8194 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8195 return Res; 8196 } 8197 8198 template <typename Derived> 8199 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8200 OMPTeamsDistributeDirective *D) { 8201 DeclarationNameInfo DirName; 8202 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8203 nullptr, D->getBeginLoc()); 8204 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8205 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8206 return Res; 8207 } 8208 8209 template <typename Derived> 8210 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8211 OMPTeamsDistributeSimdDirective *D) { 8212 DeclarationNameInfo DirName; 8213 getDerived().getSema().StartOpenMPDSABlock( 8214 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8215 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8216 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8217 return Res; 8218 } 8219 8220 template <typename Derived> 8221 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8222 OMPTeamsDistributeParallelForSimdDirective *D) { 8223 DeclarationNameInfo DirName; 8224 getDerived().getSema().StartOpenMPDSABlock( 8225 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8226 D->getBeginLoc()); 8227 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8228 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8229 return Res; 8230 } 8231 8232 template <typename Derived> 8233 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8234 OMPTeamsDistributeParallelForDirective *D) { 8235 DeclarationNameInfo DirName; 8236 getDerived().getSema().StartOpenMPDSABlock( 8237 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8238 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8239 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8240 return Res; 8241 } 8242 8243 template <typename Derived> 8244 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8245 OMPTargetTeamsDirective *D) { 8246 DeclarationNameInfo DirName; 8247 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8248 nullptr, D->getBeginLoc()); 8249 auto Res = getDerived().TransformOMPExecutableDirective(D); 8250 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8251 return Res; 8252 } 8253 8254 template <typename Derived> 8255 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8256 OMPTargetTeamsDistributeDirective *D) { 8257 DeclarationNameInfo DirName; 8258 getDerived().getSema().StartOpenMPDSABlock( 8259 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8260 auto Res = getDerived().TransformOMPExecutableDirective(D); 8261 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8262 return Res; 8263 } 8264 8265 template <typename Derived> 8266 StmtResult 8267 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8268 OMPTargetTeamsDistributeParallelForDirective *D) { 8269 DeclarationNameInfo DirName; 8270 getDerived().getSema().StartOpenMPDSABlock( 8271 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8272 D->getBeginLoc()); 8273 auto Res = getDerived().TransformOMPExecutableDirective(D); 8274 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8275 return Res; 8276 } 8277 8278 template <typename Derived> 8279 StmtResult TreeTransform<Derived>:: 8280 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8281 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8282 DeclarationNameInfo DirName; 8283 getDerived().getSema().StartOpenMPDSABlock( 8284 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8285 D->getBeginLoc()); 8286 auto Res = getDerived().TransformOMPExecutableDirective(D); 8287 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8288 return Res; 8289 } 8290 8291 template <typename Derived> 8292 StmtResult 8293 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8294 OMPTargetTeamsDistributeSimdDirective *D) { 8295 DeclarationNameInfo DirName; 8296 getDerived().getSema().StartOpenMPDSABlock( 8297 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8298 auto Res = getDerived().TransformOMPExecutableDirective(D); 8299 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8300 return Res; 8301 } 8302 8303 8304 //===----------------------------------------------------------------------===// 8305 // OpenMP clause transformation 8306 //===----------------------------------------------------------------------===// 8307 template <typename Derived> 8308 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8309 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8310 if (Cond.isInvalid()) 8311 return nullptr; 8312 return getDerived().RebuildOMPIfClause( 8313 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8314 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8315 } 8316 8317 template <typename Derived> 8318 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8319 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8320 if (Cond.isInvalid()) 8321 return nullptr; 8322 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8323 C->getLParenLoc(), C->getEndLoc()); 8324 } 8325 8326 template <typename Derived> 8327 OMPClause * 8328 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8329 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8330 if (NumThreads.isInvalid()) 8331 return nullptr; 8332 return getDerived().RebuildOMPNumThreadsClause( 8333 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8334 } 8335 8336 template <typename Derived> 8337 OMPClause * 8338 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8339 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8340 if (E.isInvalid()) 8341 return nullptr; 8342 return getDerived().RebuildOMPSafelenClause( 8343 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8344 } 8345 8346 template <typename Derived> 8347 OMPClause * 8348 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8349 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8350 if (E.isInvalid()) 8351 return nullptr; 8352 return getDerived().RebuildOMPSimdlenClause( 8353 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8354 } 8355 8356 template <typename Derived> 8357 OMPClause * 8358 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8359 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8360 if (E.isInvalid()) 8361 return nullptr; 8362 return getDerived().RebuildOMPCollapseClause( 8363 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8364 } 8365 8366 template <typename Derived> 8367 OMPClause * 8368 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8369 return getDerived().RebuildOMPDefaultClause( 8370 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8371 C->getLParenLoc(), C->getEndLoc()); 8372 } 8373 8374 template <typename Derived> 8375 OMPClause * 8376 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8377 return getDerived().RebuildOMPProcBindClause( 8378 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8379 C->getLParenLoc(), C->getEndLoc()); 8380 } 8381 8382 template <typename Derived> 8383 OMPClause * 8384 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8385 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8386 if (E.isInvalid()) 8387 return nullptr; 8388 return getDerived().RebuildOMPScheduleClause( 8389 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8390 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8391 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8392 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8393 } 8394 8395 template <typename Derived> 8396 OMPClause * 8397 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8398 ExprResult E; 8399 if (auto *Num = C->getNumForLoops()) { 8400 E = getDerived().TransformExpr(Num); 8401 if (E.isInvalid()) 8402 return nullptr; 8403 } 8404 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8405 C->getLParenLoc(), E.get()); 8406 } 8407 8408 template <typename Derived> 8409 OMPClause * 8410 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8411 // No need to rebuild this clause, no template-dependent parameters. 8412 return C; 8413 } 8414 8415 template <typename Derived> 8416 OMPClause * 8417 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8418 // No need to rebuild this clause, no template-dependent parameters. 8419 return C; 8420 } 8421 8422 template <typename Derived> 8423 OMPClause * 8424 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8425 // No need to rebuild this clause, no template-dependent parameters. 8426 return C; 8427 } 8428 8429 template <typename Derived> 8430 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8431 // No need to rebuild this clause, no template-dependent parameters. 8432 return C; 8433 } 8434 8435 template <typename Derived> 8436 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8437 // No need to rebuild this clause, no template-dependent parameters. 8438 return C; 8439 } 8440 8441 template <typename Derived> 8442 OMPClause * 8443 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8444 // No need to rebuild this clause, no template-dependent parameters. 8445 return C; 8446 } 8447 8448 template <typename Derived> 8449 OMPClause * 8450 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8451 // No need to rebuild this clause, no template-dependent parameters. 8452 return C; 8453 } 8454 8455 template <typename Derived> 8456 OMPClause * 8457 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8458 // No need to rebuild this clause, no template-dependent parameters. 8459 return C; 8460 } 8461 8462 template <typename Derived> 8463 OMPClause * 8464 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8465 // No need to rebuild this clause, no template-dependent parameters. 8466 return C; 8467 } 8468 8469 template <typename Derived> 8470 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8471 // No need to rebuild this clause, no template-dependent parameters. 8472 return C; 8473 } 8474 8475 template <typename Derived> 8476 OMPClause * 8477 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8478 // No need to rebuild this clause, no template-dependent parameters. 8479 return C; 8480 } 8481 8482 template <typename Derived> 8483 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8484 OMPUnifiedAddressClause *C) { 8485 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8486 } 8487 8488 template <typename Derived> 8489 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8490 OMPUnifiedSharedMemoryClause *C) { 8491 llvm_unreachable( 8492 "unified_shared_memory clause cannot appear in dependent context"); 8493 } 8494 8495 template <typename Derived> 8496 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8497 OMPReverseOffloadClause *C) { 8498 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8499 } 8500 8501 template <typename Derived> 8502 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8503 OMPDynamicAllocatorsClause *C) { 8504 llvm_unreachable( 8505 "dynamic_allocators clause cannot appear in dependent context"); 8506 } 8507 8508 template <typename Derived> 8509 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 8510 OMPAtomicDefaultMemOrderClause *C) { 8511 llvm_unreachable( 8512 "atomic_default_mem_order clause cannot appear in dependent context"); 8513 } 8514 8515 template <typename Derived> 8516 OMPClause * 8517 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8518 llvm::SmallVector<Expr *, 16> Vars; 8519 Vars.reserve(C->varlist_size()); 8520 for (auto *VE : C->varlists()) { 8521 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8522 if (EVar.isInvalid()) 8523 return nullptr; 8524 Vars.push_back(EVar.get()); 8525 } 8526 return getDerived().RebuildOMPPrivateClause( 8527 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8528 } 8529 8530 template <typename Derived> 8531 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8532 OMPFirstprivateClause *C) { 8533 llvm::SmallVector<Expr *, 16> Vars; 8534 Vars.reserve(C->varlist_size()); 8535 for (auto *VE : C->varlists()) { 8536 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8537 if (EVar.isInvalid()) 8538 return nullptr; 8539 Vars.push_back(EVar.get()); 8540 } 8541 return getDerived().RebuildOMPFirstprivateClause( 8542 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8543 } 8544 8545 template <typename Derived> 8546 OMPClause * 8547 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8548 llvm::SmallVector<Expr *, 16> Vars; 8549 Vars.reserve(C->varlist_size()); 8550 for (auto *VE : C->varlists()) { 8551 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8552 if (EVar.isInvalid()) 8553 return nullptr; 8554 Vars.push_back(EVar.get()); 8555 } 8556 return getDerived().RebuildOMPLastprivateClause( 8557 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8558 } 8559 8560 template <typename Derived> 8561 OMPClause * 8562 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8563 llvm::SmallVector<Expr *, 16> Vars; 8564 Vars.reserve(C->varlist_size()); 8565 for (auto *VE : C->varlists()) { 8566 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8567 if (EVar.isInvalid()) 8568 return nullptr; 8569 Vars.push_back(EVar.get()); 8570 } 8571 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8572 C->getLParenLoc(), C->getEndLoc()); 8573 } 8574 8575 template <typename Derived> 8576 OMPClause * 8577 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8578 llvm::SmallVector<Expr *, 16> Vars; 8579 Vars.reserve(C->varlist_size()); 8580 for (auto *VE : C->varlists()) { 8581 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8582 if (EVar.isInvalid()) 8583 return nullptr; 8584 Vars.push_back(EVar.get()); 8585 } 8586 CXXScopeSpec ReductionIdScopeSpec; 8587 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8588 8589 DeclarationNameInfo NameInfo = C->getNameInfo(); 8590 if (NameInfo.getName()) { 8591 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8592 if (!NameInfo.getName()) 8593 return nullptr; 8594 } 8595 // Build a list of all UDR decls with the same names ranged by the Scopes. 8596 // The Scope boundary is a duplication of the previous decl. 8597 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8598 for (auto *E : C->reduction_ops()) { 8599 // Transform all the decls. 8600 if (E) { 8601 auto *ULE = cast<UnresolvedLookupExpr>(E); 8602 UnresolvedSet<8> Decls; 8603 for (auto *D : ULE->decls()) { 8604 NamedDecl *InstD = 8605 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8606 Decls.addDecl(InstD, InstD->getAccess()); 8607 } 8608 UnresolvedReductions.push_back( 8609 UnresolvedLookupExpr::Create( 8610 SemaRef.Context, /*NamingClass=*/nullptr, 8611 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8612 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8613 Decls.begin(), Decls.end())); 8614 } else 8615 UnresolvedReductions.push_back(nullptr); 8616 } 8617 return getDerived().RebuildOMPReductionClause( 8618 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8619 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8620 } 8621 8622 template <typename Derived> 8623 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8624 OMPTaskReductionClause *C) { 8625 llvm::SmallVector<Expr *, 16> Vars; 8626 Vars.reserve(C->varlist_size()); 8627 for (auto *VE : C->varlists()) { 8628 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8629 if (EVar.isInvalid()) 8630 return nullptr; 8631 Vars.push_back(EVar.get()); 8632 } 8633 CXXScopeSpec ReductionIdScopeSpec; 8634 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8635 8636 DeclarationNameInfo NameInfo = C->getNameInfo(); 8637 if (NameInfo.getName()) { 8638 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8639 if (!NameInfo.getName()) 8640 return nullptr; 8641 } 8642 // Build a list of all UDR decls with the same names ranged by the Scopes. 8643 // The Scope boundary is a duplication of the previous decl. 8644 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8645 for (auto *E : C->reduction_ops()) { 8646 // Transform all the decls. 8647 if (E) { 8648 auto *ULE = cast<UnresolvedLookupExpr>(E); 8649 UnresolvedSet<8> Decls; 8650 for (auto *D : ULE->decls()) { 8651 NamedDecl *InstD = 8652 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8653 Decls.addDecl(InstD, InstD->getAccess()); 8654 } 8655 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8656 SemaRef.Context, /*NamingClass=*/nullptr, 8657 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8658 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8659 } else 8660 UnresolvedReductions.push_back(nullptr); 8661 } 8662 return getDerived().RebuildOMPTaskReductionClause( 8663 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8664 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8665 } 8666 8667 template <typename Derived> 8668 OMPClause * 8669 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 8670 llvm::SmallVector<Expr *, 16> Vars; 8671 Vars.reserve(C->varlist_size()); 8672 for (auto *VE : C->varlists()) { 8673 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8674 if (EVar.isInvalid()) 8675 return nullptr; 8676 Vars.push_back(EVar.get()); 8677 } 8678 CXXScopeSpec ReductionIdScopeSpec; 8679 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8680 8681 DeclarationNameInfo NameInfo = C->getNameInfo(); 8682 if (NameInfo.getName()) { 8683 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8684 if (!NameInfo.getName()) 8685 return nullptr; 8686 } 8687 // Build a list of all UDR decls with the same names ranged by the Scopes. 8688 // The Scope boundary is a duplication of the previous decl. 8689 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8690 for (auto *E : C->reduction_ops()) { 8691 // Transform all the decls. 8692 if (E) { 8693 auto *ULE = cast<UnresolvedLookupExpr>(E); 8694 UnresolvedSet<8> Decls; 8695 for (auto *D : ULE->decls()) { 8696 NamedDecl *InstD = 8697 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8698 Decls.addDecl(InstD, InstD->getAccess()); 8699 } 8700 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8701 SemaRef.Context, /*NamingClass=*/nullptr, 8702 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8703 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8704 } else 8705 UnresolvedReductions.push_back(nullptr); 8706 } 8707 return getDerived().RebuildOMPInReductionClause( 8708 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8709 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8710 } 8711 8712 template <typename Derived> 8713 OMPClause * 8714 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8715 llvm::SmallVector<Expr *, 16> Vars; 8716 Vars.reserve(C->varlist_size()); 8717 for (auto *VE : C->varlists()) { 8718 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8719 if (EVar.isInvalid()) 8720 return nullptr; 8721 Vars.push_back(EVar.get()); 8722 } 8723 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8724 if (Step.isInvalid()) 8725 return nullptr; 8726 return getDerived().RebuildOMPLinearClause( 8727 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 8728 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8729 } 8730 8731 template <typename Derived> 8732 OMPClause * 8733 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8734 llvm::SmallVector<Expr *, 16> Vars; 8735 Vars.reserve(C->varlist_size()); 8736 for (auto *VE : C->varlists()) { 8737 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8738 if (EVar.isInvalid()) 8739 return nullptr; 8740 Vars.push_back(EVar.get()); 8741 } 8742 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8743 if (Alignment.isInvalid()) 8744 return nullptr; 8745 return getDerived().RebuildOMPAlignedClause( 8746 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 8747 C->getColonLoc(), C->getEndLoc()); 8748 } 8749 8750 template <typename Derived> 8751 OMPClause * 8752 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8753 llvm::SmallVector<Expr *, 16> Vars; 8754 Vars.reserve(C->varlist_size()); 8755 for (auto *VE : C->varlists()) { 8756 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8757 if (EVar.isInvalid()) 8758 return nullptr; 8759 Vars.push_back(EVar.get()); 8760 } 8761 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 8762 C->getLParenLoc(), C->getEndLoc()); 8763 } 8764 8765 template <typename Derived> 8766 OMPClause * 8767 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8768 llvm::SmallVector<Expr *, 16> Vars; 8769 Vars.reserve(C->varlist_size()); 8770 for (auto *VE : C->varlists()) { 8771 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8772 if (EVar.isInvalid()) 8773 return nullptr; 8774 Vars.push_back(EVar.get()); 8775 } 8776 return getDerived().RebuildOMPCopyprivateClause( 8777 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8778 } 8779 8780 template <typename Derived> 8781 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8782 llvm::SmallVector<Expr *, 16> Vars; 8783 Vars.reserve(C->varlist_size()); 8784 for (auto *VE : C->varlists()) { 8785 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8786 if (EVar.isInvalid()) 8787 return nullptr; 8788 Vars.push_back(EVar.get()); 8789 } 8790 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 8791 C->getLParenLoc(), C->getEndLoc()); 8792 } 8793 8794 template <typename Derived> 8795 OMPClause * 8796 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8797 llvm::SmallVector<Expr *, 16> Vars; 8798 Vars.reserve(C->varlist_size()); 8799 for (auto *VE : C->varlists()) { 8800 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8801 if (EVar.isInvalid()) 8802 return nullptr; 8803 Vars.push_back(EVar.get()); 8804 } 8805 return getDerived().RebuildOMPDependClause( 8806 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8807 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8808 } 8809 8810 template <typename Derived> 8811 OMPClause * 8812 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8813 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8814 if (E.isInvalid()) 8815 return nullptr; 8816 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 8817 C->getLParenLoc(), C->getEndLoc()); 8818 } 8819 8820 template <typename Derived, class T> 8821 bool transformOMPMappableExprListClause( 8822 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 8823 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 8824 DeclarationNameInfo &MapperIdInfo, 8825 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 8826 // Transform expressions in the list. 8827 Vars.reserve(C->varlist_size()); 8828 for (auto *VE : C->varlists()) { 8829 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 8830 if (EVar.isInvalid()) 8831 return true; 8832 Vars.push_back(EVar.get()); 8833 } 8834 // Transform mapper scope specifier and identifier. 8835 NestedNameSpecifierLoc QualifierLoc; 8836 if (C->getMapperQualifierLoc()) { 8837 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 8838 C->getMapperQualifierLoc()); 8839 if (!QualifierLoc) 8840 return true; 8841 } 8842 MapperIdScopeSpec.Adopt(QualifierLoc); 8843 MapperIdInfo = C->getMapperIdInfo(); 8844 if (MapperIdInfo.getName()) { 8845 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 8846 if (!MapperIdInfo.getName()) 8847 return true; 8848 } 8849 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 8850 // the previous user-defined mapper lookup in dependent environment. 8851 for (auto *E : C->mapperlists()) { 8852 // Transform all the decls. 8853 if (E) { 8854 auto *ULE = cast<UnresolvedLookupExpr>(E); 8855 UnresolvedSet<8> Decls; 8856 for (auto *D : ULE->decls()) { 8857 NamedDecl *InstD = 8858 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 8859 Decls.addDecl(InstD, InstD->getAccess()); 8860 } 8861 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 8862 TT.getSema().Context, /*NamingClass=*/nullptr, 8863 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 8864 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 8865 Decls.end())); 8866 } else { 8867 UnresolvedMappers.push_back(nullptr); 8868 } 8869 } 8870 return false; 8871 } 8872 8873 template <typename Derived> 8874 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8875 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8876 llvm::SmallVector<Expr *, 16> Vars; 8877 CXXScopeSpec MapperIdScopeSpec; 8878 DeclarationNameInfo MapperIdInfo; 8879 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 8880 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 8881 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 8882 return nullptr; 8883 return getDerived().RebuildOMPMapClause( 8884 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 8885 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 8886 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 8887 } 8888 8889 template <typename Derived> 8890 OMPClause * 8891 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8892 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8893 if (E.isInvalid()) 8894 return nullptr; 8895 return getDerived().RebuildOMPNumTeamsClause( 8896 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8897 } 8898 8899 template <typename Derived> 8900 OMPClause * 8901 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8902 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8903 if (E.isInvalid()) 8904 return nullptr; 8905 return getDerived().RebuildOMPThreadLimitClause( 8906 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8907 } 8908 8909 template <typename Derived> 8910 OMPClause * 8911 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8912 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8913 if (E.isInvalid()) 8914 return nullptr; 8915 return getDerived().RebuildOMPPriorityClause( 8916 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8917 } 8918 8919 template <typename Derived> 8920 OMPClause * 8921 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8922 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8923 if (E.isInvalid()) 8924 return nullptr; 8925 return getDerived().RebuildOMPGrainsizeClause( 8926 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8927 } 8928 8929 template <typename Derived> 8930 OMPClause * 8931 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8932 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8933 if (E.isInvalid()) 8934 return nullptr; 8935 return getDerived().RebuildOMPNumTasksClause( 8936 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8937 } 8938 8939 template <typename Derived> 8940 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8941 ExprResult E = getDerived().TransformExpr(C->getHint()); 8942 if (E.isInvalid()) 8943 return nullptr; 8944 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 8945 C->getLParenLoc(), C->getEndLoc()); 8946 } 8947 8948 template <typename Derived> 8949 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8950 OMPDistScheduleClause *C) { 8951 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8952 if (E.isInvalid()) 8953 return nullptr; 8954 return getDerived().RebuildOMPDistScheduleClause( 8955 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8956 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8957 } 8958 8959 template <typename Derived> 8960 OMPClause * 8961 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8962 return C; 8963 } 8964 8965 template <typename Derived> 8966 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8967 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8968 llvm::SmallVector<Expr *, 16> Vars; 8969 CXXScopeSpec MapperIdScopeSpec; 8970 DeclarationNameInfo MapperIdInfo; 8971 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 8972 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 8973 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 8974 return nullptr; 8975 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 8976 Locs, UnresolvedMappers); 8977 } 8978 8979 template <typename Derived> 8980 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 8981 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8982 llvm::SmallVector<Expr *, 16> Vars; 8983 CXXScopeSpec MapperIdScopeSpec; 8984 DeclarationNameInfo MapperIdInfo; 8985 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 8986 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 8987 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 8988 return nullptr; 8989 return getDerived().RebuildOMPFromClause( 8990 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 8991 } 8992 8993 template <typename Derived> 8994 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 8995 OMPUseDevicePtrClause *C) { 8996 llvm::SmallVector<Expr *, 16> Vars; 8997 Vars.reserve(C->varlist_size()); 8998 for (auto *VE : C->varlists()) { 8999 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9000 if (EVar.isInvalid()) 9001 return nullptr; 9002 Vars.push_back(EVar.get()); 9003 } 9004 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9005 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9006 } 9007 9008 template <typename Derived> 9009 OMPClause * 9010 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9011 llvm::SmallVector<Expr *, 16> Vars; 9012 Vars.reserve(C->varlist_size()); 9013 for (auto *VE : C->varlists()) { 9014 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9015 if (EVar.isInvalid()) 9016 return nullptr; 9017 Vars.push_back(EVar.get()); 9018 } 9019 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9020 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9021 } 9022 9023 //===----------------------------------------------------------------------===// 9024 // Expression transformation 9025 //===----------------------------------------------------------------------===// 9026 template<typename Derived> 9027 ExprResult 9028 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9029 return TransformExpr(E->getSubExpr()); 9030 } 9031 9032 template<typename Derived> 9033 ExprResult 9034 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9035 if (!E->isTypeDependent()) 9036 return E; 9037 9038 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9039 E->getIdentKind()); 9040 } 9041 9042 template<typename Derived> 9043 ExprResult 9044 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9045 NestedNameSpecifierLoc QualifierLoc; 9046 if (E->getQualifierLoc()) { 9047 QualifierLoc 9048 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9049 if (!QualifierLoc) 9050 return ExprError(); 9051 } 9052 9053 ValueDecl *ND 9054 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9055 E->getDecl())); 9056 if (!ND) 9057 return ExprError(); 9058 9059 DeclarationNameInfo NameInfo = E->getNameInfo(); 9060 if (NameInfo.getName()) { 9061 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9062 if (!NameInfo.getName()) 9063 return ExprError(); 9064 } 9065 9066 if (!getDerived().AlwaysRebuild() && 9067 QualifierLoc == E->getQualifierLoc() && 9068 ND == E->getDecl() && 9069 NameInfo.getName() == E->getDecl()->getDeclName() && 9070 !E->hasExplicitTemplateArgs()) { 9071 9072 // Mark it referenced in the new context regardless. 9073 // FIXME: this is a bit instantiation-specific. 9074 SemaRef.MarkDeclRefReferenced(E); 9075 9076 return E; 9077 } 9078 9079 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9080 if (E->hasExplicitTemplateArgs()) { 9081 TemplateArgs = &TransArgs; 9082 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9083 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9084 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9085 E->getNumTemplateArgs(), 9086 TransArgs)) 9087 return ExprError(); 9088 } 9089 9090 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9091 TemplateArgs); 9092 } 9093 9094 template<typename Derived> 9095 ExprResult 9096 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9097 return E; 9098 } 9099 9100 template <typename Derived> 9101 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9102 FixedPointLiteral *E) { 9103 return E; 9104 } 9105 9106 template<typename Derived> 9107 ExprResult 9108 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9109 return E; 9110 } 9111 9112 template<typename Derived> 9113 ExprResult 9114 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9115 return E; 9116 } 9117 9118 template<typename Derived> 9119 ExprResult 9120 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9121 return E; 9122 } 9123 9124 template<typename Derived> 9125 ExprResult 9126 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9127 return E; 9128 } 9129 9130 template<typename Derived> 9131 ExprResult 9132 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9133 if (FunctionDecl *FD = E->getDirectCallee()) 9134 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9135 return SemaRef.MaybeBindToTemporary(E); 9136 } 9137 9138 template<typename Derived> 9139 ExprResult 9140 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9141 ExprResult ControllingExpr = 9142 getDerived().TransformExpr(E->getControllingExpr()); 9143 if (ControllingExpr.isInvalid()) 9144 return ExprError(); 9145 9146 SmallVector<Expr *, 4> AssocExprs; 9147 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9148 for (const GenericSelectionExpr::Association &Assoc : E->associations()) { 9149 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9150 if (TSI) { 9151 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9152 if (!AssocType) 9153 return ExprError(); 9154 AssocTypes.push_back(AssocType); 9155 } else { 9156 AssocTypes.push_back(nullptr); 9157 } 9158 9159 ExprResult AssocExpr = 9160 getDerived().TransformExpr(Assoc.getAssociationExpr()); 9161 if (AssocExpr.isInvalid()) 9162 return ExprError(); 9163 AssocExprs.push_back(AssocExpr.get()); 9164 } 9165 9166 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9167 E->getDefaultLoc(), 9168 E->getRParenLoc(), 9169 ControllingExpr.get(), 9170 AssocTypes, 9171 AssocExprs); 9172 } 9173 9174 template<typename Derived> 9175 ExprResult 9176 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9177 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9178 if (SubExpr.isInvalid()) 9179 return ExprError(); 9180 9181 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9182 return E; 9183 9184 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9185 E->getRParen()); 9186 } 9187 9188 /// The operand of a unary address-of operator has special rules: it's 9189 /// allowed to refer to a non-static member of a class even if there's no 'this' 9190 /// object available. 9191 template<typename Derived> 9192 ExprResult 9193 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9194 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9195 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9196 else 9197 return getDerived().TransformExpr(E); 9198 } 9199 9200 template<typename Derived> 9201 ExprResult 9202 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9203 ExprResult SubExpr; 9204 if (E->getOpcode() == UO_AddrOf) 9205 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9206 else 9207 SubExpr = TransformExpr(E->getSubExpr()); 9208 if (SubExpr.isInvalid()) 9209 return ExprError(); 9210 9211 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9212 return E; 9213 9214 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9215 E->getOpcode(), 9216 SubExpr.get()); 9217 } 9218 9219 template<typename Derived> 9220 ExprResult 9221 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9222 // Transform the type. 9223 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9224 if (!Type) 9225 return ExprError(); 9226 9227 // Transform all of the components into components similar to what the 9228 // parser uses. 9229 // FIXME: It would be slightly more efficient in the non-dependent case to 9230 // just map FieldDecls, rather than requiring the rebuilder to look for 9231 // the fields again. However, __builtin_offsetof is rare enough in 9232 // template code that we don't care. 9233 bool ExprChanged = false; 9234 typedef Sema::OffsetOfComponent Component; 9235 SmallVector<Component, 4> Components; 9236 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9237 const OffsetOfNode &ON = E->getComponent(I); 9238 Component Comp; 9239 Comp.isBrackets = true; 9240 Comp.LocStart = ON.getSourceRange().getBegin(); 9241 Comp.LocEnd = ON.getSourceRange().getEnd(); 9242 switch (ON.getKind()) { 9243 case OffsetOfNode::Array: { 9244 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9245 ExprResult Index = getDerived().TransformExpr(FromIndex); 9246 if (Index.isInvalid()) 9247 return ExprError(); 9248 9249 ExprChanged = ExprChanged || Index.get() != FromIndex; 9250 Comp.isBrackets = true; 9251 Comp.U.E = Index.get(); 9252 break; 9253 } 9254 9255 case OffsetOfNode::Field: 9256 case OffsetOfNode::Identifier: 9257 Comp.isBrackets = false; 9258 Comp.U.IdentInfo = ON.getFieldName(); 9259 if (!Comp.U.IdentInfo) 9260 continue; 9261 9262 break; 9263 9264 case OffsetOfNode::Base: 9265 // Will be recomputed during the rebuild. 9266 continue; 9267 } 9268 9269 Components.push_back(Comp); 9270 } 9271 9272 // If nothing changed, retain the existing expression. 9273 if (!getDerived().AlwaysRebuild() && 9274 Type == E->getTypeSourceInfo() && 9275 !ExprChanged) 9276 return E; 9277 9278 // Build a new offsetof expression. 9279 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9280 Components, E->getRParenLoc()); 9281 } 9282 9283 template<typename Derived> 9284 ExprResult 9285 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9286 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9287 "opaque value expression requires transformation"); 9288 return E; 9289 } 9290 9291 template<typename Derived> 9292 ExprResult 9293 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9294 return E; 9295 } 9296 9297 template<typename Derived> 9298 ExprResult 9299 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9300 // Rebuild the syntactic form. The original syntactic form has 9301 // opaque-value expressions in it, so strip those away and rebuild 9302 // the result. This is a really awful way of doing this, but the 9303 // better solution (rebuilding the semantic expressions and 9304 // rebinding OVEs as necessary) doesn't work; we'd need 9305 // TreeTransform to not strip away implicit conversions. 9306 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9307 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9308 if (result.isInvalid()) return ExprError(); 9309 9310 // If that gives us a pseudo-object result back, the pseudo-object 9311 // expression must have been an lvalue-to-rvalue conversion which we 9312 // should reapply. 9313 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9314 result = SemaRef.checkPseudoObjectRValue(result.get()); 9315 9316 return result; 9317 } 9318 9319 template<typename Derived> 9320 ExprResult 9321 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9322 UnaryExprOrTypeTraitExpr *E) { 9323 if (E->isArgumentType()) { 9324 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9325 9326 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9327 if (!NewT) 9328 return ExprError(); 9329 9330 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9331 return E; 9332 9333 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9334 E->getKind(), 9335 E->getSourceRange()); 9336 } 9337 9338 // C++0x [expr.sizeof]p1: 9339 // The operand is either an expression, which is an unevaluated operand 9340 // [...] 9341 EnterExpressionEvaluationContext Unevaluated( 9342 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9343 Sema::ReuseLambdaContextDecl); 9344 9345 // Try to recover if we have something like sizeof(T::X) where X is a type. 9346 // Notably, there must be *exactly* one set of parens if X is a type. 9347 TypeSourceInfo *RecoveryTSI = nullptr; 9348 ExprResult SubExpr; 9349 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9350 if (auto *DRE = 9351 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9352 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9353 PE, DRE, false, &RecoveryTSI); 9354 else 9355 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9356 9357 if (RecoveryTSI) { 9358 return getDerived().RebuildUnaryExprOrTypeTrait( 9359 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9360 } else if (SubExpr.isInvalid()) 9361 return ExprError(); 9362 9363 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9364 return E; 9365 9366 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9367 E->getOperatorLoc(), 9368 E->getKind(), 9369 E->getSourceRange()); 9370 } 9371 9372 template<typename Derived> 9373 ExprResult 9374 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9375 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9376 if (LHS.isInvalid()) 9377 return ExprError(); 9378 9379 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9380 if (RHS.isInvalid()) 9381 return ExprError(); 9382 9383 9384 if (!getDerived().AlwaysRebuild() && 9385 LHS.get() == E->getLHS() && 9386 RHS.get() == E->getRHS()) 9387 return E; 9388 9389 return getDerived().RebuildArraySubscriptExpr( 9390 LHS.get(), 9391 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9392 } 9393 9394 template <typename Derived> 9395 ExprResult 9396 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9397 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9398 if (Base.isInvalid()) 9399 return ExprError(); 9400 9401 ExprResult LowerBound; 9402 if (E->getLowerBound()) { 9403 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9404 if (LowerBound.isInvalid()) 9405 return ExprError(); 9406 } 9407 9408 ExprResult Length; 9409 if (E->getLength()) { 9410 Length = getDerived().TransformExpr(E->getLength()); 9411 if (Length.isInvalid()) 9412 return ExprError(); 9413 } 9414 9415 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9416 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9417 return E; 9418 9419 return getDerived().RebuildOMPArraySectionExpr( 9420 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9421 Length.get(), E->getRBracketLoc()); 9422 } 9423 9424 template<typename Derived> 9425 ExprResult 9426 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9427 // Transform the callee. 9428 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9429 if (Callee.isInvalid()) 9430 return ExprError(); 9431 9432 // Transform arguments. 9433 bool ArgChanged = false; 9434 SmallVector<Expr*, 8> Args; 9435 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9436 &ArgChanged)) 9437 return ExprError(); 9438 9439 if (!getDerived().AlwaysRebuild() && 9440 Callee.get() == E->getCallee() && 9441 !ArgChanged) 9442 return SemaRef.MaybeBindToTemporary(E); 9443 9444 // FIXME: Wrong source location information for the '('. 9445 SourceLocation FakeLParenLoc 9446 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9447 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9448 Args, 9449 E->getRParenLoc()); 9450 } 9451 9452 template<typename Derived> 9453 ExprResult 9454 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9455 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9456 if (Base.isInvalid()) 9457 return ExprError(); 9458 9459 NestedNameSpecifierLoc QualifierLoc; 9460 if (E->hasQualifier()) { 9461 QualifierLoc 9462 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9463 9464 if (!QualifierLoc) 9465 return ExprError(); 9466 } 9467 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9468 9469 ValueDecl *Member 9470 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9471 E->getMemberDecl())); 9472 if (!Member) 9473 return ExprError(); 9474 9475 NamedDecl *FoundDecl = E->getFoundDecl(); 9476 if (FoundDecl == E->getMemberDecl()) { 9477 FoundDecl = Member; 9478 } else { 9479 FoundDecl = cast_or_null<NamedDecl>( 9480 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9481 if (!FoundDecl) 9482 return ExprError(); 9483 } 9484 9485 if (!getDerived().AlwaysRebuild() && 9486 Base.get() == E->getBase() && 9487 QualifierLoc == E->getQualifierLoc() && 9488 Member == E->getMemberDecl() && 9489 FoundDecl == E->getFoundDecl() && 9490 !E->hasExplicitTemplateArgs()) { 9491 9492 // Mark it referenced in the new context regardless. 9493 // FIXME: this is a bit instantiation-specific. 9494 SemaRef.MarkMemberReferenced(E); 9495 9496 return E; 9497 } 9498 9499 TemplateArgumentListInfo TransArgs; 9500 if (E->hasExplicitTemplateArgs()) { 9501 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9502 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9503 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9504 E->getNumTemplateArgs(), 9505 TransArgs)) 9506 return ExprError(); 9507 } 9508 9509 // FIXME: Bogus source location for the operator 9510 SourceLocation FakeOperatorLoc = 9511 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9512 9513 // FIXME: to do this check properly, we will need to preserve the 9514 // first-qualifier-in-scope here, just in case we had a dependent 9515 // base (and therefore couldn't do the check) and a 9516 // nested-name-qualifier (and therefore could do the lookup). 9517 NamedDecl *FirstQualifierInScope = nullptr; 9518 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9519 if (MemberNameInfo.getName()) { 9520 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9521 if (!MemberNameInfo.getName()) 9522 return ExprError(); 9523 } 9524 9525 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9526 E->isArrow(), 9527 QualifierLoc, 9528 TemplateKWLoc, 9529 MemberNameInfo, 9530 Member, 9531 FoundDecl, 9532 (E->hasExplicitTemplateArgs() 9533 ? &TransArgs : nullptr), 9534 FirstQualifierInScope); 9535 } 9536 9537 template<typename Derived> 9538 ExprResult 9539 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9540 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9541 if (LHS.isInvalid()) 9542 return ExprError(); 9543 9544 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9545 if (RHS.isInvalid()) 9546 return ExprError(); 9547 9548 if (!getDerived().AlwaysRebuild() && 9549 LHS.get() == E->getLHS() && 9550 RHS.get() == E->getRHS()) 9551 return E; 9552 9553 Sema::FPContractStateRAII FPContractState(getSema()); 9554 getSema().FPFeatures = E->getFPFeatures(); 9555 9556 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9557 LHS.get(), RHS.get()); 9558 } 9559 9560 template<typename Derived> 9561 ExprResult 9562 TreeTransform<Derived>::TransformCompoundAssignOperator( 9563 CompoundAssignOperator *E) { 9564 return getDerived().TransformBinaryOperator(E); 9565 } 9566 9567 template<typename Derived> 9568 ExprResult TreeTransform<Derived>:: 9569 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9570 // Just rebuild the common and RHS expressions and see whether we 9571 // get any changes. 9572 9573 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9574 if (commonExpr.isInvalid()) 9575 return ExprError(); 9576 9577 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9578 if (rhs.isInvalid()) 9579 return ExprError(); 9580 9581 if (!getDerived().AlwaysRebuild() && 9582 commonExpr.get() == e->getCommon() && 9583 rhs.get() == e->getFalseExpr()) 9584 return e; 9585 9586 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9587 e->getQuestionLoc(), 9588 nullptr, 9589 e->getColonLoc(), 9590 rhs.get()); 9591 } 9592 9593 template<typename Derived> 9594 ExprResult 9595 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9596 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9597 if (Cond.isInvalid()) 9598 return ExprError(); 9599 9600 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9601 if (LHS.isInvalid()) 9602 return ExprError(); 9603 9604 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9605 if (RHS.isInvalid()) 9606 return ExprError(); 9607 9608 if (!getDerived().AlwaysRebuild() && 9609 Cond.get() == E->getCond() && 9610 LHS.get() == E->getLHS() && 9611 RHS.get() == E->getRHS()) 9612 return E; 9613 9614 return getDerived().RebuildConditionalOperator(Cond.get(), 9615 E->getQuestionLoc(), 9616 LHS.get(), 9617 E->getColonLoc(), 9618 RHS.get()); 9619 } 9620 9621 template<typename Derived> 9622 ExprResult 9623 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9624 // Implicit casts are eliminated during transformation, since they 9625 // will be recomputed by semantic analysis after transformation. 9626 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9627 } 9628 9629 template<typename Derived> 9630 ExprResult 9631 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9632 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9633 if (!Type) 9634 return ExprError(); 9635 9636 ExprResult SubExpr 9637 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9638 if (SubExpr.isInvalid()) 9639 return ExprError(); 9640 9641 if (!getDerived().AlwaysRebuild() && 9642 Type == E->getTypeInfoAsWritten() && 9643 SubExpr.get() == E->getSubExpr()) 9644 return E; 9645 9646 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9647 Type, 9648 E->getRParenLoc(), 9649 SubExpr.get()); 9650 } 9651 9652 template<typename Derived> 9653 ExprResult 9654 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9655 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9656 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9657 if (!NewT) 9658 return ExprError(); 9659 9660 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9661 if (Init.isInvalid()) 9662 return ExprError(); 9663 9664 if (!getDerived().AlwaysRebuild() && 9665 OldT == NewT && 9666 Init.get() == E->getInitializer()) 9667 return SemaRef.MaybeBindToTemporary(E); 9668 9669 // Note: the expression type doesn't necessarily match the 9670 // type-as-written, but that's okay, because it should always be 9671 // derivable from the initializer. 9672 9673 return getDerived().RebuildCompoundLiteralExpr( 9674 E->getLParenLoc(), NewT, 9675 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 9676 } 9677 9678 template<typename Derived> 9679 ExprResult 9680 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9681 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9682 if (Base.isInvalid()) 9683 return ExprError(); 9684 9685 if (!getDerived().AlwaysRebuild() && 9686 Base.get() == E->getBase()) 9687 return E; 9688 9689 // FIXME: Bad source location 9690 SourceLocation FakeOperatorLoc = 9691 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 9692 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9693 E->getAccessorLoc(), 9694 E->getAccessor()); 9695 } 9696 9697 template<typename Derived> 9698 ExprResult 9699 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9700 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9701 E = Syntactic; 9702 9703 bool InitChanged = false; 9704 9705 EnterExpressionEvaluationContext Context( 9706 getSema(), EnterExpressionEvaluationContext::InitList); 9707 9708 SmallVector<Expr*, 4> Inits; 9709 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9710 Inits, &InitChanged)) 9711 return ExprError(); 9712 9713 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9714 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9715 // in some cases. We can't reuse it in general, because the syntactic and 9716 // semantic forms are linked, and we can't know that semantic form will 9717 // match even if the syntactic form does. 9718 } 9719 9720 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9721 E->getRBraceLoc()); 9722 } 9723 9724 template<typename Derived> 9725 ExprResult 9726 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9727 Designation Desig; 9728 9729 // transform the initializer value 9730 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9731 if (Init.isInvalid()) 9732 return ExprError(); 9733 9734 // transform the designators. 9735 SmallVector<Expr*, 4> ArrayExprs; 9736 bool ExprChanged = false; 9737 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9738 if (D.isFieldDesignator()) { 9739 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9740 D.getDotLoc(), 9741 D.getFieldLoc())); 9742 if (D.getField()) { 9743 FieldDecl *Field = cast_or_null<FieldDecl>( 9744 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9745 if (Field != D.getField()) 9746 // Rebuild the expression when the transformed FieldDecl is 9747 // different to the already assigned FieldDecl. 9748 ExprChanged = true; 9749 } else { 9750 // Ensure that the designator expression is rebuilt when there isn't 9751 // a resolved FieldDecl in the designator as we don't want to assign 9752 // a FieldDecl to a pattern designator that will be instantiated again. 9753 ExprChanged = true; 9754 } 9755 continue; 9756 } 9757 9758 if (D.isArrayDesignator()) { 9759 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9760 if (Index.isInvalid()) 9761 return ExprError(); 9762 9763 Desig.AddDesignator( 9764 Designator::getArray(Index.get(), D.getLBracketLoc())); 9765 9766 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9767 ArrayExprs.push_back(Index.get()); 9768 continue; 9769 } 9770 9771 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9772 ExprResult Start 9773 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9774 if (Start.isInvalid()) 9775 return ExprError(); 9776 9777 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9778 if (End.isInvalid()) 9779 return ExprError(); 9780 9781 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9782 End.get(), 9783 D.getLBracketLoc(), 9784 D.getEllipsisLoc())); 9785 9786 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9787 End.get() != E->getArrayRangeEnd(D); 9788 9789 ArrayExprs.push_back(Start.get()); 9790 ArrayExprs.push_back(End.get()); 9791 } 9792 9793 if (!getDerived().AlwaysRebuild() && 9794 Init.get() == E->getInit() && 9795 !ExprChanged) 9796 return E; 9797 9798 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9799 E->getEqualOrColonLoc(), 9800 E->usesGNUSyntax(), Init.get()); 9801 } 9802 9803 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9804 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9805 template<typename Derived> 9806 ExprResult 9807 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9808 DesignatedInitUpdateExpr *E) { 9809 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9810 "initializer"); 9811 return ExprError(); 9812 } 9813 9814 template<typename Derived> 9815 ExprResult 9816 TreeTransform<Derived>::TransformNoInitExpr( 9817 NoInitExpr *E) { 9818 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9819 return ExprError(); 9820 } 9821 9822 template<typename Derived> 9823 ExprResult 9824 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9825 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9826 return ExprError(); 9827 } 9828 9829 template<typename Derived> 9830 ExprResult 9831 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9832 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9833 return ExprError(); 9834 } 9835 9836 template<typename Derived> 9837 ExprResult 9838 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9839 ImplicitValueInitExpr *E) { 9840 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 9841 9842 // FIXME: Will we ever have proper type location here? Will we actually 9843 // need to transform the type? 9844 QualType T = getDerived().TransformType(E->getType()); 9845 if (T.isNull()) 9846 return ExprError(); 9847 9848 if (!getDerived().AlwaysRebuild() && 9849 T == E->getType()) 9850 return E; 9851 9852 return getDerived().RebuildImplicitValueInitExpr(T); 9853 } 9854 9855 template<typename Derived> 9856 ExprResult 9857 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9858 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9859 if (!TInfo) 9860 return ExprError(); 9861 9862 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9863 if (SubExpr.isInvalid()) 9864 return ExprError(); 9865 9866 if (!getDerived().AlwaysRebuild() && 9867 TInfo == E->getWrittenTypeInfo() && 9868 SubExpr.get() == E->getSubExpr()) 9869 return E; 9870 9871 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9872 TInfo, E->getRParenLoc()); 9873 } 9874 9875 template<typename Derived> 9876 ExprResult 9877 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9878 bool ArgumentChanged = false; 9879 SmallVector<Expr*, 4> Inits; 9880 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9881 &ArgumentChanged)) 9882 return ExprError(); 9883 9884 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9885 Inits, 9886 E->getRParenLoc()); 9887 } 9888 9889 /// Transform an address-of-label expression. 9890 /// 9891 /// By default, the transformation of an address-of-label expression always 9892 /// rebuilds the expression, so that the label identifier can be resolved to 9893 /// the corresponding label statement by semantic analysis. 9894 template<typename Derived> 9895 ExprResult 9896 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9897 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9898 E->getLabel()); 9899 if (!LD) 9900 return ExprError(); 9901 9902 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9903 cast<LabelDecl>(LD)); 9904 } 9905 9906 template<typename Derived> 9907 ExprResult 9908 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9909 SemaRef.ActOnStartStmtExpr(); 9910 StmtResult SubStmt 9911 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9912 if (SubStmt.isInvalid()) { 9913 SemaRef.ActOnStmtExprError(); 9914 return ExprError(); 9915 } 9916 9917 if (!getDerived().AlwaysRebuild() && 9918 SubStmt.get() == E->getSubStmt()) { 9919 // Calling this an 'error' is unintuitive, but it does the right thing. 9920 SemaRef.ActOnStmtExprError(); 9921 return SemaRef.MaybeBindToTemporary(E); 9922 } 9923 9924 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9925 SubStmt.get(), 9926 E->getRParenLoc()); 9927 } 9928 9929 template<typename Derived> 9930 ExprResult 9931 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9932 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9933 if (Cond.isInvalid()) 9934 return ExprError(); 9935 9936 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9937 if (LHS.isInvalid()) 9938 return ExprError(); 9939 9940 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9941 if (RHS.isInvalid()) 9942 return ExprError(); 9943 9944 if (!getDerived().AlwaysRebuild() && 9945 Cond.get() == E->getCond() && 9946 LHS.get() == E->getLHS() && 9947 RHS.get() == E->getRHS()) 9948 return E; 9949 9950 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9951 Cond.get(), LHS.get(), RHS.get(), 9952 E->getRParenLoc()); 9953 } 9954 9955 template<typename Derived> 9956 ExprResult 9957 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9958 return E; 9959 } 9960 9961 template<typename Derived> 9962 ExprResult 9963 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9964 switch (E->getOperator()) { 9965 case OO_New: 9966 case OO_Delete: 9967 case OO_Array_New: 9968 case OO_Array_Delete: 9969 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9970 9971 case OO_Call: { 9972 // This is a call to an object's operator(). 9973 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9974 9975 // Transform the object itself. 9976 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9977 if (Object.isInvalid()) 9978 return ExprError(); 9979 9980 // FIXME: Poor location information 9981 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9982 static_cast<Expr *>(Object.get())->getEndLoc()); 9983 9984 // Transform the call arguments. 9985 SmallVector<Expr*, 8> Args; 9986 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9987 Args)) 9988 return ExprError(); 9989 9990 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 9991 E->getEndLoc()); 9992 } 9993 9994 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9995 case OO_##Name: 9996 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9997 #include "clang/Basic/OperatorKinds.def" 9998 case OO_Subscript: 9999 // Handled below. 10000 break; 10001 10002 case OO_Conditional: 10003 llvm_unreachable("conditional operator is not actually overloadable"); 10004 10005 case OO_None: 10006 case NUM_OVERLOADED_OPERATORS: 10007 llvm_unreachable("not an overloaded operator?"); 10008 } 10009 10010 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10011 if (Callee.isInvalid()) 10012 return ExprError(); 10013 10014 ExprResult First; 10015 if (E->getOperator() == OO_Amp) 10016 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 10017 else 10018 First = getDerived().TransformExpr(E->getArg(0)); 10019 if (First.isInvalid()) 10020 return ExprError(); 10021 10022 ExprResult Second; 10023 if (E->getNumArgs() == 2) { 10024 Second = getDerived().TransformExpr(E->getArg(1)); 10025 if (Second.isInvalid()) 10026 return ExprError(); 10027 } 10028 10029 if (!getDerived().AlwaysRebuild() && 10030 Callee.get() == E->getCallee() && 10031 First.get() == E->getArg(0) && 10032 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 10033 return SemaRef.MaybeBindToTemporary(E); 10034 10035 Sema::FPContractStateRAII FPContractState(getSema()); 10036 getSema().FPFeatures = E->getFPFeatures(); 10037 10038 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 10039 E->getOperatorLoc(), 10040 Callee.get(), 10041 First.get(), 10042 Second.get()); 10043 } 10044 10045 template<typename Derived> 10046 ExprResult 10047 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 10048 return getDerived().TransformCallExpr(E); 10049 } 10050 10051 template<typename Derived> 10052 ExprResult 10053 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 10054 // Transform the callee. 10055 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10056 if (Callee.isInvalid()) 10057 return ExprError(); 10058 10059 // Transform exec config. 10060 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 10061 if (EC.isInvalid()) 10062 return ExprError(); 10063 10064 // Transform arguments. 10065 bool ArgChanged = false; 10066 SmallVector<Expr*, 8> Args; 10067 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10068 &ArgChanged)) 10069 return ExprError(); 10070 10071 if (!getDerived().AlwaysRebuild() && 10072 Callee.get() == E->getCallee() && 10073 !ArgChanged) 10074 return SemaRef.MaybeBindToTemporary(E); 10075 10076 // FIXME: Wrong source location information for the '('. 10077 SourceLocation FakeLParenLoc 10078 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10079 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10080 Args, 10081 E->getRParenLoc(), EC.get()); 10082 } 10083 10084 template<typename Derived> 10085 ExprResult 10086 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 10087 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10088 if (!Type) 10089 return ExprError(); 10090 10091 ExprResult SubExpr 10092 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10093 if (SubExpr.isInvalid()) 10094 return ExprError(); 10095 10096 if (!getDerived().AlwaysRebuild() && 10097 Type == E->getTypeInfoAsWritten() && 10098 SubExpr.get() == E->getSubExpr()) 10099 return E; 10100 return getDerived().RebuildCXXNamedCastExpr( 10101 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 10102 Type, E->getAngleBrackets().getEnd(), 10103 // FIXME. this should be '(' location 10104 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10105 } 10106 10107 template<typename Derived> 10108 ExprResult 10109 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10110 return getDerived().TransformCXXNamedCastExpr(E); 10111 } 10112 10113 template<typename Derived> 10114 ExprResult 10115 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10116 return getDerived().TransformCXXNamedCastExpr(E); 10117 } 10118 10119 template<typename Derived> 10120 ExprResult 10121 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10122 CXXReinterpretCastExpr *E) { 10123 return getDerived().TransformCXXNamedCastExpr(E); 10124 } 10125 10126 template<typename Derived> 10127 ExprResult 10128 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10129 return getDerived().TransformCXXNamedCastExpr(E); 10130 } 10131 10132 template<typename Derived> 10133 ExprResult 10134 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10135 CXXFunctionalCastExpr *E) { 10136 TypeSourceInfo *Type = 10137 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10138 if (!Type) 10139 return ExprError(); 10140 10141 ExprResult SubExpr 10142 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10143 if (SubExpr.isInvalid()) 10144 return ExprError(); 10145 10146 if (!getDerived().AlwaysRebuild() && 10147 Type == E->getTypeInfoAsWritten() && 10148 SubExpr.get() == E->getSubExpr()) 10149 return E; 10150 10151 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10152 E->getLParenLoc(), 10153 SubExpr.get(), 10154 E->getRParenLoc(), 10155 E->isListInitialization()); 10156 } 10157 10158 template<typename Derived> 10159 ExprResult 10160 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10161 if (E->isTypeOperand()) { 10162 TypeSourceInfo *TInfo 10163 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10164 if (!TInfo) 10165 return ExprError(); 10166 10167 if (!getDerived().AlwaysRebuild() && 10168 TInfo == E->getTypeOperandSourceInfo()) 10169 return E; 10170 10171 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10172 TInfo, E->getEndLoc()); 10173 } 10174 10175 // We don't know whether the subexpression is potentially evaluated until 10176 // after we perform semantic analysis. We speculatively assume it is 10177 // unevaluated; it will get fixed later if the subexpression is in fact 10178 // potentially evaluated. 10179 EnterExpressionEvaluationContext Unevaluated( 10180 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10181 Sema::ReuseLambdaContextDecl); 10182 10183 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10184 if (SubExpr.isInvalid()) 10185 return ExprError(); 10186 10187 if (!getDerived().AlwaysRebuild() && 10188 SubExpr.get() == E->getExprOperand()) 10189 return E; 10190 10191 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10192 SubExpr.get(), E->getEndLoc()); 10193 } 10194 10195 template<typename Derived> 10196 ExprResult 10197 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10198 if (E->isTypeOperand()) { 10199 TypeSourceInfo *TInfo 10200 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10201 if (!TInfo) 10202 return ExprError(); 10203 10204 if (!getDerived().AlwaysRebuild() && 10205 TInfo == E->getTypeOperandSourceInfo()) 10206 return E; 10207 10208 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10209 TInfo, E->getEndLoc()); 10210 } 10211 10212 EnterExpressionEvaluationContext Unevaluated( 10213 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10214 10215 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10216 if (SubExpr.isInvalid()) 10217 return ExprError(); 10218 10219 if (!getDerived().AlwaysRebuild() && 10220 SubExpr.get() == E->getExprOperand()) 10221 return E; 10222 10223 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10224 SubExpr.get(), E->getEndLoc()); 10225 } 10226 10227 template<typename Derived> 10228 ExprResult 10229 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10230 return E; 10231 } 10232 10233 template<typename Derived> 10234 ExprResult 10235 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10236 CXXNullPtrLiteralExpr *E) { 10237 return E; 10238 } 10239 10240 template<typename Derived> 10241 ExprResult 10242 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10243 QualType T = getSema().getCurrentThisType(); 10244 10245 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10246 // Make sure that we capture 'this'. 10247 getSema().CheckCXXThisCapture(E->getBeginLoc()); 10248 return E; 10249 } 10250 10251 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10252 } 10253 10254 template<typename Derived> 10255 ExprResult 10256 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10257 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10258 if (SubExpr.isInvalid()) 10259 return ExprError(); 10260 10261 if (!getDerived().AlwaysRebuild() && 10262 SubExpr.get() == E->getSubExpr()) 10263 return E; 10264 10265 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10266 E->isThrownVariableInScope()); 10267 } 10268 10269 template<typename Derived> 10270 ExprResult 10271 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10272 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10273 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10274 if (!Param) 10275 return ExprError(); 10276 10277 if (!getDerived().AlwaysRebuild() && 10278 Param == E->getParam()) 10279 return E; 10280 10281 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10282 } 10283 10284 template<typename Derived> 10285 ExprResult 10286 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10287 FieldDecl *Field = cast_or_null<FieldDecl>( 10288 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10289 if (!Field) 10290 return ExprError(); 10291 10292 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10293 return E; 10294 10295 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10296 } 10297 10298 template<typename Derived> 10299 ExprResult 10300 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10301 CXXScalarValueInitExpr *E) { 10302 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10303 if (!T) 10304 return ExprError(); 10305 10306 if (!getDerived().AlwaysRebuild() && 10307 T == E->getTypeSourceInfo()) 10308 return E; 10309 10310 return getDerived().RebuildCXXScalarValueInitExpr(T, 10311 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10312 E->getRParenLoc()); 10313 } 10314 10315 template<typename Derived> 10316 ExprResult 10317 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10318 // Transform the type that we're allocating 10319 TypeSourceInfo *AllocTypeInfo = 10320 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10321 if (!AllocTypeInfo) 10322 return ExprError(); 10323 10324 // Transform the size of the array we're allocating (if any). 10325 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10326 if (ArraySize.isInvalid()) 10327 return ExprError(); 10328 10329 // Transform the placement arguments (if any). 10330 bool ArgumentChanged = false; 10331 SmallVector<Expr*, 8> PlacementArgs; 10332 if (getDerived().TransformExprs(E->getPlacementArgs(), 10333 E->getNumPlacementArgs(), true, 10334 PlacementArgs, &ArgumentChanged)) 10335 return ExprError(); 10336 10337 // Transform the initializer (if any). 10338 Expr *OldInit = E->getInitializer(); 10339 ExprResult NewInit; 10340 if (OldInit) 10341 NewInit = getDerived().TransformInitializer(OldInit, true); 10342 if (NewInit.isInvalid()) 10343 return ExprError(); 10344 10345 // Transform new operator and delete operator. 10346 FunctionDecl *OperatorNew = nullptr; 10347 if (E->getOperatorNew()) { 10348 OperatorNew = cast_or_null<FunctionDecl>( 10349 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10350 if (!OperatorNew) 10351 return ExprError(); 10352 } 10353 10354 FunctionDecl *OperatorDelete = nullptr; 10355 if (E->getOperatorDelete()) { 10356 OperatorDelete = cast_or_null<FunctionDecl>( 10357 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10358 if (!OperatorDelete) 10359 return ExprError(); 10360 } 10361 10362 if (!getDerived().AlwaysRebuild() && 10363 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10364 ArraySize.get() == E->getArraySize() && 10365 NewInit.get() == OldInit && 10366 OperatorNew == E->getOperatorNew() && 10367 OperatorDelete == E->getOperatorDelete() && 10368 !ArgumentChanged) { 10369 // Mark any declarations we need as referenced. 10370 // FIXME: instantiation-specific. 10371 if (OperatorNew) 10372 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10373 if (OperatorDelete) 10374 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10375 10376 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10377 QualType ElementType 10378 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10379 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10380 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10381 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10382 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10383 } 10384 } 10385 } 10386 10387 return E; 10388 } 10389 10390 QualType AllocType = AllocTypeInfo->getType(); 10391 if (!ArraySize.get()) { 10392 // If no array size was specified, but the new expression was 10393 // instantiated with an array type (e.g., "new T" where T is 10394 // instantiated with "int[4]"), extract the outer bound from the 10395 // array type as our array size. We do this with constant and 10396 // dependently-sized array types. 10397 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10398 if (!ArrayT) { 10399 // Do nothing 10400 } else if (const ConstantArrayType *ConsArrayT 10401 = dyn_cast<ConstantArrayType>(ArrayT)) { 10402 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10403 SemaRef.Context.getSizeType(), 10404 /*FIXME:*/ E->getBeginLoc()); 10405 AllocType = ConsArrayT->getElementType(); 10406 } else if (const DependentSizedArrayType *DepArrayT 10407 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10408 if (DepArrayT->getSizeExpr()) { 10409 ArraySize = DepArrayT->getSizeExpr(); 10410 AllocType = DepArrayT->getElementType(); 10411 } 10412 } 10413 } 10414 10415 return getDerived().RebuildCXXNewExpr( 10416 E->getBeginLoc(), E->isGlobalNew(), 10417 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10418 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10419 AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get()); 10420 } 10421 10422 template<typename Derived> 10423 ExprResult 10424 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10425 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10426 if (Operand.isInvalid()) 10427 return ExprError(); 10428 10429 // Transform the delete operator, if known. 10430 FunctionDecl *OperatorDelete = nullptr; 10431 if (E->getOperatorDelete()) { 10432 OperatorDelete = cast_or_null<FunctionDecl>( 10433 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10434 if (!OperatorDelete) 10435 return ExprError(); 10436 } 10437 10438 if (!getDerived().AlwaysRebuild() && 10439 Operand.get() == E->getArgument() && 10440 OperatorDelete == E->getOperatorDelete()) { 10441 // Mark any declarations we need as referenced. 10442 // FIXME: instantiation-specific. 10443 if (OperatorDelete) 10444 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10445 10446 if (!E->getArgument()->isTypeDependent()) { 10447 QualType Destroyed = SemaRef.Context.getBaseElementType( 10448 E->getDestroyedType()); 10449 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10450 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10451 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10452 SemaRef.LookupDestructor(Record)); 10453 } 10454 } 10455 10456 return E; 10457 } 10458 10459 return getDerived().RebuildCXXDeleteExpr( 10460 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10461 } 10462 10463 template<typename Derived> 10464 ExprResult 10465 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10466 CXXPseudoDestructorExpr *E) { 10467 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10468 if (Base.isInvalid()) 10469 return ExprError(); 10470 10471 ParsedType ObjectTypePtr; 10472 bool MayBePseudoDestructor = false; 10473 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10474 E->getOperatorLoc(), 10475 E->isArrow()? tok::arrow : tok::period, 10476 ObjectTypePtr, 10477 MayBePseudoDestructor); 10478 if (Base.isInvalid()) 10479 return ExprError(); 10480 10481 QualType ObjectType = ObjectTypePtr.get(); 10482 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10483 if (QualifierLoc) { 10484 QualifierLoc 10485 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10486 if (!QualifierLoc) 10487 return ExprError(); 10488 } 10489 CXXScopeSpec SS; 10490 SS.Adopt(QualifierLoc); 10491 10492 PseudoDestructorTypeStorage Destroyed; 10493 if (E->getDestroyedTypeInfo()) { 10494 TypeSourceInfo *DestroyedTypeInfo 10495 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10496 ObjectType, nullptr, SS); 10497 if (!DestroyedTypeInfo) 10498 return ExprError(); 10499 Destroyed = DestroyedTypeInfo; 10500 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10501 // We aren't likely to be able to resolve the identifier down to a type 10502 // now anyway, so just retain the identifier. 10503 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10504 E->getDestroyedTypeLoc()); 10505 } else { 10506 // Look for a destructor known with the given name. 10507 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10508 *E->getDestroyedTypeIdentifier(), 10509 E->getDestroyedTypeLoc(), 10510 /*Scope=*/nullptr, 10511 SS, ObjectTypePtr, 10512 false); 10513 if (!T) 10514 return ExprError(); 10515 10516 Destroyed 10517 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10518 E->getDestroyedTypeLoc()); 10519 } 10520 10521 TypeSourceInfo *ScopeTypeInfo = nullptr; 10522 if (E->getScopeTypeInfo()) { 10523 CXXScopeSpec EmptySS; 10524 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10525 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10526 if (!ScopeTypeInfo) 10527 return ExprError(); 10528 } 10529 10530 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10531 E->getOperatorLoc(), 10532 E->isArrow(), 10533 SS, 10534 ScopeTypeInfo, 10535 E->getColonColonLoc(), 10536 E->getTildeLoc(), 10537 Destroyed); 10538 } 10539 10540 template <typename Derived> 10541 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10542 bool RequiresADL, 10543 LookupResult &R) { 10544 // Transform all the decls. 10545 bool AllEmptyPacks = true; 10546 for (auto *OldD : Old->decls()) { 10547 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10548 if (!InstD) { 10549 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10550 // This can happen because of dependent hiding. 10551 if (isa<UsingShadowDecl>(OldD)) 10552 continue; 10553 else { 10554 R.clear(); 10555 return true; 10556 } 10557 } 10558 10559 // Expand using pack declarations. 10560 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10561 ArrayRef<NamedDecl*> Decls = SingleDecl; 10562 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10563 Decls = UPD->expansions(); 10564 10565 // Expand using declarations. 10566 for (auto *D : Decls) { 10567 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10568 for (auto *SD : UD->shadows()) 10569 R.addDecl(SD); 10570 } else { 10571 R.addDecl(D); 10572 } 10573 } 10574 10575 AllEmptyPacks &= Decls.empty(); 10576 }; 10577 10578 // C++ [temp.res]/8.4.2: 10579 // The program is ill-formed, no diagnostic required, if [...] lookup for 10580 // a name in the template definition found a using-declaration, but the 10581 // lookup in the corresponding scope in the instantiation odoes not find 10582 // any declarations because the using-declaration was a pack expansion and 10583 // the corresponding pack is empty 10584 if (AllEmptyPacks && !RequiresADL) { 10585 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10586 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10587 return true; 10588 } 10589 10590 // Resolve a kind, but don't do any further analysis. If it's 10591 // ambiguous, the callee needs to deal with it. 10592 R.resolveKind(); 10593 return false; 10594 } 10595 10596 template<typename Derived> 10597 ExprResult 10598 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10599 UnresolvedLookupExpr *Old) { 10600 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10601 Sema::LookupOrdinaryName); 10602 10603 // Transform the declaration set. 10604 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10605 return ExprError(); 10606 10607 // Rebuild the nested-name qualifier, if present. 10608 CXXScopeSpec SS; 10609 if (Old->getQualifierLoc()) { 10610 NestedNameSpecifierLoc QualifierLoc 10611 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10612 if (!QualifierLoc) 10613 return ExprError(); 10614 10615 SS.Adopt(QualifierLoc); 10616 } 10617 10618 if (Old->getNamingClass()) { 10619 CXXRecordDecl *NamingClass 10620 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10621 Old->getNameLoc(), 10622 Old->getNamingClass())); 10623 if (!NamingClass) { 10624 R.clear(); 10625 return ExprError(); 10626 } 10627 10628 R.setNamingClass(NamingClass); 10629 } 10630 10631 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10632 10633 // If we have neither explicit template arguments, nor the template keyword, 10634 // it's a normal declaration name or member reference. 10635 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10636 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10637 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10638 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10639 // give a good diagnostic. 10640 if (D && D->isCXXInstanceMember()) { 10641 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10642 /*TemplateArgs=*/nullptr, 10643 /*Scope=*/nullptr); 10644 } 10645 10646 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10647 } 10648 10649 // If we have template arguments, rebuild them, then rebuild the 10650 // templateid expression. 10651 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10652 if (Old->hasExplicitTemplateArgs() && 10653 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10654 Old->getNumTemplateArgs(), 10655 TransArgs)) { 10656 R.clear(); 10657 return ExprError(); 10658 } 10659 10660 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10661 Old->requiresADL(), &TransArgs); 10662 } 10663 10664 template<typename Derived> 10665 ExprResult 10666 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10667 bool ArgChanged = false; 10668 SmallVector<TypeSourceInfo *, 4> Args; 10669 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10670 TypeSourceInfo *From = E->getArg(I); 10671 TypeLoc FromTL = From->getTypeLoc(); 10672 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10673 TypeLocBuilder TLB; 10674 TLB.reserve(FromTL.getFullDataSize()); 10675 QualType To = getDerived().TransformType(TLB, FromTL); 10676 if (To.isNull()) 10677 return ExprError(); 10678 10679 if (To == From->getType()) 10680 Args.push_back(From); 10681 else { 10682 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10683 ArgChanged = true; 10684 } 10685 continue; 10686 } 10687 10688 ArgChanged = true; 10689 10690 // We have a pack expansion. Instantiate it. 10691 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10692 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10693 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10694 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10695 10696 // Determine whether the set of unexpanded parameter packs can and should 10697 // be expanded. 10698 bool Expand = true; 10699 bool RetainExpansion = false; 10700 Optional<unsigned> OrigNumExpansions = 10701 ExpansionTL.getTypePtr()->getNumExpansions(); 10702 Optional<unsigned> NumExpansions = OrigNumExpansions; 10703 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10704 PatternTL.getSourceRange(), 10705 Unexpanded, 10706 Expand, RetainExpansion, 10707 NumExpansions)) 10708 return ExprError(); 10709 10710 if (!Expand) { 10711 // The transform has determined that we should perform a simple 10712 // transformation on the pack expansion, producing another pack 10713 // expansion. 10714 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10715 10716 TypeLocBuilder TLB; 10717 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10718 10719 QualType To = getDerived().TransformType(TLB, PatternTL); 10720 if (To.isNull()) 10721 return ExprError(); 10722 10723 To = getDerived().RebuildPackExpansionType(To, 10724 PatternTL.getSourceRange(), 10725 ExpansionTL.getEllipsisLoc(), 10726 NumExpansions); 10727 if (To.isNull()) 10728 return ExprError(); 10729 10730 PackExpansionTypeLoc ToExpansionTL 10731 = TLB.push<PackExpansionTypeLoc>(To); 10732 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10733 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10734 continue; 10735 } 10736 10737 // Expand the pack expansion by substituting for each argument in the 10738 // pack(s). 10739 for (unsigned I = 0; I != *NumExpansions; ++I) { 10740 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10741 TypeLocBuilder TLB; 10742 TLB.reserve(PatternTL.getFullDataSize()); 10743 QualType To = getDerived().TransformType(TLB, PatternTL); 10744 if (To.isNull()) 10745 return ExprError(); 10746 10747 if (To->containsUnexpandedParameterPack()) { 10748 To = getDerived().RebuildPackExpansionType(To, 10749 PatternTL.getSourceRange(), 10750 ExpansionTL.getEllipsisLoc(), 10751 NumExpansions); 10752 if (To.isNull()) 10753 return ExprError(); 10754 10755 PackExpansionTypeLoc ToExpansionTL 10756 = TLB.push<PackExpansionTypeLoc>(To); 10757 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10758 } 10759 10760 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10761 } 10762 10763 if (!RetainExpansion) 10764 continue; 10765 10766 // If we're supposed to retain a pack expansion, do so by temporarily 10767 // forgetting the partially-substituted parameter pack. 10768 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10769 10770 TypeLocBuilder TLB; 10771 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10772 10773 QualType To = getDerived().TransformType(TLB, PatternTL); 10774 if (To.isNull()) 10775 return ExprError(); 10776 10777 To = getDerived().RebuildPackExpansionType(To, 10778 PatternTL.getSourceRange(), 10779 ExpansionTL.getEllipsisLoc(), 10780 NumExpansions); 10781 if (To.isNull()) 10782 return ExprError(); 10783 10784 PackExpansionTypeLoc ToExpansionTL 10785 = TLB.push<PackExpansionTypeLoc>(To); 10786 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10787 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10788 } 10789 10790 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10791 return E; 10792 10793 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 10794 E->getEndLoc()); 10795 } 10796 10797 template<typename Derived> 10798 ExprResult 10799 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10800 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10801 if (!T) 10802 return ExprError(); 10803 10804 if (!getDerived().AlwaysRebuild() && 10805 T == E->getQueriedTypeSourceInfo()) 10806 return E; 10807 10808 ExprResult SubExpr; 10809 { 10810 EnterExpressionEvaluationContext Unevaluated( 10811 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10812 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10813 if (SubExpr.isInvalid()) 10814 return ExprError(); 10815 10816 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10817 return E; 10818 } 10819 10820 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 10821 SubExpr.get(), E->getEndLoc()); 10822 } 10823 10824 template<typename Derived> 10825 ExprResult 10826 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10827 ExprResult SubExpr; 10828 { 10829 EnterExpressionEvaluationContext Unevaluated( 10830 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10831 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10832 if (SubExpr.isInvalid()) 10833 return ExprError(); 10834 10835 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10836 return E; 10837 } 10838 10839 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 10840 SubExpr.get(), E->getEndLoc()); 10841 } 10842 10843 template <typename Derived> 10844 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10845 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10846 TypeSourceInfo **RecoveryTSI) { 10847 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10848 DRE, AddrTaken, RecoveryTSI); 10849 10850 // Propagate both errors and recovered types, which return ExprEmpty. 10851 if (!NewDRE.isUsable()) 10852 return NewDRE; 10853 10854 // We got an expr, wrap it up in parens. 10855 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10856 return PE; 10857 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10858 PE->getRParen()); 10859 } 10860 10861 template <typename Derived> 10862 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10863 DependentScopeDeclRefExpr *E) { 10864 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10865 nullptr); 10866 } 10867 10868 template<typename Derived> 10869 ExprResult 10870 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10871 DependentScopeDeclRefExpr *E, 10872 bool IsAddressOfOperand, 10873 TypeSourceInfo **RecoveryTSI) { 10874 assert(E->getQualifierLoc()); 10875 NestedNameSpecifierLoc QualifierLoc 10876 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10877 if (!QualifierLoc) 10878 return ExprError(); 10879 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10880 10881 // TODO: If this is a conversion-function-id, verify that the 10882 // destination type name (if present) resolves the same way after 10883 // instantiation as it did in the local scope. 10884 10885 DeclarationNameInfo NameInfo 10886 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10887 if (!NameInfo.getName()) 10888 return ExprError(); 10889 10890 if (!E->hasExplicitTemplateArgs()) { 10891 if (!getDerived().AlwaysRebuild() && 10892 QualifierLoc == E->getQualifierLoc() && 10893 // Note: it is sufficient to compare the Name component of NameInfo: 10894 // if name has not changed, DNLoc has not changed either. 10895 NameInfo.getName() == E->getDeclName()) 10896 return E; 10897 10898 return getDerived().RebuildDependentScopeDeclRefExpr( 10899 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10900 IsAddressOfOperand, RecoveryTSI); 10901 } 10902 10903 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10904 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10905 E->getNumTemplateArgs(), 10906 TransArgs)) 10907 return ExprError(); 10908 10909 return getDerived().RebuildDependentScopeDeclRefExpr( 10910 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10911 RecoveryTSI); 10912 } 10913 10914 template<typename Derived> 10915 ExprResult 10916 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10917 // CXXConstructExprs other than for list-initialization and 10918 // CXXTemporaryObjectExpr are always implicit, so when we have 10919 // a 1-argument construction we just transform that argument. 10920 if ((E->getNumArgs() == 1 || 10921 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10922 (!getDerived().DropCallArgument(E->getArg(0))) && 10923 !E->isListInitialization()) 10924 return getDerived().TransformExpr(E->getArg(0)); 10925 10926 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 10927 10928 QualType T = getDerived().TransformType(E->getType()); 10929 if (T.isNull()) 10930 return ExprError(); 10931 10932 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10933 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10934 if (!Constructor) 10935 return ExprError(); 10936 10937 bool ArgumentChanged = false; 10938 SmallVector<Expr*, 8> Args; 10939 { 10940 EnterExpressionEvaluationContext Context( 10941 getSema(), EnterExpressionEvaluationContext::InitList, 10942 E->isListInitialization()); 10943 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10944 &ArgumentChanged)) 10945 return ExprError(); 10946 } 10947 10948 if (!getDerived().AlwaysRebuild() && 10949 T == E->getType() && 10950 Constructor == E->getConstructor() && 10951 !ArgumentChanged) { 10952 // Mark the constructor as referenced. 10953 // FIXME: Instantiation-specific 10954 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10955 return E; 10956 } 10957 10958 return getDerived().RebuildCXXConstructExpr( 10959 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 10960 E->hadMultipleCandidates(), E->isListInitialization(), 10961 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 10962 E->getConstructionKind(), E->getParenOrBraceRange()); 10963 } 10964 10965 template<typename Derived> 10966 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10967 CXXInheritedCtorInitExpr *E) { 10968 QualType T = getDerived().TransformType(E->getType()); 10969 if (T.isNull()) 10970 return ExprError(); 10971 10972 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10973 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10974 if (!Constructor) 10975 return ExprError(); 10976 10977 if (!getDerived().AlwaysRebuild() && 10978 T == E->getType() && 10979 Constructor == E->getConstructor()) { 10980 // Mark the constructor as referenced. 10981 // FIXME: Instantiation-specific 10982 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10983 return E; 10984 } 10985 10986 return getDerived().RebuildCXXInheritedCtorInitExpr( 10987 T, E->getLocation(), Constructor, 10988 E->constructsVBase(), E->inheritedFromVBase()); 10989 } 10990 10991 /// Transform a C++ temporary-binding expression. 10992 /// 10993 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10994 /// transform the subexpression and return that. 10995 template<typename Derived> 10996 ExprResult 10997 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10998 return getDerived().TransformExpr(E->getSubExpr()); 10999 } 11000 11001 /// Transform a C++ expression that contains cleanups that should 11002 /// be run after the expression is evaluated. 11003 /// 11004 /// Since ExprWithCleanups nodes are implicitly generated, we 11005 /// just transform the subexpression and return that. 11006 template<typename Derived> 11007 ExprResult 11008 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 11009 return getDerived().TransformExpr(E->getSubExpr()); 11010 } 11011 11012 template<typename Derived> 11013 ExprResult 11014 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 11015 CXXTemporaryObjectExpr *E) { 11016 TypeSourceInfo *T = 11017 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11018 if (!T) 11019 return ExprError(); 11020 11021 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11022 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11023 if (!Constructor) 11024 return ExprError(); 11025 11026 bool ArgumentChanged = false; 11027 SmallVector<Expr*, 8> Args; 11028 Args.reserve(E->getNumArgs()); 11029 { 11030 EnterExpressionEvaluationContext Context( 11031 getSema(), EnterExpressionEvaluationContext::InitList, 11032 E->isListInitialization()); 11033 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11034 &ArgumentChanged)) 11035 return ExprError(); 11036 } 11037 11038 if (!getDerived().AlwaysRebuild() && 11039 T == E->getTypeSourceInfo() && 11040 Constructor == E->getConstructor() && 11041 !ArgumentChanged) { 11042 // FIXME: Instantiation-specific 11043 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11044 return SemaRef.MaybeBindToTemporary(E); 11045 } 11046 11047 // FIXME: We should just pass E->isListInitialization(), but we're not 11048 // prepared to handle list-initialization without a child InitListExpr. 11049 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 11050 return getDerived().RebuildCXXTemporaryObjectExpr( 11051 T, LParenLoc, Args, E->getEndLoc(), 11052 /*ListInitialization=*/LParenLoc.isInvalid()); 11053 } 11054 11055 template<typename Derived> 11056 ExprResult 11057 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 11058 // Transform any init-capture expressions before entering the scope of the 11059 // lambda body, because they are not semantically within that scope. 11060 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 11061 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 11062 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 11063 E->explicit_capture_begin()); 11064 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11065 CEnd = E->capture_end(); 11066 C != CEnd; ++C) { 11067 if (!E->isInitCapture(C)) 11068 continue; 11069 EnterExpressionEvaluationContext EEEC( 11070 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11071 ExprResult NewExprInitResult = getDerived().TransformInitializer( 11072 C->getCapturedVar()->getInit(), 11073 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 11074 11075 if (NewExprInitResult.isInvalid()) 11076 return ExprError(); 11077 Expr *NewExprInit = NewExprInitResult.get(); 11078 11079 VarDecl *OldVD = C->getCapturedVar(); 11080 QualType NewInitCaptureType = 11081 getSema().buildLambdaInitCaptureInitialization( 11082 C->getLocation(), OldVD->getType()->isReferenceType(), 11083 OldVD->getIdentifier(), 11084 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 11085 NewExprInitResult = NewExprInit; 11086 InitCaptureExprsAndTypes[C - E->capture_begin()] = 11087 std::make_pair(NewExprInitResult, NewInitCaptureType); 11088 } 11089 11090 // Transform the template parameters, and add them to the current 11091 // instantiation scope. The null case is handled correctly. 11092 auto TPL = getDerived().TransformTemplateParameterList( 11093 E->getTemplateParameterList()); 11094 11095 // Transform the type of the original lambda's call operator. 11096 // The transformation MUST be done in the CurrentInstantiationScope since 11097 // it introduces a mapping of the original to the newly created 11098 // transformed parameters. 11099 TypeSourceInfo *NewCallOpTSI = nullptr; 11100 { 11101 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 11102 FunctionProtoTypeLoc OldCallOpFPTL = 11103 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 11104 11105 TypeLocBuilder NewCallOpTLBuilder; 11106 SmallVector<QualType, 4> ExceptionStorage; 11107 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 11108 QualType NewCallOpType = TransformFunctionProtoType( 11109 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 11110 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 11111 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 11112 ExceptionStorage, Changed); 11113 }); 11114 if (NewCallOpType.isNull()) 11115 return ExprError(); 11116 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 11117 NewCallOpType); 11118 } 11119 11120 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 11121 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 11122 LSI->GLTemplateParameterList = TPL; 11123 11124 // Create the local class that will describe the lambda. 11125 CXXRecordDecl *Class 11126 = getSema().createLambdaClosureType(E->getIntroducerRange(), 11127 NewCallOpTSI, 11128 /*KnownDependent=*/false, 11129 E->getCaptureDefault()); 11130 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 11131 11132 // Build the call operator. 11133 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 11134 Class, E->getIntroducerRange(), NewCallOpTSI, 11135 E->getCallOperator()->getEndLoc(), 11136 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 11137 E->getCallOperator()->isConstexpr()); 11138 11139 LSI->CallOperator = NewCallOperator; 11140 11141 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 11142 I != NumParams; ++I) { 11143 auto *P = NewCallOperator->getParamDecl(I); 11144 if (P->hasUninstantiatedDefaultArg()) { 11145 EnterExpressionEvaluationContext Eval( 11146 getSema(), 11147 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 11148 ExprResult R = getDerived().TransformExpr( 11149 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 11150 P->setDefaultArg(R.get()); 11151 } 11152 } 11153 11154 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 11155 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 11156 11157 // Introduce the context of the call operator. 11158 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 11159 /*NewThisContext*/false); 11160 11161 // Enter the scope of the lambda. 11162 getSema().buildLambdaScope(LSI, NewCallOperator, 11163 E->getIntroducerRange(), 11164 E->getCaptureDefault(), 11165 E->getCaptureDefaultLoc(), 11166 E->hasExplicitParameters(), 11167 E->hasExplicitResultType(), 11168 E->isMutable()); 11169 11170 bool Invalid = false; 11171 11172 // Transform captures. 11173 bool FinishedExplicitCaptures = false; 11174 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11175 CEnd = E->capture_end(); 11176 C != CEnd; ++C) { 11177 // When we hit the first implicit capture, tell Sema that we've finished 11178 // the list of explicit captures. 11179 if (!FinishedExplicitCaptures && C->isImplicit()) { 11180 getSema().finishLambdaExplicitCaptures(LSI); 11181 FinishedExplicitCaptures = true; 11182 } 11183 11184 // Capturing 'this' is trivial. 11185 if (C->capturesThis()) { 11186 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11187 /*BuildAndDiagnose*/ true, nullptr, 11188 C->getCaptureKind() == LCK_StarThis); 11189 continue; 11190 } 11191 // Captured expression will be recaptured during captured variables 11192 // rebuilding. 11193 if (C->capturesVLAType()) 11194 continue; 11195 11196 // Rebuild init-captures, including the implied field declaration. 11197 if (E->isInitCapture(C)) { 11198 InitCaptureInfoTy InitExprTypePair = 11199 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11200 ExprResult Init = InitExprTypePair.first; 11201 QualType InitQualType = InitExprTypePair.second; 11202 if (Init.isInvalid() || InitQualType.isNull()) { 11203 Invalid = true; 11204 continue; 11205 } 11206 VarDecl *OldVD = C->getCapturedVar(); 11207 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11208 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11209 OldVD->getInitStyle(), Init.get()); 11210 if (!NewVD) 11211 Invalid = true; 11212 else { 11213 getDerived().transformedLocalDecl(OldVD, NewVD); 11214 } 11215 getSema().buildInitCaptureField(LSI, NewVD); 11216 continue; 11217 } 11218 11219 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11220 11221 // Determine the capture kind for Sema. 11222 Sema::TryCaptureKind Kind 11223 = C->isImplicit()? Sema::TryCapture_Implicit 11224 : C->getCaptureKind() == LCK_ByCopy 11225 ? Sema::TryCapture_ExplicitByVal 11226 : Sema::TryCapture_ExplicitByRef; 11227 SourceLocation EllipsisLoc; 11228 if (C->isPackExpansion()) { 11229 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11230 bool ShouldExpand = false; 11231 bool RetainExpansion = false; 11232 Optional<unsigned> NumExpansions; 11233 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11234 C->getLocation(), 11235 Unexpanded, 11236 ShouldExpand, RetainExpansion, 11237 NumExpansions)) { 11238 Invalid = true; 11239 continue; 11240 } 11241 11242 if (ShouldExpand) { 11243 // The transform has determined that we should perform an expansion; 11244 // transform and capture each of the arguments. 11245 // expansion of the pattern. Do so. 11246 VarDecl *Pack = C->getCapturedVar(); 11247 for (unsigned I = 0; I != *NumExpansions; ++I) { 11248 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11249 VarDecl *CapturedVar 11250 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11251 Pack)); 11252 if (!CapturedVar) { 11253 Invalid = true; 11254 continue; 11255 } 11256 11257 // Capture the transformed variable. 11258 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11259 } 11260 11261 // FIXME: Retain a pack expansion if RetainExpansion is true. 11262 11263 continue; 11264 } 11265 11266 EllipsisLoc = C->getEllipsisLoc(); 11267 } 11268 11269 // Transform the captured variable. 11270 VarDecl *CapturedVar 11271 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11272 C->getCapturedVar())); 11273 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11274 Invalid = true; 11275 continue; 11276 } 11277 11278 // Capture the transformed variable. 11279 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11280 EllipsisLoc); 11281 } 11282 if (!FinishedExplicitCaptures) 11283 getSema().finishLambdaExplicitCaptures(LSI); 11284 11285 // Enter a new evaluation context to insulate the lambda from any 11286 // cleanups from the enclosing full-expression. 11287 getSema().PushExpressionEvaluationContext( 11288 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11289 11290 // Instantiate the body of the lambda expression. 11291 StmtResult Body = 11292 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11293 11294 // ActOnLambda* will pop the function scope for us. 11295 FuncScopeCleanup.disable(); 11296 11297 if (Body.isInvalid()) { 11298 SavedContext.pop(); 11299 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 11300 /*IsInstantiation=*/true); 11301 return ExprError(); 11302 } 11303 11304 // Copy the LSI before ActOnFinishFunctionBody removes it. 11305 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11306 // the call operator. 11307 auto LSICopy = *LSI; 11308 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11309 /*IsInstantiation*/ true); 11310 SavedContext.pop(); 11311 11312 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 11313 &LSICopy); 11314 } 11315 11316 template<typename Derived> 11317 ExprResult 11318 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11319 CXXUnresolvedConstructExpr *E) { 11320 TypeSourceInfo *T = 11321 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11322 if (!T) 11323 return ExprError(); 11324 11325 bool ArgumentChanged = false; 11326 SmallVector<Expr*, 8> Args; 11327 Args.reserve(E->arg_size()); 11328 { 11329 EnterExpressionEvaluationContext Context( 11330 getSema(), EnterExpressionEvaluationContext::InitList, 11331 E->isListInitialization()); 11332 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11333 &ArgumentChanged)) 11334 return ExprError(); 11335 } 11336 11337 if (!getDerived().AlwaysRebuild() && 11338 T == E->getTypeSourceInfo() && 11339 !ArgumentChanged) 11340 return E; 11341 11342 // FIXME: we're faking the locations of the commas 11343 return getDerived().RebuildCXXUnresolvedConstructExpr( 11344 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11345 } 11346 11347 template<typename Derived> 11348 ExprResult 11349 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11350 CXXDependentScopeMemberExpr *E) { 11351 // Transform the base of the expression. 11352 ExprResult Base((Expr*) nullptr); 11353 Expr *OldBase; 11354 QualType BaseType; 11355 QualType ObjectType; 11356 if (!E->isImplicitAccess()) { 11357 OldBase = E->getBase(); 11358 Base = getDerived().TransformExpr(OldBase); 11359 if (Base.isInvalid()) 11360 return ExprError(); 11361 11362 // Start the member reference and compute the object's type. 11363 ParsedType ObjectTy; 11364 bool MayBePseudoDestructor = false; 11365 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11366 E->getOperatorLoc(), 11367 E->isArrow()? tok::arrow : tok::period, 11368 ObjectTy, 11369 MayBePseudoDestructor); 11370 if (Base.isInvalid()) 11371 return ExprError(); 11372 11373 ObjectType = ObjectTy.get(); 11374 BaseType = ((Expr*) Base.get())->getType(); 11375 } else { 11376 OldBase = nullptr; 11377 BaseType = getDerived().TransformType(E->getBaseType()); 11378 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11379 } 11380 11381 // Transform the first part of the nested-name-specifier that qualifies 11382 // the member name. 11383 NamedDecl *FirstQualifierInScope 11384 = getDerived().TransformFirstQualifierInScope( 11385 E->getFirstQualifierFoundInScope(), 11386 E->getQualifierLoc().getBeginLoc()); 11387 11388 NestedNameSpecifierLoc QualifierLoc; 11389 if (E->getQualifier()) { 11390 QualifierLoc 11391 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11392 ObjectType, 11393 FirstQualifierInScope); 11394 if (!QualifierLoc) 11395 return ExprError(); 11396 } 11397 11398 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11399 11400 // TODO: If this is a conversion-function-id, verify that the 11401 // destination type name (if present) resolves the same way after 11402 // instantiation as it did in the local scope. 11403 11404 DeclarationNameInfo NameInfo 11405 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11406 if (!NameInfo.getName()) 11407 return ExprError(); 11408 11409 if (!E->hasExplicitTemplateArgs()) { 11410 // This is a reference to a member without an explicitly-specified 11411 // template argument list. Optimize for this common case. 11412 if (!getDerived().AlwaysRebuild() && 11413 Base.get() == OldBase && 11414 BaseType == E->getBaseType() && 11415 QualifierLoc == E->getQualifierLoc() && 11416 NameInfo.getName() == E->getMember() && 11417 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11418 return E; 11419 11420 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11421 BaseType, 11422 E->isArrow(), 11423 E->getOperatorLoc(), 11424 QualifierLoc, 11425 TemplateKWLoc, 11426 FirstQualifierInScope, 11427 NameInfo, 11428 /*TemplateArgs*/nullptr); 11429 } 11430 11431 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11432 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11433 E->getNumTemplateArgs(), 11434 TransArgs)) 11435 return ExprError(); 11436 11437 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11438 BaseType, 11439 E->isArrow(), 11440 E->getOperatorLoc(), 11441 QualifierLoc, 11442 TemplateKWLoc, 11443 FirstQualifierInScope, 11444 NameInfo, 11445 &TransArgs); 11446 } 11447 11448 template<typename Derived> 11449 ExprResult 11450 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11451 // Transform the base of the expression. 11452 ExprResult Base((Expr*) nullptr); 11453 QualType BaseType; 11454 if (!Old->isImplicitAccess()) { 11455 Base = getDerived().TransformExpr(Old->getBase()); 11456 if (Base.isInvalid()) 11457 return ExprError(); 11458 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11459 Old->isArrow()); 11460 if (Base.isInvalid()) 11461 return ExprError(); 11462 BaseType = Base.get()->getType(); 11463 } else { 11464 BaseType = getDerived().TransformType(Old->getBaseType()); 11465 } 11466 11467 NestedNameSpecifierLoc QualifierLoc; 11468 if (Old->getQualifierLoc()) { 11469 QualifierLoc 11470 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11471 if (!QualifierLoc) 11472 return ExprError(); 11473 } 11474 11475 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11476 11477 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11478 Sema::LookupOrdinaryName); 11479 11480 // Transform the declaration set. 11481 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11482 return ExprError(); 11483 11484 // Determine the naming class. 11485 if (Old->getNamingClass()) { 11486 CXXRecordDecl *NamingClass 11487 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11488 Old->getMemberLoc(), 11489 Old->getNamingClass())); 11490 if (!NamingClass) 11491 return ExprError(); 11492 11493 R.setNamingClass(NamingClass); 11494 } 11495 11496 TemplateArgumentListInfo TransArgs; 11497 if (Old->hasExplicitTemplateArgs()) { 11498 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11499 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11500 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11501 Old->getNumTemplateArgs(), 11502 TransArgs)) 11503 return ExprError(); 11504 } 11505 11506 // FIXME: to do this check properly, we will need to preserve the 11507 // first-qualifier-in-scope here, just in case we had a dependent 11508 // base (and therefore couldn't do the check) and a 11509 // nested-name-qualifier (and therefore could do the lookup). 11510 NamedDecl *FirstQualifierInScope = nullptr; 11511 11512 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11513 BaseType, 11514 Old->getOperatorLoc(), 11515 Old->isArrow(), 11516 QualifierLoc, 11517 TemplateKWLoc, 11518 FirstQualifierInScope, 11519 R, 11520 (Old->hasExplicitTemplateArgs() 11521 ? &TransArgs : nullptr)); 11522 } 11523 11524 template<typename Derived> 11525 ExprResult 11526 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11527 EnterExpressionEvaluationContext Unevaluated( 11528 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11529 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11530 if (SubExpr.isInvalid()) 11531 return ExprError(); 11532 11533 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11534 return E; 11535 11536 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11537 } 11538 11539 template<typename Derived> 11540 ExprResult 11541 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11542 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11543 if (Pattern.isInvalid()) 11544 return ExprError(); 11545 11546 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11547 return E; 11548 11549 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11550 E->getNumExpansions()); 11551 } 11552 11553 template<typename Derived> 11554 ExprResult 11555 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11556 // If E is not value-dependent, then nothing will change when we transform it. 11557 // Note: This is an instantiation-centric view. 11558 if (!E->isValueDependent()) 11559 return E; 11560 11561 EnterExpressionEvaluationContext Unevaluated( 11562 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11563 11564 ArrayRef<TemplateArgument> PackArgs; 11565 TemplateArgument ArgStorage; 11566 11567 // Find the argument list to transform. 11568 if (E->isPartiallySubstituted()) { 11569 PackArgs = E->getPartialArguments(); 11570 } else if (E->isValueDependent()) { 11571 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11572 bool ShouldExpand = false; 11573 bool RetainExpansion = false; 11574 Optional<unsigned> NumExpansions; 11575 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11576 Unexpanded, 11577 ShouldExpand, RetainExpansion, 11578 NumExpansions)) 11579 return ExprError(); 11580 11581 // If we need to expand the pack, build a template argument from it and 11582 // expand that. 11583 if (ShouldExpand) { 11584 auto *Pack = E->getPack(); 11585 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11586 ArgStorage = getSema().Context.getPackExpansionType( 11587 getSema().Context.getTypeDeclType(TTPD), None); 11588 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11589 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11590 } else { 11591 auto *VD = cast<ValueDecl>(Pack); 11592 ExprResult DRE = getSema().BuildDeclRefExpr( 11593 VD, VD->getType().getNonLValueExprType(getSema().Context), 11594 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11595 E->getPackLoc()); 11596 if (DRE.isInvalid()) 11597 return ExprError(); 11598 ArgStorage = new (getSema().Context) PackExpansionExpr( 11599 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11600 } 11601 PackArgs = ArgStorage; 11602 } 11603 } 11604 11605 // If we're not expanding the pack, just transform the decl. 11606 if (!PackArgs.size()) { 11607 auto *Pack = cast_or_null<NamedDecl>( 11608 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11609 if (!Pack) 11610 return ExprError(); 11611 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11612 E->getPackLoc(), 11613 E->getRParenLoc(), None, None); 11614 } 11615 11616 // Try to compute the result without performing a partial substitution. 11617 Optional<unsigned> Result = 0; 11618 for (const TemplateArgument &Arg : PackArgs) { 11619 if (!Arg.isPackExpansion()) { 11620 Result = *Result + 1; 11621 continue; 11622 } 11623 11624 TemplateArgumentLoc ArgLoc; 11625 InventTemplateArgumentLoc(Arg, ArgLoc); 11626 11627 // Find the pattern of the pack expansion. 11628 SourceLocation Ellipsis; 11629 Optional<unsigned> OrigNumExpansions; 11630 TemplateArgumentLoc Pattern = 11631 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11632 OrigNumExpansions); 11633 11634 // Substitute under the pack expansion. Do not expand the pack (yet). 11635 TemplateArgumentLoc OutPattern; 11636 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11637 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11638 /*Uneval*/ true)) 11639 return true; 11640 11641 // See if we can determine the number of arguments from the result. 11642 Optional<unsigned> NumExpansions = 11643 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11644 if (!NumExpansions) { 11645 // No: we must be in an alias template expansion, and we're going to need 11646 // to actually expand the packs. 11647 Result = None; 11648 break; 11649 } 11650 11651 Result = *Result + *NumExpansions; 11652 } 11653 11654 // Common case: we could determine the number of expansions without 11655 // substituting. 11656 if (Result) 11657 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11658 E->getPackLoc(), 11659 E->getRParenLoc(), *Result, None); 11660 11661 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11662 E->getPackLoc()); 11663 { 11664 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11665 typedef TemplateArgumentLocInventIterator< 11666 Derived, const TemplateArgument*> PackLocIterator; 11667 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11668 PackLocIterator(*this, PackArgs.end()), 11669 TransformedPackArgs, /*Uneval*/true)) 11670 return ExprError(); 11671 } 11672 11673 // Check whether we managed to fully-expand the pack. 11674 // FIXME: Is it possible for us to do so and not hit the early exit path? 11675 SmallVector<TemplateArgument, 8> Args; 11676 bool PartialSubstitution = false; 11677 for (auto &Loc : TransformedPackArgs.arguments()) { 11678 Args.push_back(Loc.getArgument()); 11679 if (Loc.getArgument().isPackExpansion()) 11680 PartialSubstitution = true; 11681 } 11682 11683 if (PartialSubstitution) 11684 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11685 E->getPackLoc(), 11686 E->getRParenLoc(), None, Args); 11687 11688 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11689 E->getPackLoc(), E->getRParenLoc(), 11690 Args.size(), None); 11691 } 11692 11693 template<typename Derived> 11694 ExprResult 11695 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11696 SubstNonTypeTemplateParmPackExpr *E) { 11697 // Default behavior is to do nothing with this transformation. 11698 return E; 11699 } 11700 11701 template<typename Derived> 11702 ExprResult 11703 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11704 SubstNonTypeTemplateParmExpr *E) { 11705 // Default behavior is to do nothing with this transformation. 11706 return E; 11707 } 11708 11709 template<typename Derived> 11710 ExprResult 11711 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11712 // Default behavior is to do nothing with this transformation. 11713 return E; 11714 } 11715 11716 template<typename Derived> 11717 ExprResult 11718 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11719 MaterializeTemporaryExpr *E) { 11720 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11721 } 11722 11723 template<typename Derived> 11724 ExprResult 11725 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11726 Expr *Pattern = E->getPattern(); 11727 11728 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11729 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11730 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11731 11732 // Determine whether the set of unexpanded parameter packs can and should 11733 // be expanded. 11734 bool Expand = true; 11735 bool RetainExpansion = false; 11736 Optional<unsigned> NumExpansions; 11737 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11738 Pattern->getSourceRange(), 11739 Unexpanded, 11740 Expand, RetainExpansion, 11741 NumExpansions)) 11742 return true; 11743 11744 if (!Expand) { 11745 // Do not expand any packs here, just transform and rebuild a fold 11746 // expression. 11747 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11748 11749 ExprResult LHS = 11750 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11751 if (LHS.isInvalid()) 11752 return true; 11753 11754 ExprResult RHS = 11755 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11756 if (RHS.isInvalid()) 11757 return true; 11758 11759 if (!getDerived().AlwaysRebuild() && 11760 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11761 return E; 11762 11763 return getDerived().RebuildCXXFoldExpr( 11764 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11765 RHS.get(), E->getEndLoc()); 11766 } 11767 11768 // The transform has determined that we should perform an elementwise 11769 // expansion of the pattern. Do so. 11770 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11771 if (Result.isInvalid()) 11772 return true; 11773 bool LeftFold = E->isLeftFold(); 11774 11775 // If we're retaining an expansion for a right fold, it is the innermost 11776 // component and takes the init (if any). 11777 if (!LeftFold && RetainExpansion) { 11778 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11779 11780 ExprResult Out = getDerived().TransformExpr(Pattern); 11781 if (Out.isInvalid()) 11782 return true; 11783 11784 Result = getDerived().RebuildCXXFoldExpr( 11785 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11786 Result.get(), E->getEndLoc()); 11787 if (Result.isInvalid()) 11788 return true; 11789 } 11790 11791 for (unsigned I = 0; I != *NumExpansions; ++I) { 11792 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11793 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11794 ExprResult Out = getDerived().TransformExpr(Pattern); 11795 if (Out.isInvalid()) 11796 return true; 11797 11798 if (Out.get()->containsUnexpandedParameterPack()) { 11799 // We still have a pack; retain a pack expansion for this slice. 11800 Result = getDerived().RebuildCXXFoldExpr( 11801 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 11802 E->getOperator(), E->getEllipsisLoc(), 11803 LeftFold ? Out.get() : Result.get(), E->getEndLoc()); 11804 } else if (Result.isUsable()) { 11805 // We've got down to a single element; build a binary operator. 11806 Result = getDerived().RebuildBinaryOperator( 11807 E->getEllipsisLoc(), E->getOperator(), 11808 LeftFold ? Result.get() : Out.get(), 11809 LeftFold ? Out.get() : Result.get()); 11810 } else 11811 Result = Out; 11812 11813 if (Result.isInvalid()) 11814 return true; 11815 } 11816 11817 // If we're retaining an expansion for a left fold, it is the outermost 11818 // component and takes the complete expansion so far as its init (if any). 11819 if (LeftFold && RetainExpansion) { 11820 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11821 11822 ExprResult Out = getDerived().TransformExpr(Pattern); 11823 if (Out.isInvalid()) 11824 return true; 11825 11826 Result = getDerived().RebuildCXXFoldExpr( 11827 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 11828 Out.get(), E->getEndLoc()); 11829 if (Result.isInvalid()) 11830 return true; 11831 } 11832 11833 // If we had no init and an empty pack, and we're not retaining an expansion, 11834 // then produce a fallback value or error. 11835 if (Result.isUnset()) 11836 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11837 E->getOperator()); 11838 11839 return Result; 11840 } 11841 11842 template<typename Derived> 11843 ExprResult 11844 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11845 CXXStdInitializerListExpr *E) { 11846 return getDerived().TransformExpr(E->getSubExpr()); 11847 } 11848 11849 template<typename Derived> 11850 ExprResult 11851 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11852 return SemaRef.MaybeBindToTemporary(E); 11853 } 11854 11855 template<typename Derived> 11856 ExprResult 11857 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11858 return E; 11859 } 11860 11861 template<typename Derived> 11862 ExprResult 11863 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11864 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11865 if (SubExpr.isInvalid()) 11866 return ExprError(); 11867 11868 if (!getDerived().AlwaysRebuild() && 11869 SubExpr.get() == E->getSubExpr()) 11870 return E; 11871 11872 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11873 } 11874 11875 template<typename Derived> 11876 ExprResult 11877 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11878 // Transform each of the elements. 11879 SmallVector<Expr *, 8> Elements; 11880 bool ArgChanged = false; 11881 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11882 /*IsCall=*/false, Elements, &ArgChanged)) 11883 return ExprError(); 11884 11885 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11886 return SemaRef.MaybeBindToTemporary(E); 11887 11888 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11889 Elements.data(), 11890 Elements.size()); 11891 } 11892 11893 template<typename Derived> 11894 ExprResult 11895 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11896 ObjCDictionaryLiteral *E) { 11897 // Transform each of the elements. 11898 SmallVector<ObjCDictionaryElement, 8> Elements; 11899 bool ArgChanged = false; 11900 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11901 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11902 11903 if (OrigElement.isPackExpansion()) { 11904 // This key/value element is a pack expansion. 11905 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11906 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11907 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11908 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11909 11910 // Determine whether the set of unexpanded parameter packs can 11911 // and should be expanded. 11912 bool Expand = true; 11913 bool RetainExpansion = false; 11914 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11915 Optional<unsigned> NumExpansions = OrigNumExpansions; 11916 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 11917 OrigElement.Value->getEndLoc()); 11918 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11919 PatternRange, Unexpanded, Expand, 11920 RetainExpansion, NumExpansions)) 11921 return ExprError(); 11922 11923 if (!Expand) { 11924 // The transform has determined that we should perform a simple 11925 // transformation on the pack expansion, producing another pack 11926 // expansion. 11927 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11928 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11929 if (Key.isInvalid()) 11930 return ExprError(); 11931 11932 if (Key.get() != OrigElement.Key) 11933 ArgChanged = true; 11934 11935 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11936 if (Value.isInvalid()) 11937 return ExprError(); 11938 11939 if (Value.get() != OrigElement.Value) 11940 ArgChanged = true; 11941 11942 ObjCDictionaryElement Expansion = { 11943 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11944 }; 11945 Elements.push_back(Expansion); 11946 continue; 11947 } 11948 11949 // Record right away that the argument was changed. This needs 11950 // to happen even if the array expands to nothing. 11951 ArgChanged = true; 11952 11953 // The transform has determined that we should perform an elementwise 11954 // expansion of the pattern. Do so. 11955 for (unsigned I = 0; I != *NumExpansions; ++I) { 11956 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11957 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11958 if (Key.isInvalid()) 11959 return ExprError(); 11960 11961 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11962 if (Value.isInvalid()) 11963 return ExprError(); 11964 11965 ObjCDictionaryElement Element = { 11966 Key.get(), Value.get(), SourceLocation(), NumExpansions 11967 }; 11968 11969 // If any unexpanded parameter packs remain, we still have a 11970 // pack expansion. 11971 // FIXME: Can this really happen? 11972 if (Key.get()->containsUnexpandedParameterPack() || 11973 Value.get()->containsUnexpandedParameterPack()) 11974 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11975 11976 Elements.push_back(Element); 11977 } 11978 11979 // FIXME: Retain a pack expansion if RetainExpansion is true. 11980 11981 // We've finished with this pack expansion. 11982 continue; 11983 } 11984 11985 // Transform and check key. 11986 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11987 if (Key.isInvalid()) 11988 return ExprError(); 11989 11990 if (Key.get() != OrigElement.Key) 11991 ArgChanged = true; 11992 11993 // Transform and check value. 11994 ExprResult Value 11995 = getDerived().TransformExpr(OrigElement.Value); 11996 if (Value.isInvalid()) 11997 return ExprError(); 11998 11999 if (Value.get() != OrigElement.Value) 12000 ArgChanged = true; 12001 12002 ObjCDictionaryElement Element = { 12003 Key.get(), Value.get(), SourceLocation(), None 12004 }; 12005 Elements.push_back(Element); 12006 } 12007 12008 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12009 return SemaRef.MaybeBindToTemporary(E); 12010 12011 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 12012 Elements); 12013 } 12014 12015 template<typename Derived> 12016 ExprResult 12017 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 12018 TypeSourceInfo *EncodedTypeInfo 12019 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 12020 if (!EncodedTypeInfo) 12021 return ExprError(); 12022 12023 if (!getDerived().AlwaysRebuild() && 12024 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 12025 return E; 12026 12027 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 12028 EncodedTypeInfo, 12029 E->getRParenLoc()); 12030 } 12031 12032 template<typename Derived> 12033 ExprResult TreeTransform<Derived>:: 12034 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 12035 // This is a kind of implicit conversion, and it needs to get dropped 12036 // and recomputed for the same general reasons that ImplicitCastExprs 12037 // do, as well a more specific one: this expression is only valid when 12038 // it appears *immediately* as an argument expression. 12039 return getDerived().TransformExpr(E->getSubExpr()); 12040 } 12041 12042 template<typename Derived> 12043 ExprResult TreeTransform<Derived>:: 12044 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 12045 TypeSourceInfo *TSInfo 12046 = getDerived().TransformType(E->getTypeInfoAsWritten()); 12047 if (!TSInfo) 12048 return ExprError(); 12049 12050 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 12051 if (Result.isInvalid()) 12052 return ExprError(); 12053 12054 if (!getDerived().AlwaysRebuild() && 12055 TSInfo == E->getTypeInfoAsWritten() && 12056 Result.get() == E->getSubExpr()) 12057 return E; 12058 12059 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 12060 E->getBridgeKeywordLoc(), TSInfo, 12061 Result.get()); 12062 } 12063 12064 template <typename Derived> 12065 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 12066 ObjCAvailabilityCheckExpr *E) { 12067 return E; 12068 } 12069 12070 template<typename Derived> 12071 ExprResult 12072 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 12073 // Transform arguments. 12074 bool ArgChanged = false; 12075 SmallVector<Expr*, 8> Args; 12076 Args.reserve(E->getNumArgs()); 12077 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 12078 &ArgChanged)) 12079 return ExprError(); 12080 12081 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 12082 // Class message: transform the receiver type. 12083 TypeSourceInfo *ReceiverTypeInfo 12084 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 12085 if (!ReceiverTypeInfo) 12086 return ExprError(); 12087 12088 // If nothing changed, just retain the existing message send. 12089 if (!getDerived().AlwaysRebuild() && 12090 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 12091 return SemaRef.MaybeBindToTemporary(E); 12092 12093 // Build a new class message send. 12094 SmallVector<SourceLocation, 16> SelLocs; 12095 E->getSelectorLocs(SelLocs); 12096 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 12097 E->getSelector(), 12098 SelLocs, 12099 E->getMethodDecl(), 12100 E->getLeftLoc(), 12101 Args, 12102 E->getRightLoc()); 12103 } 12104 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 12105 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 12106 if (!E->getMethodDecl()) 12107 return ExprError(); 12108 12109 // Build a new class message send to 'super'. 12110 SmallVector<SourceLocation, 16> SelLocs; 12111 E->getSelectorLocs(SelLocs); 12112 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 12113 E->getSelector(), 12114 SelLocs, 12115 E->getReceiverType(), 12116 E->getMethodDecl(), 12117 E->getLeftLoc(), 12118 Args, 12119 E->getRightLoc()); 12120 } 12121 12122 // Instance message: transform the receiver 12123 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 12124 "Only class and instance messages may be instantiated"); 12125 ExprResult Receiver 12126 = getDerived().TransformExpr(E->getInstanceReceiver()); 12127 if (Receiver.isInvalid()) 12128 return ExprError(); 12129 12130 // If nothing changed, just retain the existing message send. 12131 if (!getDerived().AlwaysRebuild() && 12132 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 12133 return SemaRef.MaybeBindToTemporary(E); 12134 12135 // Build a new instance message send. 12136 SmallVector<SourceLocation, 16> SelLocs; 12137 E->getSelectorLocs(SelLocs); 12138 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 12139 E->getSelector(), 12140 SelLocs, 12141 E->getMethodDecl(), 12142 E->getLeftLoc(), 12143 Args, 12144 E->getRightLoc()); 12145 } 12146 12147 template<typename Derived> 12148 ExprResult 12149 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 12150 return E; 12151 } 12152 12153 template<typename Derived> 12154 ExprResult 12155 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 12156 return E; 12157 } 12158 12159 template<typename Derived> 12160 ExprResult 12161 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 12162 // Transform the base expression. 12163 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12164 if (Base.isInvalid()) 12165 return ExprError(); 12166 12167 // We don't need to transform the ivar; it will never change. 12168 12169 // If nothing changed, just retain the existing expression. 12170 if (!getDerived().AlwaysRebuild() && 12171 Base.get() == E->getBase()) 12172 return E; 12173 12174 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 12175 E->getLocation(), 12176 E->isArrow(), E->isFreeIvar()); 12177 } 12178 12179 template<typename Derived> 12180 ExprResult 12181 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 12182 // 'super' and types never change. Property never changes. Just 12183 // retain the existing expression. 12184 if (!E->isObjectReceiver()) 12185 return E; 12186 12187 // Transform the base expression. 12188 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12189 if (Base.isInvalid()) 12190 return ExprError(); 12191 12192 // We don't need to transform the property; it will never change. 12193 12194 // If nothing changed, just retain the existing expression. 12195 if (!getDerived().AlwaysRebuild() && 12196 Base.get() == E->getBase()) 12197 return E; 12198 12199 if (E->isExplicitProperty()) 12200 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12201 E->getExplicitProperty(), 12202 E->getLocation()); 12203 12204 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12205 SemaRef.Context.PseudoObjectTy, 12206 E->getImplicitPropertyGetter(), 12207 E->getImplicitPropertySetter(), 12208 E->getLocation()); 12209 } 12210 12211 template<typename Derived> 12212 ExprResult 12213 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12214 // Transform the base expression. 12215 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12216 if (Base.isInvalid()) 12217 return ExprError(); 12218 12219 // Transform the key expression. 12220 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12221 if (Key.isInvalid()) 12222 return ExprError(); 12223 12224 // If nothing changed, just retain the existing expression. 12225 if (!getDerived().AlwaysRebuild() && 12226 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12227 return E; 12228 12229 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12230 Base.get(), Key.get(), 12231 E->getAtIndexMethodDecl(), 12232 E->setAtIndexMethodDecl()); 12233 } 12234 12235 template<typename Derived> 12236 ExprResult 12237 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12238 // Transform the base expression. 12239 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12240 if (Base.isInvalid()) 12241 return ExprError(); 12242 12243 // If nothing changed, just retain the existing expression. 12244 if (!getDerived().AlwaysRebuild() && 12245 Base.get() == E->getBase()) 12246 return E; 12247 12248 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12249 E->getOpLoc(), 12250 E->isArrow()); 12251 } 12252 12253 template<typename Derived> 12254 ExprResult 12255 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12256 bool ArgumentChanged = false; 12257 SmallVector<Expr*, 8> SubExprs; 12258 SubExprs.reserve(E->getNumSubExprs()); 12259 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12260 SubExprs, &ArgumentChanged)) 12261 return ExprError(); 12262 12263 if (!getDerived().AlwaysRebuild() && 12264 !ArgumentChanged) 12265 return E; 12266 12267 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12268 SubExprs, 12269 E->getRParenLoc()); 12270 } 12271 12272 template<typename Derived> 12273 ExprResult 12274 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12275 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12276 if (SrcExpr.isInvalid()) 12277 return ExprError(); 12278 12279 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12280 if (!Type) 12281 return ExprError(); 12282 12283 if (!getDerived().AlwaysRebuild() && 12284 Type == E->getTypeSourceInfo() && 12285 SrcExpr.get() == E->getSrcExpr()) 12286 return E; 12287 12288 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12289 SrcExpr.get(), Type, 12290 E->getRParenLoc()); 12291 } 12292 12293 template<typename Derived> 12294 ExprResult 12295 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12296 BlockDecl *oldBlock = E->getBlockDecl(); 12297 12298 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12299 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12300 12301 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12302 blockScope->TheDecl->setBlockMissingReturnType( 12303 oldBlock->blockMissingReturnType()); 12304 12305 SmallVector<ParmVarDecl*, 4> params; 12306 SmallVector<QualType, 4> paramTypes; 12307 12308 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12309 12310 // Parameter substitution. 12311 Sema::ExtParameterInfoBuilder extParamInfos; 12312 if (getDerived().TransformFunctionTypeParams( 12313 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12314 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12315 extParamInfos)) { 12316 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12317 return ExprError(); 12318 } 12319 12320 QualType exprResultType = 12321 getDerived().TransformType(exprFunctionType->getReturnType()); 12322 12323 auto epi = exprFunctionType->getExtProtoInfo(); 12324 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12325 12326 QualType functionType = 12327 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12328 blockScope->FunctionType = functionType; 12329 12330 // Set the parameters on the block decl. 12331 if (!params.empty()) 12332 blockScope->TheDecl->setParams(params); 12333 12334 if (!oldBlock->blockMissingReturnType()) { 12335 blockScope->HasImplicitReturnType = false; 12336 blockScope->ReturnType = exprResultType; 12337 } 12338 12339 // Transform the body 12340 StmtResult body = getDerived().TransformStmt(E->getBody()); 12341 if (body.isInvalid()) { 12342 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12343 return ExprError(); 12344 } 12345 12346 #ifndef NDEBUG 12347 // In builds with assertions, make sure that we captured everything we 12348 // captured before. 12349 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12350 for (const auto &I : oldBlock->captures()) { 12351 VarDecl *oldCapture = I.getVariable(); 12352 12353 // Ignore parameter packs. 12354 if (isa<ParmVarDecl>(oldCapture) && 12355 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12356 continue; 12357 12358 VarDecl *newCapture = 12359 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12360 oldCapture)); 12361 assert(blockScope->CaptureMap.count(newCapture)); 12362 } 12363 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12364 } 12365 #endif 12366 12367 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12368 /*Scope=*/nullptr); 12369 } 12370 12371 template<typename Derived> 12372 ExprResult 12373 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12374 llvm_unreachable("Cannot transform asType expressions yet"); 12375 } 12376 12377 template<typename Derived> 12378 ExprResult 12379 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12380 QualType RetTy = getDerived().TransformType(E->getType()); 12381 bool ArgumentChanged = false; 12382 SmallVector<Expr*, 8> SubExprs; 12383 SubExprs.reserve(E->getNumSubExprs()); 12384 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12385 SubExprs, &ArgumentChanged)) 12386 return ExprError(); 12387 12388 if (!getDerived().AlwaysRebuild() && 12389 !ArgumentChanged) 12390 return E; 12391 12392 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12393 RetTy, E->getOp(), E->getRParenLoc()); 12394 } 12395 12396 //===----------------------------------------------------------------------===// 12397 // Type reconstruction 12398 //===----------------------------------------------------------------------===// 12399 12400 template<typename Derived> 12401 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12402 SourceLocation Star) { 12403 return SemaRef.BuildPointerType(PointeeType, Star, 12404 getDerived().getBaseEntity()); 12405 } 12406 12407 template<typename Derived> 12408 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12409 SourceLocation Star) { 12410 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12411 getDerived().getBaseEntity()); 12412 } 12413 12414 template<typename Derived> 12415 QualType 12416 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12417 bool WrittenAsLValue, 12418 SourceLocation Sigil) { 12419 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12420 Sigil, getDerived().getBaseEntity()); 12421 } 12422 12423 template<typename Derived> 12424 QualType 12425 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12426 QualType ClassType, 12427 SourceLocation Sigil) { 12428 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12429 getDerived().getBaseEntity()); 12430 } 12431 12432 template<typename Derived> 12433 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12434 const ObjCTypeParamDecl *Decl, 12435 SourceLocation ProtocolLAngleLoc, 12436 ArrayRef<ObjCProtocolDecl *> Protocols, 12437 ArrayRef<SourceLocation> ProtocolLocs, 12438 SourceLocation ProtocolRAngleLoc) { 12439 return SemaRef.BuildObjCTypeParamType(Decl, 12440 ProtocolLAngleLoc, Protocols, 12441 ProtocolLocs, ProtocolRAngleLoc, 12442 /*FailOnError=*/true); 12443 } 12444 12445 template<typename Derived> 12446 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12447 QualType BaseType, 12448 SourceLocation Loc, 12449 SourceLocation TypeArgsLAngleLoc, 12450 ArrayRef<TypeSourceInfo *> TypeArgs, 12451 SourceLocation TypeArgsRAngleLoc, 12452 SourceLocation ProtocolLAngleLoc, 12453 ArrayRef<ObjCProtocolDecl *> Protocols, 12454 ArrayRef<SourceLocation> ProtocolLocs, 12455 SourceLocation ProtocolRAngleLoc) { 12456 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12457 TypeArgs, TypeArgsRAngleLoc, 12458 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12459 ProtocolRAngleLoc, 12460 /*FailOnError=*/true); 12461 } 12462 12463 template<typename Derived> 12464 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12465 QualType PointeeType, 12466 SourceLocation Star) { 12467 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12468 } 12469 12470 template<typename Derived> 12471 QualType 12472 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12473 ArrayType::ArraySizeModifier SizeMod, 12474 const llvm::APInt *Size, 12475 Expr *SizeExpr, 12476 unsigned IndexTypeQuals, 12477 SourceRange BracketsRange) { 12478 if (SizeExpr || !Size) 12479 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12480 IndexTypeQuals, BracketsRange, 12481 getDerived().getBaseEntity()); 12482 12483 QualType Types[] = { 12484 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12485 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12486 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12487 }; 12488 const unsigned NumTypes = llvm::array_lengthof(Types); 12489 QualType SizeType; 12490 for (unsigned I = 0; I != NumTypes; ++I) 12491 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12492 SizeType = Types[I]; 12493 break; 12494 } 12495 12496 // Note that we can return a VariableArrayType here in the case where 12497 // the element type was a dependent VariableArrayType. 12498 IntegerLiteral *ArraySize 12499 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12500 /*FIXME*/BracketsRange.getBegin()); 12501 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12502 IndexTypeQuals, BracketsRange, 12503 getDerived().getBaseEntity()); 12504 } 12505 12506 template<typename Derived> 12507 QualType 12508 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12509 ArrayType::ArraySizeModifier SizeMod, 12510 const llvm::APInt &Size, 12511 unsigned IndexTypeQuals, 12512 SourceRange BracketsRange) { 12513 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12514 IndexTypeQuals, BracketsRange); 12515 } 12516 12517 template<typename Derived> 12518 QualType 12519 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12520 ArrayType::ArraySizeModifier SizeMod, 12521 unsigned IndexTypeQuals, 12522 SourceRange BracketsRange) { 12523 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12524 IndexTypeQuals, BracketsRange); 12525 } 12526 12527 template<typename Derived> 12528 QualType 12529 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12530 ArrayType::ArraySizeModifier SizeMod, 12531 Expr *SizeExpr, 12532 unsigned IndexTypeQuals, 12533 SourceRange BracketsRange) { 12534 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12535 SizeExpr, 12536 IndexTypeQuals, BracketsRange); 12537 } 12538 12539 template<typename Derived> 12540 QualType 12541 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12542 ArrayType::ArraySizeModifier SizeMod, 12543 Expr *SizeExpr, 12544 unsigned IndexTypeQuals, 12545 SourceRange BracketsRange) { 12546 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12547 SizeExpr, 12548 IndexTypeQuals, BracketsRange); 12549 } 12550 12551 template <typename Derived> 12552 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12553 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12554 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12555 AttributeLoc); 12556 } 12557 12558 template <typename Derived> 12559 QualType 12560 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12561 unsigned NumElements, 12562 VectorType::VectorKind VecKind) { 12563 // FIXME: semantic checking! 12564 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12565 } 12566 12567 template <typename Derived> 12568 QualType TreeTransform<Derived>::RebuildDependentVectorType( 12569 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 12570 VectorType::VectorKind VecKind) { 12571 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 12572 } 12573 12574 template<typename Derived> 12575 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12576 unsigned NumElements, 12577 SourceLocation AttributeLoc) { 12578 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12579 NumElements, true); 12580 IntegerLiteral *VectorSize 12581 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12582 AttributeLoc); 12583 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12584 } 12585 12586 template<typename Derived> 12587 QualType 12588 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12589 Expr *SizeExpr, 12590 SourceLocation AttributeLoc) { 12591 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12592 } 12593 12594 template<typename Derived> 12595 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12596 QualType T, 12597 MutableArrayRef<QualType> ParamTypes, 12598 const FunctionProtoType::ExtProtoInfo &EPI) { 12599 return SemaRef.BuildFunctionType(T, ParamTypes, 12600 getDerived().getBaseLocation(), 12601 getDerived().getBaseEntity(), 12602 EPI); 12603 } 12604 12605 template<typename Derived> 12606 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12607 return SemaRef.Context.getFunctionNoProtoType(T); 12608 } 12609 12610 template<typename Derived> 12611 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12612 Decl *D) { 12613 assert(D && "no decl found"); 12614 if (D->isInvalidDecl()) return QualType(); 12615 12616 // FIXME: Doesn't account for ObjCInterfaceDecl! 12617 TypeDecl *Ty; 12618 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12619 // A valid resolved using typename pack expansion decl can have multiple 12620 // UsingDecls, but they must each have exactly one type, and it must be 12621 // the same type in every case. But we must have at least one expansion! 12622 if (UPD->expansions().empty()) { 12623 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12624 << UPD->isCXXClassMember() << UPD; 12625 return QualType(); 12626 } 12627 12628 // We might still have some unresolved types. Try to pick a resolved type 12629 // if we can. The final instantiation will check that the remaining 12630 // unresolved types instantiate to the type we pick. 12631 QualType FallbackT; 12632 QualType T; 12633 for (auto *E : UPD->expansions()) { 12634 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12635 if (ThisT.isNull()) 12636 continue; 12637 else if (ThisT->getAs<UnresolvedUsingType>()) 12638 FallbackT = ThisT; 12639 else if (T.isNull()) 12640 T = ThisT; 12641 else 12642 assert(getSema().Context.hasSameType(ThisT, T) && 12643 "mismatched resolved types in using pack expansion"); 12644 } 12645 return T.isNull() ? FallbackT : T; 12646 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12647 assert(Using->hasTypename() && 12648 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12649 12650 // A valid resolved using typename decl points to exactly one type decl. 12651 assert(++Using->shadow_begin() == Using->shadow_end()); 12652 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12653 } else { 12654 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12655 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12656 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12657 } 12658 12659 return SemaRef.Context.getTypeDeclType(Ty); 12660 } 12661 12662 template<typename Derived> 12663 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12664 SourceLocation Loc) { 12665 return SemaRef.BuildTypeofExprType(E, Loc); 12666 } 12667 12668 template<typename Derived> 12669 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12670 return SemaRef.Context.getTypeOfType(Underlying); 12671 } 12672 12673 template<typename Derived> 12674 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12675 SourceLocation Loc) { 12676 return SemaRef.BuildDecltypeType(E, Loc); 12677 } 12678 12679 template<typename Derived> 12680 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12681 UnaryTransformType::UTTKind UKind, 12682 SourceLocation Loc) { 12683 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12684 } 12685 12686 template<typename Derived> 12687 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12688 TemplateName Template, 12689 SourceLocation TemplateNameLoc, 12690 TemplateArgumentListInfo &TemplateArgs) { 12691 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12692 } 12693 12694 template<typename Derived> 12695 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12696 SourceLocation KWLoc) { 12697 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12698 } 12699 12700 template<typename Derived> 12701 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12702 SourceLocation KWLoc, 12703 bool isReadPipe) { 12704 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12705 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12706 } 12707 12708 template<typename Derived> 12709 TemplateName 12710 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12711 bool TemplateKW, 12712 TemplateDecl *Template) { 12713 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12714 Template); 12715 } 12716 12717 template<typename Derived> 12718 TemplateName 12719 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12720 SourceLocation TemplateKWLoc, 12721 const IdentifierInfo &Name, 12722 SourceLocation NameLoc, 12723 QualType ObjectType, 12724 NamedDecl *FirstQualifierInScope, 12725 bool AllowInjectedClassName) { 12726 UnqualifiedId TemplateName; 12727 TemplateName.setIdentifier(&Name, NameLoc); 12728 Sema::TemplateTy Template; 12729 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12730 SS, TemplateKWLoc, TemplateName, 12731 ParsedType::make(ObjectType), 12732 /*EnteringContext=*/false, 12733 Template, AllowInjectedClassName); 12734 return Template.get(); 12735 } 12736 12737 template<typename Derived> 12738 TemplateName 12739 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12740 SourceLocation TemplateKWLoc, 12741 OverloadedOperatorKind Operator, 12742 SourceLocation NameLoc, 12743 QualType ObjectType, 12744 bool AllowInjectedClassName) { 12745 UnqualifiedId Name; 12746 // FIXME: Bogus location information. 12747 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12748 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12749 Sema::TemplateTy Template; 12750 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12751 SS, TemplateKWLoc, Name, 12752 ParsedType::make(ObjectType), 12753 /*EnteringContext=*/false, 12754 Template, AllowInjectedClassName); 12755 return Template.get(); 12756 } 12757 12758 template<typename Derived> 12759 ExprResult 12760 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12761 SourceLocation OpLoc, 12762 Expr *OrigCallee, 12763 Expr *First, 12764 Expr *Second) { 12765 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12766 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12767 12768 if (First->getObjectKind() == OK_ObjCProperty) { 12769 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12770 if (BinaryOperator::isAssignmentOp(Opc)) 12771 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12772 First, Second); 12773 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12774 if (Result.isInvalid()) 12775 return ExprError(); 12776 First = Result.get(); 12777 } 12778 12779 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12780 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12781 if (Result.isInvalid()) 12782 return ExprError(); 12783 Second = Result.get(); 12784 } 12785 12786 // Determine whether this should be a builtin operation. 12787 if (Op == OO_Subscript) { 12788 if (!First->getType()->isOverloadableType() && 12789 !Second->getType()->isOverloadableType()) 12790 return getSema().CreateBuiltinArraySubscriptExpr( 12791 First, Callee->getBeginLoc(), Second, OpLoc); 12792 } else if (Op == OO_Arrow) { 12793 // -> is never a builtin operation. 12794 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12795 } else if (Second == nullptr || isPostIncDec) { 12796 if (!First->getType()->isOverloadableType() || 12797 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 12798 // The argument is not of overloadable type, or this is an expression 12799 // of the form &Class::member, so try to create a built-in unary 12800 // operation. 12801 UnaryOperatorKind Opc 12802 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12803 12804 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12805 } 12806 } else { 12807 if (!First->getType()->isOverloadableType() && 12808 !Second->getType()->isOverloadableType()) { 12809 // Neither of the arguments is an overloadable type, so try to 12810 // create a built-in binary operation. 12811 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12812 ExprResult Result 12813 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12814 if (Result.isInvalid()) 12815 return ExprError(); 12816 12817 return Result; 12818 } 12819 } 12820 12821 // Compute the transformed set of functions (and function templates) to be 12822 // used during overload resolution. 12823 UnresolvedSet<16> Functions; 12824 bool RequiresADL; 12825 12826 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12827 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12828 // If the overload could not be resolved in the template definition 12829 // (because we had a dependent argument), ADL is performed as part of 12830 // template instantiation. 12831 RequiresADL = ULE->requiresADL(); 12832 } else { 12833 // If we've resolved this to a particular non-member function, just call 12834 // that function. If we resolved it to a member function, 12835 // CreateOverloaded* will find that function for us. 12836 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12837 if (!isa<CXXMethodDecl>(ND)) 12838 Functions.addDecl(ND); 12839 RequiresADL = false; 12840 } 12841 12842 // Add any functions found via argument-dependent lookup. 12843 Expr *Args[2] = { First, Second }; 12844 unsigned NumArgs = 1 + (Second != nullptr); 12845 12846 // Create the overloaded operator invocation for unary operators. 12847 if (NumArgs == 1 || isPostIncDec) { 12848 UnaryOperatorKind Opc 12849 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12850 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12851 RequiresADL); 12852 } 12853 12854 if (Op == OO_Subscript) { 12855 SourceLocation LBrace; 12856 SourceLocation RBrace; 12857 12858 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12859 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12860 LBrace = SourceLocation::getFromRawEncoding( 12861 NameLoc.CXXOperatorName.BeginOpNameLoc); 12862 RBrace = SourceLocation::getFromRawEncoding( 12863 NameLoc.CXXOperatorName.EndOpNameLoc); 12864 } else { 12865 LBrace = Callee->getBeginLoc(); 12866 RBrace = OpLoc; 12867 } 12868 12869 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12870 First, Second); 12871 } 12872 12873 // Create the overloaded operator invocation for binary operators. 12874 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12875 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12876 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12877 if (Result.isInvalid()) 12878 return ExprError(); 12879 12880 return Result; 12881 } 12882 12883 template<typename Derived> 12884 ExprResult 12885 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12886 SourceLocation OperatorLoc, 12887 bool isArrow, 12888 CXXScopeSpec &SS, 12889 TypeSourceInfo *ScopeType, 12890 SourceLocation CCLoc, 12891 SourceLocation TildeLoc, 12892 PseudoDestructorTypeStorage Destroyed) { 12893 QualType BaseType = Base->getType(); 12894 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12895 (!isArrow && !BaseType->getAs<RecordType>()) || 12896 (isArrow && BaseType->getAs<PointerType>() && 12897 !BaseType->getAs<PointerType>()->getPointeeType() 12898 ->template getAs<RecordType>())){ 12899 // This pseudo-destructor expression is still a pseudo-destructor. 12900 return SemaRef.BuildPseudoDestructorExpr( 12901 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12902 CCLoc, TildeLoc, Destroyed); 12903 } 12904 12905 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12906 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12907 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12908 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12909 NameInfo.setNamedTypeInfo(DestroyedType); 12910 12911 // The scope type is now known to be a valid nested name specifier 12912 // component. Tack it on to the end of the nested name specifier. 12913 if (ScopeType) { 12914 if (!ScopeType->getType()->getAs<TagType>()) { 12915 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12916 diag::err_expected_class_or_namespace) 12917 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12918 return ExprError(); 12919 } 12920 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12921 CCLoc); 12922 } 12923 12924 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12925 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12926 OperatorLoc, isArrow, 12927 SS, TemplateKWLoc, 12928 /*FIXME: FirstQualifier*/ nullptr, 12929 NameInfo, 12930 /*TemplateArgs*/ nullptr, 12931 /*S*/nullptr); 12932 } 12933 12934 template<typename Derived> 12935 StmtResult 12936 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12937 SourceLocation Loc = S->getBeginLoc(); 12938 CapturedDecl *CD = S->getCapturedDecl(); 12939 unsigned NumParams = CD->getNumParams(); 12940 unsigned ContextParamPos = CD->getContextParamPosition(); 12941 SmallVector<Sema::CapturedParamNameType, 4> Params; 12942 for (unsigned I = 0; I < NumParams; ++I) { 12943 if (I != ContextParamPos) { 12944 Params.push_back( 12945 std::make_pair( 12946 CD->getParam(I)->getName(), 12947 getDerived().TransformType(CD->getParam(I)->getType()))); 12948 } else { 12949 Params.push_back(std::make_pair(StringRef(), QualType())); 12950 } 12951 } 12952 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12953 S->getCapturedRegionKind(), Params); 12954 StmtResult Body; 12955 { 12956 Sema::CompoundScopeRAII CompoundScope(getSema()); 12957 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12958 } 12959 12960 if (Body.isInvalid()) { 12961 getSema().ActOnCapturedRegionError(); 12962 return StmtError(); 12963 } 12964 12965 return getSema().ActOnCapturedRegionEnd(Body.get()); 12966 } 12967 12968 } // end namespace clang 12969 12970 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12971