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/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 44 using namespace llvm::omp; 45 46 namespace clang { 47 using namespace sema; 48 49 /// A semantic tree transformation that allows one to transform one 50 /// abstract syntax tree into another. 51 /// 52 /// A new tree transformation is defined by creating a new subclass \c X of 53 /// \c TreeTransform<X> and then overriding certain operations to provide 54 /// behavior specific to that transformation. For example, template 55 /// instantiation is implemented as a tree transformation where the 56 /// transformation of TemplateTypeParmType nodes involves substituting the 57 /// template arguments for their corresponding template parameters; a similar 58 /// transformation is performed for non-type template parameters and 59 /// template template parameters. 60 /// 61 /// This tree-transformation template uses static polymorphism to allow 62 /// subclasses to customize any of its operations. Thus, a subclass can 63 /// override any of the transformation or rebuild operators by providing an 64 /// operation with the same signature as the default implementation. The 65 /// overriding function should not be virtual. 66 /// 67 /// Semantic tree transformations are split into two stages, either of which 68 /// can be replaced by a subclass. The "transform" step transforms an AST node 69 /// or the parts of an AST node using the various transformation functions, 70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 71 /// node of the appropriate kind from the pieces. The default transformation 72 /// routines recursively transform the operands to composite AST nodes (e.g., 73 /// the pointee type of a PointerType node) and, if any of those operand nodes 74 /// were changed by the transformation, invokes the rebuild operation to create 75 /// a new AST node. 76 /// 77 /// Subclasses can customize the transformation at various levels. The 78 /// most coarse-grained transformations involve replacing TransformType(), 79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 81 /// new implementations. 82 /// 83 /// For more fine-grained transformations, subclasses can replace any of the 84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 86 /// replacing TransformTemplateTypeParmType() allows template instantiation 87 /// to substitute template arguments for their corresponding template 88 /// parameters. Additionally, subclasses can override the \c RebuildXXX 89 /// functions to control how AST nodes are rebuilt when their operands change. 90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 92 /// be able to use more efficient rebuild steps. 93 /// 94 /// There are a handful of other functions that can be overridden, allowing one 95 /// to avoid traversing nodes that don't need any transformation 96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 97 /// operands have not changed (\c AlwaysRebuild()), and customize the 98 /// default locations and entity names used for type-checking 99 /// (\c getBaseLocation(), \c getBaseEntity()). 100 template<typename Derived> 101 class TreeTransform { 102 /// Private RAII object that helps us forget and then re-remember 103 /// the template argument corresponding to a partially-substituted parameter 104 /// pack. 105 class ForgetPartiallySubstitutedPackRAII { 106 Derived &Self; 107 TemplateArgument Old; 108 109 public: 110 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 111 Old = Self.ForgetPartiallySubstitutedPack(); 112 } 113 114 ~ForgetPartiallySubstitutedPackRAII() { 115 Self.RememberPartiallySubstitutedPack(Old); 116 } 117 }; 118 119 protected: 120 Sema &SemaRef; 121 122 /// The set of local declarations that have been transformed, for 123 /// cases where we are forced to build new declarations within the transformer 124 /// rather than in the subclass (e.g., lambda closure types). 125 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 126 127 public: 128 /// Initializes a new tree transformer. 129 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 130 131 /// Retrieves a reference to the derived class. 132 Derived &getDerived() { return static_cast<Derived&>(*this); } 133 134 /// Retrieves a reference to the derived class. 135 const Derived &getDerived() const { 136 return static_cast<const Derived&>(*this); 137 } 138 139 static inline ExprResult Owned(Expr *E) { return E; } 140 static inline StmtResult Owned(Stmt *S) { return S; } 141 142 /// Retrieves a reference to the semantic analysis object used for 143 /// this tree transform. 144 Sema &getSema() const { return SemaRef; } 145 146 /// Whether the transformation should always rebuild AST nodes, even 147 /// if none of the children have changed. 148 /// 149 /// Subclasses may override this function to specify when the transformation 150 /// should rebuild all AST nodes. 151 /// 152 /// We must always rebuild all AST nodes when performing variadic template 153 /// pack expansion, in order to avoid violating the AST invariant that each 154 /// statement node appears at most once in its containing declaration. 155 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 156 157 /// Whether the transformation is forming an expression or statement that 158 /// replaces the original. In this case, we'll reuse mangling numbers from 159 /// existing lambdas. 160 bool ReplacingOriginal() { return false; } 161 162 /// Wether CXXConstructExpr can be skipped when they are implicit. 163 /// They will be reconstructed when used if needed. 164 /// This is useful when the user that cause rebuilding of the 165 /// CXXConstructExpr is outside of the expression at which the TreeTransform 166 /// started. 167 bool AllowSkippingCXXConstructExpr() { return true; } 168 169 /// Returns the location of the entity being transformed, if that 170 /// information was not available elsewhere in the AST. 171 /// 172 /// By default, returns no source-location information. Subclasses can 173 /// provide an alternative implementation that provides better location 174 /// information. 175 SourceLocation getBaseLocation() { return SourceLocation(); } 176 177 /// Returns the name of the entity being transformed, if that 178 /// information was not available elsewhere in the AST. 179 /// 180 /// By default, returns an empty name. Subclasses can provide an alternative 181 /// implementation with a more precise name. 182 DeclarationName getBaseEntity() { return DeclarationName(); } 183 184 /// Sets the "base" location and entity when that 185 /// information is known based on another transformation. 186 /// 187 /// By default, the source location and entity are ignored. Subclasses can 188 /// override this function to provide a customized implementation. 189 void setBase(SourceLocation Loc, DeclarationName Entity) { } 190 191 /// RAII object that temporarily sets the base location and entity 192 /// used for reporting diagnostics in types. 193 class TemporaryBase { 194 TreeTransform &Self; 195 SourceLocation OldLocation; 196 DeclarationName OldEntity; 197 198 public: 199 TemporaryBase(TreeTransform &Self, SourceLocation Location, 200 DeclarationName Entity) : Self(Self) { 201 OldLocation = Self.getDerived().getBaseLocation(); 202 OldEntity = Self.getDerived().getBaseEntity(); 203 204 if (Location.isValid()) 205 Self.getDerived().setBase(Location, Entity); 206 } 207 208 ~TemporaryBase() { 209 Self.getDerived().setBase(OldLocation, OldEntity); 210 } 211 }; 212 213 /// Determine whether the given type \p T has already been 214 /// transformed. 215 /// 216 /// Subclasses can provide an alternative implementation of this routine 217 /// to short-circuit evaluation when it is known that a given type will 218 /// not change. For example, template instantiation need not traverse 219 /// non-dependent types. 220 bool AlreadyTransformed(QualType T) { 221 return T.isNull(); 222 } 223 224 /// Transform a template parameter depth level. 225 /// 226 /// During a transformation that transforms template parameters, this maps 227 /// an old template parameter depth to a new depth. 228 unsigned TransformTemplateDepth(unsigned Depth) { 229 return Depth; 230 } 231 232 /// Determine whether the given call argument should be dropped, e.g., 233 /// because it is a default argument. 234 /// 235 /// Subclasses can provide an alternative implementation of this routine to 236 /// determine which kinds of call arguments get dropped. By default, 237 /// CXXDefaultArgument nodes are dropped (prior to transformation). 238 bool DropCallArgument(Expr *E) { 239 return E->isDefaultArgument(); 240 } 241 242 /// Determine whether we should expand a pack expansion with the 243 /// given set of parameter packs into separate arguments by repeatedly 244 /// transforming the pattern. 245 /// 246 /// By default, the transformer never tries to expand pack expansions. 247 /// Subclasses can override this routine to provide different behavior. 248 /// 249 /// \param EllipsisLoc The location of the ellipsis that identifies the 250 /// pack expansion. 251 /// 252 /// \param PatternRange The source range that covers the entire pattern of 253 /// the pack expansion. 254 /// 255 /// \param Unexpanded The set of unexpanded parameter packs within the 256 /// pattern. 257 /// 258 /// \param ShouldExpand Will be set to \c true if the transformer should 259 /// expand the corresponding pack expansions into separate arguments. When 260 /// set, \c NumExpansions must also be set. 261 /// 262 /// \param RetainExpansion Whether the caller should add an unexpanded 263 /// pack expansion after all of the expanded arguments. This is used 264 /// when extending explicitly-specified template argument packs per 265 /// C++0x [temp.arg.explicit]p9. 266 /// 267 /// \param NumExpansions The number of separate arguments that will be in 268 /// the expanded form of the corresponding pack expansion. This is both an 269 /// input and an output parameter, which can be set by the caller if the 270 /// number of expansions is known a priori (e.g., due to a prior substitution) 271 /// and will be set by the callee when the number of expansions is known. 272 /// The callee must set this value when \c ShouldExpand is \c true; it may 273 /// set this value in other cases. 274 /// 275 /// \returns true if an error occurred (e.g., because the parameter packs 276 /// are to be instantiated with arguments of different lengths), false 277 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 278 /// must be set. 279 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 280 SourceRange PatternRange, 281 ArrayRef<UnexpandedParameterPack> Unexpanded, 282 bool &ShouldExpand, 283 bool &RetainExpansion, 284 Optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Subclasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 template<typename Fn> 640 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 641 FunctionProtoTypeLoc TL, 642 CXXRecordDecl *ThisContext, 643 Qualifiers ThisTypeQuals, 644 Fn TransformExceptionSpec); 645 646 bool TransformExceptionSpec(SourceLocation Loc, 647 FunctionProtoType::ExceptionSpecInfo &ESI, 648 SmallVectorImpl<QualType> &Exceptions, 649 bool &Changed); 650 651 StmtResult TransformSEHHandler(Stmt *Handler); 652 653 QualType 654 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 655 TemplateSpecializationTypeLoc TL, 656 TemplateName Template); 657 658 QualType 659 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 660 DependentTemplateSpecializationTypeLoc TL, 661 TemplateName Template, 662 CXXScopeSpec &SS); 663 664 QualType TransformDependentTemplateSpecializationType( 665 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 666 NestedNameSpecifierLoc QualifierLoc); 667 668 /// Transforms the parameters of a function type into the 669 /// given vectors. 670 /// 671 /// The result vectors should be kept in sync; null entries in the 672 /// variables vector are acceptable. 673 /// 674 /// Return true on error. 675 bool TransformFunctionTypeParams( 676 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 677 const QualType *ParamTypes, 678 const FunctionProtoType::ExtParameterInfo *ParamInfos, 679 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 680 Sema::ExtParameterInfoBuilder &PInfos); 681 682 /// Transforms a single function-type parameter. Return null 683 /// on error. 684 /// 685 /// \param indexAdjustment - A number to add to the parameter's 686 /// scope index; can be negative 687 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 688 int indexAdjustment, 689 Optional<unsigned> NumExpansions, 690 bool ExpectParameterPack); 691 692 /// Transform the body of a lambda-expression. 693 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 694 /// Alternative implementation of TransformLambdaBody that skips transforming 695 /// the body. 696 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 697 698 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 699 700 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 701 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 702 703 TemplateParameterList *TransformTemplateParameterList( 704 TemplateParameterList *TPL) { 705 return TPL; 706 } 707 708 ExprResult TransformAddressOfOperand(Expr *E); 709 710 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 711 bool IsAddressOfOperand, 712 TypeSourceInfo **RecoveryTSI); 713 714 ExprResult TransformParenDependentScopeDeclRefExpr( 715 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 716 TypeSourceInfo **RecoveryTSI); 717 718 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 719 720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 721 // amount of stack usage with clang. 722 #define STMT(Node, Parent) \ 723 LLVM_ATTRIBUTE_NOINLINE \ 724 StmtResult Transform##Node(Node *S); 725 #define VALUESTMT(Node, Parent) \ 726 LLVM_ATTRIBUTE_NOINLINE \ 727 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 728 #define EXPR(Node, Parent) \ 729 LLVM_ATTRIBUTE_NOINLINE \ 730 ExprResult Transform##Node(Node *E); 731 #define ABSTRACT_STMT(Stmt) 732 #include "clang/AST/StmtNodes.inc" 733 734 #define GEN_CLANG_CLAUSE_CLASS 735 #define CLAUSE_CLASS(Enum, Str, Class) \ 736 LLVM_ATTRIBUTE_NOINLINE \ 737 OMPClause *Transform##Class(Class *S); 738 #include "llvm/Frontend/OpenMP/OMP.inc" 739 740 /// Build a new qualified type given its unqualified type and type location. 741 /// 742 /// By default, this routine adds type qualifiers only to types that can 743 /// have qualifiers, and silently suppresses those qualifiers that are not 744 /// permitted. Subclasses may override this routine to provide different 745 /// behavior. 746 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 747 748 /// Build a new pointer type given its pointee type. 749 /// 750 /// By default, performs semantic analysis when building the pointer type. 751 /// Subclasses may override this routine to provide different behavior. 752 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 753 754 /// Build a new block pointer type given its pointee type. 755 /// 756 /// By default, performs semantic analysis when building the block pointer 757 /// type. Subclasses may override this routine to provide different behavior. 758 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 759 760 /// Build a new reference type given the type it references. 761 /// 762 /// By default, performs semantic analysis when building the 763 /// reference type. Subclasses may override this routine to provide 764 /// different behavior. 765 /// 766 /// \param LValue whether the type was written with an lvalue sigil 767 /// or an rvalue sigil. 768 QualType RebuildReferenceType(QualType ReferentType, 769 bool LValue, 770 SourceLocation Sigil); 771 772 /// Build a new member pointer type given the pointee type and the 773 /// class type it refers into. 774 /// 775 /// By default, performs semantic analysis when building the member pointer 776 /// type. Subclasses may override this routine to provide different behavior. 777 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 778 SourceLocation Sigil); 779 780 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 781 SourceLocation ProtocolLAngleLoc, 782 ArrayRef<ObjCProtocolDecl *> Protocols, 783 ArrayRef<SourceLocation> ProtocolLocs, 784 SourceLocation ProtocolRAngleLoc); 785 786 /// Build an Objective-C object type. 787 /// 788 /// By default, performs semantic analysis when building the object type. 789 /// Subclasses may override this routine to provide different behavior. 790 QualType RebuildObjCObjectType(QualType BaseType, 791 SourceLocation Loc, 792 SourceLocation TypeArgsLAngleLoc, 793 ArrayRef<TypeSourceInfo *> TypeArgs, 794 SourceLocation TypeArgsRAngleLoc, 795 SourceLocation ProtocolLAngleLoc, 796 ArrayRef<ObjCProtocolDecl *> Protocols, 797 ArrayRef<SourceLocation> ProtocolLocs, 798 SourceLocation ProtocolRAngleLoc); 799 800 /// Build a new Objective-C object pointer type given the pointee type. 801 /// 802 /// By default, directly builds the pointer type, with no additional semantic 803 /// analysis. 804 QualType RebuildObjCObjectPointerType(QualType PointeeType, 805 SourceLocation Star); 806 807 /// Build a new array type given the element type, size 808 /// modifier, size of the array (if known), size expression, and index type 809 /// qualifiers. 810 /// 811 /// By default, performs semantic analysis when building the array type. 812 /// Subclasses may override this routine to provide different behavior. 813 /// Also by default, all of the other Rebuild*Array 814 QualType RebuildArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 const llvm::APInt *Size, 817 Expr *SizeExpr, 818 unsigned IndexTypeQuals, 819 SourceRange BracketsRange); 820 821 /// Build a new constant array type given the element type, size 822 /// modifier, (known) size of the array, and index type qualifiers. 823 /// 824 /// By default, performs semantic analysis when building the array type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildConstantArrayType(QualType ElementType, 827 ArrayType::ArraySizeModifier SizeMod, 828 const llvm::APInt &Size, 829 Expr *SizeExpr, 830 unsigned IndexTypeQuals, 831 SourceRange BracketsRange); 832 833 /// Build a new incomplete array type given the element type, size 834 /// modifier, and index type qualifiers. 835 /// 836 /// By default, performs semantic analysis when building the array type. 837 /// Subclasses may override this routine to provide different behavior. 838 QualType RebuildIncompleteArrayType(QualType ElementType, 839 ArrayType::ArraySizeModifier SizeMod, 840 unsigned IndexTypeQuals, 841 SourceRange BracketsRange); 842 843 /// Build a new variable-length array type given the element type, 844 /// size modifier, size expression, and index type qualifiers. 845 /// 846 /// By default, performs semantic analysis when building the array type. 847 /// Subclasses may override this routine to provide different behavior. 848 QualType RebuildVariableArrayType(QualType ElementType, 849 ArrayType::ArraySizeModifier SizeMod, 850 Expr *SizeExpr, 851 unsigned IndexTypeQuals, 852 SourceRange BracketsRange); 853 854 /// Build a new dependent-sized array type given the element type, 855 /// size modifier, size expression, and index type qualifiers. 856 /// 857 /// By default, performs semantic analysis when building the array type. 858 /// Subclasses may override this routine to provide different behavior. 859 QualType RebuildDependentSizedArrayType(QualType ElementType, 860 ArrayType::ArraySizeModifier SizeMod, 861 Expr *SizeExpr, 862 unsigned IndexTypeQuals, 863 SourceRange BracketsRange); 864 865 /// Build a new vector type given the element type and 866 /// number of elements. 867 /// 868 /// By default, performs semantic analysis when building the vector type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 871 VectorType::VectorKind VecKind); 872 873 /// Build a new potentially dependently-sized extended vector type 874 /// given the element type and number of elements. 875 /// 876 /// By default, performs semantic analysis when building the vector type. 877 /// Subclasses may override this routine to provide different behavior. 878 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 879 SourceLocation AttributeLoc, 880 VectorType::VectorKind); 881 882 /// Build a new extended vector type given the element type and 883 /// number of elements. 884 /// 885 /// By default, performs semantic analysis when building the vector type. 886 /// Subclasses may override this routine to provide different behavior. 887 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 888 SourceLocation AttributeLoc); 889 890 /// Build a new potentially dependently-sized extended vector type 891 /// given the element type and number of elements. 892 /// 893 /// By default, performs semantic analysis when building the vector type. 894 /// Subclasses may override this routine to provide different behavior. 895 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 896 Expr *SizeExpr, 897 SourceLocation AttributeLoc); 898 899 /// Build a new matrix type given the element type and dimensions. 900 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 901 unsigned NumColumns); 902 903 /// Build a new matrix type given the type and dependently-defined 904 /// dimensions. 905 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 906 Expr *ColumnExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new DependentAddressSpaceType or return the pointee 910 /// type variable with the correct address space (retrieved from 911 /// AddrSpaceExpr) applied to it. The former will be returned in cases 912 /// where the address space remains dependent. 913 /// 914 /// By default, performs semantic analysis when building the type with address 915 /// space applied. Subclasses may override this routine to provide different 916 /// behavior. 917 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 918 Expr *AddrSpaceExpr, 919 SourceLocation AttributeLoc); 920 921 /// Build a new function type. 922 /// 923 /// By default, performs semantic analysis when building the function type. 924 /// Subclasses may override this routine to provide different behavior. 925 QualType RebuildFunctionProtoType(QualType T, 926 MutableArrayRef<QualType> ParamTypes, 927 const FunctionProtoType::ExtProtoInfo &EPI); 928 929 /// Build a new unprototyped function type. 930 QualType RebuildFunctionNoProtoType(QualType ResultType); 931 932 /// Rebuild an unresolved typename type, given the decl that 933 /// the UnresolvedUsingTypenameDecl was transformed to. 934 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 935 936 /// Build a new type found via an alias. 937 QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) { 938 return SemaRef.Context.getUsingType(Found, Underlying); 939 } 940 941 /// Build a new typedef type. 942 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 943 return SemaRef.Context.getTypeDeclType(Typedef); 944 } 945 946 /// Build a new MacroDefined type. 947 QualType RebuildMacroQualifiedType(QualType T, 948 const IdentifierInfo *MacroII) { 949 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 950 } 951 952 /// Build a new class/struct/union type. 953 QualType RebuildRecordType(RecordDecl *Record) { 954 return SemaRef.Context.getTypeDeclType(Record); 955 } 956 957 /// Build a new Enum type. 958 QualType RebuildEnumType(EnumDecl *Enum) { 959 return SemaRef.Context.getTypeDeclType(Enum); 960 } 961 962 /// Build a new typeof(expr) type. 963 /// 964 /// By default, performs semantic analysis when building the typeof type. 965 /// Subclasses may override this routine to provide different behavior. 966 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 967 968 /// Build a new typeof(type) type. 969 /// 970 /// By default, builds a new TypeOfType with the given underlying type. 971 QualType RebuildTypeOfType(QualType Underlying); 972 973 /// Build a new unary transform type. 974 QualType RebuildUnaryTransformType(QualType BaseType, 975 UnaryTransformType::UTTKind UKind, 976 SourceLocation Loc); 977 978 /// Build a new C++11 decltype type. 979 /// 980 /// By default, performs semantic analysis when building the decltype type. 981 /// Subclasses may override this routine to provide different behavior. 982 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 983 984 /// Build a new C++11 auto type. 985 /// 986 /// By default, builds a new AutoType with the given deduced type. 987 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 988 ConceptDecl *TypeConstraintConcept, 989 ArrayRef<TemplateArgument> TypeConstraintArgs) { 990 // Note, IsDependent is always false here: we implicitly convert an 'auto' 991 // which has been deduced to a dependent type into an undeduced 'auto', so 992 // that we'll retry deduction after the transformation. 993 return SemaRef.Context.getAutoType(Deduced, Keyword, 994 /*IsDependent*/ false, /*IsPack=*/false, 995 TypeConstraintConcept, 996 TypeConstraintArgs); 997 } 998 999 /// By default, builds a new DeducedTemplateSpecializationType with the given 1000 /// deduced type. 1001 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 1002 QualType Deduced) { 1003 return SemaRef.Context.getDeducedTemplateSpecializationType( 1004 Template, Deduced, /*IsDependent*/ false); 1005 } 1006 1007 /// Build a new template specialization type. 1008 /// 1009 /// By default, performs semantic analysis when building the template 1010 /// specialization type. Subclasses may override this routine to provide 1011 /// different behavior. 1012 QualType RebuildTemplateSpecializationType(TemplateName Template, 1013 SourceLocation TemplateLoc, 1014 TemplateArgumentListInfo &Args); 1015 1016 /// Build a new parenthesized type. 1017 /// 1018 /// By default, builds a new ParenType type from the inner type. 1019 /// Subclasses may override this routine to provide different behavior. 1020 QualType RebuildParenType(QualType InnerType) { 1021 return SemaRef.BuildParenType(InnerType); 1022 } 1023 1024 /// Build a new qualified name type. 1025 /// 1026 /// By default, builds a new ElaboratedType type from the keyword, 1027 /// the nested-name-specifier and the named type. 1028 /// Subclasses may override this routine to provide different behavior. 1029 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1030 ElaboratedTypeKeyword Keyword, 1031 NestedNameSpecifierLoc QualifierLoc, 1032 QualType Named) { 1033 return SemaRef.Context.getElaboratedType(Keyword, 1034 QualifierLoc.getNestedNameSpecifier(), 1035 Named); 1036 } 1037 1038 /// Build a new typename type that refers to a template-id. 1039 /// 1040 /// By default, builds a new DependentNameType type from the 1041 /// nested-name-specifier and the given type. Subclasses may override 1042 /// this routine to provide different behavior. 1043 QualType RebuildDependentTemplateSpecializationType( 1044 ElaboratedTypeKeyword Keyword, 1045 NestedNameSpecifierLoc QualifierLoc, 1046 SourceLocation TemplateKWLoc, 1047 const IdentifierInfo *Name, 1048 SourceLocation NameLoc, 1049 TemplateArgumentListInfo &Args, 1050 bool AllowInjectedClassName) { 1051 // Rebuild the template name. 1052 // TODO: avoid TemplateName abstraction 1053 CXXScopeSpec SS; 1054 SS.Adopt(QualifierLoc); 1055 TemplateName InstName = getDerived().RebuildTemplateName( 1056 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1057 AllowInjectedClassName); 1058 1059 if (InstName.isNull()) 1060 return QualType(); 1061 1062 // If it's still dependent, make a dependent specialization. 1063 if (InstName.getAsDependentTemplateName()) 1064 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1065 QualifierLoc.getNestedNameSpecifier(), 1066 Name, 1067 Args); 1068 1069 // Otherwise, make an elaborated type wrapping a non-dependent 1070 // specialization. 1071 QualType T = 1072 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1073 if (T.isNull()) return QualType(); 1074 1075 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1076 return T; 1077 1078 return SemaRef.Context.getElaboratedType(Keyword, 1079 QualifierLoc.getNestedNameSpecifier(), 1080 T); 1081 } 1082 1083 /// Build a new typename type that refers to an identifier. 1084 /// 1085 /// By default, performs semantic analysis when building the typename type 1086 /// (or elaborated type). Subclasses may override this routine to provide 1087 /// different behavior. 1088 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1089 SourceLocation KeywordLoc, 1090 NestedNameSpecifierLoc QualifierLoc, 1091 const IdentifierInfo *Id, 1092 SourceLocation IdLoc, 1093 bool DeducedTSTContext) { 1094 CXXScopeSpec SS; 1095 SS.Adopt(QualifierLoc); 1096 1097 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1098 // If the name is still dependent, just build a new dependent name type. 1099 if (!SemaRef.computeDeclContext(SS)) 1100 return SemaRef.Context.getDependentNameType(Keyword, 1101 QualifierLoc.getNestedNameSpecifier(), 1102 Id); 1103 } 1104 1105 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1106 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1107 *Id, IdLoc, DeducedTSTContext); 1108 } 1109 1110 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1111 1112 // We had a dependent elaborated-type-specifier that has been transformed 1113 // into a non-dependent elaborated-type-specifier. Find the tag we're 1114 // referring to. 1115 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1116 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1117 if (!DC) 1118 return QualType(); 1119 1120 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1121 return QualType(); 1122 1123 TagDecl *Tag = nullptr; 1124 SemaRef.LookupQualifiedName(Result, DC); 1125 switch (Result.getResultKind()) { 1126 case LookupResult::NotFound: 1127 case LookupResult::NotFoundInCurrentInstantiation: 1128 break; 1129 1130 case LookupResult::Found: 1131 Tag = Result.getAsSingle<TagDecl>(); 1132 break; 1133 1134 case LookupResult::FoundOverloaded: 1135 case LookupResult::FoundUnresolvedValue: 1136 llvm_unreachable("Tag lookup cannot find non-tags"); 1137 1138 case LookupResult::Ambiguous: 1139 // Let the LookupResult structure handle ambiguities. 1140 return QualType(); 1141 } 1142 1143 if (!Tag) { 1144 // Check where the name exists but isn't a tag type and use that to emit 1145 // better diagnostics. 1146 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1147 SemaRef.LookupQualifiedName(Result, DC); 1148 switch (Result.getResultKind()) { 1149 case LookupResult::Found: 1150 case LookupResult::FoundOverloaded: 1151 case LookupResult::FoundUnresolvedValue: { 1152 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1153 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1154 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1155 << NTK << Kind; 1156 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1157 break; 1158 } 1159 default: 1160 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1161 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1162 break; 1163 } 1164 return QualType(); 1165 } 1166 1167 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1168 IdLoc, Id)) { 1169 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1170 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1171 return QualType(); 1172 } 1173 1174 // Build the elaborated-type-specifier type. 1175 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1176 return SemaRef.Context.getElaboratedType(Keyword, 1177 QualifierLoc.getNestedNameSpecifier(), 1178 T); 1179 } 1180 1181 /// Build a new pack expansion type. 1182 /// 1183 /// By default, builds a new PackExpansionType type from the given pattern. 1184 /// Subclasses may override this routine to provide different behavior. 1185 QualType RebuildPackExpansionType(QualType Pattern, 1186 SourceRange PatternRange, 1187 SourceLocation EllipsisLoc, 1188 Optional<unsigned> NumExpansions) { 1189 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1190 NumExpansions); 1191 } 1192 1193 /// Build a new atomic type given its value type. 1194 /// 1195 /// By default, performs semantic analysis when building the atomic type. 1196 /// Subclasses may override this routine to provide different behavior. 1197 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1198 1199 /// Build a new pipe type given its value type. 1200 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1201 bool isReadPipe); 1202 1203 /// Build a bit-precise int given its value type. 1204 QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits, 1205 SourceLocation Loc); 1206 1207 /// Build a dependent bit-precise int given its value type. 1208 QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr, 1209 SourceLocation Loc); 1210 1211 /// Build a new template name given a nested name specifier, a flag 1212 /// indicating whether the "template" keyword was provided, and the template 1213 /// that the template name refers to. 1214 /// 1215 /// By default, builds the new template name directly. Subclasses may override 1216 /// this routine to provide different behavior. 1217 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1218 bool TemplateKW, 1219 TemplateDecl *Template); 1220 1221 /// Build a new template name given a nested name specifier and the 1222 /// name that is referred to as a template. 1223 /// 1224 /// By default, performs semantic analysis to determine whether the name can 1225 /// be resolved to a specific template, then builds the appropriate kind of 1226 /// template name. Subclasses may override this routine to provide different 1227 /// behavior. 1228 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1229 SourceLocation TemplateKWLoc, 1230 const IdentifierInfo &Name, 1231 SourceLocation NameLoc, QualType ObjectType, 1232 NamedDecl *FirstQualifierInScope, 1233 bool AllowInjectedClassName); 1234 1235 /// Build a new template name given a nested name specifier and the 1236 /// overloaded operator name that is referred to as a template. 1237 /// 1238 /// By default, performs semantic analysis to determine whether the name can 1239 /// be resolved to a specific template, then builds the appropriate kind of 1240 /// template name. Subclasses may override this routine to provide different 1241 /// behavior. 1242 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1243 SourceLocation TemplateKWLoc, 1244 OverloadedOperatorKind Operator, 1245 SourceLocation NameLoc, QualType ObjectType, 1246 bool AllowInjectedClassName); 1247 1248 /// Build a new template name given a template template parameter pack 1249 /// and the 1250 /// 1251 /// By default, performs semantic analysis to determine whether the name can 1252 /// be resolved to a specific template, then builds the appropriate kind of 1253 /// template name. Subclasses may override this routine to provide different 1254 /// behavior. 1255 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1256 const TemplateArgument &ArgPack) { 1257 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1258 } 1259 1260 /// Build a new compound statement. 1261 /// 1262 /// By default, performs semantic analysis to build the new statement. 1263 /// Subclasses may override this routine to provide different behavior. 1264 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1265 MultiStmtArg Statements, 1266 SourceLocation RBraceLoc, 1267 bool IsStmtExpr) { 1268 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1269 IsStmtExpr); 1270 } 1271 1272 /// Build a new case 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 RebuildCaseStmt(SourceLocation CaseLoc, 1277 Expr *LHS, 1278 SourceLocation EllipsisLoc, 1279 Expr *RHS, 1280 SourceLocation ColonLoc) { 1281 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1282 ColonLoc); 1283 } 1284 1285 /// Attach the body to a new case statement. 1286 /// 1287 /// By default, performs semantic analysis to build the new statement. 1288 /// Subclasses may override this routine to provide different behavior. 1289 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1290 getSema().ActOnCaseStmtBody(S, Body); 1291 return S; 1292 } 1293 1294 /// Build a new default statement. 1295 /// 1296 /// By default, performs semantic analysis to build the new statement. 1297 /// Subclasses may override this routine to provide different behavior. 1298 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1299 SourceLocation ColonLoc, 1300 Stmt *SubStmt) { 1301 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1302 /*CurScope=*/nullptr); 1303 } 1304 1305 /// Build a new label statement. 1306 /// 1307 /// By default, performs semantic analysis to build the new statement. 1308 /// Subclasses may override this routine to provide different behavior. 1309 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1310 SourceLocation ColonLoc, Stmt *SubStmt) { 1311 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1312 } 1313 1314 /// Build a new attributed statement. 1315 /// 1316 /// By default, performs semantic analysis to build the new statement. 1317 /// Subclasses may override this routine to provide different behavior. 1318 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1319 ArrayRef<const Attr *> Attrs, 1320 Stmt *SubStmt) { 1321 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1322 } 1323 1324 /// Build a new "if" statement. 1325 /// 1326 /// By default, performs semantic analysis to build the new statement. 1327 /// Subclasses may override this routine to provide different behavior. 1328 StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind, 1329 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1330 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1331 SourceLocation ElseLoc, Stmt *Else) { 1332 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1333 Then, ElseLoc, Else); 1334 } 1335 1336 /// Start building a new switch statement. 1337 /// 1338 /// By default, performs semantic analysis to build the new statement. 1339 /// Subclasses may override this routine to provide different behavior. 1340 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1341 SourceLocation LParenLoc, Stmt *Init, 1342 Sema::ConditionResult Cond, 1343 SourceLocation RParenLoc) { 1344 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1345 RParenLoc); 1346 } 1347 1348 /// Attach the body to the switch statement. 1349 /// 1350 /// By default, performs semantic analysis to build the new statement. 1351 /// Subclasses may override this routine to provide different behavior. 1352 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1353 Stmt *Switch, Stmt *Body) { 1354 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1355 } 1356 1357 /// Build a new while statement. 1358 /// 1359 /// By default, performs semantic analysis to build the new statement. 1360 /// Subclasses may override this routine to provide different behavior. 1361 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1362 Sema::ConditionResult Cond, 1363 SourceLocation RParenLoc, Stmt *Body) { 1364 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1365 } 1366 1367 /// Build a new do-while statement. 1368 /// 1369 /// By default, performs semantic analysis to build the new statement. 1370 /// Subclasses may override this routine to provide different behavior. 1371 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1372 SourceLocation WhileLoc, SourceLocation LParenLoc, 1373 Expr *Cond, SourceLocation RParenLoc) { 1374 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1375 Cond, RParenLoc); 1376 } 1377 1378 /// Build a new for statement. 1379 /// 1380 /// By default, performs semantic analysis to build the new statement. 1381 /// Subclasses may override this routine to provide different behavior. 1382 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1383 Stmt *Init, Sema::ConditionResult Cond, 1384 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1385 Stmt *Body) { 1386 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1387 Inc, RParenLoc, Body); 1388 } 1389 1390 /// Build a new goto statement. 1391 /// 1392 /// By default, performs semantic analysis to build the new statement. 1393 /// Subclasses may override this routine to provide different behavior. 1394 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1395 LabelDecl *Label) { 1396 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1397 } 1398 1399 /// Build a new indirect goto statement. 1400 /// 1401 /// By default, performs semantic analysis to build the new statement. 1402 /// Subclasses may override this routine to provide different behavior. 1403 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1404 SourceLocation StarLoc, 1405 Expr *Target) { 1406 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1407 } 1408 1409 /// Build a new return statement. 1410 /// 1411 /// By default, performs semantic analysis to build the new statement. 1412 /// Subclasses may override this routine to provide different behavior. 1413 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1414 return getSema().BuildReturnStmt(ReturnLoc, Result); 1415 } 1416 1417 /// Build a new declaration statement. 1418 /// 1419 /// By default, performs semantic analysis to build the new statement. 1420 /// Subclasses may override this routine to provide different behavior. 1421 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1422 SourceLocation StartLoc, SourceLocation EndLoc) { 1423 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1424 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1425 } 1426 1427 /// Build a new inline asm statement. 1428 /// 1429 /// By default, performs semantic analysis to build the new statement. 1430 /// Subclasses may override this routine to provide different behavior. 1431 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1432 bool IsVolatile, unsigned NumOutputs, 1433 unsigned NumInputs, IdentifierInfo **Names, 1434 MultiExprArg Constraints, MultiExprArg Exprs, 1435 Expr *AsmString, MultiExprArg Clobbers, 1436 unsigned NumLabels, 1437 SourceLocation RParenLoc) { 1438 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1439 NumInputs, Names, Constraints, Exprs, 1440 AsmString, Clobbers, NumLabels, RParenLoc); 1441 } 1442 1443 /// Build a new MS style inline asm statement. 1444 /// 1445 /// By default, performs semantic analysis to build the new statement. 1446 /// Subclasses may override this routine to provide different behavior. 1447 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1448 ArrayRef<Token> AsmToks, 1449 StringRef AsmString, 1450 unsigned NumOutputs, unsigned NumInputs, 1451 ArrayRef<StringRef> Constraints, 1452 ArrayRef<StringRef> Clobbers, 1453 ArrayRef<Expr*> Exprs, 1454 SourceLocation EndLoc) { 1455 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1456 NumOutputs, NumInputs, 1457 Constraints, Clobbers, Exprs, EndLoc); 1458 } 1459 1460 /// Build a new co_return statement. 1461 /// 1462 /// By default, performs semantic analysis to build the new statement. 1463 /// Subclasses may override this routine to provide different behavior. 1464 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1465 bool IsImplicit) { 1466 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1467 } 1468 1469 /// Build a new co_await expression. 1470 /// 1471 /// By default, performs semantic analysis to build the new expression. 1472 /// Subclasses may override this routine to provide different behavior. 1473 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1474 bool IsImplicit) { 1475 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1476 } 1477 1478 /// Build a new co_await expression. 1479 /// 1480 /// By default, performs semantic analysis to build the new expression. 1481 /// Subclasses may override this routine to provide different behavior. 1482 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1483 Expr *Result, 1484 UnresolvedLookupExpr *Lookup) { 1485 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1486 } 1487 1488 /// Build a new co_yield expression. 1489 /// 1490 /// By default, performs semantic analysis to build the new expression. 1491 /// Subclasses may override this routine to provide different behavior. 1492 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1493 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1494 } 1495 1496 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1497 return getSema().BuildCoroutineBodyStmt(Args); 1498 } 1499 1500 /// Build a new Objective-C \@try statement. 1501 /// 1502 /// By default, performs semantic analysis to build the new statement. 1503 /// Subclasses may override this routine to provide different behavior. 1504 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1505 Stmt *TryBody, 1506 MultiStmtArg CatchStmts, 1507 Stmt *Finally) { 1508 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1509 Finally); 1510 } 1511 1512 /// Rebuild an Objective-C exception declaration. 1513 /// 1514 /// By default, performs semantic analysis to build the new declaration. 1515 /// Subclasses may override this routine to provide different behavior. 1516 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1517 TypeSourceInfo *TInfo, QualType T) { 1518 return getSema().BuildObjCExceptionDecl(TInfo, T, 1519 ExceptionDecl->getInnerLocStart(), 1520 ExceptionDecl->getLocation(), 1521 ExceptionDecl->getIdentifier()); 1522 } 1523 1524 /// Build a new Objective-C \@catch statement. 1525 /// 1526 /// By default, performs semantic analysis to build the new statement. 1527 /// Subclasses may override this routine to provide different behavior. 1528 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1529 SourceLocation RParenLoc, 1530 VarDecl *Var, 1531 Stmt *Body) { 1532 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1533 Var, Body); 1534 } 1535 1536 /// Build a new Objective-C \@finally statement. 1537 /// 1538 /// By default, performs semantic analysis to build the new statement. 1539 /// Subclasses may override this routine to provide different behavior. 1540 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1541 Stmt *Body) { 1542 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1543 } 1544 1545 /// Build a new Objective-C \@throw statement. 1546 /// 1547 /// By default, performs semantic analysis to build the new statement. 1548 /// Subclasses may override this routine to provide different behavior. 1549 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1550 Expr *Operand) { 1551 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1552 } 1553 1554 /// Build a new OpenMP Canonical loop. 1555 /// 1556 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1557 /// OMPCanonicalLoop. 1558 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1559 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1560 } 1561 1562 /// Build a new OpenMP executable directive. 1563 /// 1564 /// By default, performs semantic analysis to build the new statement. 1565 /// Subclasses may override this routine to provide different behavior. 1566 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1567 DeclarationNameInfo DirName, 1568 OpenMPDirectiveKind CancelRegion, 1569 ArrayRef<OMPClause *> Clauses, 1570 Stmt *AStmt, SourceLocation StartLoc, 1571 SourceLocation EndLoc) { 1572 return getSema().ActOnOpenMPExecutableDirective( 1573 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1574 } 1575 1576 /// Build a new OpenMP 'if' clause. 1577 /// 1578 /// By default, performs semantic analysis to build the new OpenMP clause. 1579 /// Subclasses may override this routine to provide different behavior. 1580 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1581 Expr *Condition, SourceLocation StartLoc, 1582 SourceLocation LParenLoc, 1583 SourceLocation NameModifierLoc, 1584 SourceLocation ColonLoc, 1585 SourceLocation EndLoc) { 1586 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1587 LParenLoc, NameModifierLoc, ColonLoc, 1588 EndLoc); 1589 } 1590 1591 /// Build a new OpenMP 'final' clause. 1592 /// 1593 /// By default, performs semantic analysis to build the new OpenMP clause. 1594 /// Subclasses may override this routine to provide different behavior. 1595 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1596 SourceLocation LParenLoc, 1597 SourceLocation EndLoc) { 1598 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1599 EndLoc); 1600 } 1601 1602 /// Build a new OpenMP 'num_threads' clause. 1603 /// 1604 /// By default, performs semantic analysis to build the new OpenMP clause. 1605 /// Subclasses may override this routine to provide different behavior. 1606 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1607 SourceLocation StartLoc, 1608 SourceLocation LParenLoc, 1609 SourceLocation EndLoc) { 1610 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1611 LParenLoc, EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'safelen' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1622 } 1623 1624 /// Build a new OpenMP 'simdlen' clause. 1625 /// 1626 /// By default, performs semantic analysis to build the new OpenMP clause. 1627 /// Subclasses may override this routine to provide different behavior. 1628 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1629 SourceLocation LParenLoc, 1630 SourceLocation EndLoc) { 1631 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1632 } 1633 1634 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1635 SourceLocation StartLoc, 1636 SourceLocation LParenLoc, 1637 SourceLocation EndLoc) { 1638 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1639 } 1640 1641 /// Build a new OpenMP 'full' clause. 1642 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1643 SourceLocation EndLoc) { 1644 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1645 } 1646 1647 /// Build a new OpenMP 'partial' clause. 1648 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1649 SourceLocation LParenLoc, 1650 SourceLocation EndLoc) { 1651 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1652 EndLoc); 1653 } 1654 1655 /// Build a new OpenMP 'allocator' clause. 1656 /// 1657 /// By default, performs semantic analysis to build the new OpenMP clause. 1658 /// Subclasses may override this routine to provide different behavior. 1659 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 SourceLocation EndLoc) { 1662 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1663 } 1664 1665 /// Build a new OpenMP 'collapse' clause. 1666 /// 1667 /// By default, performs semantic analysis to build the new OpenMP clause. 1668 /// Subclasses may override this routine to provide different behavior. 1669 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1670 SourceLocation LParenLoc, 1671 SourceLocation EndLoc) { 1672 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1673 EndLoc); 1674 } 1675 1676 /// Build a new OpenMP 'default' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new OpenMP clause. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1681 SourceLocation StartLoc, 1682 SourceLocation LParenLoc, 1683 SourceLocation EndLoc) { 1684 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1685 StartLoc, LParenLoc, EndLoc); 1686 } 1687 1688 /// Build a new OpenMP 'proc_bind' clause. 1689 /// 1690 /// By default, performs semantic analysis to build the new OpenMP clause. 1691 /// Subclasses may override this routine to provide different behavior. 1692 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1693 SourceLocation KindKwLoc, 1694 SourceLocation StartLoc, 1695 SourceLocation LParenLoc, 1696 SourceLocation EndLoc) { 1697 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1698 StartLoc, LParenLoc, EndLoc); 1699 } 1700 1701 /// Build a new OpenMP 'schedule' clause. 1702 /// 1703 /// By default, performs semantic analysis to build the new OpenMP clause. 1704 /// Subclasses may override this routine to provide different behavior. 1705 OMPClause *RebuildOMPScheduleClause( 1706 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1707 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1708 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1709 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1710 return getSema().ActOnOpenMPScheduleClause( 1711 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1712 CommaLoc, EndLoc); 1713 } 1714 1715 /// Build a new OpenMP 'ordered' clause. 1716 /// 1717 /// By default, performs semantic analysis to build the new OpenMP clause. 1718 /// Subclasses may override this routine to provide different behavior. 1719 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1720 SourceLocation EndLoc, 1721 SourceLocation LParenLoc, Expr *Num) { 1722 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1723 } 1724 1725 /// Build a new OpenMP 'private' clause. 1726 /// 1727 /// By default, performs semantic analysis to build the new OpenMP clause. 1728 /// Subclasses may override this routine to provide different behavior. 1729 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1730 SourceLocation StartLoc, 1731 SourceLocation LParenLoc, 1732 SourceLocation EndLoc) { 1733 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1734 EndLoc); 1735 } 1736 1737 /// Build a new OpenMP 'firstprivate' clause. 1738 /// 1739 /// By default, performs semantic analysis to build the new OpenMP clause. 1740 /// Subclasses may override this routine to provide different behavior. 1741 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1742 SourceLocation StartLoc, 1743 SourceLocation LParenLoc, 1744 SourceLocation EndLoc) { 1745 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1746 EndLoc); 1747 } 1748 1749 /// Build a new OpenMP 'lastprivate' clause. 1750 /// 1751 /// By default, performs semantic analysis to build the new OpenMP clause. 1752 /// Subclasses may override this routine to provide different behavior. 1753 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1754 OpenMPLastprivateModifier LPKind, 1755 SourceLocation LPKindLoc, 1756 SourceLocation ColonLoc, 1757 SourceLocation StartLoc, 1758 SourceLocation LParenLoc, 1759 SourceLocation EndLoc) { 1760 return getSema().ActOnOpenMPLastprivateClause( 1761 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1762 } 1763 1764 /// Build a new OpenMP 'shared' clause. 1765 /// 1766 /// By default, performs semantic analysis to build the new OpenMP clause. 1767 /// Subclasses may override this routine to provide different behavior. 1768 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1769 SourceLocation StartLoc, 1770 SourceLocation LParenLoc, 1771 SourceLocation EndLoc) { 1772 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1773 EndLoc); 1774 } 1775 1776 /// Build a new OpenMP 'reduction' clause. 1777 /// 1778 /// By default, performs semantic analysis to build the new statement. 1779 /// Subclasses may override this routine to provide different behavior. 1780 OMPClause *RebuildOMPReductionClause( 1781 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1782 SourceLocation StartLoc, SourceLocation LParenLoc, 1783 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1784 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1785 const DeclarationNameInfo &ReductionId, 1786 ArrayRef<Expr *> UnresolvedReductions) { 1787 return getSema().ActOnOpenMPReductionClause( 1788 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1789 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1790 } 1791 1792 /// Build a new OpenMP 'task_reduction' 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 *RebuildOMPTaskReductionClause( 1797 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1798 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1799 CXXScopeSpec &ReductionIdScopeSpec, 1800 const DeclarationNameInfo &ReductionId, 1801 ArrayRef<Expr *> UnresolvedReductions) { 1802 return getSema().ActOnOpenMPTaskReductionClause( 1803 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1804 ReductionId, UnresolvedReductions); 1805 } 1806 1807 /// Build a new OpenMP 'in_reduction' clause. 1808 /// 1809 /// By default, performs semantic analysis to build the new statement. 1810 /// Subclasses may override this routine to provide different behavior. 1811 OMPClause * 1812 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1813 SourceLocation LParenLoc, SourceLocation ColonLoc, 1814 SourceLocation EndLoc, 1815 CXXScopeSpec &ReductionIdScopeSpec, 1816 const DeclarationNameInfo &ReductionId, 1817 ArrayRef<Expr *> UnresolvedReductions) { 1818 return getSema().ActOnOpenMPInReductionClause( 1819 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1820 ReductionId, UnresolvedReductions); 1821 } 1822 1823 /// Build a new OpenMP 'linear' clause. 1824 /// 1825 /// By default, performs semantic analysis to build the new OpenMP clause. 1826 /// Subclasses may override this routine to provide different behavior. 1827 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1828 SourceLocation StartLoc, 1829 SourceLocation LParenLoc, 1830 OpenMPLinearClauseKind Modifier, 1831 SourceLocation ModifierLoc, 1832 SourceLocation ColonLoc, 1833 SourceLocation EndLoc) { 1834 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1835 Modifier, ModifierLoc, ColonLoc, 1836 EndLoc); 1837 } 1838 1839 /// Build a new OpenMP 'aligned' clause. 1840 /// 1841 /// By default, performs semantic analysis to build the new OpenMP clause. 1842 /// Subclasses may override this routine to provide different behavior. 1843 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1844 SourceLocation StartLoc, 1845 SourceLocation LParenLoc, 1846 SourceLocation ColonLoc, 1847 SourceLocation EndLoc) { 1848 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1849 LParenLoc, ColonLoc, EndLoc); 1850 } 1851 1852 /// Build a new OpenMP 'copyin' clause. 1853 /// 1854 /// By default, performs semantic analysis to build the new OpenMP clause. 1855 /// Subclasses may override this routine to provide different behavior. 1856 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1857 SourceLocation StartLoc, 1858 SourceLocation LParenLoc, 1859 SourceLocation EndLoc) { 1860 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1861 EndLoc); 1862 } 1863 1864 /// Build a new OpenMP 'copyprivate' clause. 1865 /// 1866 /// By default, performs semantic analysis to build the new OpenMP clause. 1867 /// Subclasses may override this routine to provide different behavior. 1868 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1869 SourceLocation StartLoc, 1870 SourceLocation LParenLoc, 1871 SourceLocation EndLoc) { 1872 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1873 EndLoc); 1874 } 1875 1876 /// Build a new OpenMP 'flush' pseudo clause. 1877 /// 1878 /// By default, performs semantic analysis to build the new OpenMP clause. 1879 /// Subclasses may override this routine to provide different behavior. 1880 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1881 SourceLocation StartLoc, 1882 SourceLocation LParenLoc, 1883 SourceLocation EndLoc) { 1884 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1885 EndLoc); 1886 } 1887 1888 /// Build a new OpenMP 'depobj' pseudo clause. 1889 /// 1890 /// By default, performs semantic analysis to build the new OpenMP clause. 1891 /// Subclasses may override this routine to provide different behavior. 1892 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1893 SourceLocation LParenLoc, 1894 SourceLocation EndLoc) { 1895 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1896 EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'depend' pseudo clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new OpenMP clause. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause * 1904 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1905 SourceLocation DepLoc, SourceLocation ColonLoc, 1906 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1907 SourceLocation LParenLoc, SourceLocation EndLoc) { 1908 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1909 ColonLoc, VarList, StartLoc, 1910 LParenLoc, EndLoc); 1911 } 1912 1913 /// Build a new OpenMP 'device' clause. 1914 /// 1915 /// By default, performs semantic analysis to build the new statement. 1916 /// Subclasses may override this routine to provide different behavior. 1917 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1918 Expr *Device, SourceLocation StartLoc, 1919 SourceLocation LParenLoc, 1920 SourceLocation ModifierLoc, 1921 SourceLocation EndLoc) { 1922 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1923 LParenLoc, ModifierLoc, EndLoc); 1924 } 1925 1926 /// Build a new OpenMP 'map' clause. 1927 /// 1928 /// By default, performs semantic analysis to build the new OpenMP clause. 1929 /// Subclasses may override this routine to provide different behavior. 1930 OMPClause *RebuildOMPMapClause( 1931 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1932 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1933 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1934 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1935 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1936 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1937 return getSema().ActOnOpenMPMapClause( 1938 MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId, 1939 MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs, 1940 /*NoDiagnose=*/false, UnresolvedMappers); 1941 } 1942 1943 /// Build a new OpenMP 'allocate' clause. 1944 /// 1945 /// By default, performs semantic analysis to build the new OpenMP clause. 1946 /// Subclasses may override this routine to provide different behavior. 1947 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1948 SourceLocation StartLoc, 1949 SourceLocation LParenLoc, 1950 SourceLocation ColonLoc, 1951 SourceLocation EndLoc) { 1952 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1953 LParenLoc, ColonLoc, EndLoc); 1954 } 1955 1956 /// Build a new OpenMP 'num_teams' clause. 1957 /// 1958 /// By default, performs semantic analysis to build the new statement. 1959 /// Subclasses may override this routine to provide different behavior. 1960 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1961 SourceLocation LParenLoc, 1962 SourceLocation EndLoc) { 1963 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1964 EndLoc); 1965 } 1966 1967 /// Build a new OpenMP 'thread_limit' clause. 1968 /// 1969 /// By default, performs semantic analysis to build the new statement. 1970 /// Subclasses may override this routine to provide different behavior. 1971 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1972 SourceLocation StartLoc, 1973 SourceLocation LParenLoc, 1974 SourceLocation EndLoc) { 1975 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1976 LParenLoc, EndLoc); 1977 } 1978 1979 /// Build a new OpenMP 'priority' clause. 1980 /// 1981 /// By default, performs semantic analysis to build the new statement. 1982 /// Subclasses may override this routine to provide different behavior. 1983 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1984 SourceLocation LParenLoc, 1985 SourceLocation EndLoc) { 1986 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1987 EndLoc); 1988 } 1989 1990 /// Build a new OpenMP 'grainsize' clause. 1991 /// 1992 /// By default, performs semantic analysis to build the new statement. 1993 /// Subclasses may override this routine to provide different behavior. 1994 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1995 SourceLocation LParenLoc, 1996 SourceLocation EndLoc) { 1997 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1998 EndLoc); 1999 } 2000 2001 /// Build a new OpenMP 'num_tasks' clause. 2002 /// 2003 /// By default, performs semantic analysis to build the new statement. 2004 /// Subclasses may override this routine to provide different behavior. 2005 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 2006 SourceLocation LParenLoc, 2007 SourceLocation EndLoc) { 2008 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 2009 EndLoc); 2010 } 2011 2012 /// Build a new OpenMP 'hint' clause. 2013 /// 2014 /// By default, performs semantic analysis to build the new statement. 2015 /// Subclasses may override this routine to provide different behavior. 2016 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2017 SourceLocation LParenLoc, 2018 SourceLocation EndLoc) { 2019 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2020 } 2021 2022 /// Build a new OpenMP 'detach' clause. 2023 /// 2024 /// By default, performs semantic analysis to build the new statement. 2025 /// Subclasses may override this routine to provide different behavior. 2026 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2027 SourceLocation LParenLoc, 2028 SourceLocation EndLoc) { 2029 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2030 } 2031 2032 /// Build a new OpenMP 'dist_schedule' clause. 2033 /// 2034 /// By default, performs semantic analysis to build the new OpenMP clause. 2035 /// Subclasses may override this routine to provide different behavior. 2036 OMPClause * 2037 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2038 Expr *ChunkSize, SourceLocation StartLoc, 2039 SourceLocation LParenLoc, SourceLocation KindLoc, 2040 SourceLocation CommaLoc, SourceLocation EndLoc) { 2041 return getSema().ActOnOpenMPDistScheduleClause( 2042 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2043 } 2044 2045 /// Build a new OpenMP 'to' clause. 2046 /// 2047 /// By default, performs semantic analysis to build the new statement. 2048 /// Subclasses may override this routine to provide different behavior. 2049 OMPClause * 2050 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2051 ArrayRef<SourceLocation> MotionModifiersLoc, 2052 CXXScopeSpec &MapperIdScopeSpec, 2053 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2054 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2055 ArrayRef<Expr *> UnresolvedMappers) { 2056 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2057 MapperIdScopeSpec, MapperId, ColonLoc, 2058 VarList, Locs, UnresolvedMappers); 2059 } 2060 2061 /// Build a new OpenMP 'from' clause. 2062 /// 2063 /// By default, performs semantic analysis to build the new statement. 2064 /// Subclasses may override this routine to provide different behavior. 2065 OMPClause * 2066 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2067 ArrayRef<SourceLocation> MotionModifiersLoc, 2068 CXXScopeSpec &MapperIdScopeSpec, 2069 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2070 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2071 ArrayRef<Expr *> UnresolvedMappers) { 2072 return getSema().ActOnOpenMPFromClause( 2073 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2074 ColonLoc, VarList, Locs, UnresolvedMappers); 2075 } 2076 2077 /// Build a new OpenMP 'use_device_ptr' clause. 2078 /// 2079 /// By default, performs semantic analysis to build the new OpenMP clause. 2080 /// Subclasses may override this routine to provide different behavior. 2081 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2082 const OMPVarListLocTy &Locs) { 2083 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2084 } 2085 2086 /// Build a new OpenMP 'use_device_addr' clause. 2087 /// 2088 /// By default, performs semantic analysis to build the new OpenMP clause. 2089 /// Subclasses may override this routine to provide different behavior. 2090 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2091 const OMPVarListLocTy &Locs) { 2092 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2093 } 2094 2095 /// Build a new OpenMP 'is_device_ptr' clause. 2096 /// 2097 /// By default, performs semantic analysis to build the new OpenMP clause. 2098 /// Subclasses may override this routine to provide different behavior. 2099 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2100 const OMPVarListLocTy &Locs) { 2101 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2102 } 2103 2104 /// Build a new OpenMP 'defaultmap' clause. 2105 /// 2106 /// By default, performs semantic analysis to build the new OpenMP clause. 2107 /// Subclasses may override this routine to provide different behavior. 2108 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2109 OpenMPDefaultmapClauseKind Kind, 2110 SourceLocation StartLoc, 2111 SourceLocation LParenLoc, 2112 SourceLocation MLoc, 2113 SourceLocation KindLoc, 2114 SourceLocation EndLoc) { 2115 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2116 MLoc, KindLoc, EndLoc); 2117 } 2118 2119 /// Build a new OpenMP 'nontemporal' clause. 2120 /// 2121 /// By default, performs semantic analysis to build the new OpenMP clause. 2122 /// Subclasses may override this routine to provide different behavior. 2123 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2124 SourceLocation StartLoc, 2125 SourceLocation LParenLoc, 2126 SourceLocation EndLoc) { 2127 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2128 EndLoc); 2129 } 2130 2131 /// Build a new OpenMP 'inclusive' clause. 2132 /// 2133 /// By default, performs semantic analysis to build the new OpenMP clause. 2134 /// Subclasses may override this routine to provide different behavior. 2135 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2136 SourceLocation StartLoc, 2137 SourceLocation LParenLoc, 2138 SourceLocation EndLoc) { 2139 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2140 EndLoc); 2141 } 2142 2143 /// Build a new OpenMP 'exclusive' clause. 2144 /// 2145 /// By default, performs semantic analysis to build the new OpenMP clause. 2146 /// Subclasses may override this routine to provide different behavior. 2147 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2148 SourceLocation StartLoc, 2149 SourceLocation LParenLoc, 2150 SourceLocation EndLoc) { 2151 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2152 EndLoc); 2153 } 2154 2155 /// Build a new OpenMP 'uses_allocators' clause. 2156 /// 2157 /// By default, performs semantic analysis to build the new OpenMP clause. 2158 /// Subclasses may override this routine to provide different behavior. 2159 OMPClause *RebuildOMPUsesAllocatorsClause( 2160 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2161 SourceLocation LParenLoc, SourceLocation EndLoc) { 2162 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2163 Data); 2164 } 2165 2166 /// Build a new OpenMP 'affinity' clause. 2167 /// 2168 /// By default, performs semantic analysis to build the new OpenMP clause. 2169 /// Subclasses may override this routine to provide different behavior. 2170 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2171 SourceLocation LParenLoc, 2172 SourceLocation ColonLoc, 2173 SourceLocation EndLoc, Expr *Modifier, 2174 ArrayRef<Expr *> Locators) { 2175 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2176 EndLoc, Modifier, Locators); 2177 } 2178 2179 /// Build a new OpenMP 'order' clause. 2180 /// 2181 /// By default, performs semantic analysis to build the new OpenMP clause. 2182 /// Subclasses may override this routine to provide different behavior. 2183 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2184 SourceLocation KindKwLoc, 2185 SourceLocation StartLoc, 2186 SourceLocation LParenLoc, 2187 SourceLocation EndLoc) { 2188 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2189 LParenLoc, EndLoc); 2190 } 2191 2192 /// Build a new OpenMP 'init' clause. 2193 /// 2194 /// By default, performs semantic analysis to build the new OpenMP clause. 2195 /// Subclasses may override this routine to provide different behavior. 2196 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2197 bool IsTarget, bool IsTargetSync, 2198 SourceLocation StartLoc, 2199 SourceLocation LParenLoc, 2200 SourceLocation VarLoc, 2201 SourceLocation EndLoc) { 2202 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2203 IsTargetSync, StartLoc, LParenLoc, 2204 VarLoc, EndLoc); 2205 } 2206 2207 /// Build a new OpenMP 'use' clause. 2208 /// 2209 /// By default, performs semantic analysis to build the new OpenMP clause. 2210 /// Subclasses may override this routine to provide different behavior. 2211 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2212 SourceLocation LParenLoc, 2213 SourceLocation VarLoc, SourceLocation EndLoc) { 2214 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2215 VarLoc, EndLoc); 2216 } 2217 2218 /// Build a new OpenMP 'destroy' clause. 2219 /// 2220 /// By default, performs semantic analysis to build the new OpenMP clause. 2221 /// Subclasses may override this routine to provide different behavior. 2222 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2223 SourceLocation LParenLoc, 2224 SourceLocation VarLoc, 2225 SourceLocation EndLoc) { 2226 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2227 VarLoc, EndLoc); 2228 } 2229 2230 /// Build a new OpenMP 'novariants' clause. 2231 /// 2232 /// By default, performs semantic analysis to build the new OpenMP clause. 2233 /// Subclasses may override this routine to provide different behavior. 2234 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2235 SourceLocation StartLoc, 2236 SourceLocation LParenLoc, 2237 SourceLocation EndLoc) { 2238 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2239 EndLoc); 2240 } 2241 2242 /// Build a new OpenMP 'nocontext' clause. 2243 /// 2244 /// By default, performs semantic analysis to build the new OpenMP clause. 2245 /// Subclasses may override this routine to provide different behavior. 2246 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2247 SourceLocation LParenLoc, 2248 SourceLocation EndLoc) { 2249 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2250 EndLoc); 2251 } 2252 2253 /// Build a new OpenMP 'filter' clause. 2254 /// 2255 /// By default, performs semantic analysis to build the new OpenMP clause. 2256 /// Subclasses may override this routine to provide different behavior. 2257 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2258 SourceLocation LParenLoc, 2259 SourceLocation EndLoc) { 2260 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2261 EndLoc); 2262 } 2263 2264 /// Build a new OpenMP 'bind' clause. 2265 /// 2266 /// By default, performs semantic analysis to build the new OpenMP clause. 2267 /// Subclasses may override this routine to provide different behavior. 2268 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2269 SourceLocation KindLoc, 2270 SourceLocation StartLoc, 2271 SourceLocation LParenLoc, 2272 SourceLocation EndLoc) { 2273 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2274 EndLoc); 2275 } 2276 2277 /// Build a new OpenMP 'align' clause. 2278 /// 2279 /// By default, performs semantic analysis to build the new OpenMP clause. 2280 /// Subclasses may override this routine to provide different behavior. 2281 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2282 SourceLocation LParenLoc, 2283 SourceLocation EndLoc) { 2284 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2285 } 2286 2287 /// Rebuild the operand to an Objective-C \@synchronized statement. 2288 /// 2289 /// By default, performs semantic analysis to build the new statement. 2290 /// Subclasses may override this routine to provide different behavior. 2291 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2292 Expr *object) { 2293 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2294 } 2295 2296 /// Build a new Objective-C \@synchronized statement. 2297 /// 2298 /// By default, performs semantic analysis to build the new statement. 2299 /// Subclasses may override this routine to provide different behavior. 2300 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2301 Expr *Object, Stmt *Body) { 2302 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2303 } 2304 2305 /// Build a new Objective-C \@autoreleasepool statement. 2306 /// 2307 /// By default, performs semantic analysis to build the new statement. 2308 /// Subclasses may override this routine to provide different behavior. 2309 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2310 Stmt *Body) { 2311 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2312 } 2313 2314 /// Build a new Objective-C fast enumeration statement. 2315 /// 2316 /// By default, performs semantic analysis to build the new statement. 2317 /// Subclasses may override this routine to provide different behavior. 2318 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2319 Stmt *Element, 2320 Expr *Collection, 2321 SourceLocation RParenLoc, 2322 Stmt *Body) { 2323 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2324 Element, 2325 Collection, 2326 RParenLoc); 2327 if (ForEachStmt.isInvalid()) 2328 return StmtError(); 2329 2330 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2331 } 2332 2333 /// Build a new C++ exception declaration. 2334 /// 2335 /// By default, performs semantic analysis to build the new decaration. 2336 /// Subclasses may override this routine to provide different behavior. 2337 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2338 TypeSourceInfo *Declarator, 2339 SourceLocation StartLoc, 2340 SourceLocation IdLoc, 2341 IdentifierInfo *Id) { 2342 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2343 StartLoc, IdLoc, Id); 2344 if (Var) 2345 getSema().CurContext->addDecl(Var); 2346 return Var; 2347 } 2348 2349 /// Build a new C++ catch statement. 2350 /// 2351 /// By default, performs semantic analysis to build the new statement. 2352 /// Subclasses may override this routine to provide different behavior. 2353 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2354 VarDecl *ExceptionDecl, 2355 Stmt *Handler) { 2356 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2357 Handler)); 2358 } 2359 2360 /// Build a new C++ try statement. 2361 /// 2362 /// By default, performs semantic analysis to build the new statement. 2363 /// Subclasses may override this routine to provide different behavior. 2364 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2365 ArrayRef<Stmt *> Handlers) { 2366 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2367 } 2368 2369 /// Build a new C++0x range-based for statement. 2370 /// 2371 /// By default, performs semantic analysis to build the new statement. 2372 /// Subclasses may override this routine to provide different behavior. 2373 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2374 SourceLocation CoawaitLoc, Stmt *Init, 2375 SourceLocation ColonLoc, Stmt *Range, 2376 Stmt *Begin, Stmt *End, Expr *Cond, 2377 Expr *Inc, Stmt *LoopVar, 2378 SourceLocation RParenLoc) { 2379 // If we've just learned that the range is actually an Objective-C 2380 // collection, treat this as an Objective-C fast enumeration loop. 2381 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2382 if (RangeStmt->isSingleDecl()) { 2383 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2384 if (RangeVar->isInvalidDecl()) 2385 return StmtError(); 2386 2387 Expr *RangeExpr = RangeVar->getInit(); 2388 if (!RangeExpr->isTypeDependent() && 2389 RangeExpr->getType()->isObjCObjectPointerType()) { 2390 // FIXME: Support init-statements in Objective-C++20 ranged for 2391 // statement. 2392 if (Init) { 2393 return SemaRef.Diag(Init->getBeginLoc(), 2394 diag::err_objc_for_range_init_stmt) 2395 << Init->getSourceRange(); 2396 } 2397 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2398 RangeExpr, RParenLoc); 2399 } 2400 } 2401 } 2402 } 2403 2404 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2405 Range, Begin, End, Cond, Inc, LoopVar, 2406 RParenLoc, Sema::BFRK_Rebuild); 2407 } 2408 2409 /// Build a new C++0x range-based for statement. 2410 /// 2411 /// By default, performs semantic analysis to build the new statement. 2412 /// Subclasses may override this routine to provide different behavior. 2413 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2414 bool IsIfExists, 2415 NestedNameSpecifierLoc QualifierLoc, 2416 DeclarationNameInfo NameInfo, 2417 Stmt *Nested) { 2418 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2419 QualifierLoc, NameInfo, Nested); 2420 } 2421 2422 /// Attach body to a C++0x range-based for statement. 2423 /// 2424 /// By default, performs semantic analysis to finish the new statement. 2425 /// Subclasses may override this routine to provide different behavior. 2426 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2427 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2428 } 2429 2430 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2431 Stmt *TryBlock, Stmt *Handler) { 2432 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2433 } 2434 2435 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2436 Stmt *Block) { 2437 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2438 } 2439 2440 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2441 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2442 } 2443 2444 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2445 SourceLocation LParen, 2446 SourceLocation RParen, 2447 TypeSourceInfo *TSI) { 2448 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2449 } 2450 2451 /// Build a new predefined expression. 2452 /// 2453 /// By default, performs semantic analysis to build the new expression. 2454 /// Subclasses may override this routine to provide different behavior. 2455 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2456 PredefinedExpr::IdentKind IK) { 2457 return getSema().BuildPredefinedExpr(Loc, IK); 2458 } 2459 2460 /// Build a new expression that references a declaration. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2465 LookupResult &R, 2466 bool RequiresADL) { 2467 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2468 } 2469 2470 2471 /// Build a new expression that references a declaration. 2472 /// 2473 /// By default, performs semantic analysis to build the new expression. 2474 /// Subclasses may override this routine to provide different behavior. 2475 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2476 ValueDecl *VD, 2477 const DeclarationNameInfo &NameInfo, 2478 NamedDecl *Found, 2479 TemplateArgumentListInfo *TemplateArgs) { 2480 CXXScopeSpec SS; 2481 SS.Adopt(QualifierLoc); 2482 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2483 TemplateArgs); 2484 } 2485 2486 /// Build a new expression in parentheses. 2487 /// 2488 /// By default, performs semantic analysis to build the new expression. 2489 /// Subclasses may override this routine to provide different behavior. 2490 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2491 SourceLocation RParen) { 2492 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2493 } 2494 2495 /// Build a new pseudo-destructor expression. 2496 /// 2497 /// By default, performs semantic analysis to build the new expression. 2498 /// Subclasses may override this routine to provide different behavior. 2499 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2500 SourceLocation OperatorLoc, 2501 bool isArrow, 2502 CXXScopeSpec &SS, 2503 TypeSourceInfo *ScopeType, 2504 SourceLocation CCLoc, 2505 SourceLocation TildeLoc, 2506 PseudoDestructorTypeStorage Destroyed); 2507 2508 /// Build a new unary operator expression. 2509 /// 2510 /// By default, performs semantic analysis to build the new expression. 2511 /// Subclasses may override this routine to provide different behavior. 2512 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2513 UnaryOperatorKind Opc, 2514 Expr *SubExpr) { 2515 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2516 } 2517 2518 /// Build a new builtin offsetof expression. 2519 /// 2520 /// By default, performs semantic analysis to build the new expression. 2521 /// Subclasses may override this routine to provide different behavior. 2522 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2523 TypeSourceInfo *Type, 2524 ArrayRef<Sema::OffsetOfComponent> Components, 2525 SourceLocation RParenLoc) { 2526 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2527 RParenLoc); 2528 } 2529 2530 /// Build a new sizeof, alignof or vec_step expression with a 2531 /// type argument. 2532 /// 2533 /// By default, performs semantic analysis to build the new expression. 2534 /// Subclasses may override this routine to provide different behavior. 2535 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2536 SourceLocation OpLoc, 2537 UnaryExprOrTypeTrait ExprKind, 2538 SourceRange R) { 2539 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2540 } 2541 2542 /// Build a new sizeof, alignof or vec step expression with an 2543 /// expression argument. 2544 /// 2545 /// By default, performs semantic analysis to build the new expression. 2546 /// Subclasses may override this routine to provide different behavior. 2547 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2548 UnaryExprOrTypeTrait ExprKind, 2549 SourceRange R) { 2550 ExprResult Result 2551 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2552 if (Result.isInvalid()) 2553 return ExprError(); 2554 2555 return Result; 2556 } 2557 2558 /// Build a new array subscript expression. 2559 /// 2560 /// By default, performs semantic analysis to build the new expression. 2561 /// Subclasses may override this routine to provide different behavior. 2562 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2563 SourceLocation LBracketLoc, 2564 Expr *RHS, 2565 SourceLocation RBracketLoc) { 2566 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2567 LBracketLoc, RHS, 2568 RBracketLoc); 2569 } 2570 2571 /// Build a new matrix subscript expression. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2576 Expr *ColumnIdx, 2577 SourceLocation RBracketLoc) { 2578 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2579 RBracketLoc); 2580 } 2581 2582 /// Build a new array section expression. 2583 /// 2584 /// By default, performs semantic analysis to build the new expression. 2585 /// Subclasses may override this routine to provide different behavior. 2586 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2587 Expr *LowerBound, 2588 SourceLocation ColonLocFirst, 2589 SourceLocation ColonLocSecond, 2590 Expr *Length, Expr *Stride, 2591 SourceLocation RBracketLoc) { 2592 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2593 ColonLocFirst, ColonLocSecond, 2594 Length, Stride, RBracketLoc); 2595 } 2596 2597 /// Build a new array shaping expression. 2598 /// 2599 /// By default, performs semantic analysis to build the new expression. 2600 /// Subclasses may override this routine to provide different behavior. 2601 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2602 SourceLocation RParenLoc, 2603 ArrayRef<Expr *> Dims, 2604 ArrayRef<SourceRange> BracketsRanges) { 2605 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2606 BracketsRanges); 2607 } 2608 2609 /// Build a new iterator expression. 2610 /// 2611 /// By default, performs semantic analysis to build the new expression. 2612 /// Subclasses may override this routine to provide different behavior. 2613 ExprResult RebuildOMPIteratorExpr( 2614 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2615 ArrayRef<Sema::OMPIteratorData> Data) { 2616 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2617 LLoc, RLoc, Data); 2618 } 2619 2620 /// Build a new call expression. 2621 /// 2622 /// By default, performs semantic analysis to build the new expression. 2623 /// Subclasses may override this routine to provide different behavior. 2624 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2625 MultiExprArg Args, 2626 SourceLocation RParenLoc, 2627 Expr *ExecConfig = nullptr) { 2628 return getSema().ActOnCallExpr( 2629 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2630 } 2631 2632 ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc, 2633 MultiExprArg Args, 2634 SourceLocation RParenLoc) { 2635 return getSema().ActOnArraySubscriptExpr( 2636 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc); 2637 } 2638 2639 /// Build a new member access expression. 2640 /// 2641 /// By default, performs semantic analysis to build the new expression. 2642 /// Subclasses may override this routine to provide different behavior. 2643 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2644 bool isArrow, 2645 NestedNameSpecifierLoc QualifierLoc, 2646 SourceLocation TemplateKWLoc, 2647 const DeclarationNameInfo &MemberNameInfo, 2648 ValueDecl *Member, 2649 NamedDecl *FoundDecl, 2650 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2651 NamedDecl *FirstQualifierInScope) { 2652 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2653 isArrow); 2654 if (!Member->getDeclName()) { 2655 // We have a reference to an unnamed field. This is always the 2656 // base of an anonymous struct/union member access, i.e. the 2657 // field is always of record type. 2658 assert(Member->getType()->isRecordType() && 2659 "unnamed member not of record type?"); 2660 2661 BaseResult = 2662 getSema().PerformObjectMemberConversion(BaseResult.get(), 2663 QualifierLoc.getNestedNameSpecifier(), 2664 FoundDecl, Member); 2665 if (BaseResult.isInvalid()) 2666 return ExprError(); 2667 Base = BaseResult.get(); 2668 2669 CXXScopeSpec EmptySS; 2670 return getSema().BuildFieldReferenceExpr( 2671 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2672 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2673 } 2674 2675 CXXScopeSpec SS; 2676 SS.Adopt(QualifierLoc); 2677 2678 Base = BaseResult.get(); 2679 QualType BaseType = Base->getType(); 2680 2681 if (isArrow && !BaseType->isPointerType()) 2682 return ExprError(); 2683 2684 // FIXME: this involves duplicating earlier analysis in a lot of 2685 // cases; we should avoid this when possible. 2686 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2687 R.addDecl(FoundDecl); 2688 R.resolveKind(); 2689 2690 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2691 SS, TemplateKWLoc, 2692 FirstQualifierInScope, 2693 R, ExplicitTemplateArgs, 2694 /*S*/nullptr); 2695 } 2696 2697 /// Build a new binary operator expression. 2698 /// 2699 /// By default, performs semantic analysis to build the new expression. 2700 /// Subclasses may override this routine to provide different behavior. 2701 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2702 BinaryOperatorKind Opc, 2703 Expr *LHS, Expr *RHS) { 2704 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2705 } 2706 2707 /// Build a new rewritten operator expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildCXXRewrittenBinaryOperator( 2712 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2713 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2714 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2715 RHS, /*RequiresADL*/false); 2716 } 2717 2718 /// Build a new conditional operator expression. 2719 /// 2720 /// By default, performs semantic analysis to build the new expression. 2721 /// Subclasses may override this routine to provide different behavior. 2722 ExprResult RebuildConditionalOperator(Expr *Cond, 2723 SourceLocation QuestionLoc, 2724 Expr *LHS, 2725 SourceLocation ColonLoc, 2726 Expr *RHS) { 2727 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2728 LHS, RHS); 2729 } 2730 2731 /// Build a new C-style cast expression. 2732 /// 2733 /// By default, performs semantic analysis to build the new expression. 2734 /// Subclasses may override this routine to provide different behavior. 2735 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2736 TypeSourceInfo *TInfo, 2737 SourceLocation RParenLoc, 2738 Expr *SubExpr) { 2739 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2740 SubExpr); 2741 } 2742 2743 /// Build a new compound literal expression. 2744 /// 2745 /// By default, performs semantic analysis to build the new expression. 2746 /// Subclasses may override this routine to provide different behavior. 2747 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2748 TypeSourceInfo *TInfo, 2749 SourceLocation RParenLoc, 2750 Expr *Init) { 2751 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2752 Init); 2753 } 2754 2755 /// Build a new extended vector element access expression. 2756 /// 2757 /// By default, performs semantic analysis to build the new expression. 2758 /// Subclasses may override this routine to provide different behavior. 2759 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2760 SourceLocation OpLoc, 2761 SourceLocation AccessorLoc, 2762 IdentifierInfo &Accessor) { 2763 2764 CXXScopeSpec SS; 2765 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2766 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2767 OpLoc, /*IsArrow*/ false, 2768 SS, SourceLocation(), 2769 /*FirstQualifierInScope*/ nullptr, 2770 NameInfo, 2771 /* TemplateArgs */ nullptr, 2772 /*S*/ nullptr); 2773 } 2774 2775 /// Build a new initializer list 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 RebuildInitList(SourceLocation LBraceLoc, 2780 MultiExprArg Inits, 2781 SourceLocation RBraceLoc) { 2782 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2783 } 2784 2785 /// Build a new designated initializer expression. 2786 /// 2787 /// By default, performs semantic analysis to build the new expression. 2788 /// Subclasses may override this routine to provide different behavior. 2789 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2790 MultiExprArg ArrayExprs, 2791 SourceLocation EqualOrColonLoc, 2792 bool GNUSyntax, 2793 Expr *Init) { 2794 ExprResult Result 2795 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2796 Init); 2797 if (Result.isInvalid()) 2798 return ExprError(); 2799 2800 return Result; 2801 } 2802 2803 /// Build a new value-initialized expression. 2804 /// 2805 /// By default, builds the implicit value initialization without performing 2806 /// any semantic analysis. Subclasses may override this routine to provide 2807 /// different behavior. 2808 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2809 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2810 } 2811 2812 /// Build a new \c va_arg expression. 2813 /// 2814 /// By default, performs semantic analysis to build the new expression. 2815 /// Subclasses may override this routine to provide different behavior. 2816 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2817 Expr *SubExpr, TypeSourceInfo *TInfo, 2818 SourceLocation RParenLoc) { 2819 return getSema().BuildVAArgExpr(BuiltinLoc, 2820 SubExpr, TInfo, 2821 RParenLoc); 2822 } 2823 2824 /// Build a new expression list in parentheses. 2825 /// 2826 /// By default, performs semantic analysis to build the new expression. 2827 /// Subclasses may override this routine to provide different behavior. 2828 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2829 MultiExprArg SubExprs, 2830 SourceLocation RParenLoc) { 2831 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2832 } 2833 2834 /// Build a new address-of-label expression. 2835 /// 2836 /// By default, performs semantic analysis, using the name of the label 2837 /// rather than attempting to map the label statement itself. 2838 /// Subclasses may override this routine to provide different behavior. 2839 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2840 SourceLocation LabelLoc, LabelDecl *Label) { 2841 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2842 } 2843 2844 /// Build a new GNU statement expression. 2845 /// 2846 /// By default, performs semantic analysis to build the new expression. 2847 /// Subclasses may override this routine to provide different behavior. 2848 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2849 SourceLocation RParenLoc, unsigned TemplateDepth) { 2850 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2851 TemplateDepth); 2852 } 2853 2854 /// Build a new __builtin_choose_expr expression. 2855 /// 2856 /// By default, performs semantic analysis to build the new expression. 2857 /// Subclasses may override this routine to provide different behavior. 2858 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2859 Expr *Cond, Expr *LHS, Expr *RHS, 2860 SourceLocation RParenLoc) { 2861 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2862 Cond, LHS, RHS, 2863 RParenLoc); 2864 } 2865 2866 /// Build a new generic selection expression. 2867 /// 2868 /// By default, performs semantic analysis to build the new expression. 2869 /// Subclasses may override this routine to provide different behavior. 2870 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2871 SourceLocation DefaultLoc, 2872 SourceLocation RParenLoc, 2873 Expr *ControllingExpr, 2874 ArrayRef<TypeSourceInfo *> Types, 2875 ArrayRef<Expr *> Exprs) { 2876 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2877 ControllingExpr, Types, Exprs); 2878 } 2879 2880 /// Build a new overloaded operator call expression. 2881 /// 2882 /// By default, performs semantic analysis to build the new expression. 2883 /// The semantic analysis provides the behavior of template instantiation, 2884 /// copying with transformations that turn what looks like an overloaded 2885 /// operator call into a use of a builtin operator, performing 2886 /// argument-dependent lookup, etc. Subclasses may override this routine to 2887 /// provide different behavior. 2888 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2889 SourceLocation OpLoc, 2890 Expr *Callee, 2891 Expr *First, 2892 Expr *Second); 2893 2894 /// Build a new C++ "named" cast expression, such as static_cast or 2895 /// reinterpret_cast. 2896 /// 2897 /// By default, this routine dispatches to one of the more-specific routines 2898 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2899 /// Subclasses may override this routine to provide different behavior. 2900 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2901 Stmt::StmtClass Class, 2902 SourceLocation LAngleLoc, 2903 TypeSourceInfo *TInfo, 2904 SourceLocation RAngleLoc, 2905 SourceLocation LParenLoc, 2906 Expr *SubExpr, 2907 SourceLocation RParenLoc) { 2908 switch (Class) { 2909 case Stmt::CXXStaticCastExprClass: 2910 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2911 RAngleLoc, LParenLoc, 2912 SubExpr, RParenLoc); 2913 2914 case Stmt::CXXDynamicCastExprClass: 2915 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2916 RAngleLoc, LParenLoc, 2917 SubExpr, RParenLoc); 2918 2919 case Stmt::CXXReinterpretCastExprClass: 2920 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2921 RAngleLoc, LParenLoc, 2922 SubExpr, 2923 RParenLoc); 2924 2925 case Stmt::CXXConstCastExprClass: 2926 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2927 RAngleLoc, LParenLoc, 2928 SubExpr, RParenLoc); 2929 2930 case Stmt::CXXAddrspaceCastExprClass: 2931 return getDerived().RebuildCXXAddrspaceCastExpr( 2932 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2933 2934 default: 2935 llvm_unreachable("Invalid C++ named cast"); 2936 } 2937 } 2938 2939 /// Build a new C++ static_cast expression. 2940 /// 2941 /// By default, performs semantic analysis to build the new expression. 2942 /// Subclasses may override this routine to provide different behavior. 2943 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2944 SourceLocation LAngleLoc, 2945 TypeSourceInfo *TInfo, 2946 SourceLocation RAngleLoc, 2947 SourceLocation LParenLoc, 2948 Expr *SubExpr, 2949 SourceLocation RParenLoc) { 2950 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2951 TInfo, SubExpr, 2952 SourceRange(LAngleLoc, RAngleLoc), 2953 SourceRange(LParenLoc, RParenLoc)); 2954 } 2955 2956 /// Build a new C++ dynamic_cast expression. 2957 /// 2958 /// By default, performs semantic analysis to build the new expression. 2959 /// Subclasses may override this routine to provide different behavior. 2960 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2961 SourceLocation LAngleLoc, 2962 TypeSourceInfo *TInfo, 2963 SourceLocation RAngleLoc, 2964 SourceLocation LParenLoc, 2965 Expr *SubExpr, 2966 SourceLocation RParenLoc) { 2967 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2968 TInfo, SubExpr, 2969 SourceRange(LAngleLoc, RAngleLoc), 2970 SourceRange(LParenLoc, RParenLoc)); 2971 } 2972 2973 /// Build a new C++ reinterpret_cast expression. 2974 /// 2975 /// By default, performs semantic analysis to build the new expression. 2976 /// Subclasses may override this routine to provide different behavior. 2977 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2978 SourceLocation LAngleLoc, 2979 TypeSourceInfo *TInfo, 2980 SourceLocation RAngleLoc, 2981 SourceLocation LParenLoc, 2982 Expr *SubExpr, 2983 SourceLocation RParenLoc) { 2984 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2985 TInfo, SubExpr, 2986 SourceRange(LAngleLoc, RAngleLoc), 2987 SourceRange(LParenLoc, RParenLoc)); 2988 } 2989 2990 /// Build a new C++ const_cast expression. 2991 /// 2992 /// By default, performs semantic analysis to build the new expression. 2993 /// Subclasses may override this routine to provide different behavior. 2994 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2995 SourceLocation LAngleLoc, 2996 TypeSourceInfo *TInfo, 2997 SourceLocation RAngleLoc, 2998 SourceLocation LParenLoc, 2999 Expr *SubExpr, 3000 SourceLocation RParenLoc) { 3001 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 3002 TInfo, SubExpr, 3003 SourceRange(LAngleLoc, RAngleLoc), 3004 SourceRange(LParenLoc, RParenLoc)); 3005 } 3006 3007 ExprResult 3008 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3009 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3010 SourceLocation LParenLoc, Expr *SubExpr, 3011 SourceLocation RParenLoc) { 3012 return getSema().BuildCXXNamedCast( 3013 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3014 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3015 } 3016 3017 /// Build a new C++ functional-style cast expression. 3018 /// 3019 /// By default, performs semantic analysis to build the new expression. 3020 /// Subclasses may override this routine to provide different behavior. 3021 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3022 SourceLocation LParenLoc, 3023 Expr *Sub, 3024 SourceLocation RParenLoc, 3025 bool ListInitialization) { 3026 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3027 MultiExprArg(&Sub, 1), RParenLoc, 3028 ListInitialization); 3029 } 3030 3031 /// Build a new C++ __builtin_bit_cast expression. 3032 /// 3033 /// By default, performs semantic analysis to build the new expression. 3034 /// Subclasses may override this routine to provide different behavior. 3035 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3036 TypeSourceInfo *TSI, Expr *Sub, 3037 SourceLocation RParenLoc) { 3038 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3039 } 3040 3041 /// Build a new C++ typeid(type) expression. 3042 /// 3043 /// By default, performs semantic analysis to build the new expression. 3044 /// Subclasses may override this routine to provide different behavior. 3045 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3046 SourceLocation TypeidLoc, 3047 TypeSourceInfo *Operand, 3048 SourceLocation RParenLoc) { 3049 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3050 RParenLoc); 3051 } 3052 3053 3054 /// Build a new C++ typeid(expr) expression. 3055 /// 3056 /// By default, performs semantic analysis to build the new expression. 3057 /// Subclasses may override this routine to provide different behavior. 3058 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3059 SourceLocation TypeidLoc, 3060 Expr *Operand, 3061 SourceLocation RParenLoc) { 3062 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3063 RParenLoc); 3064 } 3065 3066 /// Build a new C++ __uuidof(type) expression. 3067 /// 3068 /// By default, performs semantic analysis to build the new expression. 3069 /// Subclasses may override this routine to provide different behavior. 3070 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3071 TypeSourceInfo *Operand, 3072 SourceLocation RParenLoc) { 3073 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3074 } 3075 3076 /// Build a new C++ __uuidof(expr) expression. 3077 /// 3078 /// By default, performs semantic analysis to build the new expression. 3079 /// Subclasses may override this routine to provide different behavior. 3080 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3081 Expr *Operand, SourceLocation RParenLoc) { 3082 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3083 } 3084 3085 /// Build a new C++ "this" expression. 3086 /// 3087 /// By default, builds a new "this" expression without performing any 3088 /// semantic analysis. Subclasses may override this routine to provide 3089 /// different behavior. 3090 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3091 QualType ThisType, 3092 bool isImplicit) { 3093 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3094 } 3095 3096 /// Build a new C++ throw expression. 3097 /// 3098 /// By default, performs semantic analysis to build the new expression. 3099 /// Subclasses may override this routine to provide different behavior. 3100 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3101 bool IsThrownVariableInScope) { 3102 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3103 } 3104 3105 /// Build a new C++ default-argument expression. 3106 /// 3107 /// By default, builds a new default-argument expression, which does not 3108 /// require any semantic analysis. Subclasses may override this routine to 3109 /// provide different behavior. 3110 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3111 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3112 getSema().CurContext); 3113 } 3114 3115 /// Build a new C++11 default-initialization expression. 3116 /// 3117 /// By default, builds a new default field initialization expression, which 3118 /// does not require any semantic analysis. Subclasses may override this 3119 /// routine to provide different behavior. 3120 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3121 FieldDecl *Field) { 3122 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3123 getSema().CurContext); 3124 } 3125 3126 /// Build a new C++ zero-initialization expression. 3127 /// 3128 /// By default, performs semantic analysis to build the new expression. 3129 /// Subclasses may override this routine to provide different behavior. 3130 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3131 SourceLocation LParenLoc, 3132 SourceLocation RParenLoc) { 3133 return getSema().BuildCXXTypeConstructExpr( 3134 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3135 } 3136 3137 /// Build a new C++ "new" expression. 3138 /// 3139 /// By default, performs semantic analysis to build the new expression. 3140 /// Subclasses may override this routine to provide different behavior. 3141 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3142 bool UseGlobal, 3143 SourceLocation PlacementLParen, 3144 MultiExprArg PlacementArgs, 3145 SourceLocation PlacementRParen, 3146 SourceRange TypeIdParens, 3147 QualType AllocatedType, 3148 TypeSourceInfo *AllocatedTypeInfo, 3149 Optional<Expr *> ArraySize, 3150 SourceRange DirectInitRange, 3151 Expr *Initializer) { 3152 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3153 PlacementLParen, 3154 PlacementArgs, 3155 PlacementRParen, 3156 TypeIdParens, 3157 AllocatedType, 3158 AllocatedTypeInfo, 3159 ArraySize, 3160 DirectInitRange, 3161 Initializer); 3162 } 3163 3164 /// Build a new C++ "delete" expression. 3165 /// 3166 /// By default, performs semantic analysis to build the new expression. 3167 /// Subclasses may override this routine to provide different behavior. 3168 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3169 bool IsGlobalDelete, 3170 bool IsArrayForm, 3171 Expr *Operand) { 3172 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3173 Operand); 3174 } 3175 3176 /// Build a new type trait expression. 3177 /// 3178 /// By default, performs semantic analysis to build the new expression. 3179 /// Subclasses may override this routine to provide different behavior. 3180 ExprResult RebuildTypeTrait(TypeTrait Trait, 3181 SourceLocation StartLoc, 3182 ArrayRef<TypeSourceInfo *> Args, 3183 SourceLocation RParenLoc) { 3184 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3185 } 3186 3187 /// Build a new array type trait expression. 3188 /// 3189 /// By default, performs semantic analysis to build the new expression. 3190 /// Subclasses may override this routine to provide different behavior. 3191 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3192 SourceLocation StartLoc, 3193 TypeSourceInfo *TSInfo, 3194 Expr *DimExpr, 3195 SourceLocation RParenLoc) { 3196 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3197 } 3198 3199 /// Build a new expression trait expression. 3200 /// 3201 /// By default, performs semantic analysis to build the new expression. 3202 /// Subclasses may override this routine to provide different behavior. 3203 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3204 SourceLocation StartLoc, 3205 Expr *Queried, 3206 SourceLocation RParenLoc) { 3207 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3208 } 3209 3210 /// Build a new (previously unresolved) declaration reference 3211 /// expression. 3212 /// 3213 /// By default, performs semantic analysis to build the new expression. 3214 /// Subclasses may override this routine to provide different behavior. 3215 ExprResult RebuildDependentScopeDeclRefExpr( 3216 NestedNameSpecifierLoc QualifierLoc, 3217 SourceLocation TemplateKWLoc, 3218 const DeclarationNameInfo &NameInfo, 3219 const TemplateArgumentListInfo *TemplateArgs, 3220 bool IsAddressOfOperand, 3221 TypeSourceInfo **RecoveryTSI) { 3222 CXXScopeSpec SS; 3223 SS.Adopt(QualifierLoc); 3224 3225 if (TemplateArgs || TemplateKWLoc.isValid()) 3226 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3227 TemplateArgs); 3228 3229 return getSema().BuildQualifiedDeclarationNameExpr( 3230 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3231 } 3232 3233 /// Build a new template-id expression. 3234 /// 3235 /// By default, performs semantic analysis to build the new expression. 3236 /// Subclasses may override this routine to provide different behavior. 3237 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3238 SourceLocation TemplateKWLoc, 3239 LookupResult &R, 3240 bool RequiresADL, 3241 const TemplateArgumentListInfo *TemplateArgs) { 3242 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3243 TemplateArgs); 3244 } 3245 3246 /// Build a new object-construction expression. 3247 /// 3248 /// By default, performs semantic analysis to build the new expression. 3249 /// Subclasses may override this routine to provide different behavior. 3250 ExprResult RebuildCXXConstructExpr(QualType T, 3251 SourceLocation Loc, 3252 CXXConstructorDecl *Constructor, 3253 bool IsElidable, 3254 MultiExprArg Args, 3255 bool HadMultipleCandidates, 3256 bool ListInitialization, 3257 bool StdInitListInitialization, 3258 bool RequiresZeroInit, 3259 CXXConstructExpr::ConstructionKind ConstructKind, 3260 SourceRange ParenRange) { 3261 // Reconstruct the constructor we originally found, which might be 3262 // different if this is a call to an inherited constructor. 3263 CXXConstructorDecl *FoundCtor = Constructor; 3264 if (Constructor->isInheritingConstructor()) 3265 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3266 3267 SmallVector<Expr *, 8> ConvertedArgs; 3268 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3269 ConvertedArgs)) 3270 return ExprError(); 3271 3272 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3273 IsElidable, 3274 ConvertedArgs, 3275 HadMultipleCandidates, 3276 ListInitialization, 3277 StdInitListInitialization, 3278 RequiresZeroInit, ConstructKind, 3279 ParenRange); 3280 } 3281 3282 /// Build a new implicit construction via inherited constructor 3283 /// expression. 3284 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3285 CXXConstructorDecl *Constructor, 3286 bool ConstructsVBase, 3287 bool InheritedFromVBase) { 3288 return new (getSema().Context) CXXInheritedCtorInitExpr( 3289 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3290 } 3291 3292 /// Build a new object-construction expression. 3293 /// 3294 /// By default, performs semantic analysis to build the new expression. 3295 /// Subclasses may override this routine to provide different behavior. 3296 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3297 SourceLocation LParenOrBraceLoc, 3298 MultiExprArg Args, 3299 SourceLocation RParenOrBraceLoc, 3300 bool ListInitialization) { 3301 return getSema().BuildCXXTypeConstructExpr( 3302 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3303 } 3304 3305 /// Build a new object-construction expression. 3306 /// 3307 /// By default, performs semantic analysis to build the new expression. 3308 /// Subclasses may override this routine to provide different behavior. 3309 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3310 SourceLocation LParenLoc, 3311 MultiExprArg Args, 3312 SourceLocation RParenLoc, 3313 bool ListInitialization) { 3314 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3315 RParenLoc, ListInitialization); 3316 } 3317 3318 /// Build a new member reference expression. 3319 /// 3320 /// By default, performs semantic analysis to build the new expression. 3321 /// Subclasses may override this routine to provide different behavior. 3322 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3323 QualType BaseType, 3324 bool IsArrow, 3325 SourceLocation OperatorLoc, 3326 NestedNameSpecifierLoc QualifierLoc, 3327 SourceLocation TemplateKWLoc, 3328 NamedDecl *FirstQualifierInScope, 3329 const DeclarationNameInfo &MemberNameInfo, 3330 const TemplateArgumentListInfo *TemplateArgs) { 3331 CXXScopeSpec SS; 3332 SS.Adopt(QualifierLoc); 3333 3334 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3335 OperatorLoc, IsArrow, 3336 SS, TemplateKWLoc, 3337 FirstQualifierInScope, 3338 MemberNameInfo, 3339 TemplateArgs, /*S*/nullptr); 3340 } 3341 3342 /// Build a new member reference expression. 3343 /// 3344 /// By default, performs semantic analysis to build the new expression. 3345 /// Subclasses may override this routine to provide different behavior. 3346 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3347 SourceLocation OperatorLoc, 3348 bool IsArrow, 3349 NestedNameSpecifierLoc QualifierLoc, 3350 SourceLocation TemplateKWLoc, 3351 NamedDecl *FirstQualifierInScope, 3352 LookupResult &R, 3353 const TemplateArgumentListInfo *TemplateArgs) { 3354 CXXScopeSpec SS; 3355 SS.Adopt(QualifierLoc); 3356 3357 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3358 OperatorLoc, IsArrow, 3359 SS, TemplateKWLoc, 3360 FirstQualifierInScope, 3361 R, TemplateArgs, /*S*/nullptr); 3362 } 3363 3364 /// Build a new noexcept expression. 3365 /// 3366 /// By default, performs semantic analysis to build the new expression. 3367 /// Subclasses may override this routine to provide different behavior. 3368 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3369 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3370 } 3371 3372 /// Build a new expression to compute the length of a parameter pack. 3373 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3374 NamedDecl *Pack, 3375 SourceLocation PackLoc, 3376 SourceLocation RParenLoc, 3377 Optional<unsigned> Length, 3378 ArrayRef<TemplateArgument> PartialArgs) { 3379 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3380 RParenLoc, Length, PartialArgs); 3381 } 3382 3383 /// Build a new expression representing a call to a source location 3384 /// builtin. 3385 /// 3386 /// By default, performs semantic analysis to build the new expression. 3387 /// Subclasses may override this routine to provide different behavior. 3388 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3389 SourceLocation BuiltinLoc, 3390 SourceLocation RPLoc, 3391 DeclContext *ParentContext) { 3392 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3393 } 3394 3395 /// Build a new Objective-C boxed expression. 3396 /// 3397 /// By default, performs semantic analysis to build the new expression. 3398 /// Subclasses may override this routine to provide different behavior. 3399 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3400 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3401 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3402 TemplateArgumentListInfo *TALI) { 3403 CXXScopeSpec SS; 3404 SS.Adopt(NNS); 3405 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3406 ConceptNameInfo, 3407 FoundDecl, 3408 NamedConcept, TALI); 3409 if (Result.isInvalid()) 3410 return ExprError(); 3411 return Result; 3412 } 3413 3414 /// \brief Build a new requires expression. 3415 /// 3416 /// By default, performs semantic analysis to build the new expression. 3417 /// Subclasses may override this routine to provide different behavior. 3418 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3419 RequiresExprBodyDecl *Body, 3420 ArrayRef<ParmVarDecl *> LocalParameters, 3421 ArrayRef<concepts::Requirement *> Requirements, 3422 SourceLocation ClosingBraceLoc) { 3423 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3424 LocalParameters, Requirements, ClosingBraceLoc); 3425 } 3426 3427 concepts::TypeRequirement * 3428 RebuildTypeRequirement( 3429 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3430 return SemaRef.BuildTypeRequirement(SubstDiag); 3431 } 3432 3433 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3434 return SemaRef.BuildTypeRequirement(T); 3435 } 3436 3437 concepts::ExprRequirement * 3438 RebuildExprRequirement( 3439 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3440 SourceLocation NoexceptLoc, 3441 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3442 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3443 std::move(Ret)); 3444 } 3445 3446 concepts::ExprRequirement * 3447 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3448 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3449 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3450 std::move(Ret)); 3451 } 3452 3453 concepts::NestedRequirement * 3454 RebuildNestedRequirement( 3455 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3456 return SemaRef.BuildNestedRequirement(SubstDiag); 3457 } 3458 3459 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3460 return SemaRef.BuildNestedRequirement(Constraint); 3461 } 3462 3463 /// \brief Build a new Objective-C boxed expression. 3464 /// 3465 /// By default, performs semantic analysis to build the new expression. 3466 /// Subclasses may override this routine to provide different behavior. 3467 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3468 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3469 } 3470 3471 /// Build a new Objective-C array literal. 3472 /// 3473 /// By default, performs semantic analysis to build the new expression. 3474 /// Subclasses may override this routine to provide different behavior. 3475 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3476 Expr **Elements, unsigned NumElements) { 3477 return getSema().BuildObjCArrayLiteral(Range, 3478 MultiExprArg(Elements, NumElements)); 3479 } 3480 3481 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3482 Expr *Base, Expr *Key, 3483 ObjCMethodDecl *getterMethod, 3484 ObjCMethodDecl *setterMethod) { 3485 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3486 getterMethod, setterMethod); 3487 } 3488 3489 /// Build a new Objective-C dictionary literal. 3490 /// 3491 /// By default, performs semantic analysis to build the new expression. 3492 /// Subclasses may override this routine to provide different behavior. 3493 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3494 MutableArrayRef<ObjCDictionaryElement> Elements) { 3495 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3496 } 3497 3498 /// Build a new Objective-C \@encode expression. 3499 /// 3500 /// By default, performs semantic analysis to build the new expression. 3501 /// Subclasses may override this routine to provide different behavior. 3502 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3503 TypeSourceInfo *EncodeTypeInfo, 3504 SourceLocation RParenLoc) { 3505 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3506 } 3507 3508 /// Build a new Objective-C class message. 3509 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3510 Selector Sel, 3511 ArrayRef<SourceLocation> SelectorLocs, 3512 ObjCMethodDecl *Method, 3513 SourceLocation LBracLoc, 3514 MultiExprArg Args, 3515 SourceLocation RBracLoc) { 3516 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3517 ReceiverTypeInfo->getType(), 3518 /*SuperLoc=*/SourceLocation(), 3519 Sel, Method, LBracLoc, SelectorLocs, 3520 RBracLoc, Args); 3521 } 3522 3523 /// Build a new Objective-C instance message. 3524 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3525 Selector Sel, 3526 ArrayRef<SourceLocation> SelectorLocs, 3527 ObjCMethodDecl *Method, 3528 SourceLocation LBracLoc, 3529 MultiExprArg Args, 3530 SourceLocation RBracLoc) { 3531 return SemaRef.BuildInstanceMessage(Receiver, 3532 Receiver->getType(), 3533 /*SuperLoc=*/SourceLocation(), 3534 Sel, Method, LBracLoc, SelectorLocs, 3535 RBracLoc, Args); 3536 } 3537 3538 /// Build a new Objective-C instance/class message to 'super'. 3539 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3540 Selector Sel, 3541 ArrayRef<SourceLocation> SelectorLocs, 3542 QualType SuperType, 3543 ObjCMethodDecl *Method, 3544 SourceLocation LBracLoc, 3545 MultiExprArg Args, 3546 SourceLocation RBracLoc) { 3547 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3548 SuperType, 3549 SuperLoc, 3550 Sel, Method, LBracLoc, SelectorLocs, 3551 RBracLoc, Args) 3552 : SemaRef.BuildClassMessage(nullptr, 3553 SuperType, 3554 SuperLoc, 3555 Sel, Method, LBracLoc, SelectorLocs, 3556 RBracLoc, Args); 3557 3558 3559 } 3560 3561 /// Build a new Objective-C ivar reference expression. 3562 /// 3563 /// By default, performs semantic analysis to build the new expression. 3564 /// Subclasses may override this routine to provide different behavior. 3565 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3566 SourceLocation IvarLoc, 3567 bool IsArrow, bool IsFreeIvar) { 3568 CXXScopeSpec SS; 3569 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3570 ExprResult Result = getSema().BuildMemberReferenceExpr( 3571 BaseArg, BaseArg->getType(), 3572 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3573 /*FirstQualifierInScope=*/nullptr, NameInfo, 3574 /*TemplateArgs=*/nullptr, 3575 /*S=*/nullptr); 3576 if (IsFreeIvar && Result.isUsable()) 3577 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3578 return Result; 3579 } 3580 3581 /// Build a new Objective-C property reference expression. 3582 /// 3583 /// By default, performs semantic analysis to build the new expression. 3584 /// Subclasses may override this routine to provide different behavior. 3585 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3586 ObjCPropertyDecl *Property, 3587 SourceLocation PropertyLoc) { 3588 CXXScopeSpec SS; 3589 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3590 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3591 /*FIXME:*/PropertyLoc, 3592 /*IsArrow=*/false, 3593 SS, SourceLocation(), 3594 /*FirstQualifierInScope=*/nullptr, 3595 NameInfo, 3596 /*TemplateArgs=*/nullptr, 3597 /*S=*/nullptr); 3598 } 3599 3600 /// Build a new Objective-C property reference expression. 3601 /// 3602 /// By default, performs semantic analysis to build the new expression. 3603 /// Subclasses may override this routine to provide different behavior. 3604 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3605 ObjCMethodDecl *Getter, 3606 ObjCMethodDecl *Setter, 3607 SourceLocation PropertyLoc) { 3608 // Since these expressions can only be value-dependent, we do not 3609 // need to perform semantic analysis again. 3610 return Owned( 3611 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3612 VK_LValue, OK_ObjCProperty, 3613 PropertyLoc, Base)); 3614 } 3615 3616 /// Build a new Objective-C "isa" expression. 3617 /// 3618 /// By default, performs semantic analysis to build the new expression. 3619 /// Subclasses may override this routine to provide different behavior. 3620 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3621 SourceLocation OpLoc, bool IsArrow) { 3622 CXXScopeSpec SS; 3623 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3624 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3625 OpLoc, IsArrow, 3626 SS, SourceLocation(), 3627 /*FirstQualifierInScope=*/nullptr, 3628 NameInfo, 3629 /*TemplateArgs=*/nullptr, 3630 /*S=*/nullptr); 3631 } 3632 3633 /// Build a new shuffle vector expression. 3634 /// 3635 /// By default, performs semantic analysis to build the new expression. 3636 /// Subclasses may override this routine to provide different behavior. 3637 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3638 MultiExprArg SubExprs, 3639 SourceLocation RParenLoc) { 3640 // Find the declaration for __builtin_shufflevector 3641 const IdentifierInfo &Name 3642 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3643 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3644 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3645 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3646 3647 // Build a reference to the __builtin_shufflevector builtin 3648 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3649 Expr *Callee = new (SemaRef.Context) 3650 DeclRefExpr(SemaRef.Context, Builtin, false, 3651 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3652 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3653 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3654 CK_BuiltinFnToFnPtr).get(); 3655 3656 // Build the CallExpr 3657 ExprResult TheCall = CallExpr::Create( 3658 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3659 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3660 FPOptionsOverride()); 3661 3662 // Type-check the __builtin_shufflevector expression. 3663 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3664 } 3665 3666 /// Build a new convert vector expression. 3667 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3668 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3669 SourceLocation RParenLoc) { 3670 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3671 BuiltinLoc, RParenLoc); 3672 } 3673 3674 /// Build a new template argument pack expansion. 3675 /// 3676 /// By default, performs semantic analysis to build a new pack expansion 3677 /// for a template argument. Subclasses may override this routine to provide 3678 /// different behavior. 3679 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3680 SourceLocation EllipsisLoc, 3681 Optional<unsigned> NumExpansions) { 3682 switch (Pattern.getArgument().getKind()) { 3683 case TemplateArgument::Expression: { 3684 ExprResult Result 3685 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3686 EllipsisLoc, NumExpansions); 3687 if (Result.isInvalid()) 3688 return TemplateArgumentLoc(); 3689 3690 return TemplateArgumentLoc(Result.get(), Result.get()); 3691 } 3692 3693 case TemplateArgument::Template: 3694 return TemplateArgumentLoc( 3695 SemaRef.Context, 3696 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3697 NumExpansions), 3698 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3699 EllipsisLoc); 3700 3701 case TemplateArgument::Null: 3702 case TemplateArgument::Integral: 3703 case TemplateArgument::Declaration: 3704 case TemplateArgument::Pack: 3705 case TemplateArgument::TemplateExpansion: 3706 case TemplateArgument::NullPtr: 3707 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3708 3709 case TemplateArgument::Type: 3710 if (TypeSourceInfo *Expansion 3711 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3712 EllipsisLoc, 3713 NumExpansions)) 3714 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3715 Expansion); 3716 break; 3717 } 3718 3719 return TemplateArgumentLoc(); 3720 } 3721 3722 /// Build a new expression pack expansion. 3723 /// 3724 /// By default, performs semantic analysis to build a new pack expansion 3725 /// for an expression. Subclasses may override this routine to provide 3726 /// different behavior. 3727 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3728 Optional<unsigned> NumExpansions) { 3729 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3730 } 3731 3732 /// Build a new C++1z fold-expression. 3733 /// 3734 /// By default, performs semantic analysis in order to build a new fold 3735 /// expression. 3736 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3737 SourceLocation LParenLoc, Expr *LHS, 3738 BinaryOperatorKind Operator, 3739 SourceLocation EllipsisLoc, Expr *RHS, 3740 SourceLocation RParenLoc, 3741 Optional<unsigned> NumExpansions) { 3742 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3743 EllipsisLoc, RHS, RParenLoc, 3744 NumExpansions); 3745 } 3746 3747 /// Build an empty C++1z fold-expression with the given operator. 3748 /// 3749 /// By default, produces the fallback value for the fold-expression, or 3750 /// produce an error if there is no fallback value. 3751 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3752 BinaryOperatorKind Operator) { 3753 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3754 } 3755 3756 /// Build a new atomic operation expression. 3757 /// 3758 /// By default, performs semantic analysis to build the new expression. 3759 /// Subclasses may override this routine to provide different behavior. 3760 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3761 AtomicExpr::AtomicOp Op, 3762 SourceLocation RParenLoc) { 3763 // Use this for all of the locations, since we don't know the difference 3764 // between the call and the expr at this point. 3765 SourceRange Range{BuiltinLoc, RParenLoc}; 3766 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3767 Sema::AtomicArgumentOrder::AST); 3768 } 3769 3770 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3771 ArrayRef<Expr *> SubExprs, QualType Type) { 3772 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3773 } 3774 3775 private: 3776 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3777 QualType ObjectType, 3778 NamedDecl *FirstQualifierInScope, 3779 CXXScopeSpec &SS); 3780 3781 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3782 QualType ObjectType, 3783 NamedDecl *FirstQualifierInScope, 3784 CXXScopeSpec &SS); 3785 3786 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3787 NamedDecl *FirstQualifierInScope, 3788 CXXScopeSpec &SS); 3789 3790 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3791 DependentNameTypeLoc TL, 3792 bool DeducibleTSTContext); 3793 }; 3794 3795 template <typename Derived> 3796 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3797 if (!S) 3798 return S; 3799 3800 switch (S->getStmtClass()) { 3801 case Stmt::NoStmtClass: break; 3802 3803 // Transform individual statement nodes 3804 // Pass SDK into statements that can produce a value 3805 #define STMT(Node, Parent) \ 3806 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3807 #define VALUESTMT(Node, Parent) \ 3808 case Stmt::Node##Class: \ 3809 return getDerived().Transform##Node(cast<Node>(S), SDK); 3810 #define ABSTRACT_STMT(Node) 3811 #define EXPR(Node, Parent) 3812 #include "clang/AST/StmtNodes.inc" 3813 3814 // Transform expressions by calling TransformExpr. 3815 #define STMT(Node, Parent) 3816 #define ABSTRACT_STMT(Stmt) 3817 #define EXPR(Node, Parent) case Stmt::Node##Class: 3818 #include "clang/AST/StmtNodes.inc" 3819 { 3820 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3821 3822 if (SDK == SDK_StmtExprResult) 3823 E = getSema().ActOnStmtExprResult(E); 3824 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3825 } 3826 } 3827 3828 return S; 3829 } 3830 3831 template<typename Derived> 3832 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3833 if (!S) 3834 return S; 3835 3836 switch (S->getClauseKind()) { 3837 default: break; 3838 // Transform individual clause nodes 3839 #define GEN_CLANG_CLAUSE_CLASS 3840 #define CLAUSE_CLASS(Enum, Str, Class) \ 3841 case Enum: \ 3842 return getDerived().Transform##Class(cast<Class>(S)); 3843 #include "llvm/Frontend/OpenMP/OMP.inc" 3844 } 3845 3846 return S; 3847 } 3848 3849 3850 template<typename Derived> 3851 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3852 if (!E) 3853 return E; 3854 3855 switch (E->getStmtClass()) { 3856 case Stmt::NoStmtClass: break; 3857 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3858 #define ABSTRACT_STMT(Stmt) 3859 #define EXPR(Node, Parent) \ 3860 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3861 #include "clang/AST/StmtNodes.inc" 3862 } 3863 3864 return E; 3865 } 3866 3867 template<typename Derived> 3868 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3869 bool NotCopyInit) { 3870 // Initializers are instantiated like expressions, except that various outer 3871 // layers are stripped. 3872 if (!Init) 3873 return Init; 3874 3875 if (auto *FE = dyn_cast<FullExpr>(Init)) 3876 Init = FE->getSubExpr(); 3877 3878 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3879 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 3880 Init = OVE->getSourceExpr(); 3881 } 3882 3883 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3884 Init = MTE->getSubExpr(); 3885 3886 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3887 Init = Binder->getSubExpr(); 3888 3889 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3890 Init = ICE->getSubExprAsWritten(); 3891 3892 if (CXXStdInitializerListExpr *ILE = 3893 dyn_cast<CXXStdInitializerListExpr>(Init)) 3894 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3895 3896 // If this is copy-initialization, we only need to reconstruct 3897 // InitListExprs. Other forms of copy-initialization will be a no-op if 3898 // the initializer is already the right type. 3899 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3900 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3901 return getDerived().TransformExpr(Init); 3902 3903 // Revert value-initialization back to empty parens. 3904 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3905 SourceRange Parens = VIE->getSourceRange(); 3906 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3907 Parens.getEnd()); 3908 } 3909 3910 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3911 if (isa<ImplicitValueInitExpr>(Init)) 3912 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3913 SourceLocation()); 3914 3915 // Revert initialization by constructor back to a parenthesized or braced list 3916 // of expressions. Any other form of initializer can just be reused directly. 3917 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3918 return getDerived().TransformExpr(Init); 3919 3920 // If the initialization implicitly converted an initializer list to a 3921 // std::initializer_list object, unwrap the std::initializer_list too. 3922 if (Construct && Construct->isStdInitListInitialization()) 3923 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3924 3925 // Enter a list-init context if this was list initialization. 3926 EnterExpressionEvaluationContext Context( 3927 getSema(), EnterExpressionEvaluationContext::InitList, 3928 Construct->isListInitialization()); 3929 3930 SmallVector<Expr*, 8> NewArgs; 3931 bool ArgChanged = false; 3932 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3933 /*IsCall*/true, NewArgs, &ArgChanged)) 3934 return ExprError(); 3935 3936 // If this was list initialization, revert to syntactic list form. 3937 if (Construct->isListInitialization()) 3938 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3939 Construct->getEndLoc()); 3940 3941 // Build a ParenListExpr to represent anything else. 3942 SourceRange Parens = Construct->getParenOrBraceRange(); 3943 if (Parens.isInvalid()) { 3944 // This was a variable declaration's initialization for which no initializer 3945 // was specified. 3946 assert(NewArgs.empty() && 3947 "no parens or braces but have direct init with arguments?"); 3948 return ExprEmpty(); 3949 } 3950 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3951 Parens.getEnd()); 3952 } 3953 3954 template<typename Derived> 3955 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3956 unsigned NumInputs, 3957 bool IsCall, 3958 SmallVectorImpl<Expr *> &Outputs, 3959 bool *ArgChanged) { 3960 for (unsigned I = 0; I != NumInputs; ++I) { 3961 // If requested, drop call arguments that need to be dropped. 3962 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3963 if (ArgChanged) 3964 *ArgChanged = true; 3965 3966 break; 3967 } 3968 3969 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3970 Expr *Pattern = Expansion->getPattern(); 3971 3972 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3973 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3974 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3975 3976 // Determine whether the set of unexpanded parameter packs can and should 3977 // be expanded. 3978 bool Expand = true; 3979 bool RetainExpansion = false; 3980 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3981 Optional<unsigned> NumExpansions = OrigNumExpansions; 3982 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3983 Pattern->getSourceRange(), 3984 Unexpanded, 3985 Expand, RetainExpansion, 3986 NumExpansions)) 3987 return true; 3988 3989 if (!Expand) { 3990 // The transform has determined that we should perform a simple 3991 // transformation on the pack expansion, producing another pack 3992 // expansion. 3993 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3994 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3995 if (OutPattern.isInvalid()) 3996 return true; 3997 3998 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3999 Expansion->getEllipsisLoc(), 4000 NumExpansions); 4001 if (Out.isInvalid()) 4002 return true; 4003 4004 if (ArgChanged) 4005 *ArgChanged = true; 4006 Outputs.push_back(Out.get()); 4007 continue; 4008 } 4009 4010 // Record right away that the argument was changed. This needs 4011 // to happen even if the array expands to nothing. 4012 if (ArgChanged) *ArgChanged = true; 4013 4014 // The transform has determined that we should perform an elementwise 4015 // expansion of the pattern. Do so. 4016 for (unsigned I = 0; I != *NumExpansions; ++I) { 4017 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4018 ExprResult Out = getDerived().TransformExpr(Pattern); 4019 if (Out.isInvalid()) 4020 return true; 4021 4022 if (Out.get()->containsUnexpandedParameterPack()) { 4023 Out = getDerived().RebuildPackExpansion( 4024 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4025 if (Out.isInvalid()) 4026 return true; 4027 } 4028 4029 Outputs.push_back(Out.get()); 4030 } 4031 4032 // If we're supposed to retain a pack expansion, do so by temporarily 4033 // forgetting the partially-substituted parameter pack. 4034 if (RetainExpansion) { 4035 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4036 4037 ExprResult Out = getDerived().TransformExpr(Pattern); 4038 if (Out.isInvalid()) 4039 return true; 4040 4041 Out = getDerived().RebuildPackExpansion( 4042 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4043 if (Out.isInvalid()) 4044 return true; 4045 4046 Outputs.push_back(Out.get()); 4047 } 4048 4049 continue; 4050 } 4051 4052 ExprResult Result = 4053 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4054 : getDerived().TransformExpr(Inputs[I]); 4055 if (Result.isInvalid()) 4056 return true; 4057 4058 if (Result.get() != Inputs[I] && ArgChanged) 4059 *ArgChanged = true; 4060 4061 Outputs.push_back(Result.get()); 4062 } 4063 4064 return false; 4065 } 4066 4067 template <typename Derived> 4068 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4069 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4070 if (Var) { 4071 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4072 getDerived().TransformDefinition(Var->getLocation(), Var)); 4073 4074 if (!ConditionVar) 4075 return Sema::ConditionError(); 4076 4077 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4078 } 4079 4080 if (Expr) { 4081 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4082 4083 if (CondExpr.isInvalid()) 4084 return Sema::ConditionError(); 4085 4086 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4087 /*MissingOK=*/true); 4088 } 4089 4090 return Sema::ConditionResult(); 4091 } 4092 4093 template <typename Derived> 4094 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4095 NestedNameSpecifierLoc NNS, QualType ObjectType, 4096 NamedDecl *FirstQualifierInScope) { 4097 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4098 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4099 Qualifier = Qualifier.getPrefix()) 4100 Qualifiers.push_back(Qualifier); 4101 4102 CXXScopeSpec SS; 4103 while (!Qualifiers.empty()) { 4104 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4105 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4106 4107 switch (QNNS->getKind()) { 4108 case NestedNameSpecifier::Identifier: { 4109 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4110 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4111 ObjectType); 4112 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4113 SS, FirstQualifierInScope, false)) 4114 return NestedNameSpecifierLoc(); 4115 break; 4116 } 4117 4118 case NestedNameSpecifier::Namespace: { 4119 NamespaceDecl *NS = 4120 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4121 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4122 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4123 break; 4124 } 4125 4126 case NestedNameSpecifier::NamespaceAlias: { 4127 NamespaceAliasDecl *Alias = 4128 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4129 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4130 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4131 Q.getLocalEndLoc()); 4132 break; 4133 } 4134 4135 case NestedNameSpecifier::Global: 4136 // There is no meaningful transformation that one could perform on the 4137 // global scope. 4138 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4139 break; 4140 4141 case NestedNameSpecifier::Super: { 4142 CXXRecordDecl *RD = 4143 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4144 SourceLocation(), QNNS->getAsRecordDecl())); 4145 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4146 break; 4147 } 4148 4149 case NestedNameSpecifier::TypeSpecWithTemplate: 4150 case NestedNameSpecifier::TypeSpec: { 4151 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4152 FirstQualifierInScope, SS); 4153 4154 if (!TL) 4155 return NestedNameSpecifierLoc(); 4156 4157 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4158 (SemaRef.getLangOpts().CPlusPlus11 && 4159 TL.getType()->isEnumeralType())) { 4160 assert(!TL.getType().hasLocalQualifiers() && 4161 "Can't get cv-qualifiers here"); 4162 if (TL.getType()->isEnumeralType()) 4163 SemaRef.Diag(TL.getBeginLoc(), 4164 diag::warn_cxx98_compat_enum_nested_name_spec); 4165 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4166 Q.getLocalEndLoc()); 4167 break; 4168 } 4169 // If the nested-name-specifier is an invalid type def, don't emit an 4170 // error because a previous error should have already been emitted. 4171 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4172 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4173 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4174 << TL.getType() << SS.getRange(); 4175 } 4176 return NestedNameSpecifierLoc(); 4177 } 4178 } 4179 4180 // The qualifier-in-scope and object type only apply to the leftmost entity. 4181 FirstQualifierInScope = nullptr; 4182 ObjectType = QualType(); 4183 } 4184 4185 // Don't rebuild the nested-name-specifier if we don't have to. 4186 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4187 !getDerived().AlwaysRebuild()) 4188 return NNS; 4189 4190 // If we can re-use the source-location data from the original 4191 // nested-name-specifier, do so. 4192 if (SS.location_size() == NNS.getDataLength() && 4193 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4194 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4195 4196 // Allocate new nested-name-specifier location information. 4197 return SS.getWithLocInContext(SemaRef.Context); 4198 } 4199 4200 template<typename Derived> 4201 DeclarationNameInfo 4202 TreeTransform<Derived> 4203 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4204 DeclarationName Name = NameInfo.getName(); 4205 if (!Name) 4206 return DeclarationNameInfo(); 4207 4208 switch (Name.getNameKind()) { 4209 case DeclarationName::Identifier: 4210 case DeclarationName::ObjCZeroArgSelector: 4211 case DeclarationName::ObjCOneArgSelector: 4212 case DeclarationName::ObjCMultiArgSelector: 4213 case DeclarationName::CXXOperatorName: 4214 case DeclarationName::CXXLiteralOperatorName: 4215 case DeclarationName::CXXUsingDirective: 4216 return NameInfo; 4217 4218 case DeclarationName::CXXDeductionGuideName: { 4219 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4220 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4221 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4222 if (!NewTemplate) 4223 return DeclarationNameInfo(); 4224 4225 DeclarationNameInfo NewNameInfo(NameInfo); 4226 NewNameInfo.setName( 4227 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4228 return NewNameInfo; 4229 } 4230 4231 case DeclarationName::CXXConstructorName: 4232 case DeclarationName::CXXDestructorName: 4233 case DeclarationName::CXXConversionFunctionName: { 4234 TypeSourceInfo *NewTInfo; 4235 CanQualType NewCanTy; 4236 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4237 NewTInfo = getDerived().TransformType(OldTInfo); 4238 if (!NewTInfo) 4239 return DeclarationNameInfo(); 4240 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4241 } 4242 else { 4243 NewTInfo = nullptr; 4244 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4245 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4246 if (NewT.isNull()) 4247 return DeclarationNameInfo(); 4248 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4249 } 4250 4251 DeclarationName NewName 4252 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4253 NewCanTy); 4254 DeclarationNameInfo NewNameInfo(NameInfo); 4255 NewNameInfo.setName(NewName); 4256 NewNameInfo.setNamedTypeInfo(NewTInfo); 4257 return NewNameInfo; 4258 } 4259 } 4260 4261 llvm_unreachable("Unknown name kind."); 4262 } 4263 4264 template<typename Derived> 4265 TemplateName 4266 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4267 TemplateName Name, 4268 SourceLocation NameLoc, 4269 QualType ObjectType, 4270 NamedDecl *FirstQualifierInScope, 4271 bool AllowInjectedClassName) { 4272 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4273 TemplateDecl *Template = QTN->getTemplateDecl(); 4274 assert(Template && "qualified template name must refer to a template"); 4275 4276 TemplateDecl *TransTemplate 4277 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4278 Template)); 4279 if (!TransTemplate) 4280 return TemplateName(); 4281 4282 if (!getDerived().AlwaysRebuild() && 4283 SS.getScopeRep() == QTN->getQualifier() && 4284 TransTemplate == Template) 4285 return Name; 4286 4287 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4288 TransTemplate); 4289 } 4290 4291 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4292 if (SS.getScopeRep()) { 4293 // These apply to the scope specifier, not the template. 4294 ObjectType = QualType(); 4295 FirstQualifierInScope = nullptr; 4296 } 4297 4298 if (!getDerived().AlwaysRebuild() && 4299 SS.getScopeRep() == DTN->getQualifier() && 4300 ObjectType.isNull()) 4301 return Name; 4302 4303 // FIXME: Preserve the location of the "template" keyword. 4304 SourceLocation TemplateKWLoc = NameLoc; 4305 4306 if (DTN->isIdentifier()) { 4307 return getDerived().RebuildTemplateName(SS, 4308 TemplateKWLoc, 4309 *DTN->getIdentifier(), 4310 NameLoc, 4311 ObjectType, 4312 FirstQualifierInScope, 4313 AllowInjectedClassName); 4314 } 4315 4316 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4317 DTN->getOperator(), NameLoc, 4318 ObjectType, AllowInjectedClassName); 4319 } 4320 4321 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4322 TemplateDecl *TransTemplate 4323 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4324 Template)); 4325 if (!TransTemplate) 4326 return TemplateName(); 4327 4328 if (!getDerived().AlwaysRebuild() && 4329 TransTemplate == Template) 4330 return Name; 4331 4332 return TemplateName(TransTemplate); 4333 } 4334 4335 if (SubstTemplateTemplateParmPackStorage *SubstPack 4336 = Name.getAsSubstTemplateTemplateParmPack()) { 4337 TemplateTemplateParmDecl *TransParam 4338 = cast_or_null<TemplateTemplateParmDecl>( 4339 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4340 if (!TransParam) 4341 return TemplateName(); 4342 4343 if (!getDerived().AlwaysRebuild() && 4344 TransParam == SubstPack->getParameterPack()) 4345 return Name; 4346 4347 return getDerived().RebuildTemplateName(TransParam, 4348 SubstPack->getArgumentPack()); 4349 } 4350 4351 // These should be getting filtered out before they reach the AST. 4352 llvm_unreachable("overloaded function decl survived to here"); 4353 } 4354 4355 template<typename Derived> 4356 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4357 const TemplateArgument &Arg, 4358 TemplateArgumentLoc &Output) { 4359 Output = getSema().getTrivialTemplateArgumentLoc( 4360 Arg, QualType(), getDerived().getBaseLocation()); 4361 } 4362 4363 template <typename Derived> 4364 bool TreeTransform<Derived>::TransformTemplateArgument( 4365 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4366 bool Uneval) { 4367 const TemplateArgument &Arg = Input.getArgument(); 4368 switch (Arg.getKind()) { 4369 case TemplateArgument::Null: 4370 case TemplateArgument::Pack: 4371 llvm_unreachable("Unexpected TemplateArgument"); 4372 4373 case TemplateArgument::Integral: 4374 case TemplateArgument::NullPtr: 4375 case TemplateArgument::Declaration: { 4376 // Transform a resolved template argument straight to a resolved template 4377 // argument. We get here when substituting into an already-substituted 4378 // template type argument during concept satisfaction checking. 4379 QualType T = Arg.getNonTypeTemplateArgumentType(); 4380 QualType NewT = getDerived().TransformType(T); 4381 if (NewT.isNull()) 4382 return true; 4383 4384 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4385 ? Arg.getAsDecl() 4386 : nullptr; 4387 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4388 getDerived().getBaseLocation(), D)) 4389 : nullptr; 4390 if (D && !NewD) 4391 return true; 4392 4393 if (NewT == T && D == NewD) 4394 Output = Input; 4395 else if (Arg.getKind() == TemplateArgument::Integral) 4396 Output = TemplateArgumentLoc( 4397 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4398 TemplateArgumentLocInfo()); 4399 else if (Arg.getKind() == TemplateArgument::NullPtr) 4400 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4401 TemplateArgumentLocInfo()); 4402 else 4403 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4404 TemplateArgumentLocInfo()); 4405 4406 return false; 4407 } 4408 4409 case TemplateArgument::Type: { 4410 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4411 if (!DI) 4412 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4413 4414 DI = getDerived().TransformType(DI); 4415 if (!DI) 4416 return true; 4417 4418 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4419 return false; 4420 } 4421 4422 case TemplateArgument::Template: { 4423 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4424 if (QualifierLoc) { 4425 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4426 if (!QualifierLoc) 4427 return true; 4428 } 4429 4430 CXXScopeSpec SS; 4431 SS.Adopt(QualifierLoc); 4432 TemplateName Template = getDerived().TransformTemplateName( 4433 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4434 if (Template.isNull()) 4435 return true; 4436 4437 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4438 QualifierLoc, Input.getTemplateNameLoc()); 4439 return false; 4440 } 4441 4442 case TemplateArgument::TemplateExpansion: 4443 llvm_unreachable("Caller should expand pack expansions"); 4444 4445 case TemplateArgument::Expression: { 4446 // Template argument expressions are constant expressions. 4447 EnterExpressionEvaluationContext Unevaluated( 4448 getSema(), 4449 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4450 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4451 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4452 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4453 4454 Expr *InputExpr = Input.getSourceExpression(); 4455 if (!InputExpr) 4456 InputExpr = Input.getArgument().getAsExpr(); 4457 4458 ExprResult E = getDerived().TransformExpr(InputExpr); 4459 E = SemaRef.ActOnConstantExpression(E); 4460 if (E.isInvalid()) 4461 return true; 4462 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4463 return false; 4464 } 4465 } 4466 4467 // Work around bogus GCC warning 4468 return true; 4469 } 4470 4471 /// Iterator adaptor that invents template argument location information 4472 /// for each of the template arguments in its underlying iterator. 4473 template<typename Derived, typename InputIterator> 4474 class TemplateArgumentLocInventIterator { 4475 TreeTransform<Derived> &Self; 4476 InputIterator Iter; 4477 4478 public: 4479 typedef TemplateArgumentLoc value_type; 4480 typedef TemplateArgumentLoc reference; 4481 typedef typename std::iterator_traits<InputIterator>::difference_type 4482 difference_type; 4483 typedef std::input_iterator_tag iterator_category; 4484 4485 class pointer { 4486 TemplateArgumentLoc Arg; 4487 4488 public: 4489 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4490 4491 const TemplateArgumentLoc *operator->() const { return &Arg; } 4492 }; 4493 4494 TemplateArgumentLocInventIterator() { } 4495 4496 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4497 InputIterator Iter) 4498 : Self(Self), Iter(Iter) { } 4499 4500 TemplateArgumentLocInventIterator &operator++() { 4501 ++Iter; 4502 return *this; 4503 } 4504 4505 TemplateArgumentLocInventIterator operator++(int) { 4506 TemplateArgumentLocInventIterator Old(*this); 4507 ++(*this); 4508 return Old; 4509 } 4510 4511 reference operator*() const { 4512 TemplateArgumentLoc Result; 4513 Self.InventTemplateArgumentLoc(*Iter, Result); 4514 return Result; 4515 } 4516 4517 pointer operator->() const { return pointer(**this); } 4518 4519 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4520 const TemplateArgumentLocInventIterator &Y) { 4521 return X.Iter == Y.Iter; 4522 } 4523 4524 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4525 const TemplateArgumentLocInventIterator &Y) { 4526 return X.Iter != Y.Iter; 4527 } 4528 }; 4529 4530 template<typename Derived> 4531 template<typename InputIterator> 4532 bool TreeTransform<Derived>::TransformTemplateArguments( 4533 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4534 bool Uneval) { 4535 for (; First != Last; ++First) { 4536 TemplateArgumentLoc Out; 4537 TemplateArgumentLoc In = *First; 4538 4539 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4540 // Unpack argument packs, which we translate them into separate 4541 // arguments. 4542 // FIXME: We could do much better if we could guarantee that the 4543 // TemplateArgumentLocInfo for the pack expansion would be usable for 4544 // all of the template arguments in the argument pack. 4545 typedef TemplateArgumentLocInventIterator<Derived, 4546 TemplateArgument::pack_iterator> 4547 PackLocIterator; 4548 if (TransformTemplateArguments(PackLocIterator(*this, 4549 In.getArgument().pack_begin()), 4550 PackLocIterator(*this, 4551 In.getArgument().pack_end()), 4552 Outputs, Uneval)) 4553 return true; 4554 4555 continue; 4556 } 4557 4558 if (In.getArgument().isPackExpansion()) { 4559 // We have a pack expansion, for which we will be substituting into 4560 // the pattern. 4561 SourceLocation Ellipsis; 4562 Optional<unsigned> OrigNumExpansions; 4563 TemplateArgumentLoc Pattern 4564 = getSema().getTemplateArgumentPackExpansionPattern( 4565 In, Ellipsis, OrigNumExpansions); 4566 4567 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4568 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4569 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4570 4571 // Determine whether the set of unexpanded parameter packs can and should 4572 // be expanded. 4573 bool Expand = true; 4574 bool RetainExpansion = false; 4575 Optional<unsigned> NumExpansions = OrigNumExpansions; 4576 if (getDerived().TryExpandParameterPacks(Ellipsis, 4577 Pattern.getSourceRange(), 4578 Unexpanded, 4579 Expand, 4580 RetainExpansion, 4581 NumExpansions)) 4582 return true; 4583 4584 if (!Expand) { 4585 // The transform has determined that we should perform a simple 4586 // transformation on the pack expansion, producing another pack 4587 // expansion. 4588 TemplateArgumentLoc OutPattern; 4589 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4590 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4591 return true; 4592 4593 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4594 NumExpansions); 4595 if (Out.getArgument().isNull()) 4596 return true; 4597 4598 Outputs.addArgument(Out); 4599 continue; 4600 } 4601 4602 // The transform has determined that we should perform an elementwise 4603 // expansion of the pattern. Do so. 4604 for (unsigned I = 0; I != *NumExpansions; ++I) { 4605 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4606 4607 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4608 return true; 4609 4610 if (Out.getArgument().containsUnexpandedParameterPack()) { 4611 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4612 OrigNumExpansions); 4613 if (Out.getArgument().isNull()) 4614 return true; 4615 } 4616 4617 Outputs.addArgument(Out); 4618 } 4619 4620 // If we're supposed to retain a pack expansion, do so by temporarily 4621 // forgetting the partially-substituted parameter pack. 4622 if (RetainExpansion) { 4623 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4624 4625 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4626 return true; 4627 4628 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4629 OrigNumExpansions); 4630 if (Out.getArgument().isNull()) 4631 return true; 4632 4633 Outputs.addArgument(Out); 4634 } 4635 4636 continue; 4637 } 4638 4639 // The simple case: 4640 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4641 return true; 4642 4643 Outputs.addArgument(Out); 4644 } 4645 4646 return false; 4647 4648 } 4649 4650 //===----------------------------------------------------------------------===// 4651 // Type transformation 4652 //===----------------------------------------------------------------------===// 4653 4654 template<typename Derived> 4655 QualType TreeTransform<Derived>::TransformType(QualType T) { 4656 if (getDerived().AlreadyTransformed(T)) 4657 return T; 4658 4659 // Temporary workaround. All of these transformations should 4660 // eventually turn into transformations on TypeLocs. 4661 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4662 getDerived().getBaseLocation()); 4663 4664 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4665 4666 if (!NewDI) 4667 return QualType(); 4668 4669 return NewDI->getType(); 4670 } 4671 4672 template<typename Derived> 4673 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4674 // Refine the base location to the type's location. 4675 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4676 getDerived().getBaseEntity()); 4677 if (getDerived().AlreadyTransformed(DI->getType())) 4678 return DI; 4679 4680 TypeLocBuilder TLB; 4681 4682 TypeLoc TL = DI->getTypeLoc(); 4683 TLB.reserve(TL.getFullDataSize()); 4684 4685 QualType Result = getDerived().TransformType(TLB, TL); 4686 if (Result.isNull()) 4687 return nullptr; 4688 4689 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4690 } 4691 4692 template<typename Derived> 4693 QualType 4694 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4695 switch (T.getTypeLocClass()) { 4696 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4697 #define TYPELOC(CLASS, PARENT) \ 4698 case TypeLoc::CLASS: \ 4699 return getDerived().Transform##CLASS##Type(TLB, \ 4700 T.castAs<CLASS##TypeLoc>()); 4701 #include "clang/AST/TypeLocNodes.def" 4702 } 4703 4704 llvm_unreachable("unhandled type loc!"); 4705 } 4706 4707 template<typename Derived> 4708 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4709 if (!isa<DependentNameType>(T)) 4710 return TransformType(T); 4711 4712 if (getDerived().AlreadyTransformed(T)) 4713 return T; 4714 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4715 getDerived().getBaseLocation()); 4716 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4717 return NewDI ? NewDI->getType() : QualType(); 4718 } 4719 4720 template<typename Derived> 4721 TypeSourceInfo * 4722 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4723 if (!isa<DependentNameType>(DI->getType())) 4724 return TransformType(DI); 4725 4726 // Refine the base location to the type's location. 4727 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4728 getDerived().getBaseEntity()); 4729 if (getDerived().AlreadyTransformed(DI->getType())) 4730 return DI; 4731 4732 TypeLocBuilder TLB; 4733 4734 TypeLoc TL = DI->getTypeLoc(); 4735 TLB.reserve(TL.getFullDataSize()); 4736 4737 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4738 if (QTL) 4739 TL = QTL.getUnqualifiedLoc(); 4740 4741 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4742 4743 QualType Result = getDerived().TransformDependentNameType( 4744 TLB, DNTL, /*DeducedTSTContext*/true); 4745 if (Result.isNull()) 4746 return nullptr; 4747 4748 if (QTL) { 4749 Result = getDerived().RebuildQualifiedType(Result, QTL); 4750 if (Result.isNull()) 4751 return nullptr; 4752 TLB.TypeWasModifiedSafely(Result); 4753 } 4754 4755 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4756 } 4757 4758 template<typename Derived> 4759 QualType 4760 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4761 QualifiedTypeLoc T) { 4762 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4763 if (Result.isNull()) 4764 return QualType(); 4765 4766 Result = getDerived().RebuildQualifiedType(Result, T); 4767 4768 if (Result.isNull()) 4769 return QualType(); 4770 4771 // RebuildQualifiedType might have updated the type, but not in a way 4772 // that invalidates the TypeLoc. (There's no location information for 4773 // qualifiers.) 4774 TLB.TypeWasModifiedSafely(Result); 4775 4776 return Result; 4777 } 4778 4779 template <typename Derived> 4780 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4781 QualifiedTypeLoc TL) { 4782 4783 SourceLocation Loc = TL.getBeginLoc(); 4784 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4785 4786 if ((T.getAddressSpace() != LangAS::Default && 4787 Quals.getAddressSpace() != LangAS::Default) && 4788 T.getAddressSpace() != Quals.getAddressSpace()) { 4789 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4790 << TL.getType() << T; 4791 return QualType(); 4792 } 4793 4794 // C++ [dcl.fct]p7: 4795 // [When] adding cv-qualifications on top of the function type [...] the 4796 // cv-qualifiers are ignored. 4797 if (T->isFunctionType()) { 4798 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4799 Quals.getAddressSpace()); 4800 return T; 4801 } 4802 4803 // C++ [dcl.ref]p1: 4804 // when the cv-qualifiers are introduced through the use of a typedef-name 4805 // or decltype-specifier [...] the cv-qualifiers are ignored. 4806 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4807 // applied to a reference type. 4808 if (T->isReferenceType()) { 4809 // The only qualifier that applies to a reference type is restrict. 4810 if (!Quals.hasRestrict()) 4811 return T; 4812 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4813 } 4814 4815 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4816 // resulting type. 4817 if (Quals.hasObjCLifetime()) { 4818 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4819 Quals.removeObjCLifetime(); 4820 else if (T.getObjCLifetime()) { 4821 // Objective-C ARC: 4822 // A lifetime qualifier applied to a substituted template parameter 4823 // overrides the lifetime qualifier from the template argument. 4824 const AutoType *AutoTy; 4825 if (const SubstTemplateTypeParmType *SubstTypeParam 4826 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4827 QualType Replacement = SubstTypeParam->getReplacementType(); 4828 Qualifiers Qs = Replacement.getQualifiers(); 4829 Qs.removeObjCLifetime(); 4830 Replacement = SemaRef.Context.getQualifiedType( 4831 Replacement.getUnqualifiedType(), Qs); 4832 T = SemaRef.Context.getSubstTemplateTypeParmType( 4833 SubstTypeParam->getReplacedParameter(), Replacement); 4834 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4835 // 'auto' types behave the same way as template parameters. 4836 QualType Deduced = AutoTy->getDeducedType(); 4837 Qualifiers Qs = Deduced.getQualifiers(); 4838 Qs.removeObjCLifetime(); 4839 Deduced = 4840 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4841 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4842 AutoTy->isDependentType(), 4843 /*isPack=*/false, 4844 AutoTy->getTypeConstraintConcept(), 4845 AutoTy->getTypeConstraintArguments()); 4846 } else { 4847 // Otherwise, complain about the addition of a qualifier to an 4848 // already-qualified type. 4849 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4850 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4851 Quals.removeObjCLifetime(); 4852 } 4853 } 4854 } 4855 4856 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4857 } 4858 4859 template<typename Derived> 4860 TypeLoc 4861 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4862 QualType ObjectType, 4863 NamedDecl *UnqualLookup, 4864 CXXScopeSpec &SS) { 4865 if (getDerived().AlreadyTransformed(TL.getType())) 4866 return TL; 4867 4868 TypeSourceInfo *TSI = 4869 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4870 if (TSI) 4871 return TSI->getTypeLoc(); 4872 return TypeLoc(); 4873 } 4874 4875 template<typename Derived> 4876 TypeSourceInfo * 4877 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4878 QualType ObjectType, 4879 NamedDecl *UnqualLookup, 4880 CXXScopeSpec &SS) { 4881 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4882 return TSInfo; 4883 4884 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4885 UnqualLookup, SS); 4886 } 4887 4888 template <typename Derived> 4889 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4890 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4891 CXXScopeSpec &SS) { 4892 QualType T = TL.getType(); 4893 assert(!getDerived().AlreadyTransformed(T)); 4894 4895 TypeLocBuilder TLB; 4896 QualType Result; 4897 4898 if (isa<TemplateSpecializationType>(T)) { 4899 TemplateSpecializationTypeLoc SpecTL = 4900 TL.castAs<TemplateSpecializationTypeLoc>(); 4901 4902 TemplateName Template = getDerived().TransformTemplateName( 4903 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4904 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4905 if (Template.isNull()) 4906 return nullptr; 4907 4908 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4909 Template); 4910 } else if (isa<DependentTemplateSpecializationType>(T)) { 4911 DependentTemplateSpecializationTypeLoc SpecTL = 4912 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4913 4914 TemplateName Template 4915 = getDerived().RebuildTemplateName(SS, 4916 SpecTL.getTemplateKeywordLoc(), 4917 *SpecTL.getTypePtr()->getIdentifier(), 4918 SpecTL.getTemplateNameLoc(), 4919 ObjectType, UnqualLookup, 4920 /*AllowInjectedClassName*/true); 4921 if (Template.isNull()) 4922 return nullptr; 4923 4924 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4925 SpecTL, 4926 Template, 4927 SS); 4928 } else { 4929 // Nothing special needs to be done for these. 4930 Result = getDerived().TransformType(TLB, TL); 4931 } 4932 4933 if (Result.isNull()) 4934 return nullptr; 4935 4936 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4937 } 4938 4939 template <class TyLoc> static inline 4940 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4941 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4942 NewT.setNameLoc(T.getNameLoc()); 4943 return T.getType(); 4944 } 4945 4946 template<typename Derived> 4947 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4948 BuiltinTypeLoc T) { 4949 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4950 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4951 if (T.needsExtraLocalData()) 4952 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4953 return T.getType(); 4954 } 4955 4956 template<typename Derived> 4957 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4958 ComplexTypeLoc T) { 4959 // FIXME: recurse? 4960 return TransformTypeSpecType(TLB, T); 4961 } 4962 4963 template <typename Derived> 4964 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4965 AdjustedTypeLoc TL) { 4966 // Adjustments applied during transformation are handled elsewhere. 4967 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4968 } 4969 4970 template<typename Derived> 4971 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4972 DecayedTypeLoc TL) { 4973 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4974 if (OriginalType.isNull()) 4975 return QualType(); 4976 4977 QualType Result = TL.getType(); 4978 if (getDerived().AlwaysRebuild() || 4979 OriginalType != TL.getOriginalLoc().getType()) 4980 Result = SemaRef.Context.getDecayedType(OriginalType); 4981 TLB.push<DecayedTypeLoc>(Result); 4982 // Nothing to set for DecayedTypeLoc. 4983 return Result; 4984 } 4985 4986 template<typename Derived> 4987 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4988 PointerTypeLoc TL) { 4989 QualType PointeeType 4990 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4991 if (PointeeType.isNull()) 4992 return QualType(); 4993 4994 QualType Result = TL.getType(); 4995 if (PointeeType->getAs<ObjCObjectType>()) { 4996 // A dependent pointer type 'T *' has is being transformed such 4997 // that an Objective-C class type is being replaced for 'T'. The 4998 // resulting pointer type is an ObjCObjectPointerType, not a 4999 // PointerType. 5000 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5001 5002 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5003 NewT.setStarLoc(TL.getStarLoc()); 5004 return Result; 5005 } 5006 5007 if (getDerived().AlwaysRebuild() || 5008 PointeeType != TL.getPointeeLoc().getType()) { 5009 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5010 if (Result.isNull()) 5011 return QualType(); 5012 } 5013 5014 // Objective-C ARC can add lifetime qualifiers to the type that we're 5015 // pointing to. 5016 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5017 5018 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5019 NewT.setSigilLoc(TL.getSigilLoc()); 5020 return Result; 5021 } 5022 5023 template<typename Derived> 5024 QualType 5025 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5026 BlockPointerTypeLoc TL) { 5027 QualType PointeeType 5028 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5029 if (PointeeType.isNull()) 5030 return QualType(); 5031 5032 QualType Result = TL.getType(); 5033 if (getDerived().AlwaysRebuild() || 5034 PointeeType != TL.getPointeeLoc().getType()) { 5035 Result = getDerived().RebuildBlockPointerType(PointeeType, 5036 TL.getSigilLoc()); 5037 if (Result.isNull()) 5038 return QualType(); 5039 } 5040 5041 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5042 NewT.setSigilLoc(TL.getSigilLoc()); 5043 return Result; 5044 } 5045 5046 /// Transforms a reference type. Note that somewhat paradoxically we 5047 /// don't care whether the type itself is an l-value type or an r-value 5048 /// type; we only care if the type was *written* as an l-value type 5049 /// or an r-value type. 5050 template<typename Derived> 5051 QualType 5052 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5053 ReferenceTypeLoc TL) { 5054 const ReferenceType *T = TL.getTypePtr(); 5055 5056 // Note that this works with the pointee-as-written. 5057 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5058 if (PointeeType.isNull()) 5059 return QualType(); 5060 5061 QualType Result = TL.getType(); 5062 if (getDerived().AlwaysRebuild() || 5063 PointeeType != T->getPointeeTypeAsWritten()) { 5064 Result = getDerived().RebuildReferenceType(PointeeType, 5065 T->isSpelledAsLValue(), 5066 TL.getSigilLoc()); 5067 if (Result.isNull()) 5068 return QualType(); 5069 } 5070 5071 // Objective-C ARC can add lifetime qualifiers to the type that we're 5072 // referring to. 5073 TLB.TypeWasModifiedSafely( 5074 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5075 5076 // r-value references can be rebuilt as l-value references. 5077 ReferenceTypeLoc NewTL; 5078 if (isa<LValueReferenceType>(Result)) 5079 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5080 else 5081 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5082 NewTL.setSigilLoc(TL.getSigilLoc()); 5083 5084 return Result; 5085 } 5086 5087 template<typename Derived> 5088 QualType 5089 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5090 LValueReferenceTypeLoc TL) { 5091 return TransformReferenceType(TLB, TL); 5092 } 5093 5094 template<typename Derived> 5095 QualType 5096 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5097 RValueReferenceTypeLoc TL) { 5098 return TransformReferenceType(TLB, TL); 5099 } 5100 5101 template<typename Derived> 5102 QualType 5103 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5104 MemberPointerTypeLoc TL) { 5105 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5106 if (PointeeType.isNull()) 5107 return QualType(); 5108 5109 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5110 TypeSourceInfo *NewClsTInfo = nullptr; 5111 if (OldClsTInfo) { 5112 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5113 if (!NewClsTInfo) 5114 return QualType(); 5115 } 5116 5117 const MemberPointerType *T = TL.getTypePtr(); 5118 QualType OldClsType = QualType(T->getClass(), 0); 5119 QualType NewClsType; 5120 if (NewClsTInfo) 5121 NewClsType = NewClsTInfo->getType(); 5122 else { 5123 NewClsType = getDerived().TransformType(OldClsType); 5124 if (NewClsType.isNull()) 5125 return QualType(); 5126 } 5127 5128 QualType Result = TL.getType(); 5129 if (getDerived().AlwaysRebuild() || 5130 PointeeType != T->getPointeeType() || 5131 NewClsType != OldClsType) { 5132 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5133 TL.getStarLoc()); 5134 if (Result.isNull()) 5135 return QualType(); 5136 } 5137 5138 // If we had to adjust the pointee type when building a member pointer, make 5139 // sure to push TypeLoc info for it. 5140 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5141 if (MPT && PointeeType != MPT->getPointeeType()) { 5142 assert(isa<AdjustedType>(MPT->getPointeeType())); 5143 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5144 } 5145 5146 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5147 NewTL.setSigilLoc(TL.getSigilLoc()); 5148 NewTL.setClassTInfo(NewClsTInfo); 5149 5150 return Result; 5151 } 5152 5153 template<typename Derived> 5154 QualType 5155 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5156 ConstantArrayTypeLoc TL) { 5157 const ConstantArrayType *T = TL.getTypePtr(); 5158 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5159 if (ElementType.isNull()) 5160 return QualType(); 5161 5162 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5163 Expr *OldSize = TL.getSizeExpr(); 5164 if (!OldSize) 5165 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5166 Expr *NewSize = nullptr; 5167 if (OldSize) { 5168 EnterExpressionEvaluationContext Unevaluated( 5169 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5170 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5171 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5172 } 5173 5174 QualType Result = TL.getType(); 5175 if (getDerived().AlwaysRebuild() || 5176 ElementType != T->getElementType() || 5177 (T->getSizeExpr() && NewSize != OldSize)) { 5178 Result = getDerived().RebuildConstantArrayType(ElementType, 5179 T->getSizeModifier(), 5180 T->getSize(), NewSize, 5181 T->getIndexTypeCVRQualifiers(), 5182 TL.getBracketsRange()); 5183 if (Result.isNull()) 5184 return QualType(); 5185 } 5186 5187 // We might have either a ConstantArrayType or a VariableArrayType now: 5188 // a ConstantArrayType is allowed to have an element type which is a 5189 // VariableArrayType if the type is dependent. Fortunately, all array 5190 // types have the same location layout. 5191 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5192 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5193 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5194 NewTL.setSizeExpr(NewSize); 5195 5196 return Result; 5197 } 5198 5199 template<typename Derived> 5200 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5201 TypeLocBuilder &TLB, 5202 IncompleteArrayTypeLoc TL) { 5203 const IncompleteArrayType *T = TL.getTypePtr(); 5204 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5205 if (ElementType.isNull()) 5206 return QualType(); 5207 5208 QualType Result = TL.getType(); 5209 if (getDerived().AlwaysRebuild() || 5210 ElementType != T->getElementType()) { 5211 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5212 T->getSizeModifier(), 5213 T->getIndexTypeCVRQualifiers(), 5214 TL.getBracketsRange()); 5215 if (Result.isNull()) 5216 return QualType(); 5217 } 5218 5219 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5220 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5221 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5222 NewTL.setSizeExpr(nullptr); 5223 5224 return Result; 5225 } 5226 5227 template<typename Derived> 5228 QualType 5229 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5230 VariableArrayTypeLoc TL) { 5231 const VariableArrayType *T = TL.getTypePtr(); 5232 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5233 if (ElementType.isNull()) 5234 return QualType(); 5235 5236 ExprResult SizeResult; 5237 { 5238 EnterExpressionEvaluationContext Context( 5239 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5240 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5241 } 5242 if (SizeResult.isInvalid()) 5243 return QualType(); 5244 SizeResult = 5245 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5246 if (SizeResult.isInvalid()) 5247 return QualType(); 5248 5249 Expr *Size = SizeResult.get(); 5250 5251 QualType Result = TL.getType(); 5252 if (getDerived().AlwaysRebuild() || 5253 ElementType != T->getElementType() || 5254 Size != T->getSizeExpr()) { 5255 Result = getDerived().RebuildVariableArrayType(ElementType, 5256 T->getSizeModifier(), 5257 Size, 5258 T->getIndexTypeCVRQualifiers(), 5259 TL.getBracketsRange()); 5260 if (Result.isNull()) 5261 return QualType(); 5262 } 5263 5264 // We might have constant size array now, but fortunately it has the same 5265 // location layout. 5266 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5267 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5268 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5269 NewTL.setSizeExpr(Size); 5270 5271 return Result; 5272 } 5273 5274 template<typename Derived> 5275 QualType 5276 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5277 DependentSizedArrayTypeLoc TL) { 5278 const DependentSizedArrayType *T = TL.getTypePtr(); 5279 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5280 if (ElementType.isNull()) 5281 return QualType(); 5282 5283 // Array bounds are constant expressions. 5284 EnterExpressionEvaluationContext Unevaluated( 5285 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5286 5287 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5288 Expr *origSize = TL.getSizeExpr(); 5289 if (!origSize) origSize = T->getSizeExpr(); 5290 5291 ExprResult sizeResult 5292 = getDerived().TransformExpr(origSize); 5293 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5294 if (sizeResult.isInvalid()) 5295 return QualType(); 5296 5297 Expr *size = sizeResult.get(); 5298 5299 QualType Result = TL.getType(); 5300 if (getDerived().AlwaysRebuild() || 5301 ElementType != T->getElementType() || 5302 size != origSize) { 5303 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5304 T->getSizeModifier(), 5305 size, 5306 T->getIndexTypeCVRQualifiers(), 5307 TL.getBracketsRange()); 5308 if (Result.isNull()) 5309 return QualType(); 5310 } 5311 5312 // We might have any sort of array type now, but fortunately they 5313 // all have the same location layout. 5314 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5315 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5316 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5317 NewTL.setSizeExpr(size); 5318 5319 return Result; 5320 } 5321 5322 template <typename Derived> 5323 QualType TreeTransform<Derived>::TransformDependentVectorType( 5324 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5325 const DependentVectorType *T = TL.getTypePtr(); 5326 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5327 if (ElementType.isNull()) 5328 return QualType(); 5329 5330 EnterExpressionEvaluationContext Unevaluated( 5331 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5332 5333 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5334 Size = SemaRef.ActOnConstantExpression(Size); 5335 if (Size.isInvalid()) 5336 return QualType(); 5337 5338 QualType Result = TL.getType(); 5339 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5340 Size.get() != T->getSizeExpr()) { 5341 Result = getDerived().RebuildDependentVectorType( 5342 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5343 if (Result.isNull()) 5344 return QualType(); 5345 } 5346 5347 // Result might be dependent or not. 5348 if (isa<DependentVectorType>(Result)) { 5349 DependentVectorTypeLoc NewTL = 5350 TLB.push<DependentVectorTypeLoc>(Result); 5351 NewTL.setNameLoc(TL.getNameLoc()); 5352 } else { 5353 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5354 NewTL.setNameLoc(TL.getNameLoc()); 5355 } 5356 5357 return Result; 5358 } 5359 5360 template<typename Derived> 5361 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5362 TypeLocBuilder &TLB, 5363 DependentSizedExtVectorTypeLoc TL) { 5364 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5365 5366 // FIXME: ext vector locs should be nested 5367 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5368 if (ElementType.isNull()) 5369 return QualType(); 5370 5371 // Vector sizes are constant expressions. 5372 EnterExpressionEvaluationContext Unevaluated( 5373 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5374 5375 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5376 Size = SemaRef.ActOnConstantExpression(Size); 5377 if (Size.isInvalid()) 5378 return QualType(); 5379 5380 QualType Result = TL.getType(); 5381 if (getDerived().AlwaysRebuild() || 5382 ElementType != T->getElementType() || 5383 Size.get() != T->getSizeExpr()) { 5384 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5385 Size.get(), 5386 T->getAttributeLoc()); 5387 if (Result.isNull()) 5388 return QualType(); 5389 } 5390 5391 // Result might be dependent or not. 5392 if (isa<DependentSizedExtVectorType>(Result)) { 5393 DependentSizedExtVectorTypeLoc NewTL 5394 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5395 NewTL.setNameLoc(TL.getNameLoc()); 5396 } else { 5397 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5398 NewTL.setNameLoc(TL.getNameLoc()); 5399 } 5400 5401 return Result; 5402 } 5403 5404 template <typename Derived> 5405 QualType 5406 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5407 ConstantMatrixTypeLoc TL) { 5408 const ConstantMatrixType *T = TL.getTypePtr(); 5409 QualType ElementType = getDerived().TransformType(T->getElementType()); 5410 if (ElementType.isNull()) 5411 return QualType(); 5412 5413 QualType Result = TL.getType(); 5414 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5415 Result = getDerived().RebuildConstantMatrixType( 5416 ElementType, T->getNumRows(), T->getNumColumns()); 5417 if (Result.isNull()) 5418 return QualType(); 5419 } 5420 5421 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5422 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5423 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5424 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5425 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5426 5427 return Result; 5428 } 5429 5430 template <typename Derived> 5431 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5432 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5433 const DependentSizedMatrixType *T = TL.getTypePtr(); 5434 5435 QualType ElementType = getDerived().TransformType(T->getElementType()); 5436 if (ElementType.isNull()) { 5437 return QualType(); 5438 } 5439 5440 // Matrix dimensions are constant expressions. 5441 EnterExpressionEvaluationContext Unevaluated( 5442 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5443 5444 Expr *origRows = TL.getAttrRowOperand(); 5445 if (!origRows) 5446 origRows = T->getRowExpr(); 5447 Expr *origColumns = TL.getAttrColumnOperand(); 5448 if (!origColumns) 5449 origColumns = T->getColumnExpr(); 5450 5451 ExprResult rowResult = getDerived().TransformExpr(origRows); 5452 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5453 if (rowResult.isInvalid()) 5454 return QualType(); 5455 5456 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5457 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5458 if (columnResult.isInvalid()) 5459 return QualType(); 5460 5461 Expr *rows = rowResult.get(); 5462 Expr *columns = columnResult.get(); 5463 5464 QualType Result = TL.getType(); 5465 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5466 rows != origRows || columns != origColumns) { 5467 Result = getDerived().RebuildDependentSizedMatrixType( 5468 ElementType, rows, columns, T->getAttributeLoc()); 5469 5470 if (Result.isNull()) 5471 return QualType(); 5472 } 5473 5474 // We might have any sort of matrix type now, but fortunately they 5475 // all have the same location layout. 5476 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5477 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5478 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5479 NewTL.setAttrRowOperand(rows); 5480 NewTL.setAttrColumnOperand(columns); 5481 return Result; 5482 } 5483 5484 template <typename Derived> 5485 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5486 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5487 const DependentAddressSpaceType *T = TL.getTypePtr(); 5488 5489 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5490 5491 if (pointeeType.isNull()) 5492 return QualType(); 5493 5494 // Address spaces are constant expressions. 5495 EnterExpressionEvaluationContext Unevaluated( 5496 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5497 5498 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5499 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5500 if (AddrSpace.isInvalid()) 5501 return QualType(); 5502 5503 QualType Result = TL.getType(); 5504 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5505 AddrSpace.get() != T->getAddrSpaceExpr()) { 5506 Result = getDerived().RebuildDependentAddressSpaceType( 5507 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5508 if (Result.isNull()) 5509 return QualType(); 5510 } 5511 5512 // Result might be dependent or not. 5513 if (isa<DependentAddressSpaceType>(Result)) { 5514 DependentAddressSpaceTypeLoc NewTL = 5515 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5516 5517 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5518 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5519 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5520 5521 } else { 5522 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5523 Result, getDerived().getBaseLocation()); 5524 TransformType(TLB, DI->getTypeLoc()); 5525 } 5526 5527 return Result; 5528 } 5529 5530 template <typename Derived> 5531 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5532 VectorTypeLoc TL) { 5533 const VectorType *T = TL.getTypePtr(); 5534 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5535 if (ElementType.isNull()) 5536 return QualType(); 5537 5538 QualType Result = TL.getType(); 5539 if (getDerived().AlwaysRebuild() || 5540 ElementType != T->getElementType()) { 5541 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5542 T->getVectorKind()); 5543 if (Result.isNull()) 5544 return QualType(); 5545 } 5546 5547 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5548 NewTL.setNameLoc(TL.getNameLoc()); 5549 5550 return Result; 5551 } 5552 5553 template<typename Derived> 5554 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5555 ExtVectorTypeLoc TL) { 5556 const VectorType *T = TL.getTypePtr(); 5557 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5558 if (ElementType.isNull()) 5559 return QualType(); 5560 5561 QualType Result = TL.getType(); 5562 if (getDerived().AlwaysRebuild() || 5563 ElementType != T->getElementType()) { 5564 Result = getDerived().RebuildExtVectorType(ElementType, 5565 T->getNumElements(), 5566 /*FIXME*/ SourceLocation()); 5567 if (Result.isNull()) 5568 return QualType(); 5569 } 5570 5571 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5572 NewTL.setNameLoc(TL.getNameLoc()); 5573 5574 return Result; 5575 } 5576 5577 template <typename Derived> 5578 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5579 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5580 bool ExpectParameterPack) { 5581 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5582 TypeSourceInfo *NewDI = nullptr; 5583 5584 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5585 // If we're substituting into a pack expansion type and we know the 5586 // length we want to expand to, just substitute for the pattern. 5587 TypeLoc OldTL = OldDI->getTypeLoc(); 5588 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5589 5590 TypeLocBuilder TLB; 5591 TypeLoc NewTL = OldDI->getTypeLoc(); 5592 TLB.reserve(NewTL.getFullDataSize()); 5593 5594 QualType Result = getDerived().TransformType(TLB, 5595 OldExpansionTL.getPatternLoc()); 5596 if (Result.isNull()) 5597 return nullptr; 5598 5599 Result = RebuildPackExpansionType(Result, 5600 OldExpansionTL.getPatternLoc().getSourceRange(), 5601 OldExpansionTL.getEllipsisLoc(), 5602 NumExpansions); 5603 if (Result.isNull()) 5604 return nullptr; 5605 5606 PackExpansionTypeLoc NewExpansionTL 5607 = TLB.push<PackExpansionTypeLoc>(Result); 5608 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5609 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5610 } else 5611 NewDI = getDerived().TransformType(OldDI); 5612 if (!NewDI) 5613 return nullptr; 5614 5615 if (NewDI == OldDI && indexAdjustment == 0) 5616 return OldParm; 5617 5618 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5619 OldParm->getDeclContext(), 5620 OldParm->getInnerLocStart(), 5621 OldParm->getLocation(), 5622 OldParm->getIdentifier(), 5623 NewDI->getType(), 5624 NewDI, 5625 OldParm->getStorageClass(), 5626 /* DefArg */ nullptr); 5627 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5628 OldParm->getFunctionScopeIndex() + indexAdjustment); 5629 transformedLocalDecl(OldParm, {newParm}); 5630 return newParm; 5631 } 5632 5633 template <typename Derived> 5634 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5635 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5636 const QualType *ParamTypes, 5637 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5638 SmallVectorImpl<QualType> &OutParamTypes, 5639 SmallVectorImpl<ParmVarDecl *> *PVars, 5640 Sema::ExtParameterInfoBuilder &PInfos) { 5641 int indexAdjustment = 0; 5642 5643 unsigned NumParams = Params.size(); 5644 for (unsigned i = 0; i != NumParams; ++i) { 5645 if (ParmVarDecl *OldParm = Params[i]) { 5646 assert(OldParm->getFunctionScopeIndex() == i); 5647 5648 Optional<unsigned> NumExpansions; 5649 ParmVarDecl *NewParm = nullptr; 5650 if (OldParm->isParameterPack()) { 5651 // We have a function parameter pack that may need to be expanded. 5652 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5653 5654 // Find the parameter packs that could be expanded. 5655 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5656 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5657 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5658 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5659 5660 // Determine whether we should expand the parameter packs. 5661 bool ShouldExpand = false; 5662 bool RetainExpansion = false; 5663 Optional<unsigned> OrigNumExpansions; 5664 if (Unexpanded.size() > 0) { 5665 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5666 NumExpansions = OrigNumExpansions; 5667 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5668 Pattern.getSourceRange(), 5669 Unexpanded, 5670 ShouldExpand, 5671 RetainExpansion, 5672 NumExpansions)) { 5673 return true; 5674 } 5675 } else { 5676 #ifndef NDEBUG 5677 const AutoType *AT = 5678 Pattern.getType().getTypePtr()->getContainedAutoType(); 5679 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5680 "Could not find parameter packs or undeduced auto type!"); 5681 #endif 5682 } 5683 5684 if (ShouldExpand) { 5685 // Expand the function parameter pack into multiple, separate 5686 // parameters. 5687 getDerived().ExpandingFunctionParameterPack(OldParm); 5688 for (unsigned I = 0; I != *NumExpansions; ++I) { 5689 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5690 ParmVarDecl *NewParm 5691 = getDerived().TransformFunctionTypeParam(OldParm, 5692 indexAdjustment++, 5693 OrigNumExpansions, 5694 /*ExpectParameterPack=*/false); 5695 if (!NewParm) 5696 return true; 5697 5698 if (ParamInfos) 5699 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5700 OutParamTypes.push_back(NewParm->getType()); 5701 if (PVars) 5702 PVars->push_back(NewParm); 5703 } 5704 5705 // If we're supposed to retain a pack expansion, do so by temporarily 5706 // forgetting the partially-substituted parameter pack. 5707 if (RetainExpansion) { 5708 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5709 ParmVarDecl *NewParm 5710 = getDerived().TransformFunctionTypeParam(OldParm, 5711 indexAdjustment++, 5712 OrigNumExpansions, 5713 /*ExpectParameterPack=*/false); 5714 if (!NewParm) 5715 return true; 5716 5717 if (ParamInfos) 5718 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5719 OutParamTypes.push_back(NewParm->getType()); 5720 if (PVars) 5721 PVars->push_back(NewParm); 5722 } 5723 5724 // The next parameter should have the same adjustment as the 5725 // last thing we pushed, but we post-incremented indexAdjustment 5726 // on every push. Also, if we push nothing, the adjustment should 5727 // go down by one. 5728 indexAdjustment--; 5729 5730 // We're done with the pack expansion. 5731 continue; 5732 } 5733 5734 // We'll substitute the parameter now without expanding the pack 5735 // expansion. 5736 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5737 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5738 indexAdjustment, 5739 NumExpansions, 5740 /*ExpectParameterPack=*/true); 5741 assert(NewParm->isParameterPack() && 5742 "Parameter pack no longer a parameter pack after " 5743 "transformation."); 5744 } else { 5745 NewParm = getDerived().TransformFunctionTypeParam( 5746 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5747 } 5748 5749 if (!NewParm) 5750 return true; 5751 5752 if (ParamInfos) 5753 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5754 OutParamTypes.push_back(NewParm->getType()); 5755 if (PVars) 5756 PVars->push_back(NewParm); 5757 continue; 5758 } 5759 5760 // Deal with the possibility that we don't have a parameter 5761 // declaration for this parameter. 5762 QualType OldType = ParamTypes[i]; 5763 bool IsPackExpansion = false; 5764 Optional<unsigned> NumExpansions; 5765 QualType NewType; 5766 if (const PackExpansionType *Expansion 5767 = dyn_cast<PackExpansionType>(OldType)) { 5768 // We have a function parameter pack that may need to be expanded. 5769 QualType Pattern = Expansion->getPattern(); 5770 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5771 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5772 5773 // Determine whether we should expand the parameter packs. 5774 bool ShouldExpand = false; 5775 bool RetainExpansion = false; 5776 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5777 Unexpanded, 5778 ShouldExpand, 5779 RetainExpansion, 5780 NumExpansions)) { 5781 return true; 5782 } 5783 5784 if (ShouldExpand) { 5785 // Expand the function parameter pack into multiple, separate 5786 // parameters. 5787 for (unsigned I = 0; I != *NumExpansions; ++I) { 5788 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5789 QualType NewType = getDerived().TransformType(Pattern); 5790 if (NewType.isNull()) 5791 return true; 5792 5793 if (NewType->containsUnexpandedParameterPack()) { 5794 NewType = 5795 getSema().getASTContext().getPackExpansionType(NewType, None); 5796 5797 if (NewType.isNull()) 5798 return true; 5799 } 5800 5801 if (ParamInfos) 5802 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5803 OutParamTypes.push_back(NewType); 5804 if (PVars) 5805 PVars->push_back(nullptr); 5806 } 5807 5808 // We're done with the pack expansion. 5809 continue; 5810 } 5811 5812 // If we're supposed to retain a pack expansion, do so by temporarily 5813 // forgetting the partially-substituted parameter pack. 5814 if (RetainExpansion) { 5815 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5816 QualType NewType = getDerived().TransformType(Pattern); 5817 if (NewType.isNull()) 5818 return true; 5819 5820 if (ParamInfos) 5821 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5822 OutParamTypes.push_back(NewType); 5823 if (PVars) 5824 PVars->push_back(nullptr); 5825 } 5826 5827 // We'll substitute the parameter now without expanding the pack 5828 // expansion. 5829 OldType = Expansion->getPattern(); 5830 IsPackExpansion = true; 5831 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5832 NewType = getDerived().TransformType(OldType); 5833 } else { 5834 NewType = getDerived().TransformType(OldType); 5835 } 5836 5837 if (NewType.isNull()) 5838 return true; 5839 5840 if (IsPackExpansion) 5841 NewType = getSema().Context.getPackExpansionType(NewType, 5842 NumExpansions); 5843 5844 if (ParamInfos) 5845 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5846 OutParamTypes.push_back(NewType); 5847 if (PVars) 5848 PVars->push_back(nullptr); 5849 } 5850 5851 #ifndef NDEBUG 5852 if (PVars) { 5853 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5854 if (ParmVarDecl *parm = (*PVars)[i]) 5855 assert(parm->getFunctionScopeIndex() == i); 5856 } 5857 #endif 5858 5859 return false; 5860 } 5861 5862 template<typename Derived> 5863 QualType 5864 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5865 FunctionProtoTypeLoc TL) { 5866 SmallVector<QualType, 4> ExceptionStorage; 5867 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5868 return getDerived().TransformFunctionProtoType( 5869 TLB, TL, nullptr, Qualifiers(), 5870 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5871 return This->getDerived().TransformExceptionSpec( 5872 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5873 }); 5874 } 5875 5876 template<typename Derived> template<typename Fn> 5877 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5878 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5879 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5880 5881 // Transform the parameters and return type. 5882 // 5883 // We are required to instantiate the params and return type in source order. 5884 // When the function has a trailing return type, we instantiate the 5885 // parameters before the return type, since the return type can then refer 5886 // to the parameters themselves (via decltype, sizeof, etc.). 5887 // 5888 SmallVector<QualType, 4> ParamTypes; 5889 SmallVector<ParmVarDecl*, 4> ParamDecls; 5890 Sema::ExtParameterInfoBuilder ExtParamInfos; 5891 const FunctionProtoType *T = TL.getTypePtr(); 5892 5893 QualType ResultType; 5894 5895 if (T->hasTrailingReturn()) { 5896 if (getDerived().TransformFunctionTypeParams( 5897 TL.getBeginLoc(), TL.getParams(), 5898 TL.getTypePtr()->param_type_begin(), 5899 T->getExtParameterInfosOrNull(), 5900 ParamTypes, &ParamDecls, ExtParamInfos)) 5901 return QualType(); 5902 5903 { 5904 // C++11 [expr.prim.general]p3: 5905 // If a declaration declares a member function or member function 5906 // template of a class X, the expression this is a prvalue of type 5907 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5908 // and the end of the function-definition, member-declarator, or 5909 // declarator. 5910 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5911 5912 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5913 if (ResultType.isNull()) 5914 return QualType(); 5915 } 5916 } 5917 else { 5918 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5919 if (ResultType.isNull()) 5920 return QualType(); 5921 5922 if (getDerived().TransformFunctionTypeParams( 5923 TL.getBeginLoc(), TL.getParams(), 5924 TL.getTypePtr()->param_type_begin(), 5925 T->getExtParameterInfosOrNull(), 5926 ParamTypes, &ParamDecls, ExtParamInfos)) 5927 return QualType(); 5928 } 5929 5930 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5931 5932 bool EPIChanged = false; 5933 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5934 return QualType(); 5935 5936 // Handle extended parameter information. 5937 if (auto NewExtParamInfos = 5938 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5939 if (!EPI.ExtParameterInfos || 5940 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5941 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5942 EPIChanged = true; 5943 } 5944 EPI.ExtParameterInfos = NewExtParamInfos; 5945 } else if (EPI.ExtParameterInfos) { 5946 EPIChanged = true; 5947 EPI.ExtParameterInfos = nullptr; 5948 } 5949 5950 QualType Result = TL.getType(); 5951 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5952 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5953 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5954 if (Result.isNull()) 5955 return QualType(); 5956 } 5957 5958 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5959 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5960 NewTL.setLParenLoc(TL.getLParenLoc()); 5961 NewTL.setRParenLoc(TL.getRParenLoc()); 5962 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5963 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5964 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5965 NewTL.setParam(i, ParamDecls[i]); 5966 5967 return Result; 5968 } 5969 5970 template<typename Derived> 5971 bool TreeTransform<Derived>::TransformExceptionSpec( 5972 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5973 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5974 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5975 5976 // Instantiate a dynamic noexcept expression, if any. 5977 if (isComputedNoexcept(ESI.Type)) { 5978 EnterExpressionEvaluationContext Unevaluated( 5979 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5980 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5981 if (NoexceptExpr.isInvalid()) 5982 return true; 5983 5984 ExceptionSpecificationType EST = ESI.Type; 5985 NoexceptExpr = 5986 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5987 if (NoexceptExpr.isInvalid()) 5988 return true; 5989 5990 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5991 Changed = true; 5992 ESI.NoexceptExpr = NoexceptExpr.get(); 5993 ESI.Type = EST; 5994 } 5995 5996 if (ESI.Type != EST_Dynamic) 5997 return false; 5998 5999 // Instantiate a dynamic exception specification's type. 6000 for (QualType T : ESI.Exceptions) { 6001 if (const PackExpansionType *PackExpansion = 6002 T->getAs<PackExpansionType>()) { 6003 Changed = true; 6004 6005 // We have a pack expansion. Instantiate it. 6006 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6007 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6008 Unexpanded); 6009 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6010 6011 // Determine whether the set of unexpanded parameter packs can and 6012 // should 6013 // be expanded. 6014 bool Expand = false; 6015 bool RetainExpansion = false; 6016 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6017 // FIXME: Track the location of the ellipsis (and track source location 6018 // information for the types in the exception specification in general). 6019 if (getDerived().TryExpandParameterPacks( 6020 Loc, SourceRange(), Unexpanded, Expand, 6021 RetainExpansion, NumExpansions)) 6022 return true; 6023 6024 if (!Expand) { 6025 // We can't expand this pack expansion into separate arguments yet; 6026 // just substitute into the pattern and create a new pack expansion 6027 // type. 6028 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6029 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6030 if (U.isNull()) 6031 return true; 6032 6033 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6034 Exceptions.push_back(U); 6035 continue; 6036 } 6037 6038 // Substitute into the pack expansion pattern for each slice of the 6039 // pack. 6040 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6041 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6042 6043 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6044 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6045 return true; 6046 6047 Exceptions.push_back(U); 6048 } 6049 } else { 6050 QualType U = getDerived().TransformType(T); 6051 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6052 return true; 6053 if (T != U) 6054 Changed = true; 6055 6056 Exceptions.push_back(U); 6057 } 6058 } 6059 6060 ESI.Exceptions = Exceptions; 6061 if (ESI.Exceptions.empty()) 6062 ESI.Type = EST_DynamicNone; 6063 return false; 6064 } 6065 6066 template<typename Derived> 6067 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6068 TypeLocBuilder &TLB, 6069 FunctionNoProtoTypeLoc TL) { 6070 const FunctionNoProtoType *T = TL.getTypePtr(); 6071 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6072 if (ResultType.isNull()) 6073 return QualType(); 6074 6075 QualType Result = TL.getType(); 6076 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6077 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6078 6079 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6080 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6081 NewTL.setLParenLoc(TL.getLParenLoc()); 6082 NewTL.setRParenLoc(TL.getRParenLoc()); 6083 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6084 6085 return Result; 6086 } 6087 6088 template <typename Derived> 6089 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6090 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6091 const UnresolvedUsingType *T = TL.getTypePtr(); 6092 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6093 if (!D) 6094 return QualType(); 6095 6096 QualType Result = TL.getType(); 6097 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6098 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6099 if (Result.isNull()) 6100 return QualType(); 6101 } 6102 6103 // We might get an arbitrary type spec type back. We should at 6104 // least always get a type spec type, though. 6105 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6106 NewTL.setNameLoc(TL.getNameLoc()); 6107 6108 return Result; 6109 } 6110 6111 template <typename Derived> 6112 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6113 UsingTypeLoc TL) { 6114 const UsingType *T = TL.getTypePtr(); 6115 6116 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6117 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6118 if (!Found) 6119 return QualType(); 6120 6121 QualType Underlying = getDerived().TransformType(T->desugar()); 6122 if (Underlying.isNull()) 6123 return QualType(); 6124 6125 QualType Result = TL.getType(); 6126 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6127 Underlying != T->getUnderlyingType()) { 6128 Result = getDerived().RebuildUsingType(Found, Underlying); 6129 if (Result.isNull()) 6130 return QualType(); 6131 } 6132 6133 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6134 return Result; 6135 } 6136 6137 template<typename Derived> 6138 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6139 TypedefTypeLoc TL) { 6140 const TypedefType *T = TL.getTypePtr(); 6141 TypedefNameDecl *Typedef 6142 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6143 T->getDecl())); 6144 if (!Typedef) 6145 return QualType(); 6146 6147 QualType Result = TL.getType(); 6148 if (getDerived().AlwaysRebuild() || 6149 Typedef != T->getDecl()) { 6150 Result = getDerived().RebuildTypedefType(Typedef); 6151 if (Result.isNull()) 6152 return QualType(); 6153 } 6154 6155 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6156 NewTL.setNameLoc(TL.getNameLoc()); 6157 6158 return Result; 6159 } 6160 6161 template<typename Derived> 6162 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6163 TypeOfExprTypeLoc TL) { 6164 // typeof expressions are not potentially evaluated contexts 6165 EnterExpressionEvaluationContext Unevaluated( 6166 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6167 Sema::ReuseLambdaContextDecl); 6168 6169 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6170 if (E.isInvalid()) 6171 return QualType(); 6172 6173 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6174 if (E.isInvalid()) 6175 return QualType(); 6176 6177 QualType Result = TL.getType(); 6178 if (getDerived().AlwaysRebuild() || 6179 E.get() != TL.getUnderlyingExpr()) { 6180 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6181 if (Result.isNull()) 6182 return QualType(); 6183 } 6184 else E.get(); 6185 6186 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6187 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6188 NewTL.setLParenLoc(TL.getLParenLoc()); 6189 NewTL.setRParenLoc(TL.getRParenLoc()); 6190 6191 return Result; 6192 } 6193 6194 template<typename Derived> 6195 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6196 TypeOfTypeLoc TL) { 6197 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6198 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6199 if (!New_Under_TI) 6200 return QualType(); 6201 6202 QualType Result = TL.getType(); 6203 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6204 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6205 if (Result.isNull()) 6206 return QualType(); 6207 } 6208 6209 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6210 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6211 NewTL.setLParenLoc(TL.getLParenLoc()); 6212 NewTL.setRParenLoc(TL.getRParenLoc()); 6213 NewTL.setUnderlyingTInfo(New_Under_TI); 6214 6215 return Result; 6216 } 6217 6218 template<typename Derived> 6219 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6220 DecltypeTypeLoc TL) { 6221 const DecltypeType *T = TL.getTypePtr(); 6222 6223 // decltype expressions are not potentially evaluated contexts 6224 EnterExpressionEvaluationContext Unevaluated( 6225 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6226 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6227 6228 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6229 if (E.isInvalid()) 6230 return QualType(); 6231 6232 E = getSema().ActOnDecltypeExpression(E.get()); 6233 if (E.isInvalid()) 6234 return QualType(); 6235 6236 QualType Result = TL.getType(); 6237 if (getDerived().AlwaysRebuild() || 6238 E.get() != T->getUnderlyingExpr()) { 6239 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6240 if (Result.isNull()) 6241 return QualType(); 6242 } 6243 else E.get(); 6244 6245 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6246 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6247 NewTL.setRParenLoc(TL.getRParenLoc()); 6248 return Result; 6249 } 6250 6251 template<typename Derived> 6252 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6253 TypeLocBuilder &TLB, 6254 UnaryTransformTypeLoc TL) { 6255 QualType Result = TL.getType(); 6256 if (Result->isDependentType()) { 6257 const UnaryTransformType *T = TL.getTypePtr(); 6258 QualType NewBase = 6259 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6260 Result = getDerived().RebuildUnaryTransformType(NewBase, 6261 T->getUTTKind(), 6262 TL.getKWLoc()); 6263 if (Result.isNull()) 6264 return QualType(); 6265 } 6266 6267 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6268 NewTL.setKWLoc(TL.getKWLoc()); 6269 NewTL.setParensRange(TL.getParensRange()); 6270 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6271 return Result; 6272 } 6273 6274 template<typename Derived> 6275 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6276 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6277 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6278 6279 CXXScopeSpec SS; 6280 TemplateName TemplateName = getDerived().TransformTemplateName( 6281 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6282 if (TemplateName.isNull()) 6283 return QualType(); 6284 6285 QualType OldDeduced = T->getDeducedType(); 6286 QualType NewDeduced; 6287 if (!OldDeduced.isNull()) { 6288 NewDeduced = getDerived().TransformType(OldDeduced); 6289 if (NewDeduced.isNull()) 6290 return QualType(); 6291 } 6292 6293 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6294 TemplateName, NewDeduced); 6295 if (Result.isNull()) 6296 return QualType(); 6297 6298 DeducedTemplateSpecializationTypeLoc NewTL = 6299 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6300 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6301 6302 return Result; 6303 } 6304 6305 template<typename Derived> 6306 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6307 RecordTypeLoc TL) { 6308 const RecordType *T = TL.getTypePtr(); 6309 RecordDecl *Record 6310 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6311 T->getDecl())); 6312 if (!Record) 6313 return QualType(); 6314 6315 QualType Result = TL.getType(); 6316 if (getDerived().AlwaysRebuild() || 6317 Record != T->getDecl()) { 6318 Result = getDerived().RebuildRecordType(Record); 6319 if (Result.isNull()) 6320 return QualType(); 6321 } 6322 6323 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6324 NewTL.setNameLoc(TL.getNameLoc()); 6325 6326 return Result; 6327 } 6328 6329 template<typename Derived> 6330 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6331 EnumTypeLoc TL) { 6332 const EnumType *T = TL.getTypePtr(); 6333 EnumDecl *Enum 6334 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6335 T->getDecl())); 6336 if (!Enum) 6337 return QualType(); 6338 6339 QualType Result = TL.getType(); 6340 if (getDerived().AlwaysRebuild() || 6341 Enum != T->getDecl()) { 6342 Result = getDerived().RebuildEnumType(Enum); 6343 if (Result.isNull()) 6344 return QualType(); 6345 } 6346 6347 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6348 NewTL.setNameLoc(TL.getNameLoc()); 6349 6350 return Result; 6351 } 6352 6353 template<typename Derived> 6354 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6355 TypeLocBuilder &TLB, 6356 InjectedClassNameTypeLoc TL) { 6357 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6358 TL.getTypePtr()->getDecl()); 6359 if (!D) return QualType(); 6360 6361 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6362 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6363 return T; 6364 } 6365 6366 template<typename Derived> 6367 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6368 TypeLocBuilder &TLB, 6369 TemplateTypeParmTypeLoc TL) { 6370 return TransformTypeSpecType(TLB, TL); 6371 } 6372 6373 template<typename Derived> 6374 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6375 TypeLocBuilder &TLB, 6376 SubstTemplateTypeParmTypeLoc TL) { 6377 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6378 6379 // Substitute into the replacement type, which itself might involve something 6380 // that needs to be transformed. This only tends to occur with default 6381 // template arguments of template template parameters. 6382 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6383 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6384 if (Replacement.isNull()) 6385 return QualType(); 6386 6387 // Always canonicalize the replacement type. 6388 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6389 QualType Result 6390 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6391 Replacement); 6392 6393 // Propagate type-source information. 6394 SubstTemplateTypeParmTypeLoc NewTL 6395 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6396 NewTL.setNameLoc(TL.getNameLoc()); 6397 return Result; 6398 6399 } 6400 6401 template<typename Derived> 6402 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6403 TypeLocBuilder &TLB, 6404 SubstTemplateTypeParmPackTypeLoc TL) { 6405 return TransformTypeSpecType(TLB, TL); 6406 } 6407 6408 template<typename Derived> 6409 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6410 TypeLocBuilder &TLB, 6411 TemplateSpecializationTypeLoc TL) { 6412 const TemplateSpecializationType *T = TL.getTypePtr(); 6413 6414 // The nested-name-specifier never matters in a TemplateSpecializationType, 6415 // because we can't have a dependent nested-name-specifier anyway. 6416 CXXScopeSpec SS; 6417 TemplateName Template 6418 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6419 TL.getTemplateNameLoc()); 6420 if (Template.isNull()) 6421 return QualType(); 6422 6423 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6424 } 6425 6426 template<typename Derived> 6427 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6428 AtomicTypeLoc TL) { 6429 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6430 if (ValueType.isNull()) 6431 return QualType(); 6432 6433 QualType Result = TL.getType(); 6434 if (getDerived().AlwaysRebuild() || 6435 ValueType != TL.getValueLoc().getType()) { 6436 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6437 if (Result.isNull()) 6438 return QualType(); 6439 } 6440 6441 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6442 NewTL.setKWLoc(TL.getKWLoc()); 6443 NewTL.setLParenLoc(TL.getLParenLoc()); 6444 NewTL.setRParenLoc(TL.getRParenLoc()); 6445 6446 return Result; 6447 } 6448 6449 template <typename Derived> 6450 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6451 PipeTypeLoc TL) { 6452 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6453 if (ValueType.isNull()) 6454 return QualType(); 6455 6456 QualType Result = TL.getType(); 6457 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6458 const PipeType *PT = Result->castAs<PipeType>(); 6459 bool isReadPipe = PT->isReadOnly(); 6460 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6461 if (Result.isNull()) 6462 return QualType(); 6463 } 6464 6465 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6466 NewTL.setKWLoc(TL.getKWLoc()); 6467 6468 return Result; 6469 } 6470 6471 template <typename Derived> 6472 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6473 BitIntTypeLoc TL) { 6474 const BitIntType *EIT = TL.getTypePtr(); 6475 QualType Result = TL.getType(); 6476 6477 if (getDerived().AlwaysRebuild()) { 6478 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6479 EIT->getNumBits(), TL.getNameLoc()); 6480 if (Result.isNull()) 6481 return QualType(); 6482 } 6483 6484 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6485 NewTL.setNameLoc(TL.getNameLoc()); 6486 return Result; 6487 } 6488 6489 template <typename Derived> 6490 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6491 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6492 const DependentBitIntType *EIT = TL.getTypePtr(); 6493 6494 EnterExpressionEvaluationContext Unevaluated( 6495 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6496 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6497 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6498 6499 if (BitsExpr.isInvalid()) 6500 return QualType(); 6501 6502 QualType Result = TL.getType(); 6503 6504 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6505 Result = getDerived().RebuildDependentBitIntType( 6506 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6507 6508 if (Result.isNull()) 6509 return QualType(); 6510 } 6511 6512 if (isa<DependentBitIntType>(Result)) { 6513 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6514 NewTL.setNameLoc(TL.getNameLoc()); 6515 } else { 6516 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6517 NewTL.setNameLoc(TL.getNameLoc()); 6518 } 6519 return Result; 6520 } 6521 6522 /// Simple iterator that traverses the template arguments in a 6523 /// container that provides a \c getArgLoc() member function. 6524 /// 6525 /// This iterator is intended to be used with the iterator form of 6526 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6527 template<typename ArgLocContainer> 6528 class TemplateArgumentLocContainerIterator { 6529 ArgLocContainer *Container; 6530 unsigned Index; 6531 6532 public: 6533 typedef TemplateArgumentLoc value_type; 6534 typedef TemplateArgumentLoc reference; 6535 typedef int difference_type; 6536 typedef std::input_iterator_tag iterator_category; 6537 6538 class pointer { 6539 TemplateArgumentLoc Arg; 6540 6541 public: 6542 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6543 6544 const TemplateArgumentLoc *operator->() const { 6545 return &Arg; 6546 } 6547 }; 6548 6549 6550 TemplateArgumentLocContainerIterator() {} 6551 6552 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6553 unsigned Index) 6554 : Container(&Container), Index(Index) { } 6555 6556 TemplateArgumentLocContainerIterator &operator++() { 6557 ++Index; 6558 return *this; 6559 } 6560 6561 TemplateArgumentLocContainerIterator operator++(int) { 6562 TemplateArgumentLocContainerIterator Old(*this); 6563 ++(*this); 6564 return Old; 6565 } 6566 6567 TemplateArgumentLoc operator*() const { 6568 return Container->getArgLoc(Index); 6569 } 6570 6571 pointer operator->() const { 6572 return pointer(Container->getArgLoc(Index)); 6573 } 6574 6575 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6576 const TemplateArgumentLocContainerIterator &Y) { 6577 return X.Container == Y.Container && X.Index == Y.Index; 6578 } 6579 6580 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6581 const TemplateArgumentLocContainerIterator &Y) { 6582 return !(X == Y); 6583 } 6584 }; 6585 6586 template<typename Derived> 6587 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6588 AutoTypeLoc TL) { 6589 const AutoType *T = TL.getTypePtr(); 6590 QualType OldDeduced = T->getDeducedType(); 6591 QualType NewDeduced; 6592 if (!OldDeduced.isNull()) { 6593 NewDeduced = getDerived().TransformType(OldDeduced); 6594 if (NewDeduced.isNull()) 6595 return QualType(); 6596 } 6597 6598 ConceptDecl *NewCD = nullptr; 6599 TemplateArgumentListInfo NewTemplateArgs; 6600 NestedNameSpecifierLoc NewNestedNameSpec; 6601 if (T->isConstrained()) { 6602 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6603 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6604 6605 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6606 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6607 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6608 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6609 ArgIterator(TL, 6610 TL.getNumArgs()), 6611 NewTemplateArgs)) 6612 return QualType(); 6613 6614 if (TL.getNestedNameSpecifierLoc()) { 6615 NewNestedNameSpec 6616 = getDerived().TransformNestedNameSpecifierLoc( 6617 TL.getNestedNameSpecifierLoc()); 6618 if (!NewNestedNameSpec) 6619 return QualType(); 6620 } 6621 } 6622 6623 QualType Result = TL.getType(); 6624 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6625 T->isDependentType() || T->isConstrained()) { 6626 // FIXME: Maybe don't rebuild if all template arguments are the same. 6627 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6628 NewArgList.reserve(NewTemplateArgs.size()); 6629 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6630 NewArgList.push_back(ArgLoc.getArgument()); 6631 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6632 NewArgList); 6633 if (Result.isNull()) 6634 return QualType(); 6635 } 6636 6637 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6638 NewTL.setNameLoc(TL.getNameLoc()); 6639 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6640 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6641 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6642 NewTL.setFoundDecl(TL.getFoundDecl()); 6643 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6644 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6645 NewTL.setRParenLoc(TL.getRParenLoc()); 6646 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6647 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6648 6649 return Result; 6650 } 6651 6652 template <typename Derived> 6653 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6654 TypeLocBuilder &TLB, 6655 TemplateSpecializationTypeLoc TL, 6656 TemplateName Template) { 6657 TemplateArgumentListInfo NewTemplateArgs; 6658 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6659 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6660 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6661 ArgIterator; 6662 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6663 ArgIterator(TL, TL.getNumArgs()), 6664 NewTemplateArgs)) 6665 return QualType(); 6666 6667 // FIXME: maybe don't rebuild if all the template arguments are the same. 6668 6669 QualType Result = 6670 getDerived().RebuildTemplateSpecializationType(Template, 6671 TL.getTemplateNameLoc(), 6672 NewTemplateArgs); 6673 6674 if (!Result.isNull()) { 6675 // Specializations of template template parameters are represented as 6676 // TemplateSpecializationTypes, and substitution of type alias templates 6677 // within a dependent context can transform them into 6678 // DependentTemplateSpecializationTypes. 6679 if (isa<DependentTemplateSpecializationType>(Result)) { 6680 DependentTemplateSpecializationTypeLoc NewTL 6681 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6682 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6683 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6684 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6685 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6686 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6687 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6688 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6689 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6690 return Result; 6691 } 6692 6693 TemplateSpecializationTypeLoc NewTL 6694 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6695 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6696 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6697 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6698 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6699 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6700 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6701 } 6702 6703 return Result; 6704 } 6705 6706 template <typename Derived> 6707 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6708 TypeLocBuilder &TLB, 6709 DependentTemplateSpecializationTypeLoc TL, 6710 TemplateName Template, 6711 CXXScopeSpec &SS) { 6712 TemplateArgumentListInfo NewTemplateArgs; 6713 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6714 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6715 typedef TemplateArgumentLocContainerIterator< 6716 DependentTemplateSpecializationTypeLoc> ArgIterator; 6717 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6718 ArgIterator(TL, TL.getNumArgs()), 6719 NewTemplateArgs)) 6720 return QualType(); 6721 6722 // FIXME: maybe don't rebuild if all the template arguments are the same. 6723 6724 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6725 QualType Result 6726 = getSema().Context.getDependentTemplateSpecializationType( 6727 TL.getTypePtr()->getKeyword(), 6728 DTN->getQualifier(), 6729 DTN->getIdentifier(), 6730 NewTemplateArgs); 6731 6732 DependentTemplateSpecializationTypeLoc NewTL 6733 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6734 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6735 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6736 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6737 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6738 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6739 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6740 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6741 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6742 return Result; 6743 } 6744 6745 QualType Result 6746 = getDerived().RebuildTemplateSpecializationType(Template, 6747 TL.getTemplateNameLoc(), 6748 NewTemplateArgs); 6749 6750 if (!Result.isNull()) { 6751 /// FIXME: Wrap this in an elaborated-type-specifier? 6752 TemplateSpecializationTypeLoc NewTL 6753 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6754 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6755 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6756 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6757 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6758 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6759 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6760 } 6761 6762 return Result; 6763 } 6764 6765 template<typename Derived> 6766 QualType 6767 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6768 ElaboratedTypeLoc TL) { 6769 const ElaboratedType *T = TL.getTypePtr(); 6770 6771 NestedNameSpecifierLoc QualifierLoc; 6772 // NOTE: the qualifier in an ElaboratedType is optional. 6773 if (TL.getQualifierLoc()) { 6774 QualifierLoc 6775 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6776 if (!QualifierLoc) 6777 return QualType(); 6778 } 6779 6780 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6781 if (NamedT.isNull()) 6782 return QualType(); 6783 6784 // C++0x [dcl.type.elab]p2: 6785 // If the identifier resolves to a typedef-name or the simple-template-id 6786 // resolves to an alias template specialization, the 6787 // elaborated-type-specifier is ill-formed. 6788 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6789 if (const TemplateSpecializationType *TST = 6790 NamedT->getAs<TemplateSpecializationType>()) { 6791 TemplateName Template = TST->getTemplateName(); 6792 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6793 Template.getAsTemplateDecl())) { 6794 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6795 diag::err_tag_reference_non_tag) 6796 << TAT << Sema::NTK_TypeAliasTemplate 6797 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6798 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6799 } 6800 } 6801 } 6802 6803 QualType Result = TL.getType(); 6804 if (getDerived().AlwaysRebuild() || 6805 QualifierLoc != TL.getQualifierLoc() || 6806 NamedT != T->getNamedType()) { 6807 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6808 T->getKeyword(), 6809 QualifierLoc, NamedT); 6810 if (Result.isNull()) 6811 return QualType(); 6812 } 6813 6814 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6815 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6816 NewTL.setQualifierLoc(QualifierLoc); 6817 return Result; 6818 } 6819 6820 template<typename Derived> 6821 QualType TreeTransform<Derived>::TransformAttributedType( 6822 TypeLocBuilder &TLB, 6823 AttributedTypeLoc TL) { 6824 const AttributedType *oldType = TL.getTypePtr(); 6825 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6826 if (modifiedType.isNull()) 6827 return QualType(); 6828 6829 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6830 const Attr *oldAttr = TL.getAttr(); 6831 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6832 if (oldAttr && !newAttr) 6833 return QualType(); 6834 6835 QualType result = TL.getType(); 6836 6837 // FIXME: dependent operand expressions? 6838 if (getDerived().AlwaysRebuild() || 6839 modifiedType != oldType->getModifiedType()) { 6840 // TODO: this is really lame; we should really be rebuilding the 6841 // equivalent type from first principles. 6842 QualType equivalentType 6843 = getDerived().TransformType(oldType->getEquivalentType()); 6844 if (equivalentType.isNull()) 6845 return QualType(); 6846 6847 // Check whether we can add nullability; it is only represented as 6848 // type sugar, and therefore cannot be diagnosed in any other way. 6849 if (auto nullability = oldType->getImmediateNullability()) { 6850 if (!modifiedType->canHaveNullability()) { 6851 SemaRef.Diag(TL.getAttr()->getLocation(), 6852 diag::err_nullability_nonpointer) 6853 << DiagNullabilityKind(*nullability, false) << modifiedType; 6854 return QualType(); 6855 } 6856 } 6857 6858 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6859 modifiedType, 6860 equivalentType); 6861 } 6862 6863 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6864 newTL.setAttr(newAttr); 6865 return result; 6866 } 6867 6868 template<typename Derived> 6869 QualType 6870 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6871 ParenTypeLoc TL) { 6872 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6873 if (Inner.isNull()) 6874 return QualType(); 6875 6876 QualType Result = TL.getType(); 6877 if (getDerived().AlwaysRebuild() || 6878 Inner != TL.getInnerLoc().getType()) { 6879 Result = getDerived().RebuildParenType(Inner); 6880 if (Result.isNull()) 6881 return QualType(); 6882 } 6883 6884 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6885 NewTL.setLParenLoc(TL.getLParenLoc()); 6886 NewTL.setRParenLoc(TL.getRParenLoc()); 6887 return Result; 6888 } 6889 6890 template <typename Derived> 6891 QualType 6892 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6893 MacroQualifiedTypeLoc TL) { 6894 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6895 if (Inner.isNull()) 6896 return QualType(); 6897 6898 QualType Result = TL.getType(); 6899 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6900 Result = 6901 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6902 if (Result.isNull()) 6903 return QualType(); 6904 } 6905 6906 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6907 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6908 return Result; 6909 } 6910 6911 template<typename Derived> 6912 QualType TreeTransform<Derived>::TransformDependentNameType( 6913 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6914 return TransformDependentNameType(TLB, TL, false); 6915 } 6916 6917 template<typename Derived> 6918 QualType TreeTransform<Derived>::TransformDependentNameType( 6919 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6920 const DependentNameType *T = TL.getTypePtr(); 6921 6922 NestedNameSpecifierLoc QualifierLoc 6923 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6924 if (!QualifierLoc) 6925 return QualType(); 6926 6927 QualType Result 6928 = getDerived().RebuildDependentNameType(T->getKeyword(), 6929 TL.getElaboratedKeywordLoc(), 6930 QualifierLoc, 6931 T->getIdentifier(), 6932 TL.getNameLoc(), 6933 DeducedTSTContext); 6934 if (Result.isNull()) 6935 return QualType(); 6936 6937 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6938 QualType NamedT = ElabT->getNamedType(); 6939 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6940 6941 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6942 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6943 NewTL.setQualifierLoc(QualifierLoc); 6944 } else { 6945 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6946 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6947 NewTL.setQualifierLoc(QualifierLoc); 6948 NewTL.setNameLoc(TL.getNameLoc()); 6949 } 6950 return Result; 6951 } 6952 6953 template<typename Derived> 6954 QualType TreeTransform<Derived>:: 6955 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6956 DependentTemplateSpecializationTypeLoc TL) { 6957 NestedNameSpecifierLoc QualifierLoc; 6958 if (TL.getQualifierLoc()) { 6959 QualifierLoc 6960 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6961 if (!QualifierLoc) 6962 return QualType(); 6963 } 6964 6965 return getDerived() 6966 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6967 } 6968 6969 template<typename Derived> 6970 QualType TreeTransform<Derived>:: 6971 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6972 DependentTemplateSpecializationTypeLoc TL, 6973 NestedNameSpecifierLoc QualifierLoc) { 6974 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6975 6976 TemplateArgumentListInfo NewTemplateArgs; 6977 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6978 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6979 6980 typedef TemplateArgumentLocContainerIterator< 6981 DependentTemplateSpecializationTypeLoc> ArgIterator; 6982 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6983 ArgIterator(TL, TL.getNumArgs()), 6984 NewTemplateArgs)) 6985 return QualType(); 6986 6987 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6988 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6989 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6990 /*AllowInjectedClassName*/ false); 6991 if (Result.isNull()) 6992 return QualType(); 6993 6994 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6995 QualType NamedT = ElabT->getNamedType(); 6996 6997 // Copy information relevant to the template specialization. 6998 TemplateSpecializationTypeLoc NamedTL 6999 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7000 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7001 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7002 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7003 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7004 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7005 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7006 7007 // Copy information relevant to the elaborated type. 7008 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7009 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7010 NewTL.setQualifierLoc(QualifierLoc); 7011 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7012 DependentTemplateSpecializationTypeLoc SpecTL 7013 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7014 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7015 SpecTL.setQualifierLoc(QualifierLoc); 7016 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7017 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7018 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7019 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7020 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7021 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7022 } else { 7023 TemplateSpecializationTypeLoc SpecTL 7024 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7025 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7026 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7027 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7028 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7029 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7030 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7031 } 7032 return Result; 7033 } 7034 7035 template<typename Derived> 7036 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7037 PackExpansionTypeLoc TL) { 7038 QualType Pattern 7039 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7040 if (Pattern.isNull()) 7041 return QualType(); 7042 7043 QualType Result = TL.getType(); 7044 if (getDerived().AlwaysRebuild() || 7045 Pattern != TL.getPatternLoc().getType()) { 7046 Result = getDerived().RebuildPackExpansionType(Pattern, 7047 TL.getPatternLoc().getSourceRange(), 7048 TL.getEllipsisLoc(), 7049 TL.getTypePtr()->getNumExpansions()); 7050 if (Result.isNull()) 7051 return QualType(); 7052 } 7053 7054 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7055 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7056 return Result; 7057 } 7058 7059 template<typename Derived> 7060 QualType 7061 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7062 ObjCInterfaceTypeLoc TL) { 7063 // ObjCInterfaceType is never dependent. 7064 TLB.pushFullCopy(TL); 7065 return TL.getType(); 7066 } 7067 7068 template<typename Derived> 7069 QualType 7070 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7071 ObjCTypeParamTypeLoc TL) { 7072 const ObjCTypeParamType *T = TL.getTypePtr(); 7073 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7074 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7075 if (!OTP) 7076 return QualType(); 7077 7078 QualType Result = TL.getType(); 7079 if (getDerived().AlwaysRebuild() || 7080 OTP != T->getDecl()) { 7081 Result = getDerived().RebuildObjCTypeParamType(OTP, 7082 TL.getProtocolLAngleLoc(), 7083 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7084 TL.getNumProtocols()), 7085 TL.getProtocolLocs(), 7086 TL.getProtocolRAngleLoc()); 7087 if (Result.isNull()) 7088 return QualType(); 7089 } 7090 7091 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7092 if (TL.getNumProtocols()) { 7093 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7094 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7095 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7096 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7097 } 7098 return Result; 7099 } 7100 7101 template<typename Derived> 7102 QualType 7103 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7104 ObjCObjectTypeLoc TL) { 7105 // Transform base type. 7106 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7107 if (BaseType.isNull()) 7108 return QualType(); 7109 7110 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7111 7112 // Transform type arguments. 7113 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7114 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7115 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7116 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7117 QualType TypeArg = TypeArgInfo->getType(); 7118 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7119 AnyChanged = true; 7120 7121 // We have a pack expansion. Instantiate it. 7122 const auto *PackExpansion = PackExpansionLoc.getType() 7123 ->castAs<PackExpansionType>(); 7124 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7125 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7126 Unexpanded); 7127 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7128 7129 // Determine whether the set of unexpanded parameter packs can 7130 // and should be expanded. 7131 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7132 bool Expand = false; 7133 bool RetainExpansion = false; 7134 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7135 if (getDerived().TryExpandParameterPacks( 7136 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7137 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7138 return QualType(); 7139 7140 if (!Expand) { 7141 // We can't expand this pack expansion into separate arguments yet; 7142 // just substitute into the pattern and create a new pack expansion 7143 // type. 7144 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7145 7146 TypeLocBuilder TypeArgBuilder; 7147 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7148 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7149 PatternLoc); 7150 if (NewPatternType.isNull()) 7151 return QualType(); 7152 7153 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7154 NewPatternType, NumExpansions); 7155 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7156 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7157 NewTypeArgInfos.push_back( 7158 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7159 continue; 7160 } 7161 7162 // Substitute into the pack expansion pattern for each slice of the 7163 // pack. 7164 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7165 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7166 7167 TypeLocBuilder TypeArgBuilder; 7168 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7169 7170 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7171 PatternLoc); 7172 if (NewTypeArg.isNull()) 7173 return QualType(); 7174 7175 NewTypeArgInfos.push_back( 7176 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7177 } 7178 7179 continue; 7180 } 7181 7182 TypeLocBuilder TypeArgBuilder; 7183 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7184 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7185 if (NewTypeArg.isNull()) 7186 return QualType(); 7187 7188 // If nothing changed, just keep the old TypeSourceInfo. 7189 if (NewTypeArg == TypeArg) { 7190 NewTypeArgInfos.push_back(TypeArgInfo); 7191 continue; 7192 } 7193 7194 NewTypeArgInfos.push_back( 7195 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7196 AnyChanged = true; 7197 } 7198 7199 QualType Result = TL.getType(); 7200 if (getDerived().AlwaysRebuild() || AnyChanged) { 7201 // Rebuild the type. 7202 Result = getDerived().RebuildObjCObjectType( 7203 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7204 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7205 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7206 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7207 7208 if (Result.isNull()) 7209 return QualType(); 7210 } 7211 7212 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7213 NewT.setHasBaseTypeAsWritten(true); 7214 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7215 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7216 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7217 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7218 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7219 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7220 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7221 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7222 return Result; 7223 } 7224 7225 template<typename Derived> 7226 QualType 7227 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7228 ObjCObjectPointerTypeLoc TL) { 7229 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7230 if (PointeeType.isNull()) 7231 return QualType(); 7232 7233 QualType Result = TL.getType(); 7234 if (getDerived().AlwaysRebuild() || 7235 PointeeType != TL.getPointeeLoc().getType()) { 7236 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7237 TL.getStarLoc()); 7238 if (Result.isNull()) 7239 return QualType(); 7240 } 7241 7242 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7243 NewT.setStarLoc(TL.getStarLoc()); 7244 return Result; 7245 } 7246 7247 //===----------------------------------------------------------------------===// 7248 // Statement transformation 7249 //===----------------------------------------------------------------------===// 7250 template<typename Derived> 7251 StmtResult 7252 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7253 return S; 7254 } 7255 7256 template<typename Derived> 7257 StmtResult 7258 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7259 return getDerived().TransformCompoundStmt(S, false); 7260 } 7261 7262 template<typename Derived> 7263 StmtResult 7264 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7265 bool IsStmtExpr) { 7266 Sema::CompoundScopeRAII CompoundScope(getSema()); 7267 7268 const Stmt *ExprResult = S->getStmtExprResult(); 7269 bool SubStmtInvalid = false; 7270 bool SubStmtChanged = false; 7271 SmallVector<Stmt*, 8> Statements; 7272 for (auto *B : S->body()) { 7273 StmtResult Result = getDerived().TransformStmt( 7274 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7275 7276 if (Result.isInvalid()) { 7277 // Immediately fail if this was a DeclStmt, since it's very 7278 // likely that this will cause problems for future statements. 7279 if (isa<DeclStmt>(B)) 7280 return StmtError(); 7281 7282 // Otherwise, just keep processing substatements and fail later. 7283 SubStmtInvalid = true; 7284 continue; 7285 } 7286 7287 SubStmtChanged = SubStmtChanged || Result.get() != B; 7288 Statements.push_back(Result.getAs<Stmt>()); 7289 } 7290 7291 if (SubStmtInvalid) 7292 return StmtError(); 7293 7294 if (!getDerived().AlwaysRebuild() && 7295 !SubStmtChanged) 7296 return S; 7297 7298 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7299 Statements, 7300 S->getRBracLoc(), 7301 IsStmtExpr); 7302 } 7303 7304 template<typename Derived> 7305 StmtResult 7306 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7307 ExprResult LHS, RHS; 7308 { 7309 EnterExpressionEvaluationContext Unevaluated( 7310 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7311 7312 // Transform the left-hand case value. 7313 LHS = getDerived().TransformExpr(S->getLHS()); 7314 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7315 if (LHS.isInvalid()) 7316 return StmtError(); 7317 7318 // Transform the right-hand case value (for the GNU case-range extension). 7319 RHS = getDerived().TransformExpr(S->getRHS()); 7320 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7321 if (RHS.isInvalid()) 7322 return StmtError(); 7323 } 7324 7325 // Build the case statement. 7326 // Case statements are always rebuilt so that they will attached to their 7327 // transformed switch statement. 7328 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7329 LHS.get(), 7330 S->getEllipsisLoc(), 7331 RHS.get(), 7332 S->getColonLoc()); 7333 if (Case.isInvalid()) 7334 return StmtError(); 7335 7336 // Transform the statement following the case 7337 StmtResult SubStmt = 7338 getDerived().TransformStmt(S->getSubStmt()); 7339 if (SubStmt.isInvalid()) 7340 return StmtError(); 7341 7342 // Attach the body to the case statement 7343 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7344 } 7345 7346 template <typename Derived> 7347 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7348 // Transform the statement following the default case 7349 StmtResult SubStmt = 7350 getDerived().TransformStmt(S->getSubStmt()); 7351 if (SubStmt.isInvalid()) 7352 return StmtError(); 7353 7354 // Default statements are always rebuilt 7355 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7356 SubStmt.get()); 7357 } 7358 7359 template<typename Derived> 7360 StmtResult 7361 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7362 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7363 if (SubStmt.isInvalid()) 7364 return StmtError(); 7365 7366 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7367 S->getDecl()); 7368 if (!LD) 7369 return StmtError(); 7370 7371 // If we're transforming "in-place" (we're not creating new local 7372 // declarations), assume we're replacing the old label statement 7373 // and clear out the reference to it. 7374 if (LD == S->getDecl()) 7375 S->getDecl()->setStmt(nullptr); 7376 7377 // FIXME: Pass the real colon location in. 7378 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7379 cast<LabelDecl>(LD), SourceLocation(), 7380 SubStmt.get()); 7381 } 7382 7383 template <typename Derived> 7384 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7385 if (!R) 7386 return R; 7387 7388 switch (R->getKind()) { 7389 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7390 #define ATTR(X) 7391 #define PRAGMA_SPELLING_ATTR(X) \ 7392 case attr::X: \ 7393 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7394 #include "clang/Basic/AttrList.inc" 7395 default: 7396 return R; 7397 } 7398 } 7399 7400 template <typename Derived> 7401 StmtResult 7402 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7403 StmtDiscardKind SDK) { 7404 bool AttrsChanged = false; 7405 SmallVector<const Attr *, 1> Attrs; 7406 7407 // Visit attributes and keep track if any are transformed. 7408 for (const auto *I : S->getAttrs()) { 7409 const Attr *R = getDerived().TransformAttr(I); 7410 AttrsChanged |= (I != R); 7411 if (R) 7412 Attrs.push_back(R); 7413 } 7414 7415 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7416 if (SubStmt.isInvalid()) 7417 return StmtError(); 7418 7419 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7420 return S; 7421 7422 // If transforming the attributes failed for all of the attributes in the 7423 // statement, don't make an AttributedStmt without attributes. 7424 if (Attrs.empty()) 7425 return SubStmt; 7426 7427 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7428 SubStmt.get()); 7429 } 7430 7431 template<typename Derived> 7432 StmtResult 7433 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7434 // Transform the initialization statement 7435 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7436 if (Init.isInvalid()) 7437 return StmtError(); 7438 7439 Sema::ConditionResult Cond; 7440 if (!S->isConsteval()) { 7441 // Transform the condition 7442 Cond = getDerived().TransformCondition( 7443 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7444 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7445 : Sema::ConditionKind::Boolean); 7446 if (Cond.isInvalid()) 7447 return StmtError(); 7448 } 7449 7450 // If this is a constexpr if, determine which arm we should instantiate. 7451 llvm::Optional<bool> ConstexprConditionValue; 7452 if (S->isConstexpr()) 7453 ConstexprConditionValue = Cond.getKnownValue(); 7454 7455 // Transform the "then" branch. 7456 StmtResult Then; 7457 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7458 Then = getDerived().TransformStmt(S->getThen()); 7459 if (Then.isInvalid()) 7460 return StmtError(); 7461 } else { 7462 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7463 } 7464 7465 // Transform the "else" branch. 7466 StmtResult Else; 7467 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7468 Else = getDerived().TransformStmt(S->getElse()); 7469 if (Else.isInvalid()) 7470 return StmtError(); 7471 } 7472 7473 if (!getDerived().AlwaysRebuild() && 7474 Init.get() == S->getInit() && 7475 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7476 Then.get() == S->getThen() && 7477 Else.get() == S->getElse()) 7478 return S; 7479 7480 return getDerived().RebuildIfStmt( 7481 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7482 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7483 } 7484 7485 template<typename Derived> 7486 StmtResult 7487 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7488 // Transform the initialization statement 7489 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7490 if (Init.isInvalid()) 7491 return StmtError(); 7492 7493 // Transform the condition. 7494 Sema::ConditionResult Cond = getDerived().TransformCondition( 7495 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7496 Sema::ConditionKind::Switch); 7497 if (Cond.isInvalid()) 7498 return StmtError(); 7499 7500 // Rebuild the switch statement. 7501 StmtResult Switch = 7502 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7503 Init.get(), Cond, S->getRParenLoc()); 7504 if (Switch.isInvalid()) 7505 return StmtError(); 7506 7507 // Transform the body of the switch statement. 7508 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7509 if (Body.isInvalid()) 7510 return StmtError(); 7511 7512 // Complete the switch statement. 7513 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7514 Body.get()); 7515 } 7516 7517 template<typename Derived> 7518 StmtResult 7519 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7520 // Transform the condition 7521 Sema::ConditionResult Cond = getDerived().TransformCondition( 7522 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7523 Sema::ConditionKind::Boolean); 7524 if (Cond.isInvalid()) 7525 return StmtError(); 7526 7527 // Transform the body 7528 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7529 if (Body.isInvalid()) 7530 return StmtError(); 7531 7532 if (!getDerived().AlwaysRebuild() && 7533 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7534 Body.get() == S->getBody()) 7535 return Owned(S); 7536 7537 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7538 Cond, S->getRParenLoc(), Body.get()); 7539 } 7540 7541 template<typename Derived> 7542 StmtResult 7543 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7544 // Transform the body 7545 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7546 if (Body.isInvalid()) 7547 return StmtError(); 7548 7549 // Transform the condition 7550 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7551 if (Cond.isInvalid()) 7552 return StmtError(); 7553 7554 if (!getDerived().AlwaysRebuild() && 7555 Cond.get() == S->getCond() && 7556 Body.get() == S->getBody()) 7557 return S; 7558 7559 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7560 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7561 S->getRParenLoc()); 7562 } 7563 7564 template<typename Derived> 7565 StmtResult 7566 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7567 if (getSema().getLangOpts().OpenMP) 7568 getSema().startOpenMPLoop(); 7569 7570 // Transform the initialization statement 7571 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7572 if (Init.isInvalid()) 7573 return StmtError(); 7574 7575 // In OpenMP loop region loop control variable must be captured and be 7576 // private. Perform analysis of first part (if any). 7577 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7578 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7579 7580 // Transform the condition 7581 Sema::ConditionResult Cond = getDerived().TransformCondition( 7582 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7583 Sema::ConditionKind::Boolean); 7584 if (Cond.isInvalid()) 7585 return StmtError(); 7586 7587 // Transform the increment 7588 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7589 if (Inc.isInvalid()) 7590 return StmtError(); 7591 7592 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7593 if (S->getInc() && !FullInc.get()) 7594 return StmtError(); 7595 7596 // Transform the body 7597 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7598 if (Body.isInvalid()) 7599 return StmtError(); 7600 7601 if (!getDerived().AlwaysRebuild() && 7602 Init.get() == S->getInit() && 7603 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7604 Inc.get() == S->getInc() && 7605 Body.get() == S->getBody()) 7606 return S; 7607 7608 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7609 Init.get(), Cond, FullInc, 7610 S->getRParenLoc(), Body.get()); 7611 } 7612 7613 template<typename Derived> 7614 StmtResult 7615 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7616 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7617 S->getLabel()); 7618 if (!LD) 7619 return StmtError(); 7620 7621 // Goto statements must always be rebuilt, to resolve the label. 7622 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7623 cast<LabelDecl>(LD)); 7624 } 7625 7626 template<typename Derived> 7627 StmtResult 7628 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7629 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7630 if (Target.isInvalid()) 7631 return StmtError(); 7632 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7633 7634 if (!getDerived().AlwaysRebuild() && 7635 Target.get() == S->getTarget()) 7636 return S; 7637 7638 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7639 Target.get()); 7640 } 7641 7642 template<typename Derived> 7643 StmtResult 7644 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7645 return S; 7646 } 7647 7648 template<typename Derived> 7649 StmtResult 7650 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7651 return S; 7652 } 7653 7654 template<typename Derived> 7655 StmtResult 7656 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7657 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7658 /*NotCopyInit*/false); 7659 if (Result.isInvalid()) 7660 return StmtError(); 7661 7662 // FIXME: We always rebuild the return statement because there is no way 7663 // to tell whether the return type of the function has changed. 7664 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7665 } 7666 7667 template<typename Derived> 7668 StmtResult 7669 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7670 bool DeclChanged = false; 7671 SmallVector<Decl *, 4> Decls; 7672 for (auto *D : S->decls()) { 7673 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7674 if (!Transformed) 7675 return StmtError(); 7676 7677 if (Transformed != D) 7678 DeclChanged = true; 7679 7680 Decls.push_back(Transformed); 7681 } 7682 7683 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7684 return S; 7685 7686 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7687 } 7688 7689 template<typename Derived> 7690 StmtResult 7691 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7692 7693 SmallVector<Expr*, 8> Constraints; 7694 SmallVector<Expr*, 8> Exprs; 7695 SmallVector<IdentifierInfo *, 4> Names; 7696 7697 ExprResult AsmString; 7698 SmallVector<Expr*, 8> Clobbers; 7699 7700 bool ExprsChanged = false; 7701 7702 // Go through the outputs. 7703 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7704 Names.push_back(S->getOutputIdentifier(I)); 7705 7706 // No need to transform the constraint literal. 7707 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7708 7709 // Transform the output expr. 7710 Expr *OutputExpr = S->getOutputExpr(I); 7711 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7712 if (Result.isInvalid()) 7713 return StmtError(); 7714 7715 ExprsChanged |= Result.get() != OutputExpr; 7716 7717 Exprs.push_back(Result.get()); 7718 } 7719 7720 // Go through the inputs. 7721 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7722 Names.push_back(S->getInputIdentifier(I)); 7723 7724 // No need to transform the constraint literal. 7725 Constraints.push_back(S->getInputConstraintLiteral(I)); 7726 7727 // Transform the input expr. 7728 Expr *InputExpr = S->getInputExpr(I); 7729 ExprResult Result = getDerived().TransformExpr(InputExpr); 7730 if (Result.isInvalid()) 7731 return StmtError(); 7732 7733 ExprsChanged |= Result.get() != InputExpr; 7734 7735 Exprs.push_back(Result.get()); 7736 } 7737 7738 // Go through the Labels. 7739 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7740 Names.push_back(S->getLabelIdentifier(I)); 7741 7742 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7743 if (Result.isInvalid()) 7744 return StmtError(); 7745 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7746 Exprs.push_back(Result.get()); 7747 } 7748 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7749 return S; 7750 7751 // Go through the clobbers. 7752 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7753 Clobbers.push_back(S->getClobberStringLiteral(I)); 7754 7755 // No need to transform the asm string literal. 7756 AsmString = S->getAsmString(); 7757 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7758 S->isVolatile(), S->getNumOutputs(), 7759 S->getNumInputs(), Names.data(), 7760 Constraints, Exprs, AsmString.get(), 7761 Clobbers, S->getNumLabels(), 7762 S->getRParenLoc()); 7763 } 7764 7765 template<typename Derived> 7766 StmtResult 7767 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7768 ArrayRef<Token> AsmToks = 7769 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7770 7771 bool HadError = false, HadChange = false; 7772 7773 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7774 SmallVector<Expr*, 8> TransformedExprs; 7775 TransformedExprs.reserve(SrcExprs.size()); 7776 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7777 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7778 if (!Result.isUsable()) { 7779 HadError = true; 7780 } else { 7781 HadChange |= (Result.get() != SrcExprs[i]); 7782 TransformedExprs.push_back(Result.get()); 7783 } 7784 } 7785 7786 if (HadError) return StmtError(); 7787 if (!HadChange && !getDerived().AlwaysRebuild()) 7788 return Owned(S); 7789 7790 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7791 AsmToks, S->getAsmString(), 7792 S->getNumOutputs(), S->getNumInputs(), 7793 S->getAllConstraints(), S->getClobbers(), 7794 TransformedExprs, S->getEndLoc()); 7795 } 7796 7797 // C++ Coroutines TS 7798 7799 template<typename Derived> 7800 StmtResult 7801 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7802 auto *ScopeInfo = SemaRef.getCurFunction(); 7803 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7804 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7805 ScopeInfo->NeedsCoroutineSuspends && 7806 ScopeInfo->CoroutineSuspends.first == nullptr && 7807 ScopeInfo->CoroutineSuspends.second == nullptr && 7808 "expected clean scope info"); 7809 7810 // Set that we have (possibly-invalid) suspend points before we do anything 7811 // that may fail. 7812 ScopeInfo->setNeedsCoroutineSuspends(false); 7813 7814 // We re-build the coroutine promise object (and the coroutine parameters its 7815 // type and constructor depend on) based on the types used in our current 7816 // function. We must do so, and set it on the current FunctionScopeInfo, 7817 // before attempting to transform the other parts of the coroutine body 7818 // statement, such as the implicit suspend statements (because those 7819 // statements reference the FunctionScopeInfo::CoroutinePromise). 7820 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7821 return StmtError(); 7822 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7823 if (!Promise) 7824 return StmtError(); 7825 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7826 ScopeInfo->CoroutinePromise = Promise; 7827 7828 // Transform the implicit coroutine statements constructed using dependent 7829 // types during the previous parse: initial and final suspensions, the return 7830 // object, and others. We also transform the coroutine function's body. 7831 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7832 if (InitSuspend.isInvalid()) 7833 return StmtError(); 7834 StmtResult FinalSuspend = 7835 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7836 if (FinalSuspend.isInvalid() || 7837 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7838 return StmtError(); 7839 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7840 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7841 7842 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7843 if (BodyRes.isInvalid()) 7844 return StmtError(); 7845 7846 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7847 if (Builder.isInvalid()) 7848 return StmtError(); 7849 7850 Expr *ReturnObject = S->getReturnValueInit(); 7851 assert(ReturnObject && "the return object is expected to be valid"); 7852 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7853 /*NoCopyInit*/ false); 7854 if (Res.isInvalid()) 7855 return StmtError(); 7856 Builder.ReturnValue = Res.get(); 7857 7858 // If during the previous parse the coroutine still had a dependent promise 7859 // statement, we may need to build some implicit coroutine statements 7860 // (such as exception and fallthrough handlers) for the first time. 7861 if (S->hasDependentPromiseType()) { 7862 // We can only build these statements, however, if the current promise type 7863 // is not dependent. 7864 if (!Promise->getType()->isDependentType()) { 7865 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7866 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7867 "these nodes should not have been built yet"); 7868 if (!Builder.buildDependentStatements()) 7869 return StmtError(); 7870 } 7871 } else { 7872 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7873 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7874 if (Res.isInvalid()) 7875 return StmtError(); 7876 Builder.OnFallthrough = Res.get(); 7877 } 7878 7879 if (auto *OnException = S->getExceptionHandler()) { 7880 StmtResult Res = getDerived().TransformStmt(OnException); 7881 if (Res.isInvalid()) 7882 return StmtError(); 7883 Builder.OnException = Res.get(); 7884 } 7885 7886 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7887 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7888 if (Res.isInvalid()) 7889 return StmtError(); 7890 Builder.ReturnStmtOnAllocFailure = Res.get(); 7891 } 7892 7893 // Transform any additional statements we may have already built 7894 assert(S->getAllocate() && S->getDeallocate() && 7895 "allocation and deallocation calls must already be built"); 7896 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7897 if (AllocRes.isInvalid()) 7898 return StmtError(); 7899 Builder.Allocate = AllocRes.get(); 7900 7901 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7902 if (DeallocRes.isInvalid()) 7903 return StmtError(); 7904 Builder.Deallocate = DeallocRes.get(); 7905 7906 assert(S->getResultDecl() && "ResultDecl must already be built"); 7907 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7908 if (ResultDecl.isInvalid()) 7909 return StmtError(); 7910 Builder.ResultDecl = ResultDecl.get(); 7911 7912 if (auto *ReturnStmt = S->getReturnStmt()) { 7913 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7914 if (Res.isInvalid()) 7915 return StmtError(); 7916 Builder.ReturnStmt = Res.get(); 7917 } 7918 } 7919 7920 return getDerived().RebuildCoroutineBodyStmt(Builder); 7921 } 7922 7923 template<typename Derived> 7924 StmtResult 7925 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7926 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7927 /*NotCopyInit*/false); 7928 if (Result.isInvalid()) 7929 return StmtError(); 7930 7931 // Always rebuild; we don't know if this needs to be injected into a new 7932 // context or if the promise type has changed. 7933 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7934 S->isImplicit()); 7935 } 7936 7937 template<typename Derived> 7938 ExprResult 7939 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7940 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7941 /*NotCopyInit*/false); 7942 if (Result.isInvalid()) 7943 return ExprError(); 7944 7945 // Always rebuild; we don't know if this needs to be injected into a new 7946 // context or if the promise type has changed. 7947 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7948 E->isImplicit()); 7949 } 7950 7951 template <typename Derived> 7952 ExprResult 7953 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7954 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7955 /*NotCopyInit*/ false); 7956 if (OperandResult.isInvalid()) 7957 return ExprError(); 7958 7959 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7960 E->getOperatorCoawaitLookup()); 7961 7962 if (LookupResult.isInvalid()) 7963 return ExprError(); 7964 7965 // Always rebuild; we don't know if this needs to be injected into a new 7966 // context or if the promise type has changed. 7967 return getDerived().RebuildDependentCoawaitExpr( 7968 E->getKeywordLoc(), OperandResult.get(), 7969 cast<UnresolvedLookupExpr>(LookupResult.get())); 7970 } 7971 7972 template<typename Derived> 7973 ExprResult 7974 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7975 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7976 /*NotCopyInit*/false); 7977 if (Result.isInvalid()) 7978 return ExprError(); 7979 7980 // Always rebuild; we don't know if this needs to be injected into a new 7981 // context or if the promise type has changed. 7982 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7983 } 7984 7985 // Objective-C Statements. 7986 7987 template<typename Derived> 7988 StmtResult 7989 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7990 // Transform the body of the @try. 7991 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7992 if (TryBody.isInvalid()) 7993 return StmtError(); 7994 7995 // Transform the @catch statements (if present). 7996 bool AnyCatchChanged = false; 7997 SmallVector<Stmt*, 8> CatchStmts; 7998 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7999 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8000 if (Catch.isInvalid()) 8001 return StmtError(); 8002 if (Catch.get() != S->getCatchStmt(I)) 8003 AnyCatchChanged = true; 8004 CatchStmts.push_back(Catch.get()); 8005 } 8006 8007 // Transform the @finally statement (if present). 8008 StmtResult Finally; 8009 if (S->getFinallyStmt()) { 8010 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8011 if (Finally.isInvalid()) 8012 return StmtError(); 8013 } 8014 8015 // If nothing changed, just retain this statement. 8016 if (!getDerived().AlwaysRebuild() && 8017 TryBody.get() == S->getTryBody() && 8018 !AnyCatchChanged && 8019 Finally.get() == S->getFinallyStmt()) 8020 return S; 8021 8022 // Build a new statement. 8023 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8024 CatchStmts, Finally.get()); 8025 } 8026 8027 template<typename Derived> 8028 StmtResult 8029 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8030 // Transform the @catch parameter, if there is one. 8031 VarDecl *Var = nullptr; 8032 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8033 TypeSourceInfo *TSInfo = nullptr; 8034 if (FromVar->getTypeSourceInfo()) { 8035 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8036 if (!TSInfo) 8037 return StmtError(); 8038 } 8039 8040 QualType T; 8041 if (TSInfo) 8042 T = TSInfo->getType(); 8043 else { 8044 T = getDerived().TransformType(FromVar->getType()); 8045 if (T.isNull()) 8046 return StmtError(); 8047 } 8048 8049 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8050 if (!Var) 8051 return StmtError(); 8052 } 8053 8054 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8055 if (Body.isInvalid()) 8056 return StmtError(); 8057 8058 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8059 S->getRParenLoc(), 8060 Var, Body.get()); 8061 } 8062 8063 template<typename Derived> 8064 StmtResult 8065 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8066 // Transform the body. 8067 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8068 if (Body.isInvalid()) 8069 return StmtError(); 8070 8071 // If nothing changed, just retain this statement. 8072 if (!getDerived().AlwaysRebuild() && 8073 Body.get() == S->getFinallyBody()) 8074 return S; 8075 8076 // Build a new statement. 8077 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8078 Body.get()); 8079 } 8080 8081 template<typename Derived> 8082 StmtResult 8083 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8084 ExprResult Operand; 8085 if (S->getThrowExpr()) { 8086 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8087 if (Operand.isInvalid()) 8088 return StmtError(); 8089 } 8090 8091 if (!getDerived().AlwaysRebuild() && 8092 Operand.get() == S->getThrowExpr()) 8093 return S; 8094 8095 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8096 } 8097 8098 template<typename Derived> 8099 StmtResult 8100 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8101 ObjCAtSynchronizedStmt *S) { 8102 // Transform the object we are locking. 8103 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8104 if (Object.isInvalid()) 8105 return StmtError(); 8106 Object = 8107 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8108 Object.get()); 8109 if (Object.isInvalid()) 8110 return StmtError(); 8111 8112 // Transform the body. 8113 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8114 if (Body.isInvalid()) 8115 return StmtError(); 8116 8117 // If nothing change, just retain the current statement. 8118 if (!getDerived().AlwaysRebuild() && 8119 Object.get() == S->getSynchExpr() && 8120 Body.get() == S->getSynchBody()) 8121 return S; 8122 8123 // Build a new statement. 8124 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8125 Object.get(), Body.get()); 8126 } 8127 8128 template<typename Derived> 8129 StmtResult 8130 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8131 ObjCAutoreleasePoolStmt *S) { 8132 // Transform the body. 8133 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8134 if (Body.isInvalid()) 8135 return StmtError(); 8136 8137 // If nothing changed, just retain this statement. 8138 if (!getDerived().AlwaysRebuild() && 8139 Body.get() == S->getSubStmt()) 8140 return S; 8141 8142 // Build a new statement. 8143 return getDerived().RebuildObjCAutoreleasePoolStmt( 8144 S->getAtLoc(), Body.get()); 8145 } 8146 8147 template<typename Derived> 8148 StmtResult 8149 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8150 ObjCForCollectionStmt *S) { 8151 // Transform the element statement. 8152 StmtResult Element = 8153 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8154 if (Element.isInvalid()) 8155 return StmtError(); 8156 8157 // Transform the collection expression. 8158 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8159 if (Collection.isInvalid()) 8160 return StmtError(); 8161 8162 // Transform the body. 8163 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8164 if (Body.isInvalid()) 8165 return StmtError(); 8166 8167 // If nothing changed, just retain this statement. 8168 if (!getDerived().AlwaysRebuild() && 8169 Element.get() == S->getElement() && 8170 Collection.get() == S->getCollection() && 8171 Body.get() == S->getBody()) 8172 return S; 8173 8174 // Build a new statement. 8175 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8176 Element.get(), 8177 Collection.get(), 8178 S->getRParenLoc(), 8179 Body.get()); 8180 } 8181 8182 template <typename Derived> 8183 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8184 // Transform the exception declaration, if any. 8185 VarDecl *Var = nullptr; 8186 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8187 TypeSourceInfo *T = 8188 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8189 if (!T) 8190 return StmtError(); 8191 8192 Var = getDerived().RebuildExceptionDecl( 8193 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8194 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8195 if (!Var || Var->isInvalidDecl()) 8196 return StmtError(); 8197 } 8198 8199 // Transform the actual exception handler. 8200 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8201 if (Handler.isInvalid()) 8202 return StmtError(); 8203 8204 if (!getDerived().AlwaysRebuild() && !Var && 8205 Handler.get() == S->getHandlerBlock()) 8206 return S; 8207 8208 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8209 } 8210 8211 template <typename Derived> 8212 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8213 // Transform the try block itself. 8214 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8215 if (TryBlock.isInvalid()) 8216 return StmtError(); 8217 8218 // Transform the handlers. 8219 bool HandlerChanged = false; 8220 SmallVector<Stmt *, 8> Handlers; 8221 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8222 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8223 if (Handler.isInvalid()) 8224 return StmtError(); 8225 8226 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8227 Handlers.push_back(Handler.getAs<Stmt>()); 8228 } 8229 8230 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8231 !HandlerChanged) 8232 return S; 8233 8234 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8235 Handlers); 8236 } 8237 8238 template<typename Derived> 8239 StmtResult 8240 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8241 StmtResult Init = 8242 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8243 if (Init.isInvalid()) 8244 return StmtError(); 8245 8246 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8247 if (Range.isInvalid()) 8248 return StmtError(); 8249 8250 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8251 if (Begin.isInvalid()) 8252 return StmtError(); 8253 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8254 if (End.isInvalid()) 8255 return StmtError(); 8256 8257 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8258 if (Cond.isInvalid()) 8259 return StmtError(); 8260 if (Cond.get()) 8261 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8262 if (Cond.isInvalid()) 8263 return StmtError(); 8264 if (Cond.get()) 8265 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8266 8267 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8268 if (Inc.isInvalid()) 8269 return StmtError(); 8270 if (Inc.get()) 8271 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8272 8273 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8274 if (LoopVar.isInvalid()) 8275 return StmtError(); 8276 8277 StmtResult NewStmt = S; 8278 if (getDerived().AlwaysRebuild() || 8279 Init.get() != S->getInit() || 8280 Range.get() != S->getRangeStmt() || 8281 Begin.get() != S->getBeginStmt() || 8282 End.get() != S->getEndStmt() || 8283 Cond.get() != S->getCond() || 8284 Inc.get() != S->getInc() || 8285 LoopVar.get() != S->getLoopVarStmt()) { 8286 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8287 S->getCoawaitLoc(), Init.get(), 8288 S->getColonLoc(), Range.get(), 8289 Begin.get(), End.get(), 8290 Cond.get(), 8291 Inc.get(), LoopVar.get(), 8292 S->getRParenLoc()); 8293 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8294 // Might not have attached any initializer to the loop variable. 8295 getSema().ActOnInitializerError( 8296 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8297 return StmtError(); 8298 } 8299 } 8300 8301 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8302 if (Body.isInvalid()) 8303 return StmtError(); 8304 8305 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8306 // it now so we have a new statement to attach the body to. 8307 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8308 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8309 S->getCoawaitLoc(), Init.get(), 8310 S->getColonLoc(), Range.get(), 8311 Begin.get(), End.get(), 8312 Cond.get(), 8313 Inc.get(), LoopVar.get(), 8314 S->getRParenLoc()); 8315 if (NewStmt.isInvalid()) 8316 return StmtError(); 8317 } 8318 8319 if (NewStmt.get() == S) 8320 return S; 8321 8322 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8323 } 8324 8325 template<typename Derived> 8326 StmtResult 8327 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8328 MSDependentExistsStmt *S) { 8329 // Transform the nested-name-specifier, if any. 8330 NestedNameSpecifierLoc QualifierLoc; 8331 if (S->getQualifierLoc()) { 8332 QualifierLoc 8333 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8334 if (!QualifierLoc) 8335 return StmtError(); 8336 } 8337 8338 // Transform the declaration name. 8339 DeclarationNameInfo NameInfo = S->getNameInfo(); 8340 if (NameInfo.getName()) { 8341 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8342 if (!NameInfo.getName()) 8343 return StmtError(); 8344 } 8345 8346 // Check whether anything changed. 8347 if (!getDerived().AlwaysRebuild() && 8348 QualifierLoc == S->getQualifierLoc() && 8349 NameInfo.getName() == S->getNameInfo().getName()) 8350 return S; 8351 8352 // Determine whether this name exists, if we can. 8353 CXXScopeSpec SS; 8354 SS.Adopt(QualifierLoc); 8355 bool Dependent = false; 8356 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8357 case Sema::IER_Exists: 8358 if (S->isIfExists()) 8359 break; 8360 8361 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8362 8363 case Sema::IER_DoesNotExist: 8364 if (S->isIfNotExists()) 8365 break; 8366 8367 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8368 8369 case Sema::IER_Dependent: 8370 Dependent = true; 8371 break; 8372 8373 case Sema::IER_Error: 8374 return StmtError(); 8375 } 8376 8377 // We need to continue with the instantiation, so do so now. 8378 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8379 if (SubStmt.isInvalid()) 8380 return StmtError(); 8381 8382 // If we have resolved the name, just transform to the substatement. 8383 if (!Dependent) 8384 return SubStmt; 8385 8386 // The name is still dependent, so build a dependent expression again. 8387 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8388 S->isIfExists(), 8389 QualifierLoc, 8390 NameInfo, 8391 SubStmt.get()); 8392 } 8393 8394 template<typename Derived> 8395 ExprResult 8396 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8397 NestedNameSpecifierLoc QualifierLoc; 8398 if (E->getQualifierLoc()) { 8399 QualifierLoc 8400 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8401 if (!QualifierLoc) 8402 return ExprError(); 8403 } 8404 8405 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8406 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8407 if (!PD) 8408 return ExprError(); 8409 8410 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8411 if (Base.isInvalid()) 8412 return ExprError(); 8413 8414 return new (SemaRef.getASTContext()) 8415 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8416 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8417 QualifierLoc, E->getMemberLoc()); 8418 } 8419 8420 template <typename Derived> 8421 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8422 MSPropertySubscriptExpr *E) { 8423 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8424 if (BaseRes.isInvalid()) 8425 return ExprError(); 8426 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8427 if (IdxRes.isInvalid()) 8428 return ExprError(); 8429 8430 if (!getDerived().AlwaysRebuild() && 8431 BaseRes.get() == E->getBase() && 8432 IdxRes.get() == E->getIdx()) 8433 return E; 8434 8435 return getDerived().RebuildArraySubscriptExpr( 8436 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8437 } 8438 8439 template <typename Derived> 8440 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8441 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8442 if (TryBlock.isInvalid()) 8443 return StmtError(); 8444 8445 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8446 if (Handler.isInvalid()) 8447 return StmtError(); 8448 8449 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8450 Handler.get() == S->getHandler()) 8451 return S; 8452 8453 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8454 TryBlock.get(), Handler.get()); 8455 } 8456 8457 template <typename Derived> 8458 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8459 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8460 if (Block.isInvalid()) 8461 return StmtError(); 8462 8463 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8464 } 8465 8466 template <typename Derived> 8467 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8468 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8469 if (FilterExpr.isInvalid()) 8470 return StmtError(); 8471 8472 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8473 if (Block.isInvalid()) 8474 return StmtError(); 8475 8476 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8477 Block.get()); 8478 } 8479 8480 template <typename Derived> 8481 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8482 if (isa<SEHFinallyStmt>(Handler)) 8483 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8484 else 8485 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8486 } 8487 8488 template<typename Derived> 8489 StmtResult 8490 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8491 return S; 8492 } 8493 8494 //===----------------------------------------------------------------------===// 8495 // OpenMP directive transformation 8496 //===----------------------------------------------------------------------===// 8497 8498 template <typename Derived> 8499 StmtResult 8500 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8501 // OMPCanonicalLoops are eliminated during transformation, since they will be 8502 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8503 // after transformation. 8504 return getDerived().TransformStmt(L->getLoopStmt()); 8505 } 8506 8507 template <typename Derived> 8508 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8509 OMPExecutableDirective *D) { 8510 8511 // Transform the clauses 8512 llvm::SmallVector<OMPClause *, 16> TClauses; 8513 ArrayRef<OMPClause *> Clauses = D->clauses(); 8514 TClauses.reserve(Clauses.size()); 8515 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8516 I != E; ++I) { 8517 if (*I) { 8518 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8519 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8520 getDerived().getSema().EndOpenMPClause(); 8521 if (Clause) 8522 TClauses.push_back(Clause); 8523 } else { 8524 TClauses.push_back(nullptr); 8525 } 8526 } 8527 StmtResult AssociatedStmt; 8528 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8529 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8530 /*CurScope=*/nullptr); 8531 StmtResult Body; 8532 { 8533 Sema::CompoundScopeRAII CompoundScope(getSema()); 8534 Stmt *CS; 8535 if (D->getDirectiveKind() == OMPD_atomic || 8536 D->getDirectiveKind() == OMPD_critical || 8537 D->getDirectiveKind() == OMPD_section || 8538 D->getDirectiveKind() == OMPD_master) 8539 CS = D->getAssociatedStmt(); 8540 else 8541 CS = D->getRawStmt(); 8542 Body = getDerived().TransformStmt(CS); 8543 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8544 getSema().getLangOpts().OpenMPIRBuilder) 8545 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8546 } 8547 AssociatedStmt = 8548 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8549 if (AssociatedStmt.isInvalid()) { 8550 return StmtError(); 8551 } 8552 } 8553 if (TClauses.size() != Clauses.size()) { 8554 return StmtError(); 8555 } 8556 8557 // Transform directive name for 'omp critical' directive. 8558 DeclarationNameInfo DirName; 8559 if (D->getDirectiveKind() == OMPD_critical) { 8560 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8561 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8562 } 8563 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8564 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8565 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8566 } else if (D->getDirectiveKind() == OMPD_cancel) { 8567 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8568 } 8569 8570 return getDerived().RebuildOMPExecutableDirective( 8571 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8572 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8573 } 8574 8575 template <typename Derived> 8576 StmtResult 8577 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8578 // TODO: Fix This 8579 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8580 << getOpenMPDirectiveName(D->getDirectiveKind()); 8581 return StmtError(); 8582 } 8583 8584 template <typename Derived> 8585 StmtResult 8586 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8587 DeclarationNameInfo DirName; 8588 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8589 D->getBeginLoc()); 8590 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8591 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8592 return Res; 8593 } 8594 8595 template <typename Derived> 8596 StmtResult 8597 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8598 DeclarationNameInfo DirName; 8599 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8600 D->getBeginLoc()); 8601 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8602 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8603 return Res; 8604 } 8605 8606 template <typename Derived> 8607 StmtResult 8608 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8609 DeclarationNameInfo DirName; 8610 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8611 nullptr, D->getBeginLoc()); 8612 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8613 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8614 return Res; 8615 } 8616 8617 template <typename Derived> 8618 StmtResult 8619 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8620 DeclarationNameInfo DirName; 8621 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8622 nullptr, D->getBeginLoc()); 8623 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8624 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8625 return Res; 8626 } 8627 8628 template <typename Derived> 8629 StmtResult 8630 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8631 DeclarationNameInfo DirName; 8632 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8633 D->getBeginLoc()); 8634 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8635 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8636 return Res; 8637 } 8638 8639 template <typename Derived> 8640 StmtResult 8641 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8642 DeclarationNameInfo DirName; 8643 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8644 D->getBeginLoc()); 8645 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8646 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8647 return Res; 8648 } 8649 8650 template <typename Derived> 8651 StmtResult 8652 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8653 DeclarationNameInfo DirName; 8654 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8655 D->getBeginLoc()); 8656 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8657 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8658 return Res; 8659 } 8660 8661 template <typename Derived> 8662 StmtResult 8663 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8664 DeclarationNameInfo DirName; 8665 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8666 D->getBeginLoc()); 8667 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8668 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8669 return Res; 8670 } 8671 8672 template <typename Derived> 8673 StmtResult 8674 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8675 DeclarationNameInfo DirName; 8676 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8677 D->getBeginLoc()); 8678 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8679 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8680 return Res; 8681 } 8682 8683 template <typename Derived> 8684 StmtResult 8685 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8686 DeclarationNameInfo DirName; 8687 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8688 D->getBeginLoc()); 8689 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8690 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8691 return Res; 8692 } 8693 8694 template <typename Derived> 8695 StmtResult 8696 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8697 getDerived().getSema().StartOpenMPDSABlock( 8698 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8699 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8700 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8701 return Res; 8702 } 8703 8704 template <typename Derived> 8705 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8706 OMPParallelForDirective *D) { 8707 DeclarationNameInfo DirName; 8708 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8709 nullptr, D->getBeginLoc()); 8710 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8711 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8712 return Res; 8713 } 8714 8715 template <typename Derived> 8716 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8717 OMPParallelForSimdDirective *D) { 8718 DeclarationNameInfo DirName; 8719 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8720 nullptr, D->getBeginLoc()); 8721 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8722 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8723 return Res; 8724 } 8725 8726 template <typename Derived> 8727 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8728 OMPParallelMasterDirective *D) { 8729 DeclarationNameInfo DirName; 8730 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8731 nullptr, D->getBeginLoc()); 8732 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8733 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8734 return Res; 8735 } 8736 8737 template <typename Derived> 8738 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8739 OMPParallelSectionsDirective *D) { 8740 DeclarationNameInfo DirName; 8741 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8742 nullptr, D->getBeginLoc()); 8743 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8744 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8745 return Res; 8746 } 8747 8748 template <typename Derived> 8749 StmtResult 8750 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8751 DeclarationNameInfo DirName; 8752 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8753 D->getBeginLoc()); 8754 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8755 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8756 return Res; 8757 } 8758 8759 template <typename Derived> 8760 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8761 OMPTaskyieldDirective *D) { 8762 DeclarationNameInfo DirName; 8763 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8764 D->getBeginLoc()); 8765 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8766 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8767 return Res; 8768 } 8769 8770 template <typename Derived> 8771 StmtResult 8772 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8773 DeclarationNameInfo DirName; 8774 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8775 D->getBeginLoc()); 8776 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8777 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8778 return Res; 8779 } 8780 8781 template <typename Derived> 8782 StmtResult 8783 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8784 DeclarationNameInfo DirName; 8785 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8786 D->getBeginLoc()); 8787 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8788 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8789 return Res; 8790 } 8791 8792 template <typename Derived> 8793 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8794 OMPTaskgroupDirective *D) { 8795 DeclarationNameInfo DirName; 8796 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8797 D->getBeginLoc()); 8798 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8799 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8800 return Res; 8801 } 8802 8803 template <typename Derived> 8804 StmtResult 8805 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8806 DeclarationNameInfo DirName; 8807 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8808 D->getBeginLoc()); 8809 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8810 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8811 return Res; 8812 } 8813 8814 template <typename Derived> 8815 StmtResult 8816 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8817 DeclarationNameInfo DirName; 8818 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8819 D->getBeginLoc()); 8820 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8821 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8822 return Res; 8823 } 8824 8825 template <typename Derived> 8826 StmtResult 8827 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8828 DeclarationNameInfo DirName; 8829 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8830 D->getBeginLoc()); 8831 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8832 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8833 return Res; 8834 } 8835 8836 template <typename Derived> 8837 StmtResult 8838 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8839 DeclarationNameInfo DirName; 8840 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8841 D->getBeginLoc()); 8842 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8843 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8844 return Res; 8845 } 8846 8847 template <typename Derived> 8848 StmtResult 8849 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8850 DeclarationNameInfo DirName; 8851 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8852 D->getBeginLoc()); 8853 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8854 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8855 return Res; 8856 } 8857 8858 template <typename Derived> 8859 StmtResult 8860 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8861 DeclarationNameInfo DirName; 8862 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8863 D->getBeginLoc()); 8864 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8865 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8866 return Res; 8867 } 8868 8869 template <typename Derived> 8870 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8871 OMPTargetDataDirective *D) { 8872 DeclarationNameInfo DirName; 8873 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8874 D->getBeginLoc()); 8875 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8876 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8877 return Res; 8878 } 8879 8880 template <typename Derived> 8881 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8882 OMPTargetEnterDataDirective *D) { 8883 DeclarationNameInfo DirName; 8884 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8885 nullptr, D->getBeginLoc()); 8886 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8887 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8888 return Res; 8889 } 8890 8891 template <typename Derived> 8892 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8893 OMPTargetExitDataDirective *D) { 8894 DeclarationNameInfo DirName; 8895 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8896 nullptr, D->getBeginLoc()); 8897 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8898 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8899 return Res; 8900 } 8901 8902 template <typename Derived> 8903 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8904 OMPTargetParallelDirective *D) { 8905 DeclarationNameInfo DirName; 8906 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8907 nullptr, D->getBeginLoc()); 8908 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8909 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8910 return Res; 8911 } 8912 8913 template <typename Derived> 8914 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8915 OMPTargetParallelForDirective *D) { 8916 DeclarationNameInfo DirName; 8917 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8918 nullptr, D->getBeginLoc()); 8919 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8920 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8921 return Res; 8922 } 8923 8924 template <typename Derived> 8925 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8926 OMPTargetUpdateDirective *D) { 8927 DeclarationNameInfo DirName; 8928 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8929 nullptr, D->getBeginLoc()); 8930 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8931 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8932 return Res; 8933 } 8934 8935 template <typename Derived> 8936 StmtResult 8937 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8938 DeclarationNameInfo DirName; 8939 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8940 D->getBeginLoc()); 8941 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8942 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8943 return Res; 8944 } 8945 8946 template <typename Derived> 8947 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8948 OMPCancellationPointDirective *D) { 8949 DeclarationNameInfo DirName; 8950 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8951 nullptr, D->getBeginLoc()); 8952 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8953 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8954 return Res; 8955 } 8956 8957 template <typename Derived> 8958 StmtResult 8959 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8960 DeclarationNameInfo DirName; 8961 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8962 D->getBeginLoc()); 8963 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8964 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8965 return Res; 8966 } 8967 8968 template <typename Derived> 8969 StmtResult 8970 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8971 DeclarationNameInfo DirName; 8972 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8973 D->getBeginLoc()); 8974 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8975 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8976 return Res; 8977 } 8978 8979 template <typename Derived> 8980 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8981 OMPTaskLoopSimdDirective *D) { 8982 DeclarationNameInfo DirName; 8983 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8984 nullptr, D->getBeginLoc()); 8985 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8986 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8987 return Res; 8988 } 8989 8990 template <typename Derived> 8991 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8992 OMPMasterTaskLoopDirective *D) { 8993 DeclarationNameInfo DirName; 8994 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8995 nullptr, D->getBeginLoc()); 8996 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8997 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8998 return Res; 8999 } 9000 9001 template <typename Derived> 9002 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9003 OMPMasterTaskLoopSimdDirective *D) { 9004 DeclarationNameInfo DirName; 9005 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9006 nullptr, D->getBeginLoc()); 9007 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9008 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9009 return Res; 9010 } 9011 9012 template <typename Derived> 9013 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9014 OMPParallelMasterTaskLoopDirective *D) { 9015 DeclarationNameInfo DirName; 9016 getDerived().getSema().StartOpenMPDSABlock( 9017 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9018 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9019 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9020 return Res; 9021 } 9022 9023 template <typename Derived> 9024 StmtResult 9025 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9026 OMPParallelMasterTaskLoopSimdDirective *D) { 9027 DeclarationNameInfo DirName; 9028 getDerived().getSema().StartOpenMPDSABlock( 9029 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9030 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9031 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9032 return Res; 9033 } 9034 9035 template <typename Derived> 9036 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9037 OMPDistributeDirective *D) { 9038 DeclarationNameInfo DirName; 9039 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9040 D->getBeginLoc()); 9041 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9042 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9043 return Res; 9044 } 9045 9046 template <typename Derived> 9047 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9048 OMPDistributeParallelForDirective *D) { 9049 DeclarationNameInfo DirName; 9050 getDerived().getSema().StartOpenMPDSABlock( 9051 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9052 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9053 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9054 return Res; 9055 } 9056 9057 template <typename Derived> 9058 StmtResult 9059 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9060 OMPDistributeParallelForSimdDirective *D) { 9061 DeclarationNameInfo DirName; 9062 getDerived().getSema().StartOpenMPDSABlock( 9063 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9064 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9065 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9066 return Res; 9067 } 9068 9069 template <typename Derived> 9070 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9071 OMPDistributeSimdDirective *D) { 9072 DeclarationNameInfo DirName; 9073 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9074 nullptr, D->getBeginLoc()); 9075 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9076 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9077 return Res; 9078 } 9079 9080 template <typename Derived> 9081 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9082 OMPTargetParallelForSimdDirective *D) { 9083 DeclarationNameInfo DirName; 9084 getDerived().getSema().StartOpenMPDSABlock( 9085 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9086 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9087 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9088 return Res; 9089 } 9090 9091 template <typename Derived> 9092 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9093 OMPTargetSimdDirective *D) { 9094 DeclarationNameInfo DirName; 9095 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9096 D->getBeginLoc()); 9097 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9098 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9099 return Res; 9100 } 9101 9102 template <typename Derived> 9103 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9104 OMPTeamsDistributeDirective *D) { 9105 DeclarationNameInfo DirName; 9106 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9107 nullptr, D->getBeginLoc()); 9108 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9109 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9110 return Res; 9111 } 9112 9113 template <typename Derived> 9114 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9115 OMPTeamsDistributeSimdDirective *D) { 9116 DeclarationNameInfo DirName; 9117 getDerived().getSema().StartOpenMPDSABlock( 9118 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9119 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9120 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9121 return Res; 9122 } 9123 9124 template <typename Derived> 9125 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9126 OMPTeamsDistributeParallelForSimdDirective *D) { 9127 DeclarationNameInfo DirName; 9128 getDerived().getSema().StartOpenMPDSABlock( 9129 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9130 D->getBeginLoc()); 9131 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9132 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9133 return Res; 9134 } 9135 9136 template <typename Derived> 9137 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9138 OMPTeamsDistributeParallelForDirective *D) { 9139 DeclarationNameInfo DirName; 9140 getDerived().getSema().StartOpenMPDSABlock( 9141 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9142 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9143 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9144 return Res; 9145 } 9146 9147 template <typename Derived> 9148 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9149 OMPTargetTeamsDirective *D) { 9150 DeclarationNameInfo DirName; 9151 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9152 nullptr, D->getBeginLoc()); 9153 auto Res = getDerived().TransformOMPExecutableDirective(D); 9154 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9155 return Res; 9156 } 9157 9158 template <typename Derived> 9159 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9160 OMPTargetTeamsDistributeDirective *D) { 9161 DeclarationNameInfo DirName; 9162 getDerived().getSema().StartOpenMPDSABlock( 9163 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9164 auto Res = getDerived().TransformOMPExecutableDirective(D); 9165 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9166 return Res; 9167 } 9168 9169 template <typename Derived> 9170 StmtResult 9171 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9172 OMPTargetTeamsDistributeParallelForDirective *D) { 9173 DeclarationNameInfo DirName; 9174 getDerived().getSema().StartOpenMPDSABlock( 9175 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9176 D->getBeginLoc()); 9177 auto Res = getDerived().TransformOMPExecutableDirective(D); 9178 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9179 return Res; 9180 } 9181 9182 template <typename Derived> 9183 StmtResult TreeTransform<Derived>:: 9184 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9185 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9186 DeclarationNameInfo DirName; 9187 getDerived().getSema().StartOpenMPDSABlock( 9188 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9189 D->getBeginLoc()); 9190 auto Res = getDerived().TransformOMPExecutableDirective(D); 9191 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9192 return Res; 9193 } 9194 9195 template <typename Derived> 9196 StmtResult 9197 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9198 OMPTargetTeamsDistributeSimdDirective *D) { 9199 DeclarationNameInfo DirName; 9200 getDerived().getSema().StartOpenMPDSABlock( 9201 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9202 auto Res = getDerived().TransformOMPExecutableDirective(D); 9203 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9204 return Res; 9205 } 9206 9207 template <typename Derived> 9208 StmtResult 9209 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9210 DeclarationNameInfo DirName; 9211 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9212 D->getBeginLoc()); 9213 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9214 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9215 return Res; 9216 } 9217 9218 template <typename Derived> 9219 StmtResult 9220 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9221 DeclarationNameInfo DirName; 9222 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9223 D->getBeginLoc()); 9224 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9225 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9226 return Res; 9227 } 9228 9229 template <typename Derived> 9230 StmtResult 9231 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9232 DeclarationNameInfo DirName; 9233 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9234 D->getBeginLoc()); 9235 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9236 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9237 return Res; 9238 } 9239 9240 template <typename Derived> 9241 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9242 OMPGenericLoopDirective *D) { 9243 DeclarationNameInfo DirName; 9244 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9245 D->getBeginLoc()); 9246 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9247 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9248 return Res; 9249 } 9250 9251 //===----------------------------------------------------------------------===// 9252 // OpenMP clause transformation 9253 //===----------------------------------------------------------------------===// 9254 template <typename Derived> 9255 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9256 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9257 if (Cond.isInvalid()) 9258 return nullptr; 9259 return getDerived().RebuildOMPIfClause( 9260 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9261 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9262 } 9263 9264 template <typename Derived> 9265 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9266 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9267 if (Cond.isInvalid()) 9268 return nullptr; 9269 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9270 C->getLParenLoc(), C->getEndLoc()); 9271 } 9272 9273 template <typename Derived> 9274 OMPClause * 9275 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9276 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9277 if (NumThreads.isInvalid()) 9278 return nullptr; 9279 return getDerived().RebuildOMPNumThreadsClause( 9280 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9281 } 9282 9283 template <typename Derived> 9284 OMPClause * 9285 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9286 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9287 if (E.isInvalid()) 9288 return nullptr; 9289 return getDerived().RebuildOMPSafelenClause( 9290 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9291 } 9292 9293 template <typename Derived> 9294 OMPClause * 9295 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9296 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9297 if (E.isInvalid()) 9298 return nullptr; 9299 return getDerived().RebuildOMPAllocatorClause( 9300 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9301 } 9302 9303 template <typename Derived> 9304 OMPClause * 9305 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9306 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9307 if (E.isInvalid()) 9308 return nullptr; 9309 return getDerived().RebuildOMPSimdlenClause( 9310 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9311 } 9312 9313 template <typename Derived> 9314 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9315 SmallVector<Expr *, 4> TransformedSizes; 9316 TransformedSizes.reserve(C->getNumSizes()); 9317 bool Changed = false; 9318 for (Expr *E : C->getSizesRefs()) { 9319 if (!E) { 9320 TransformedSizes.push_back(nullptr); 9321 continue; 9322 } 9323 9324 ExprResult T = getDerived().TransformExpr(E); 9325 if (T.isInvalid()) 9326 return nullptr; 9327 if (E != T.get()) 9328 Changed = true; 9329 TransformedSizes.push_back(T.get()); 9330 } 9331 9332 if (!Changed && !getDerived().AlwaysRebuild()) 9333 return C; 9334 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9335 C->getLParenLoc(), C->getEndLoc()); 9336 } 9337 9338 template <typename Derived> 9339 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9340 if (!getDerived().AlwaysRebuild()) 9341 return C; 9342 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9343 } 9344 9345 template <typename Derived> 9346 OMPClause * 9347 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9348 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9349 if (T.isInvalid()) 9350 return nullptr; 9351 Expr *Factor = T.get(); 9352 bool Changed = Factor != C->getFactor(); 9353 9354 if (!Changed && !getDerived().AlwaysRebuild()) 9355 return C; 9356 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9357 C->getEndLoc()); 9358 } 9359 9360 template <typename Derived> 9361 OMPClause * 9362 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9363 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9364 if (E.isInvalid()) 9365 return nullptr; 9366 return getDerived().RebuildOMPCollapseClause( 9367 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9368 } 9369 9370 template <typename Derived> 9371 OMPClause * 9372 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9373 return getDerived().RebuildOMPDefaultClause( 9374 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9375 C->getLParenLoc(), C->getEndLoc()); 9376 } 9377 9378 template <typename Derived> 9379 OMPClause * 9380 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9381 return getDerived().RebuildOMPProcBindClause( 9382 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9383 C->getLParenLoc(), C->getEndLoc()); 9384 } 9385 9386 template <typename Derived> 9387 OMPClause * 9388 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9389 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9390 if (E.isInvalid()) 9391 return nullptr; 9392 return getDerived().RebuildOMPScheduleClause( 9393 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9394 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9395 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9396 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9397 } 9398 9399 template <typename Derived> 9400 OMPClause * 9401 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9402 ExprResult E; 9403 if (auto *Num = C->getNumForLoops()) { 9404 E = getDerived().TransformExpr(Num); 9405 if (E.isInvalid()) 9406 return nullptr; 9407 } 9408 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9409 C->getLParenLoc(), E.get()); 9410 } 9411 9412 template <typename Derived> 9413 OMPClause * 9414 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9415 ExprResult E; 9416 if (Expr *Evt = C->getEventHandler()) { 9417 E = getDerived().TransformExpr(Evt); 9418 if (E.isInvalid()) 9419 return nullptr; 9420 } 9421 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9422 C->getLParenLoc(), C->getEndLoc()); 9423 } 9424 9425 template <typename Derived> 9426 OMPClause * 9427 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9428 // No need to rebuild this clause, no template-dependent parameters. 9429 return C; 9430 } 9431 9432 template <typename Derived> 9433 OMPClause * 9434 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9435 // No need to rebuild this clause, no template-dependent parameters. 9436 return C; 9437 } 9438 9439 template <typename Derived> 9440 OMPClause * 9441 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9442 // No need to rebuild this clause, no template-dependent parameters. 9443 return C; 9444 } 9445 9446 template <typename Derived> 9447 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9448 // No need to rebuild this clause, no template-dependent parameters. 9449 return C; 9450 } 9451 9452 template <typename Derived> 9453 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9454 // No need to rebuild this clause, no template-dependent parameters. 9455 return C; 9456 } 9457 9458 template <typename Derived> 9459 OMPClause * 9460 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9461 // No need to rebuild this clause, no template-dependent parameters. 9462 return C; 9463 } 9464 9465 template <typename Derived> 9466 OMPClause * 9467 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9468 // No need to rebuild this clause, no template-dependent parameters. 9469 return C; 9470 } 9471 9472 template <typename Derived> 9473 OMPClause * 9474 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9475 // No need to rebuild this clause, no template-dependent parameters. 9476 return C; 9477 } 9478 9479 template <typename Derived> 9480 OMPClause * 9481 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9482 // No need to rebuild this clause, no template-dependent parameters. 9483 return C; 9484 } 9485 9486 template <typename Derived> 9487 OMPClause * 9488 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9489 // No need to rebuild this clause, no template-dependent parameters. 9490 return C; 9491 } 9492 9493 template <typename Derived> 9494 OMPClause * 9495 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9496 // No need to rebuild this clause, no template-dependent parameters. 9497 return C; 9498 } 9499 9500 template <typename Derived> 9501 OMPClause * 9502 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9503 // No need to rebuild this clause, no template-dependent parameters. 9504 return C; 9505 } 9506 9507 template <typename Derived> 9508 OMPClause * 9509 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9510 // No need to rebuild this clause, no template-dependent parameters. 9511 return C; 9512 } 9513 9514 template <typename Derived> 9515 OMPClause * 9516 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9517 // No need to rebuild this clause, no template-dependent parameters. 9518 return C; 9519 } 9520 9521 template <typename Derived> 9522 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9523 // No need to rebuild this clause, no template-dependent parameters. 9524 return C; 9525 } 9526 9527 template <typename Derived> 9528 OMPClause * 9529 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9530 // No need to rebuild this clause, no template-dependent parameters. 9531 return C; 9532 } 9533 9534 template <typename Derived> 9535 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9536 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9537 if (IVR.isInvalid()) 9538 return nullptr; 9539 9540 llvm::SmallVector<Expr *, 8> PrefExprs; 9541 PrefExprs.reserve(C->varlist_size() - 1); 9542 for (Expr *E : llvm::drop_begin(C->varlists())) { 9543 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9544 if (ER.isInvalid()) 9545 return nullptr; 9546 PrefExprs.push_back(ER.get()); 9547 } 9548 return getDerived().RebuildOMPInitClause( 9549 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9550 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9551 } 9552 9553 template <typename Derived> 9554 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9555 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9556 if (ER.isInvalid()) 9557 return nullptr; 9558 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9559 C->getLParenLoc(), C->getVarLoc(), 9560 C->getEndLoc()); 9561 } 9562 9563 template <typename Derived> 9564 OMPClause * 9565 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9566 ExprResult ER; 9567 if (Expr *IV = C->getInteropVar()) { 9568 ER = getDerived().TransformExpr(IV); 9569 if (ER.isInvalid()) 9570 return nullptr; 9571 } 9572 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9573 C->getLParenLoc(), C->getVarLoc(), 9574 C->getEndLoc()); 9575 } 9576 9577 template <typename Derived> 9578 OMPClause * 9579 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9580 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9581 if (Cond.isInvalid()) 9582 return nullptr; 9583 return getDerived().RebuildOMPNovariantsClause( 9584 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9585 } 9586 9587 template <typename Derived> 9588 OMPClause * 9589 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9590 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9591 if (Cond.isInvalid()) 9592 return nullptr; 9593 return getDerived().RebuildOMPNocontextClause( 9594 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9595 } 9596 9597 template <typename Derived> 9598 OMPClause * 9599 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9600 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9601 if (ThreadID.isInvalid()) 9602 return nullptr; 9603 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9604 C->getLParenLoc(), C->getEndLoc()); 9605 } 9606 9607 template <typename Derived> 9608 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9609 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9610 if (E.isInvalid()) 9611 return nullptr; 9612 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9613 C->getLParenLoc(), C->getEndLoc()); 9614 } 9615 9616 template <typename Derived> 9617 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9618 OMPUnifiedAddressClause *C) { 9619 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9620 } 9621 9622 template <typename Derived> 9623 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9624 OMPUnifiedSharedMemoryClause *C) { 9625 llvm_unreachable( 9626 "unified_shared_memory clause cannot appear in dependent context"); 9627 } 9628 9629 template <typename Derived> 9630 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9631 OMPReverseOffloadClause *C) { 9632 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9633 } 9634 9635 template <typename Derived> 9636 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9637 OMPDynamicAllocatorsClause *C) { 9638 llvm_unreachable( 9639 "dynamic_allocators clause cannot appear in dependent context"); 9640 } 9641 9642 template <typename Derived> 9643 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9644 OMPAtomicDefaultMemOrderClause *C) { 9645 llvm_unreachable( 9646 "atomic_default_mem_order clause cannot appear in dependent context"); 9647 } 9648 9649 template <typename Derived> 9650 OMPClause * 9651 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9652 llvm::SmallVector<Expr *, 16> Vars; 9653 Vars.reserve(C->varlist_size()); 9654 for (auto *VE : C->varlists()) { 9655 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9656 if (EVar.isInvalid()) 9657 return nullptr; 9658 Vars.push_back(EVar.get()); 9659 } 9660 return getDerived().RebuildOMPPrivateClause( 9661 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9662 } 9663 9664 template <typename Derived> 9665 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9666 OMPFirstprivateClause *C) { 9667 llvm::SmallVector<Expr *, 16> Vars; 9668 Vars.reserve(C->varlist_size()); 9669 for (auto *VE : C->varlists()) { 9670 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9671 if (EVar.isInvalid()) 9672 return nullptr; 9673 Vars.push_back(EVar.get()); 9674 } 9675 return getDerived().RebuildOMPFirstprivateClause( 9676 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9677 } 9678 9679 template <typename Derived> 9680 OMPClause * 9681 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9682 llvm::SmallVector<Expr *, 16> Vars; 9683 Vars.reserve(C->varlist_size()); 9684 for (auto *VE : C->varlists()) { 9685 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9686 if (EVar.isInvalid()) 9687 return nullptr; 9688 Vars.push_back(EVar.get()); 9689 } 9690 return getDerived().RebuildOMPLastprivateClause( 9691 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9692 C->getLParenLoc(), C->getEndLoc()); 9693 } 9694 9695 template <typename Derived> 9696 OMPClause * 9697 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9698 llvm::SmallVector<Expr *, 16> Vars; 9699 Vars.reserve(C->varlist_size()); 9700 for (auto *VE : C->varlists()) { 9701 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9702 if (EVar.isInvalid()) 9703 return nullptr; 9704 Vars.push_back(EVar.get()); 9705 } 9706 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9707 C->getLParenLoc(), C->getEndLoc()); 9708 } 9709 9710 template <typename Derived> 9711 OMPClause * 9712 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9713 llvm::SmallVector<Expr *, 16> Vars; 9714 Vars.reserve(C->varlist_size()); 9715 for (auto *VE : C->varlists()) { 9716 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9717 if (EVar.isInvalid()) 9718 return nullptr; 9719 Vars.push_back(EVar.get()); 9720 } 9721 CXXScopeSpec ReductionIdScopeSpec; 9722 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9723 9724 DeclarationNameInfo NameInfo = C->getNameInfo(); 9725 if (NameInfo.getName()) { 9726 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9727 if (!NameInfo.getName()) 9728 return nullptr; 9729 } 9730 // Build a list of all UDR decls with the same names ranged by the Scopes. 9731 // The Scope boundary is a duplication of the previous decl. 9732 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9733 for (auto *E : C->reduction_ops()) { 9734 // Transform all the decls. 9735 if (E) { 9736 auto *ULE = cast<UnresolvedLookupExpr>(E); 9737 UnresolvedSet<8> Decls; 9738 for (auto *D : ULE->decls()) { 9739 NamedDecl *InstD = 9740 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9741 Decls.addDecl(InstD, InstD->getAccess()); 9742 } 9743 UnresolvedReductions.push_back( 9744 UnresolvedLookupExpr::Create( 9745 SemaRef.Context, /*NamingClass=*/nullptr, 9746 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9747 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9748 Decls.begin(), Decls.end())); 9749 } else 9750 UnresolvedReductions.push_back(nullptr); 9751 } 9752 return getDerived().RebuildOMPReductionClause( 9753 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9754 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9755 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9756 } 9757 9758 template <typename Derived> 9759 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9760 OMPTaskReductionClause *C) { 9761 llvm::SmallVector<Expr *, 16> Vars; 9762 Vars.reserve(C->varlist_size()); 9763 for (auto *VE : C->varlists()) { 9764 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9765 if (EVar.isInvalid()) 9766 return nullptr; 9767 Vars.push_back(EVar.get()); 9768 } 9769 CXXScopeSpec ReductionIdScopeSpec; 9770 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9771 9772 DeclarationNameInfo NameInfo = C->getNameInfo(); 9773 if (NameInfo.getName()) { 9774 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9775 if (!NameInfo.getName()) 9776 return nullptr; 9777 } 9778 // Build a list of all UDR decls with the same names ranged by the Scopes. 9779 // The Scope boundary is a duplication of the previous decl. 9780 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9781 for (auto *E : C->reduction_ops()) { 9782 // Transform all the decls. 9783 if (E) { 9784 auto *ULE = cast<UnresolvedLookupExpr>(E); 9785 UnresolvedSet<8> Decls; 9786 for (auto *D : ULE->decls()) { 9787 NamedDecl *InstD = 9788 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9789 Decls.addDecl(InstD, InstD->getAccess()); 9790 } 9791 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9792 SemaRef.Context, /*NamingClass=*/nullptr, 9793 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9794 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9795 } else 9796 UnresolvedReductions.push_back(nullptr); 9797 } 9798 return getDerived().RebuildOMPTaskReductionClause( 9799 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9800 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9801 } 9802 9803 template <typename Derived> 9804 OMPClause * 9805 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9806 llvm::SmallVector<Expr *, 16> Vars; 9807 Vars.reserve(C->varlist_size()); 9808 for (auto *VE : C->varlists()) { 9809 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9810 if (EVar.isInvalid()) 9811 return nullptr; 9812 Vars.push_back(EVar.get()); 9813 } 9814 CXXScopeSpec ReductionIdScopeSpec; 9815 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9816 9817 DeclarationNameInfo NameInfo = C->getNameInfo(); 9818 if (NameInfo.getName()) { 9819 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9820 if (!NameInfo.getName()) 9821 return nullptr; 9822 } 9823 // Build a list of all UDR decls with the same names ranged by the Scopes. 9824 // The Scope boundary is a duplication of the previous decl. 9825 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9826 for (auto *E : C->reduction_ops()) { 9827 // Transform all the decls. 9828 if (E) { 9829 auto *ULE = cast<UnresolvedLookupExpr>(E); 9830 UnresolvedSet<8> Decls; 9831 for (auto *D : ULE->decls()) { 9832 NamedDecl *InstD = 9833 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9834 Decls.addDecl(InstD, InstD->getAccess()); 9835 } 9836 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9837 SemaRef.Context, /*NamingClass=*/nullptr, 9838 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9839 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9840 } else 9841 UnresolvedReductions.push_back(nullptr); 9842 } 9843 return getDerived().RebuildOMPInReductionClause( 9844 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9845 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9846 } 9847 9848 template <typename Derived> 9849 OMPClause * 9850 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9851 llvm::SmallVector<Expr *, 16> Vars; 9852 Vars.reserve(C->varlist_size()); 9853 for (auto *VE : C->varlists()) { 9854 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9855 if (EVar.isInvalid()) 9856 return nullptr; 9857 Vars.push_back(EVar.get()); 9858 } 9859 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9860 if (Step.isInvalid()) 9861 return nullptr; 9862 return getDerived().RebuildOMPLinearClause( 9863 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9864 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9865 } 9866 9867 template <typename Derived> 9868 OMPClause * 9869 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9870 llvm::SmallVector<Expr *, 16> Vars; 9871 Vars.reserve(C->varlist_size()); 9872 for (auto *VE : C->varlists()) { 9873 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9874 if (EVar.isInvalid()) 9875 return nullptr; 9876 Vars.push_back(EVar.get()); 9877 } 9878 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9879 if (Alignment.isInvalid()) 9880 return nullptr; 9881 return getDerived().RebuildOMPAlignedClause( 9882 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9883 C->getColonLoc(), C->getEndLoc()); 9884 } 9885 9886 template <typename Derived> 9887 OMPClause * 9888 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9889 llvm::SmallVector<Expr *, 16> Vars; 9890 Vars.reserve(C->varlist_size()); 9891 for (auto *VE : C->varlists()) { 9892 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9893 if (EVar.isInvalid()) 9894 return nullptr; 9895 Vars.push_back(EVar.get()); 9896 } 9897 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9898 C->getLParenLoc(), C->getEndLoc()); 9899 } 9900 9901 template <typename Derived> 9902 OMPClause * 9903 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9904 llvm::SmallVector<Expr *, 16> Vars; 9905 Vars.reserve(C->varlist_size()); 9906 for (auto *VE : C->varlists()) { 9907 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9908 if (EVar.isInvalid()) 9909 return nullptr; 9910 Vars.push_back(EVar.get()); 9911 } 9912 return getDerived().RebuildOMPCopyprivateClause( 9913 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9914 } 9915 9916 template <typename Derived> 9917 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9918 llvm::SmallVector<Expr *, 16> Vars; 9919 Vars.reserve(C->varlist_size()); 9920 for (auto *VE : C->varlists()) { 9921 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9922 if (EVar.isInvalid()) 9923 return nullptr; 9924 Vars.push_back(EVar.get()); 9925 } 9926 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9927 C->getLParenLoc(), C->getEndLoc()); 9928 } 9929 9930 template <typename Derived> 9931 OMPClause * 9932 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9933 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9934 if (E.isInvalid()) 9935 return nullptr; 9936 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9937 C->getLParenLoc(), C->getEndLoc()); 9938 } 9939 9940 template <typename Derived> 9941 OMPClause * 9942 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9943 llvm::SmallVector<Expr *, 16> Vars; 9944 Expr *DepModifier = C->getModifier(); 9945 if (DepModifier) { 9946 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9947 if (DepModRes.isInvalid()) 9948 return nullptr; 9949 DepModifier = DepModRes.get(); 9950 } 9951 Vars.reserve(C->varlist_size()); 9952 for (auto *VE : C->varlists()) { 9953 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9954 if (EVar.isInvalid()) 9955 return nullptr; 9956 Vars.push_back(EVar.get()); 9957 } 9958 return getDerived().RebuildOMPDependClause( 9959 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9960 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9961 C->getEndLoc()); 9962 } 9963 9964 template <typename Derived> 9965 OMPClause * 9966 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9967 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9968 if (E.isInvalid()) 9969 return nullptr; 9970 return getDerived().RebuildOMPDeviceClause( 9971 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9972 C->getModifierLoc(), C->getEndLoc()); 9973 } 9974 9975 template <typename Derived, class T> 9976 bool transformOMPMappableExprListClause( 9977 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9978 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9979 DeclarationNameInfo &MapperIdInfo, 9980 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9981 // Transform expressions in the list. 9982 Vars.reserve(C->varlist_size()); 9983 for (auto *VE : C->varlists()) { 9984 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9985 if (EVar.isInvalid()) 9986 return true; 9987 Vars.push_back(EVar.get()); 9988 } 9989 // Transform mapper scope specifier and identifier. 9990 NestedNameSpecifierLoc QualifierLoc; 9991 if (C->getMapperQualifierLoc()) { 9992 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9993 C->getMapperQualifierLoc()); 9994 if (!QualifierLoc) 9995 return true; 9996 } 9997 MapperIdScopeSpec.Adopt(QualifierLoc); 9998 MapperIdInfo = C->getMapperIdInfo(); 9999 if (MapperIdInfo.getName()) { 10000 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10001 if (!MapperIdInfo.getName()) 10002 return true; 10003 } 10004 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10005 // the previous user-defined mapper lookup in dependent environment. 10006 for (auto *E : C->mapperlists()) { 10007 // Transform all the decls. 10008 if (E) { 10009 auto *ULE = cast<UnresolvedLookupExpr>(E); 10010 UnresolvedSet<8> Decls; 10011 for (auto *D : ULE->decls()) { 10012 NamedDecl *InstD = 10013 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10014 Decls.addDecl(InstD, InstD->getAccess()); 10015 } 10016 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10017 TT.getSema().Context, /*NamingClass=*/nullptr, 10018 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10019 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10020 Decls.end())); 10021 } else { 10022 UnresolvedMappers.push_back(nullptr); 10023 } 10024 } 10025 return false; 10026 } 10027 10028 template <typename Derived> 10029 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10030 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10031 llvm::SmallVector<Expr *, 16> Vars; 10032 CXXScopeSpec MapperIdScopeSpec; 10033 DeclarationNameInfo MapperIdInfo; 10034 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10035 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10036 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10037 return nullptr; 10038 return getDerived().RebuildOMPMapClause( 10039 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 10040 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 10041 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10042 } 10043 10044 template <typename Derived> 10045 OMPClause * 10046 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10047 Expr *Allocator = C->getAllocator(); 10048 if (Allocator) { 10049 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10050 if (AllocatorRes.isInvalid()) 10051 return nullptr; 10052 Allocator = AllocatorRes.get(); 10053 } 10054 llvm::SmallVector<Expr *, 16> Vars; 10055 Vars.reserve(C->varlist_size()); 10056 for (auto *VE : C->varlists()) { 10057 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10058 if (EVar.isInvalid()) 10059 return nullptr; 10060 Vars.push_back(EVar.get()); 10061 } 10062 return getDerived().RebuildOMPAllocateClause( 10063 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10064 C->getEndLoc()); 10065 } 10066 10067 template <typename Derived> 10068 OMPClause * 10069 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10070 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10071 if (E.isInvalid()) 10072 return nullptr; 10073 return getDerived().RebuildOMPNumTeamsClause( 10074 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10075 } 10076 10077 template <typename Derived> 10078 OMPClause * 10079 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10080 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10081 if (E.isInvalid()) 10082 return nullptr; 10083 return getDerived().RebuildOMPThreadLimitClause( 10084 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10085 } 10086 10087 template <typename Derived> 10088 OMPClause * 10089 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10090 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10091 if (E.isInvalid()) 10092 return nullptr; 10093 return getDerived().RebuildOMPPriorityClause( 10094 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10095 } 10096 10097 template <typename Derived> 10098 OMPClause * 10099 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10100 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10101 if (E.isInvalid()) 10102 return nullptr; 10103 return getDerived().RebuildOMPGrainsizeClause( 10104 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10105 } 10106 10107 template <typename Derived> 10108 OMPClause * 10109 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10110 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10111 if (E.isInvalid()) 10112 return nullptr; 10113 return getDerived().RebuildOMPNumTasksClause( 10114 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10115 } 10116 10117 template <typename Derived> 10118 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10119 ExprResult E = getDerived().TransformExpr(C->getHint()); 10120 if (E.isInvalid()) 10121 return nullptr; 10122 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10123 C->getLParenLoc(), C->getEndLoc()); 10124 } 10125 10126 template <typename Derived> 10127 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10128 OMPDistScheduleClause *C) { 10129 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10130 if (E.isInvalid()) 10131 return nullptr; 10132 return getDerived().RebuildOMPDistScheduleClause( 10133 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10134 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10135 } 10136 10137 template <typename Derived> 10138 OMPClause * 10139 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10140 // Rebuild Defaultmap Clause since we need to invoke the checking of 10141 // defaultmap(none:variable-category) after template initialization. 10142 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10143 C->getDefaultmapKind(), 10144 C->getBeginLoc(), 10145 C->getLParenLoc(), 10146 C->getDefaultmapModifierLoc(), 10147 C->getDefaultmapKindLoc(), 10148 C->getEndLoc()); 10149 } 10150 10151 template <typename Derived> 10152 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10153 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10154 llvm::SmallVector<Expr *, 16> Vars; 10155 CXXScopeSpec MapperIdScopeSpec; 10156 DeclarationNameInfo MapperIdInfo; 10157 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10158 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10159 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10160 return nullptr; 10161 return getDerived().RebuildOMPToClause( 10162 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10163 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10164 } 10165 10166 template <typename Derived> 10167 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10168 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10169 llvm::SmallVector<Expr *, 16> Vars; 10170 CXXScopeSpec MapperIdScopeSpec; 10171 DeclarationNameInfo MapperIdInfo; 10172 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10173 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10174 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10175 return nullptr; 10176 return getDerived().RebuildOMPFromClause( 10177 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10178 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10179 } 10180 10181 template <typename Derived> 10182 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10183 OMPUseDevicePtrClause *C) { 10184 llvm::SmallVector<Expr *, 16> Vars; 10185 Vars.reserve(C->varlist_size()); 10186 for (auto *VE : C->varlists()) { 10187 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10188 if (EVar.isInvalid()) 10189 return nullptr; 10190 Vars.push_back(EVar.get()); 10191 } 10192 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10193 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10194 } 10195 10196 template <typename Derived> 10197 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10198 OMPUseDeviceAddrClause *C) { 10199 llvm::SmallVector<Expr *, 16> Vars; 10200 Vars.reserve(C->varlist_size()); 10201 for (auto *VE : C->varlists()) { 10202 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10203 if (EVar.isInvalid()) 10204 return nullptr; 10205 Vars.push_back(EVar.get()); 10206 } 10207 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10208 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10209 } 10210 10211 template <typename Derived> 10212 OMPClause * 10213 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10214 llvm::SmallVector<Expr *, 16> Vars; 10215 Vars.reserve(C->varlist_size()); 10216 for (auto *VE : C->varlists()) { 10217 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10218 if (EVar.isInvalid()) 10219 return nullptr; 10220 Vars.push_back(EVar.get()); 10221 } 10222 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10223 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10224 } 10225 10226 template <typename Derived> 10227 OMPClause * 10228 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10229 llvm::SmallVector<Expr *, 16> Vars; 10230 Vars.reserve(C->varlist_size()); 10231 for (auto *VE : C->varlists()) { 10232 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10233 if (EVar.isInvalid()) 10234 return nullptr; 10235 Vars.push_back(EVar.get()); 10236 } 10237 return getDerived().RebuildOMPNontemporalClause( 10238 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10239 } 10240 10241 template <typename Derived> 10242 OMPClause * 10243 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10244 llvm::SmallVector<Expr *, 16> Vars; 10245 Vars.reserve(C->varlist_size()); 10246 for (auto *VE : C->varlists()) { 10247 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10248 if (EVar.isInvalid()) 10249 return nullptr; 10250 Vars.push_back(EVar.get()); 10251 } 10252 return getDerived().RebuildOMPInclusiveClause( 10253 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10254 } 10255 10256 template <typename Derived> 10257 OMPClause * 10258 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10259 llvm::SmallVector<Expr *, 16> Vars; 10260 Vars.reserve(C->varlist_size()); 10261 for (auto *VE : C->varlists()) { 10262 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10263 if (EVar.isInvalid()) 10264 return nullptr; 10265 Vars.push_back(EVar.get()); 10266 } 10267 return getDerived().RebuildOMPExclusiveClause( 10268 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10269 } 10270 10271 template <typename Derived> 10272 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10273 OMPUsesAllocatorsClause *C) { 10274 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10275 Data.reserve(C->getNumberOfAllocators()); 10276 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10277 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10278 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10279 if (Allocator.isInvalid()) 10280 continue; 10281 ExprResult AllocatorTraits; 10282 if (Expr *AT = D.AllocatorTraits) { 10283 AllocatorTraits = getDerived().TransformExpr(AT); 10284 if (AllocatorTraits.isInvalid()) 10285 continue; 10286 } 10287 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10288 NewD.Allocator = Allocator.get(); 10289 NewD.AllocatorTraits = AllocatorTraits.get(); 10290 NewD.LParenLoc = D.LParenLoc; 10291 NewD.RParenLoc = D.RParenLoc; 10292 } 10293 return getDerived().RebuildOMPUsesAllocatorsClause( 10294 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10295 } 10296 10297 template <typename Derived> 10298 OMPClause * 10299 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10300 SmallVector<Expr *, 4> Locators; 10301 Locators.reserve(C->varlist_size()); 10302 ExprResult ModifierRes; 10303 if (Expr *Modifier = C->getModifier()) { 10304 ModifierRes = getDerived().TransformExpr(Modifier); 10305 if (ModifierRes.isInvalid()) 10306 return nullptr; 10307 } 10308 for (Expr *E : C->varlists()) { 10309 ExprResult Locator = getDerived().TransformExpr(E); 10310 if (Locator.isInvalid()) 10311 continue; 10312 Locators.push_back(Locator.get()); 10313 } 10314 return getDerived().RebuildOMPAffinityClause( 10315 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10316 ModifierRes.get(), Locators); 10317 } 10318 10319 template <typename Derived> 10320 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10321 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10322 C->getBeginLoc(), C->getLParenLoc(), 10323 C->getEndLoc()); 10324 } 10325 10326 template <typename Derived> 10327 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10328 return getDerived().RebuildOMPBindClause( 10329 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10330 C->getLParenLoc(), C->getEndLoc()); 10331 } 10332 10333 //===----------------------------------------------------------------------===// 10334 // Expression transformation 10335 //===----------------------------------------------------------------------===// 10336 template<typename Derived> 10337 ExprResult 10338 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10339 return TransformExpr(E->getSubExpr()); 10340 } 10341 10342 template <typename Derived> 10343 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10344 SYCLUniqueStableNameExpr *E) { 10345 if (!E->isTypeDependent()) 10346 return E; 10347 10348 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10349 10350 if (!NewT) 10351 return ExprError(); 10352 10353 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10354 return E; 10355 10356 return getDerived().RebuildSYCLUniqueStableNameExpr( 10357 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10358 } 10359 10360 template<typename Derived> 10361 ExprResult 10362 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10363 if (!E->isTypeDependent()) 10364 return E; 10365 10366 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10367 E->getIdentKind()); 10368 } 10369 10370 template<typename Derived> 10371 ExprResult 10372 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10373 NestedNameSpecifierLoc QualifierLoc; 10374 if (E->getQualifierLoc()) { 10375 QualifierLoc 10376 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10377 if (!QualifierLoc) 10378 return ExprError(); 10379 } 10380 10381 ValueDecl *ND 10382 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10383 E->getDecl())); 10384 if (!ND) 10385 return ExprError(); 10386 10387 NamedDecl *Found = ND; 10388 if (E->getFoundDecl() != E->getDecl()) { 10389 Found = cast_or_null<NamedDecl>( 10390 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10391 if (!Found) 10392 return ExprError(); 10393 } 10394 10395 DeclarationNameInfo NameInfo = E->getNameInfo(); 10396 if (NameInfo.getName()) { 10397 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10398 if (!NameInfo.getName()) 10399 return ExprError(); 10400 } 10401 10402 if (!getDerived().AlwaysRebuild() && 10403 QualifierLoc == E->getQualifierLoc() && 10404 ND == E->getDecl() && 10405 Found == E->getFoundDecl() && 10406 NameInfo.getName() == E->getDecl()->getDeclName() && 10407 !E->hasExplicitTemplateArgs()) { 10408 10409 // Mark it referenced in the new context regardless. 10410 // FIXME: this is a bit instantiation-specific. 10411 SemaRef.MarkDeclRefReferenced(E); 10412 10413 return E; 10414 } 10415 10416 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10417 if (E->hasExplicitTemplateArgs()) { 10418 TemplateArgs = &TransArgs; 10419 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10420 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10421 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10422 E->getNumTemplateArgs(), 10423 TransArgs)) 10424 return ExprError(); 10425 } 10426 10427 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10428 Found, TemplateArgs); 10429 } 10430 10431 template<typename Derived> 10432 ExprResult 10433 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10434 return E; 10435 } 10436 10437 template <typename Derived> 10438 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10439 FixedPointLiteral *E) { 10440 return E; 10441 } 10442 10443 template<typename Derived> 10444 ExprResult 10445 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10446 return E; 10447 } 10448 10449 template<typename Derived> 10450 ExprResult 10451 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10452 return E; 10453 } 10454 10455 template<typename Derived> 10456 ExprResult 10457 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10458 return E; 10459 } 10460 10461 template<typename Derived> 10462 ExprResult 10463 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10464 return E; 10465 } 10466 10467 template<typename Derived> 10468 ExprResult 10469 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10470 if (FunctionDecl *FD = E->getDirectCallee()) 10471 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10472 return SemaRef.MaybeBindToTemporary(E); 10473 } 10474 10475 template<typename Derived> 10476 ExprResult 10477 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10478 ExprResult ControllingExpr = 10479 getDerived().TransformExpr(E->getControllingExpr()); 10480 if (ControllingExpr.isInvalid()) 10481 return ExprError(); 10482 10483 SmallVector<Expr *, 4> AssocExprs; 10484 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10485 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10486 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10487 if (TSI) { 10488 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10489 if (!AssocType) 10490 return ExprError(); 10491 AssocTypes.push_back(AssocType); 10492 } else { 10493 AssocTypes.push_back(nullptr); 10494 } 10495 10496 ExprResult AssocExpr = 10497 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10498 if (AssocExpr.isInvalid()) 10499 return ExprError(); 10500 AssocExprs.push_back(AssocExpr.get()); 10501 } 10502 10503 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10504 E->getDefaultLoc(), 10505 E->getRParenLoc(), 10506 ControllingExpr.get(), 10507 AssocTypes, 10508 AssocExprs); 10509 } 10510 10511 template<typename Derived> 10512 ExprResult 10513 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10514 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10515 if (SubExpr.isInvalid()) 10516 return ExprError(); 10517 10518 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10519 return E; 10520 10521 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10522 E->getRParen()); 10523 } 10524 10525 /// The operand of a unary address-of operator has special rules: it's 10526 /// allowed to refer to a non-static member of a class even if there's no 'this' 10527 /// object available. 10528 template<typename Derived> 10529 ExprResult 10530 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10531 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10532 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10533 else 10534 return getDerived().TransformExpr(E); 10535 } 10536 10537 template<typename Derived> 10538 ExprResult 10539 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10540 ExprResult SubExpr; 10541 if (E->getOpcode() == UO_AddrOf) 10542 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10543 else 10544 SubExpr = TransformExpr(E->getSubExpr()); 10545 if (SubExpr.isInvalid()) 10546 return ExprError(); 10547 10548 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10549 return E; 10550 10551 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10552 E->getOpcode(), 10553 SubExpr.get()); 10554 } 10555 10556 template<typename Derived> 10557 ExprResult 10558 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10559 // Transform the type. 10560 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10561 if (!Type) 10562 return ExprError(); 10563 10564 // Transform all of the components into components similar to what the 10565 // parser uses. 10566 // FIXME: It would be slightly more efficient in the non-dependent case to 10567 // just map FieldDecls, rather than requiring the rebuilder to look for 10568 // the fields again. However, __builtin_offsetof is rare enough in 10569 // template code that we don't care. 10570 bool ExprChanged = false; 10571 typedef Sema::OffsetOfComponent Component; 10572 SmallVector<Component, 4> Components; 10573 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10574 const OffsetOfNode &ON = E->getComponent(I); 10575 Component Comp; 10576 Comp.isBrackets = true; 10577 Comp.LocStart = ON.getSourceRange().getBegin(); 10578 Comp.LocEnd = ON.getSourceRange().getEnd(); 10579 switch (ON.getKind()) { 10580 case OffsetOfNode::Array: { 10581 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10582 ExprResult Index = getDerived().TransformExpr(FromIndex); 10583 if (Index.isInvalid()) 10584 return ExprError(); 10585 10586 ExprChanged = ExprChanged || Index.get() != FromIndex; 10587 Comp.isBrackets = true; 10588 Comp.U.E = Index.get(); 10589 break; 10590 } 10591 10592 case OffsetOfNode::Field: 10593 case OffsetOfNode::Identifier: 10594 Comp.isBrackets = false; 10595 Comp.U.IdentInfo = ON.getFieldName(); 10596 if (!Comp.U.IdentInfo) 10597 continue; 10598 10599 break; 10600 10601 case OffsetOfNode::Base: 10602 // Will be recomputed during the rebuild. 10603 continue; 10604 } 10605 10606 Components.push_back(Comp); 10607 } 10608 10609 // If nothing changed, retain the existing expression. 10610 if (!getDerived().AlwaysRebuild() && 10611 Type == E->getTypeSourceInfo() && 10612 !ExprChanged) 10613 return E; 10614 10615 // Build a new offsetof expression. 10616 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10617 Components, E->getRParenLoc()); 10618 } 10619 10620 template<typename Derived> 10621 ExprResult 10622 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10623 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10624 "opaque value expression requires transformation"); 10625 return E; 10626 } 10627 10628 template<typename Derived> 10629 ExprResult 10630 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10631 return E; 10632 } 10633 10634 template <typename Derived> 10635 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10636 llvm::SmallVector<Expr *, 8> Children; 10637 bool Changed = false; 10638 for (Expr *C : E->subExpressions()) { 10639 ExprResult NewC = getDerived().TransformExpr(C); 10640 if (NewC.isInvalid()) 10641 return ExprError(); 10642 Children.push_back(NewC.get()); 10643 10644 Changed |= NewC.get() != C; 10645 } 10646 if (!getDerived().AlwaysRebuild() && !Changed) 10647 return E; 10648 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10649 Children, E->getType()); 10650 } 10651 10652 template<typename Derived> 10653 ExprResult 10654 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10655 // Rebuild the syntactic form. The original syntactic form has 10656 // opaque-value expressions in it, so strip those away and rebuild 10657 // the result. This is a really awful way of doing this, but the 10658 // better solution (rebuilding the semantic expressions and 10659 // rebinding OVEs as necessary) doesn't work; we'd need 10660 // TreeTransform to not strip away implicit conversions. 10661 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10662 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10663 if (result.isInvalid()) return ExprError(); 10664 10665 // If that gives us a pseudo-object result back, the pseudo-object 10666 // expression must have been an lvalue-to-rvalue conversion which we 10667 // should reapply. 10668 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10669 result = SemaRef.checkPseudoObjectRValue(result.get()); 10670 10671 return result; 10672 } 10673 10674 template<typename Derived> 10675 ExprResult 10676 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10677 UnaryExprOrTypeTraitExpr *E) { 10678 if (E->isArgumentType()) { 10679 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10680 10681 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10682 if (!NewT) 10683 return ExprError(); 10684 10685 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10686 return E; 10687 10688 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10689 E->getKind(), 10690 E->getSourceRange()); 10691 } 10692 10693 // C++0x [expr.sizeof]p1: 10694 // The operand is either an expression, which is an unevaluated operand 10695 // [...] 10696 EnterExpressionEvaluationContext Unevaluated( 10697 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10698 Sema::ReuseLambdaContextDecl); 10699 10700 // Try to recover if we have something like sizeof(T::X) where X is a type. 10701 // Notably, there must be *exactly* one set of parens if X is a type. 10702 TypeSourceInfo *RecoveryTSI = nullptr; 10703 ExprResult SubExpr; 10704 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10705 if (auto *DRE = 10706 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10707 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10708 PE, DRE, false, &RecoveryTSI); 10709 else 10710 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10711 10712 if (RecoveryTSI) { 10713 return getDerived().RebuildUnaryExprOrTypeTrait( 10714 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10715 } else if (SubExpr.isInvalid()) 10716 return ExprError(); 10717 10718 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10719 return E; 10720 10721 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10722 E->getOperatorLoc(), 10723 E->getKind(), 10724 E->getSourceRange()); 10725 } 10726 10727 template<typename Derived> 10728 ExprResult 10729 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10730 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10731 if (LHS.isInvalid()) 10732 return ExprError(); 10733 10734 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10735 if (RHS.isInvalid()) 10736 return ExprError(); 10737 10738 10739 if (!getDerived().AlwaysRebuild() && 10740 LHS.get() == E->getLHS() && 10741 RHS.get() == E->getRHS()) 10742 return E; 10743 10744 return getDerived().RebuildArraySubscriptExpr( 10745 LHS.get(), 10746 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10747 } 10748 10749 template <typename Derived> 10750 ExprResult 10751 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10752 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10753 if (Base.isInvalid()) 10754 return ExprError(); 10755 10756 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10757 if (RowIdx.isInvalid()) 10758 return ExprError(); 10759 10760 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10761 if (ColumnIdx.isInvalid()) 10762 return ExprError(); 10763 10764 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10765 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10766 return E; 10767 10768 return getDerived().RebuildMatrixSubscriptExpr( 10769 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10770 } 10771 10772 template <typename Derived> 10773 ExprResult 10774 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10775 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10776 if (Base.isInvalid()) 10777 return ExprError(); 10778 10779 ExprResult LowerBound; 10780 if (E->getLowerBound()) { 10781 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10782 if (LowerBound.isInvalid()) 10783 return ExprError(); 10784 } 10785 10786 ExprResult Length; 10787 if (E->getLength()) { 10788 Length = getDerived().TransformExpr(E->getLength()); 10789 if (Length.isInvalid()) 10790 return ExprError(); 10791 } 10792 10793 ExprResult Stride; 10794 if (Expr *Str = E->getStride()) { 10795 Stride = getDerived().TransformExpr(Str); 10796 if (Stride.isInvalid()) 10797 return ExprError(); 10798 } 10799 10800 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10801 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10802 return E; 10803 10804 return getDerived().RebuildOMPArraySectionExpr( 10805 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10806 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10807 E->getRBracketLoc()); 10808 } 10809 10810 template <typename Derived> 10811 ExprResult 10812 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10813 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10814 if (Base.isInvalid()) 10815 return ExprError(); 10816 10817 SmallVector<Expr *, 4> Dims; 10818 bool ErrorFound = false; 10819 for (Expr *Dim : E->getDimensions()) { 10820 ExprResult DimRes = getDerived().TransformExpr(Dim); 10821 if (DimRes.isInvalid()) { 10822 ErrorFound = true; 10823 continue; 10824 } 10825 Dims.push_back(DimRes.get()); 10826 } 10827 10828 if (ErrorFound) 10829 return ExprError(); 10830 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10831 E->getRParenLoc(), Dims, 10832 E->getBracketsRanges()); 10833 } 10834 10835 template <typename Derived> 10836 ExprResult 10837 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10838 unsigned NumIterators = E->numOfIterators(); 10839 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10840 10841 bool ErrorFound = false; 10842 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10843 for (unsigned I = 0; I < NumIterators; ++I) { 10844 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10845 Data[I].DeclIdent = D->getIdentifier(); 10846 Data[I].DeclIdentLoc = D->getLocation(); 10847 if (D->getLocation() == D->getBeginLoc()) { 10848 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10849 "Implicit type must be int."); 10850 } else { 10851 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10852 QualType DeclTy = getDerived().TransformType(D->getType()); 10853 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10854 } 10855 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10856 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10857 ExprResult End = getDerived().TransformExpr(Range.End); 10858 ExprResult Step = getDerived().TransformExpr(Range.Step); 10859 ErrorFound = ErrorFound || 10860 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10861 !Data[I].Type.get().isNull())) || 10862 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10863 if (ErrorFound) 10864 continue; 10865 Data[I].Range.Begin = Begin.get(); 10866 Data[I].Range.End = End.get(); 10867 Data[I].Range.Step = Step.get(); 10868 Data[I].AssignLoc = E->getAssignLoc(I); 10869 Data[I].ColonLoc = E->getColonLoc(I); 10870 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10871 NeedToRebuild = 10872 NeedToRebuild || 10873 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10874 D->getType().getTypePtrOrNull()) || 10875 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10876 Range.Step != Data[I].Range.Step; 10877 } 10878 if (ErrorFound) 10879 return ExprError(); 10880 if (!NeedToRebuild) 10881 return E; 10882 10883 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10884 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10885 if (!Res.isUsable()) 10886 return Res; 10887 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10888 for (unsigned I = 0; I < NumIterators; ++I) 10889 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10890 IE->getIteratorDecl(I)); 10891 return Res; 10892 } 10893 10894 template<typename Derived> 10895 ExprResult 10896 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10897 // Transform the callee. 10898 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10899 if (Callee.isInvalid()) 10900 return ExprError(); 10901 10902 // Transform arguments. 10903 bool ArgChanged = false; 10904 SmallVector<Expr*, 8> Args; 10905 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10906 &ArgChanged)) 10907 return ExprError(); 10908 10909 if (!getDerived().AlwaysRebuild() && 10910 Callee.get() == E->getCallee() && 10911 !ArgChanged) 10912 return SemaRef.MaybeBindToTemporary(E); 10913 10914 // FIXME: Wrong source location information for the '('. 10915 SourceLocation FakeLParenLoc 10916 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10917 10918 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10919 if (E->hasStoredFPFeatures()) { 10920 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10921 getSema().CurFPFeatures = 10922 NewOverrides.applyOverrides(getSema().getLangOpts()); 10923 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10924 } 10925 10926 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10927 Args, 10928 E->getRParenLoc()); 10929 } 10930 10931 template<typename Derived> 10932 ExprResult 10933 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10934 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10935 if (Base.isInvalid()) 10936 return ExprError(); 10937 10938 NestedNameSpecifierLoc QualifierLoc; 10939 if (E->hasQualifier()) { 10940 QualifierLoc 10941 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10942 10943 if (!QualifierLoc) 10944 return ExprError(); 10945 } 10946 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10947 10948 ValueDecl *Member 10949 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10950 E->getMemberDecl())); 10951 if (!Member) 10952 return ExprError(); 10953 10954 NamedDecl *FoundDecl = E->getFoundDecl(); 10955 if (FoundDecl == E->getMemberDecl()) { 10956 FoundDecl = Member; 10957 } else { 10958 FoundDecl = cast_or_null<NamedDecl>( 10959 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10960 if (!FoundDecl) 10961 return ExprError(); 10962 } 10963 10964 if (!getDerived().AlwaysRebuild() && 10965 Base.get() == E->getBase() && 10966 QualifierLoc == E->getQualifierLoc() && 10967 Member == E->getMemberDecl() && 10968 FoundDecl == E->getFoundDecl() && 10969 !E->hasExplicitTemplateArgs()) { 10970 10971 // Mark it referenced in the new context regardless. 10972 // FIXME: this is a bit instantiation-specific. 10973 SemaRef.MarkMemberReferenced(E); 10974 10975 return E; 10976 } 10977 10978 TemplateArgumentListInfo TransArgs; 10979 if (E->hasExplicitTemplateArgs()) { 10980 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10981 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10982 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10983 E->getNumTemplateArgs(), 10984 TransArgs)) 10985 return ExprError(); 10986 } 10987 10988 // FIXME: Bogus source location for the operator 10989 SourceLocation FakeOperatorLoc = 10990 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10991 10992 // FIXME: to do this check properly, we will need to preserve the 10993 // first-qualifier-in-scope here, just in case we had a dependent 10994 // base (and therefore couldn't do the check) and a 10995 // nested-name-qualifier (and therefore could do the lookup). 10996 NamedDecl *FirstQualifierInScope = nullptr; 10997 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10998 if (MemberNameInfo.getName()) { 10999 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11000 if (!MemberNameInfo.getName()) 11001 return ExprError(); 11002 } 11003 11004 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11005 E->isArrow(), 11006 QualifierLoc, 11007 TemplateKWLoc, 11008 MemberNameInfo, 11009 Member, 11010 FoundDecl, 11011 (E->hasExplicitTemplateArgs() 11012 ? &TransArgs : nullptr), 11013 FirstQualifierInScope); 11014 } 11015 11016 template<typename Derived> 11017 ExprResult 11018 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11019 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11020 if (LHS.isInvalid()) 11021 return ExprError(); 11022 11023 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11024 if (RHS.isInvalid()) 11025 return ExprError(); 11026 11027 if (!getDerived().AlwaysRebuild() && 11028 LHS.get() == E->getLHS() && 11029 RHS.get() == E->getRHS()) 11030 return E; 11031 11032 if (E->isCompoundAssignmentOp()) 11033 // FPFeatures has already been established from trailing storage 11034 return getDerived().RebuildBinaryOperator( 11035 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11036 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11037 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11038 getSema().CurFPFeatures = 11039 NewOverrides.applyOverrides(getSema().getLangOpts()); 11040 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11041 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11042 LHS.get(), RHS.get()); 11043 } 11044 11045 template <typename Derived> 11046 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11047 CXXRewrittenBinaryOperator *E) { 11048 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11049 11050 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11051 if (LHS.isInvalid()) 11052 return ExprError(); 11053 11054 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11055 if (RHS.isInvalid()) 11056 return ExprError(); 11057 11058 // Extract the already-resolved callee declarations so that we can restrict 11059 // ourselves to using them as the unqualified lookup results when rebuilding. 11060 UnresolvedSet<2> UnqualLookups; 11061 bool ChangedAnyLookups = false; 11062 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11063 const_cast<Expr *>(Decomp.InnerBinOp)}; 11064 for (Expr *PossibleBinOp : PossibleBinOps) { 11065 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11066 if (!Op) 11067 continue; 11068 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11069 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11070 continue; 11071 11072 // Transform the callee in case we built a call to a local extern 11073 // declaration. 11074 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11075 E->getOperatorLoc(), Callee->getFoundDecl())); 11076 if (!Found) 11077 return ExprError(); 11078 if (Found != Callee->getFoundDecl()) 11079 ChangedAnyLookups = true; 11080 UnqualLookups.addDecl(Found); 11081 } 11082 11083 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11084 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11085 // Mark all functions used in the rewrite as referenced. Note that when 11086 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11087 // function calls, and/or there might be a user-defined conversion sequence 11088 // applied to the operands of the <. 11089 // FIXME: this is a bit instantiation-specific. 11090 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11091 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11092 return E; 11093 } 11094 11095 return getDerived().RebuildCXXRewrittenBinaryOperator( 11096 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11097 } 11098 11099 template<typename Derived> 11100 ExprResult 11101 TreeTransform<Derived>::TransformCompoundAssignOperator( 11102 CompoundAssignOperator *E) { 11103 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11104 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11105 getSema().CurFPFeatures = 11106 NewOverrides.applyOverrides(getSema().getLangOpts()); 11107 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11108 return getDerived().TransformBinaryOperator(E); 11109 } 11110 11111 template<typename Derived> 11112 ExprResult TreeTransform<Derived>:: 11113 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11114 // Just rebuild the common and RHS expressions and see whether we 11115 // get any changes. 11116 11117 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11118 if (commonExpr.isInvalid()) 11119 return ExprError(); 11120 11121 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11122 if (rhs.isInvalid()) 11123 return ExprError(); 11124 11125 if (!getDerived().AlwaysRebuild() && 11126 commonExpr.get() == e->getCommon() && 11127 rhs.get() == e->getFalseExpr()) 11128 return e; 11129 11130 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11131 e->getQuestionLoc(), 11132 nullptr, 11133 e->getColonLoc(), 11134 rhs.get()); 11135 } 11136 11137 template<typename Derived> 11138 ExprResult 11139 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11140 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11141 if (Cond.isInvalid()) 11142 return ExprError(); 11143 11144 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11145 if (LHS.isInvalid()) 11146 return ExprError(); 11147 11148 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11149 if (RHS.isInvalid()) 11150 return ExprError(); 11151 11152 if (!getDerived().AlwaysRebuild() && 11153 Cond.get() == E->getCond() && 11154 LHS.get() == E->getLHS() && 11155 RHS.get() == E->getRHS()) 11156 return E; 11157 11158 return getDerived().RebuildConditionalOperator(Cond.get(), 11159 E->getQuestionLoc(), 11160 LHS.get(), 11161 E->getColonLoc(), 11162 RHS.get()); 11163 } 11164 11165 template<typename Derived> 11166 ExprResult 11167 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11168 // Implicit casts are eliminated during transformation, since they 11169 // will be recomputed by semantic analysis after transformation. 11170 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11171 } 11172 11173 template<typename Derived> 11174 ExprResult 11175 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11176 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11177 if (!Type) 11178 return ExprError(); 11179 11180 ExprResult SubExpr 11181 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11182 if (SubExpr.isInvalid()) 11183 return ExprError(); 11184 11185 if (!getDerived().AlwaysRebuild() && 11186 Type == E->getTypeInfoAsWritten() && 11187 SubExpr.get() == E->getSubExpr()) 11188 return E; 11189 11190 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11191 Type, 11192 E->getRParenLoc(), 11193 SubExpr.get()); 11194 } 11195 11196 template<typename Derived> 11197 ExprResult 11198 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11199 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11200 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11201 if (!NewT) 11202 return ExprError(); 11203 11204 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11205 if (Init.isInvalid()) 11206 return ExprError(); 11207 11208 if (!getDerived().AlwaysRebuild() && 11209 OldT == NewT && 11210 Init.get() == E->getInitializer()) 11211 return SemaRef.MaybeBindToTemporary(E); 11212 11213 // Note: the expression type doesn't necessarily match the 11214 // type-as-written, but that's okay, because it should always be 11215 // derivable from the initializer. 11216 11217 return getDerived().RebuildCompoundLiteralExpr( 11218 E->getLParenLoc(), NewT, 11219 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11220 } 11221 11222 template<typename Derived> 11223 ExprResult 11224 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11225 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11226 if (Base.isInvalid()) 11227 return ExprError(); 11228 11229 if (!getDerived().AlwaysRebuild() && 11230 Base.get() == E->getBase()) 11231 return E; 11232 11233 // FIXME: Bad source location 11234 SourceLocation FakeOperatorLoc = 11235 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11236 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11237 E->getAccessorLoc(), 11238 E->getAccessor()); 11239 } 11240 11241 template<typename Derived> 11242 ExprResult 11243 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11244 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11245 E = Syntactic; 11246 11247 bool InitChanged = false; 11248 11249 EnterExpressionEvaluationContext Context( 11250 getSema(), EnterExpressionEvaluationContext::InitList); 11251 11252 SmallVector<Expr*, 4> Inits; 11253 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11254 Inits, &InitChanged)) 11255 return ExprError(); 11256 11257 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11258 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11259 // in some cases. We can't reuse it in general, because the syntactic and 11260 // semantic forms are linked, and we can't know that semantic form will 11261 // match even if the syntactic form does. 11262 } 11263 11264 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11265 E->getRBraceLoc()); 11266 } 11267 11268 template<typename Derived> 11269 ExprResult 11270 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11271 Designation Desig; 11272 11273 // transform the initializer value 11274 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11275 if (Init.isInvalid()) 11276 return ExprError(); 11277 11278 // transform the designators. 11279 SmallVector<Expr*, 4> ArrayExprs; 11280 bool ExprChanged = false; 11281 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11282 if (D.isFieldDesignator()) { 11283 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11284 D.getDotLoc(), 11285 D.getFieldLoc())); 11286 if (D.getField()) { 11287 FieldDecl *Field = cast_or_null<FieldDecl>( 11288 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11289 if (Field != D.getField()) 11290 // Rebuild the expression when the transformed FieldDecl is 11291 // different to the already assigned FieldDecl. 11292 ExprChanged = true; 11293 } else { 11294 // Ensure that the designator expression is rebuilt when there isn't 11295 // a resolved FieldDecl in the designator as we don't want to assign 11296 // a FieldDecl to a pattern designator that will be instantiated again. 11297 ExprChanged = true; 11298 } 11299 continue; 11300 } 11301 11302 if (D.isArrayDesignator()) { 11303 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11304 if (Index.isInvalid()) 11305 return ExprError(); 11306 11307 Desig.AddDesignator( 11308 Designator::getArray(Index.get(), D.getLBracketLoc())); 11309 11310 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11311 ArrayExprs.push_back(Index.get()); 11312 continue; 11313 } 11314 11315 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11316 ExprResult Start 11317 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11318 if (Start.isInvalid()) 11319 return ExprError(); 11320 11321 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11322 if (End.isInvalid()) 11323 return ExprError(); 11324 11325 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11326 End.get(), 11327 D.getLBracketLoc(), 11328 D.getEllipsisLoc())); 11329 11330 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11331 End.get() != E->getArrayRangeEnd(D); 11332 11333 ArrayExprs.push_back(Start.get()); 11334 ArrayExprs.push_back(End.get()); 11335 } 11336 11337 if (!getDerived().AlwaysRebuild() && 11338 Init.get() == E->getInit() && 11339 !ExprChanged) 11340 return E; 11341 11342 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11343 E->getEqualOrColonLoc(), 11344 E->usesGNUSyntax(), Init.get()); 11345 } 11346 11347 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11348 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11349 template<typename Derived> 11350 ExprResult 11351 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11352 DesignatedInitUpdateExpr *E) { 11353 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11354 "initializer"); 11355 return ExprError(); 11356 } 11357 11358 template<typename Derived> 11359 ExprResult 11360 TreeTransform<Derived>::TransformNoInitExpr( 11361 NoInitExpr *E) { 11362 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11363 return ExprError(); 11364 } 11365 11366 template<typename Derived> 11367 ExprResult 11368 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11369 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11370 return ExprError(); 11371 } 11372 11373 template<typename Derived> 11374 ExprResult 11375 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11376 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11377 return ExprError(); 11378 } 11379 11380 template<typename Derived> 11381 ExprResult 11382 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11383 ImplicitValueInitExpr *E) { 11384 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11385 11386 // FIXME: Will we ever have proper type location here? Will we actually 11387 // need to transform the type? 11388 QualType T = getDerived().TransformType(E->getType()); 11389 if (T.isNull()) 11390 return ExprError(); 11391 11392 if (!getDerived().AlwaysRebuild() && 11393 T == E->getType()) 11394 return E; 11395 11396 return getDerived().RebuildImplicitValueInitExpr(T); 11397 } 11398 11399 template<typename Derived> 11400 ExprResult 11401 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11402 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11403 if (!TInfo) 11404 return ExprError(); 11405 11406 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11407 if (SubExpr.isInvalid()) 11408 return ExprError(); 11409 11410 if (!getDerived().AlwaysRebuild() && 11411 TInfo == E->getWrittenTypeInfo() && 11412 SubExpr.get() == E->getSubExpr()) 11413 return E; 11414 11415 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11416 TInfo, E->getRParenLoc()); 11417 } 11418 11419 template<typename Derived> 11420 ExprResult 11421 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11422 bool ArgumentChanged = false; 11423 SmallVector<Expr*, 4> Inits; 11424 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11425 &ArgumentChanged)) 11426 return ExprError(); 11427 11428 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11429 Inits, 11430 E->getRParenLoc()); 11431 } 11432 11433 /// Transform an address-of-label expression. 11434 /// 11435 /// By default, the transformation of an address-of-label expression always 11436 /// rebuilds the expression, so that the label identifier can be resolved to 11437 /// the corresponding label statement by semantic analysis. 11438 template<typename Derived> 11439 ExprResult 11440 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11441 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11442 E->getLabel()); 11443 if (!LD) 11444 return ExprError(); 11445 11446 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11447 cast<LabelDecl>(LD)); 11448 } 11449 11450 template<typename Derived> 11451 ExprResult 11452 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11453 SemaRef.ActOnStartStmtExpr(); 11454 StmtResult SubStmt 11455 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11456 if (SubStmt.isInvalid()) { 11457 SemaRef.ActOnStmtExprError(); 11458 return ExprError(); 11459 } 11460 11461 unsigned OldDepth = E->getTemplateDepth(); 11462 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11463 11464 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11465 SubStmt.get() == E->getSubStmt()) { 11466 // Calling this an 'error' is unintuitive, but it does the right thing. 11467 SemaRef.ActOnStmtExprError(); 11468 return SemaRef.MaybeBindToTemporary(E); 11469 } 11470 11471 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11472 E->getRParenLoc(), NewDepth); 11473 } 11474 11475 template<typename Derived> 11476 ExprResult 11477 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11478 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11479 if (Cond.isInvalid()) 11480 return ExprError(); 11481 11482 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11483 if (LHS.isInvalid()) 11484 return ExprError(); 11485 11486 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11487 if (RHS.isInvalid()) 11488 return ExprError(); 11489 11490 if (!getDerived().AlwaysRebuild() && 11491 Cond.get() == E->getCond() && 11492 LHS.get() == E->getLHS() && 11493 RHS.get() == E->getRHS()) 11494 return E; 11495 11496 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11497 Cond.get(), LHS.get(), RHS.get(), 11498 E->getRParenLoc()); 11499 } 11500 11501 template<typename Derived> 11502 ExprResult 11503 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11504 return E; 11505 } 11506 11507 template<typename Derived> 11508 ExprResult 11509 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11510 switch (E->getOperator()) { 11511 case OO_New: 11512 case OO_Delete: 11513 case OO_Array_New: 11514 case OO_Array_Delete: 11515 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11516 11517 case OO_Subscript: 11518 case OO_Call: { 11519 // This is a call to an object's operator(). 11520 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11521 11522 // Transform the object itself. 11523 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11524 if (Object.isInvalid()) 11525 return ExprError(); 11526 11527 // FIXME: Poor location information 11528 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11529 static_cast<Expr *>(Object.get())->getEndLoc()); 11530 11531 // Transform the call arguments. 11532 SmallVector<Expr*, 8> Args; 11533 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11534 Args)) 11535 return ExprError(); 11536 11537 if (E->getOperator() == OO_Subscript) 11538 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 11539 Args, E->getEndLoc()); 11540 11541 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11542 E->getEndLoc()); 11543 } 11544 11545 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 11546 case OO_##Name: \ 11547 break; 11548 11549 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11550 #include "clang/Basic/OperatorKinds.def" 11551 11552 case OO_Conditional: 11553 llvm_unreachable("conditional operator is not actually overloadable"); 11554 11555 case OO_None: 11556 case NUM_OVERLOADED_OPERATORS: 11557 llvm_unreachable("not an overloaded operator?"); 11558 } 11559 11560 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11561 if (Callee.isInvalid()) 11562 return ExprError(); 11563 11564 ExprResult First; 11565 if (E->getOperator() == OO_Amp) 11566 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11567 else 11568 First = getDerived().TransformExpr(E->getArg(0)); 11569 if (First.isInvalid()) 11570 return ExprError(); 11571 11572 ExprResult Second; 11573 if (E->getNumArgs() == 2) { 11574 Second = getDerived().TransformExpr(E->getArg(1)); 11575 if (Second.isInvalid()) 11576 return ExprError(); 11577 } 11578 11579 if (!getDerived().AlwaysRebuild() && 11580 Callee.get() == E->getCallee() && 11581 First.get() == E->getArg(0) && 11582 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11583 return SemaRef.MaybeBindToTemporary(E); 11584 11585 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11586 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11587 getSema().CurFPFeatures = 11588 NewOverrides.applyOverrides(getSema().getLangOpts()); 11589 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11590 11591 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11592 E->getOperatorLoc(), 11593 Callee.get(), 11594 First.get(), 11595 Second.get()); 11596 } 11597 11598 template<typename Derived> 11599 ExprResult 11600 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11601 return getDerived().TransformCallExpr(E); 11602 } 11603 11604 template <typename Derived> 11605 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11606 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11607 getSema().CurContext != E->getParentContext(); 11608 11609 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11610 return E; 11611 11612 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11613 E->getEndLoc(), 11614 getSema().CurContext); 11615 } 11616 11617 template<typename Derived> 11618 ExprResult 11619 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11620 // Transform the callee. 11621 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11622 if (Callee.isInvalid()) 11623 return ExprError(); 11624 11625 // Transform exec config. 11626 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11627 if (EC.isInvalid()) 11628 return ExprError(); 11629 11630 // Transform arguments. 11631 bool ArgChanged = false; 11632 SmallVector<Expr*, 8> Args; 11633 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11634 &ArgChanged)) 11635 return ExprError(); 11636 11637 if (!getDerived().AlwaysRebuild() && 11638 Callee.get() == E->getCallee() && 11639 !ArgChanged) 11640 return SemaRef.MaybeBindToTemporary(E); 11641 11642 // FIXME: Wrong source location information for the '('. 11643 SourceLocation FakeLParenLoc 11644 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11645 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11646 Args, 11647 E->getRParenLoc(), EC.get()); 11648 } 11649 11650 template<typename Derived> 11651 ExprResult 11652 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11653 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11654 if (!Type) 11655 return ExprError(); 11656 11657 ExprResult SubExpr 11658 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11659 if (SubExpr.isInvalid()) 11660 return ExprError(); 11661 11662 if (!getDerived().AlwaysRebuild() && 11663 Type == E->getTypeInfoAsWritten() && 11664 SubExpr.get() == E->getSubExpr()) 11665 return E; 11666 return getDerived().RebuildCXXNamedCastExpr( 11667 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11668 Type, E->getAngleBrackets().getEnd(), 11669 // FIXME. this should be '(' location 11670 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11671 } 11672 11673 template<typename Derived> 11674 ExprResult 11675 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11676 TypeSourceInfo *TSI = 11677 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11678 if (!TSI) 11679 return ExprError(); 11680 11681 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11682 if (Sub.isInvalid()) 11683 return ExprError(); 11684 11685 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11686 Sub.get(), BCE->getEndLoc()); 11687 } 11688 11689 template<typename Derived> 11690 ExprResult 11691 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11692 return getDerived().TransformCXXNamedCastExpr(E); 11693 } 11694 11695 template<typename Derived> 11696 ExprResult 11697 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11698 return getDerived().TransformCXXNamedCastExpr(E); 11699 } 11700 11701 template<typename Derived> 11702 ExprResult 11703 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11704 CXXReinterpretCastExpr *E) { 11705 return getDerived().TransformCXXNamedCastExpr(E); 11706 } 11707 11708 template<typename Derived> 11709 ExprResult 11710 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11711 return getDerived().TransformCXXNamedCastExpr(E); 11712 } 11713 11714 template<typename Derived> 11715 ExprResult 11716 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11717 return getDerived().TransformCXXNamedCastExpr(E); 11718 } 11719 11720 template<typename Derived> 11721 ExprResult 11722 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11723 CXXFunctionalCastExpr *E) { 11724 TypeSourceInfo *Type = 11725 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11726 if (!Type) 11727 return ExprError(); 11728 11729 ExprResult SubExpr 11730 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11731 if (SubExpr.isInvalid()) 11732 return ExprError(); 11733 11734 if (!getDerived().AlwaysRebuild() && 11735 Type == E->getTypeInfoAsWritten() && 11736 SubExpr.get() == E->getSubExpr()) 11737 return E; 11738 11739 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11740 E->getLParenLoc(), 11741 SubExpr.get(), 11742 E->getRParenLoc(), 11743 E->isListInitialization()); 11744 } 11745 11746 template<typename Derived> 11747 ExprResult 11748 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11749 if (E->isTypeOperand()) { 11750 TypeSourceInfo *TInfo 11751 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11752 if (!TInfo) 11753 return ExprError(); 11754 11755 if (!getDerived().AlwaysRebuild() && 11756 TInfo == E->getTypeOperandSourceInfo()) 11757 return E; 11758 11759 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11760 TInfo, E->getEndLoc()); 11761 } 11762 11763 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11764 // type. We must not unilaterally enter unevaluated context here, as then 11765 // semantic processing can re-transform an already transformed operand. 11766 Expr *Op = E->getExprOperand(); 11767 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11768 if (E->isGLValue()) 11769 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11770 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11771 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11772 11773 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11774 Sema::ReuseLambdaContextDecl); 11775 11776 ExprResult SubExpr = getDerived().TransformExpr(Op); 11777 if (SubExpr.isInvalid()) 11778 return ExprError(); 11779 11780 if (!getDerived().AlwaysRebuild() && 11781 SubExpr.get() == E->getExprOperand()) 11782 return E; 11783 11784 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11785 SubExpr.get(), E->getEndLoc()); 11786 } 11787 11788 template<typename Derived> 11789 ExprResult 11790 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11791 if (E->isTypeOperand()) { 11792 TypeSourceInfo *TInfo 11793 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11794 if (!TInfo) 11795 return ExprError(); 11796 11797 if (!getDerived().AlwaysRebuild() && 11798 TInfo == E->getTypeOperandSourceInfo()) 11799 return E; 11800 11801 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11802 TInfo, E->getEndLoc()); 11803 } 11804 11805 EnterExpressionEvaluationContext Unevaluated( 11806 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11807 11808 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11809 if (SubExpr.isInvalid()) 11810 return ExprError(); 11811 11812 if (!getDerived().AlwaysRebuild() && 11813 SubExpr.get() == E->getExprOperand()) 11814 return E; 11815 11816 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11817 SubExpr.get(), E->getEndLoc()); 11818 } 11819 11820 template<typename Derived> 11821 ExprResult 11822 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11823 return E; 11824 } 11825 11826 template<typename Derived> 11827 ExprResult 11828 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11829 CXXNullPtrLiteralExpr *E) { 11830 return E; 11831 } 11832 11833 template<typename Derived> 11834 ExprResult 11835 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11836 QualType T = getSema().getCurrentThisType(); 11837 11838 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11839 // Mark it referenced in the new context regardless. 11840 // FIXME: this is a bit instantiation-specific. 11841 getSema().MarkThisReferenced(E); 11842 return E; 11843 } 11844 11845 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11846 } 11847 11848 template<typename Derived> 11849 ExprResult 11850 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11851 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11852 if (SubExpr.isInvalid()) 11853 return ExprError(); 11854 11855 if (!getDerived().AlwaysRebuild() && 11856 SubExpr.get() == E->getSubExpr()) 11857 return E; 11858 11859 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11860 E->isThrownVariableInScope()); 11861 } 11862 11863 template<typename Derived> 11864 ExprResult 11865 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11866 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11867 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11868 if (!Param) 11869 return ExprError(); 11870 11871 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11872 E->getUsedContext() == SemaRef.CurContext) 11873 return E; 11874 11875 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11876 } 11877 11878 template<typename Derived> 11879 ExprResult 11880 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11881 FieldDecl *Field = cast_or_null<FieldDecl>( 11882 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11883 if (!Field) 11884 return ExprError(); 11885 11886 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11887 E->getUsedContext() == SemaRef.CurContext) 11888 return E; 11889 11890 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11891 } 11892 11893 template<typename Derived> 11894 ExprResult 11895 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11896 CXXScalarValueInitExpr *E) { 11897 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11898 if (!T) 11899 return ExprError(); 11900 11901 if (!getDerived().AlwaysRebuild() && 11902 T == E->getTypeSourceInfo()) 11903 return E; 11904 11905 return getDerived().RebuildCXXScalarValueInitExpr(T, 11906 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11907 E->getRParenLoc()); 11908 } 11909 11910 template<typename Derived> 11911 ExprResult 11912 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11913 // Transform the type that we're allocating 11914 TypeSourceInfo *AllocTypeInfo = 11915 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11916 if (!AllocTypeInfo) 11917 return ExprError(); 11918 11919 // Transform the size of the array we're allocating (if any). 11920 Optional<Expr *> ArraySize; 11921 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11922 ExprResult NewArraySize; 11923 if (*OldArraySize) { 11924 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11925 if (NewArraySize.isInvalid()) 11926 return ExprError(); 11927 } 11928 ArraySize = NewArraySize.get(); 11929 } 11930 11931 // Transform the placement arguments (if any). 11932 bool ArgumentChanged = false; 11933 SmallVector<Expr*, 8> PlacementArgs; 11934 if (getDerived().TransformExprs(E->getPlacementArgs(), 11935 E->getNumPlacementArgs(), true, 11936 PlacementArgs, &ArgumentChanged)) 11937 return ExprError(); 11938 11939 // Transform the initializer (if any). 11940 Expr *OldInit = E->getInitializer(); 11941 ExprResult NewInit; 11942 if (OldInit) 11943 NewInit = getDerived().TransformInitializer(OldInit, true); 11944 if (NewInit.isInvalid()) 11945 return ExprError(); 11946 11947 // Transform new operator and delete operator. 11948 FunctionDecl *OperatorNew = nullptr; 11949 if (E->getOperatorNew()) { 11950 OperatorNew = cast_or_null<FunctionDecl>( 11951 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11952 if (!OperatorNew) 11953 return ExprError(); 11954 } 11955 11956 FunctionDecl *OperatorDelete = nullptr; 11957 if (E->getOperatorDelete()) { 11958 OperatorDelete = cast_or_null<FunctionDecl>( 11959 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11960 if (!OperatorDelete) 11961 return ExprError(); 11962 } 11963 11964 if (!getDerived().AlwaysRebuild() && 11965 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11966 ArraySize == E->getArraySize() && 11967 NewInit.get() == OldInit && 11968 OperatorNew == E->getOperatorNew() && 11969 OperatorDelete == E->getOperatorDelete() && 11970 !ArgumentChanged) { 11971 // Mark any declarations we need as referenced. 11972 // FIXME: instantiation-specific. 11973 if (OperatorNew) 11974 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11975 if (OperatorDelete) 11976 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11977 11978 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11979 QualType ElementType 11980 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11981 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11982 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11983 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11984 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11985 } 11986 } 11987 } 11988 11989 return E; 11990 } 11991 11992 QualType AllocType = AllocTypeInfo->getType(); 11993 if (!ArraySize) { 11994 // If no array size was specified, but the new expression was 11995 // instantiated with an array type (e.g., "new T" where T is 11996 // instantiated with "int[4]"), extract the outer bound from the 11997 // array type as our array size. We do this with constant and 11998 // dependently-sized array types. 11999 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12000 if (!ArrayT) { 12001 // Do nothing 12002 } else if (const ConstantArrayType *ConsArrayT 12003 = dyn_cast<ConstantArrayType>(ArrayT)) { 12004 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12005 SemaRef.Context.getSizeType(), 12006 /*FIXME:*/ E->getBeginLoc()); 12007 AllocType = ConsArrayT->getElementType(); 12008 } else if (const DependentSizedArrayType *DepArrayT 12009 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12010 if (DepArrayT->getSizeExpr()) { 12011 ArraySize = DepArrayT->getSizeExpr(); 12012 AllocType = DepArrayT->getElementType(); 12013 } 12014 } 12015 } 12016 12017 return getDerived().RebuildCXXNewExpr( 12018 E->getBeginLoc(), E->isGlobalNew(), 12019 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12020 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12021 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12022 } 12023 12024 template<typename Derived> 12025 ExprResult 12026 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12027 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12028 if (Operand.isInvalid()) 12029 return ExprError(); 12030 12031 // Transform the delete operator, if known. 12032 FunctionDecl *OperatorDelete = nullptr; 12033 if (E->getOperatorDelete()) { 12034 OperatorDelete = cast_or_null<FunctionDecl>( 12035 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12036 if (!OperatorDelete) 12037 return ExprError(); 12038 } 12039 12040 if (!getDerived().AlwaysRebuild() && 12041 Operand.get() == E->getArgument() && 12042 OperatorDelete == E->getOperatorDelete()) { 12043 // Mark any declarations we need as referenced. 12044 // FIXME: instantiation-specific. 12045 if (OperatorDelete) 12046 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12047 12048 if (!E->getArgument()->isTypeDependent()) { 12049 QualType Destroyed = SemaRef.Context.getBaseElementType( 12050 E->getDestroyedType()); 12051 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12052 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12053 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12054 SemaRef.LookupDestructor(Record)); 12055 } 12056 } 12057 12058 return E; 12059 } 12060 12061 return getDerived().RebuildCXXDeleteExpr( 12062 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12063 } 12064 12065 template<typename Derived> 12066 ExprResult 12067 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12068 CXXPseudoDestructorExpr *E) { 12069 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12070 if (Base.isInvalid()) 12071 return ExprError(); 12072 12073 ParsedType ObjectTypePtr; 12074 bool MayBePseudoDestructor = false; 12075 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12076 E->getOperatorLoc(), 12077 E->isArrow()? tok::arrow : tok::period, 12078 ObjectTypePtr, 12079 MayBePseudoDestructor); 12080 if (Base.isInvalid()) 12081 return ExprError(); 12082 12083 QualType ObjectType = ObjectTypePtr.get(); 12084 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12085 if (QualifierLoc) { 12086 QualifierLoc 12087 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12088 if (!QualifierLoc) 12089 return ExprError(); 12090 } 12091 CXXScopeSpec SS; 12092 SS.Adopt(QualifierLoc); 12093 12094 PseudoDestructorTypeStorage Destroyed; 12095 if (E->getDestroyedTypeInfo()) { 12096 TypeSourceInfo *DestroyedTypeInfo 12097 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12098 ObjectType, nullptr, SS); 12099 if (!DestroyedTypeInfo) 12100 return ExprError(); 12101 Destroyed = DestroyedTypeInfo; 12102 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12103 // We aren't likely to be able to resolve the identifier down to a type 12104 // now anyway, so just retain the identifier. 12105 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12106 E->getDestroyedTypeLoc()); 12107 } else { 12108 // Look for a destructor known with the given name. 12109 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12110 *E->getDestroyedTypeIdentifier(), 12111 E->getDestroyedTypeLoc(), 12112 /*Scope=*/nullptr, 12113 SS, ObjectTypePtr, 12114 false); 12115 if (!T) 12116 return ExprError(); 12117 12118 Destroyed 12119 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12120 E->getDestroyedTypeLoc()); 12121 } 12122 12123 TypeSourceInfo *ScopeTypeInfo = nullptr; 12124 if (E->getScopeTypeInfo()) { 12125 CXXScopeSpec EmptySS; 12126 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12127 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12128 if (!ScopeTypeInfo) 12129 return ExprError(); 12130 } 12131 12132 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12133 E->getOperatorLoc(), 12134 E->isArrow(), 12135 SS, 12136 ScopeTypeInfo, 12137 E->getColonColonLoc(), 12138 E->getTildeLoc(), 12139 Destroyed); 12140 } 12141 12142 template <typename Derived> 12143 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12144 bool RequiresADL, 12145 LookupResult &R) { 12146 // Transform all the decls. 12147 bool AllEmptyPacks = true; 12148 for (auto *OldD : Old->decls()) { 12149 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12150 if (!InstD) { 12151 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12152 // This can happen because of dependent hiding. 12153 if (isa<UsingShadowDecl>(OldD)) 12154 continue; 12155 else { 12156 R.clear(); 12157 return true; 12158 } 12159 } 12160 12161 // Expand using pack declarations. 12162 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12163 ArrayRef<NamedDecl*> Decls = SingleDecl; 12164 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12165 Decls = UPD->expansions(); 12166 12167 // Expand using declarations. 12168 for (auto *D : Decls) { 12169 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12170 for (auto *SD : UD->shadows()) 12171 R.addDecl(SD); 12172 } else { 12173 R.addDecl(D); 12174 } 12175 } 12176 12177 AllEmptyPacks &= Decls.empty(); 12178 }; 12179 12180 // C++ [temp.res]/8.4.2: 12181 // The program is ill-formed, no diagnostic required, if [...] lookup for 12182 // a name in the template definition found a using-declaration, but the 12183 // lookup in the corresponding scope in the instantiation odoes not find 12184 // any declarations because the using-declaration was a pack expansion and 12185 // the corresponding pack is empty 12186 if (AllEmptyPacks && !RequiresADL) { 12187 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12188 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12189 return true; 12190 } 12191 12192 // Resolve a kind, but don't do any further analysis. If it's 12193 // ambiguous, the callee needs to deal with it. 12194 R.resolveKind(); 12195 return false; 12196 } 12197 12198 template<typename Derived> 12199 ExprResult 12200 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12201 UnresolvedLookupExpr *Old) { 12202 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12203 Sema::LookupOrdinaryName); 12204 12205 // Transform the declaration set. 12206 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12207 return ExprError(); 12208 12209 // Rebuild the nested-name qualifier, if present. 12210 CXXScopeSpec SS; 12211 if (Old->getQualifierLoc()) { 12212 NestedNameSpecifierLoc QualifierLoc 12213 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12214 if (!QualifierLoc) 12215 return ExprError(); 12216 12217 SS.Adopt(QualifierLoc); 12218 } 12219 12220 if (Old->getNamingClass()) { 12221 CXXRecordDecl *NamingClass 12222 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12223 Old->getNameLoc(), 12224 Old->getNamingClass())); 12225 if (!NamingClass) { 12226 R.clear(); 12227 return ExprError(); 12228 } 12229 12230 R.setNamingClass(NamingClass); 12231 } 12232 12233 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12234 12235 // If we have neither explicit template arguments, nor the template keyword, 12236 // it's a normal declaration name or member reference. 12237 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12238 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12239 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12240 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12241 // give a good diagnostic. 12242 if (D && D->isCXXInstanceMember()) { 12243 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12244 /*TemplateArgs=*/nullptr, 12245 /*Scope=*/nullptr); 12246 } 12247 12248 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12249 } 12250 12251 // If we have template arguments, rebuild them, then rebuild the 12252 // templateid expression. 12253 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12254 if (Old->hasExplicitTemplateArgs() && 12255 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12256 Old->getNumTemplateArgs(), 12257 TransArgs)) { 12258 R.clear(); 12259 return ExprError(); 12260 } 12261 12262 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12263 Old->requiresADL(), &TransArgs); 12264 } 12265 12266 template<typename Derived> 12267 ExprResult 12268 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12269 bool ArgChanged = false; 12270 SmallVector<TypeSourceInfo *, 4> Args; 12271 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12272 TypeSourceInfo *From = E->getArg(I); 12273 TypeLoc FromTL = From->getTypeLoc(); 12274 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12275 TypeLocBuilder TLB; 12276 TLB.reserve(FromTL.getFullDataSize()); 12277 QualType To = getDerived().TransformType(TLB, FromTL); 12278 if (To.isNull()) 12279 return ExprError(); 12280 12281 if (To == From->getType()) 12282 Args.push_back(From); 12283 else { 12284 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12285 ArgChanged = true; 12286 } 12287 continue; 12288 } 12289 12290 ArgChanged = true; 12291 12292 // We have a pack expansion. Instantiate it. 12293 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12294 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12295 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12296 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12297 12298 // Determine whether the set of unexpanded parameter packs can and should 12299 // be expanded. 12300 bool Expand = true; 12301 bool RetainExpansion = false; 12302 Optional<unsigned> OrigNumExpansions = 12303 ExpansionTL.getTypePtr()->getNumExpansions(); 12304 Optional<unsigned> NumExpansions = OrigNumExpansions; 12305 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12306 PatternTL.getSourceRange(), 12307 Unexpanded, 12308 Expand, RetainExpansion, 12309 NumExpansions)) 12310 return ExprError(); 12311 12312 if (!Expand) { 12313 // The transform has determined that we should perform a simple 12314 // transformation on the pack expansion, producing another pack 12315 // expansion. 12316 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12317 12318 TypeLocBuilder TLB; 12319 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12320 12321 QualType To = getDerived().TransformType(TLB, PatternTL); 12322 if (To.isNull()) 12323 return ExprError(); 12324 12325 To = getDerived().RebuildPackExpansionType(To, 12326 PatternTL.getSourceRange(), 12327 ExpansionTL.getEllipsisLoc(), 12328 NumExpansions); 12329 if (To.isNull()) 12330 return ExprError(); 12331 12332 PackExpansionTypeLoc ToExpansionTL 12333 = TLB.push<PackExpansionTypeLoc>(To); 12334 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12335 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12336 continue; 12337 } 12338 12339 // Expand the pack expansion by substituting for each argument in the 12340 // pack(s). 12341 for (unsigned I = 0; I != *NumExpansions; ++I) { 12342 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12343 TypeLocBuilder TLB; 12344 TLB.reserve(PatternTL.getFullDataSize()); 12345 QualType To = getDerived().TransformType(TLB, PatternTL); 12346 if (To.isNull()) 12347 return ExprError(); 12348 12349 if (To->containsUnexpandedParameterPack()) { 12350 To = getDerived().RebuildPackExpansionType(To, 12351 PatternTL.getSourceRange(), 12352 ExpansionTL.getEllipsisLoc(), 12353 NumExpansions); 12354 if (To.isNull()) 12355 return ExprError(); 12356 12357 PackExpansionTypeLoc ToExpansionTL 12358 = TLB.push<PackExpansionTypeLoc>(To); 12359 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12360 } 12361 12362 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12363 } 12364 12365 if (!RetainExpansion) 12366 continue; 12367 12368 // If we're supposed to retain a pack expansion, do so by temporarily 12369 // forgetting the partially-substituted parameter pack. 12370 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12371 12372 TypeLocBuilder TLB; 12373 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12374 12375 QualType To = getDerived().TransformType(TLB, PatternTL); 12376 if (To.isNull()) 12377 return ExprError(); 12378 12379 To = getDerived().RebuildPackExpansionType(To, 12380 PatternTL.getSourceRange(), 12381 ExpansionTL.getEllipsisLoc(), 12382 NumExpansions); 12383 if (To.isNull()) 12384 return ExprError(); 12385 12386 PackExpansionTypeLoc ToExpansionTL 12387 = TLB.push<PackExpansionTypeLoc>(To); 12388 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12389 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12390 } 12391 12392 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12393 return E; 12394 12395 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12396 E->getEndLoc()); 12397 } 12398 12399 template<typename Derived> 12400 ExprResult 12401 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12402 ConceptSpecializationExpr *E) { 12403 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12404 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12405 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12406 Old->NumTemplateArgs, TransArgs)) 12407 return ExprError(); 12408 12409 return getDerived().RebuildConceptSpecializationExpr( 12410 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12411 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12412 &TransArgs); 12413 } 12414 12415 template<typename Derived> 12416 ExprResult 12417 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12418 SmallVector<ParmVarDecl*, 4> TransParams; 12419 SmallVector<QualType, 4> TransParamTypes; 12420 Sema::ExtParameterInfoBuilder ExtParamInfos; 12421 12422 // C++2a [expr.prim.req]p2 12423 // Expressions appearing within a requirement-body are unevaluated operands. 12424 EnterExpressionEvaluationContext Ctx( 12425 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12426 12427 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12428 getSema().Context, getSema().CurContext, 12429 E->getBody()->getBeginLoc()); 12430 12431 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12432 12433 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12434 E->getLocalParameters(), 12435 /*ParamTypes=*/nullptr, 12436 /*ParamInfos=*/nullptr, 12437 TransParamTypes, &TransParams, 12438 ExtParamInfos)) 12439 return ExprError(); 12440 12441 for (ParmVarDecl *Param : TransParams) 12442 Param->setDeclContext(Body); 12443 12444 SmallVector<concepts::Requirement *, 4> TransReqs; 12445 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12446 TransReqs)) 12447 return ExprError(); 12448 12449 for (concepts::Requirement *Req : TransReqs) { 12450 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12451 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12452 ER->getReturnTypeRequirement() 12453 .getTypeConstraintTemplateParameterList()->getParam(0) 12454 ->setDeclContext(Body); 12455 } 12456 } 12457 } 12458 12459 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12460 TransParams, TransReqs, 12461 E->getRBraceLoc()); 12462 } 12463 12464 template<typename Derived> 12465 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12466 ArrayRef<concepts::Requirement *> Reqs, 12467 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12468 for (concepts::Requirement *Req : Reqs) { 12469 concepts::Requirement *TransReq = nullptr; 12470 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12471 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12472 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12473 TransReq = getDerived().TransformExprRequirement(ExprReq); 12474 else 12475 TransReq = getDerived().TransformNestedRequirement( 12476 cast<concepts::NestedRequirement>(Req)); 12477 if (!TransReq) 12478 return true; 12479 Transformed.push_back(TransReq); 12480 } 12481 return false; 12482 } 12483 12484 template<typename Derived> 12485 concepts::TypeRequirement * 12486 TreeTransform<Derived>::TransformTypeRequirement( 12487 concepts::TypeRequirement *Req) { 12488 if (Req->isSubstitutionFailure()) { 12489 if (getDerived().AlwaysRebuild()) 12490 return getDerived().RebuildTypeRequirement( 12491 Req->getSubstitutionDiagnostic()); 12492 return Req; 12493 } 12494 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12495 if (!TransType) 12496 return nullptr; 12497 return getDerived().RebuildTypeRequirement(TransType); 12498 } 12499 12500 template<typename Derived> 12501 concepts::ExprRequirement * 12502 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12503 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12504 if (Req->isExprSubstitutionFailure()) 12505 TransExpr = Req->getExprSubstitutionDiagnostic(); 12506 else { 12507 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12508 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 12509 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 12510 if (TransExprRes.isInvalid()) 12511 return nullptr; 12512 TransExpr = TransExprRes.get(); 12513 } 12514 12515 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12516 const auto &RetReq = Req->getReturnTypeRequirement(); 12517 if (RetReq.isEmpty()) 12518 TransRetReq.emplace(); 12519 else if (RetReq.isSubstitutionFailure()) 12520 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12521 else if (RetReq.isTypeConstraint()) { 12522 TemplateParameterList *OrigTPL = 12523 RetReq.getTypeConstraintTemplateParameterList(); 12524 TemplateParameterList *TPL = 12525 getDerived().TransformTemplateParameterList(OrigTPL); 12526 if (!TPL) 12527 return nullptr; 12528 TransRetReq.emplace(TPL); 12529 } 12530 assert(TransRetReq.hasValue() && 12531 "All code paths leading here must set TransRetReq"); 12532 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12533 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12534 Req->getNoexceptLoc(), 12535 std::move(*TransRetReq)); 12536 return getDerived().RebuildExprRequirement( 12537 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12538 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12539 } 12540 12541 template<typename Derived> 12542 concepts::NestedRequirement * 12543 TreeTransform<Derived>::TransformNestedRequirement( 12544 concepts::NestedRequirement *Req) { 12545 if (Req->isSubstitutionFailure()) { 12546 if (getDerived().AlwaysRebuild()) 12547 return getDerived().RebuildNestedRequirement( 12548 Req->getSubstitutionDiagnostic()); 12549 return Req; 12550 } 12551 ExprResult TransConstraint = 12552 getDerived().TransformExpr(Req->getConstraintExpr()); 12553 if (TransConstraint.isInvalid()) 12554 return nullptr; 12555 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12556 } 12557 12558 template<typename Derived> 12559 ExprResult 12560 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12561 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12562 if (!T) 12563 return ExprError(); 12564 12565 if (!getDerived().AlwaysRebuild() && 12566 T == E->getQueriedTypeSourceInfo()) 12567 return E; 12568 12569 ExprResult SubExpr; 12570 { 12571 EnterExpressionEvaluationContext Unevaluated( 12572 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12573 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12574 if (SubExpr.isInvalid()) 12575 return ExprError(); 12576 12577 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12578 return E; 12579 } 12580 12581 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12582 SubExpr.get(), E->getEndLoc()); 12583 } 12584 12585 template<typename Derived> 12586 ExprResult 12587 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12588 ExprResult SubExpr; 12589 { 12590 EnterExpressionEvaluationContext Unevaluated( 12591 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12592 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12593 if (SubExpr.isInvalid()) 12594 return ExprError(); 12595 12596 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12597 return E; 12598 } 12599 12600 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12601 SubExpr.get(), E->getEndLoc()); 12602 } 12603 12604 template <typename Derived> 12605 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12606 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12607 TypeSourceInfo **RecoveryTSI) { 12608 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12609 DRE, AddrTaken, RecoveryTSI); 12610 12611 // Propagate both errors and recovered types, which return ExprEmpty. 12612 if (!NewDRE.isUsable()) 12613 return NewDRE; 12614 12615 // We got an expr, wrap it up in parens. 12616 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12617 return PE; 12618 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12619 PE->getRParen()); 12620 } 12621 12622 template <typename Derived> 12623 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12624 DependentScopeDeclRefExpr *E) { 12625 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12626 nullptr); 12627 } 12628 12629 template <typename Derived> 12630 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12631 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12632 TypeSourceInfo **RecoveryTSI) { 12633 assert(E->getQualifierLoc()); 12634 NestedNameSpecifierLoc QualifierLoc = 12635 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12636 if (!QualifierLoc) 12637 return ExprError(); 12638 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12639 12640 // TODO: If this is a conversion-function-id, verify that the 12641 // destination type name (if present) resolves the same way after 12642 // instantiation as it did in the local scope. 12643 12644 DeclarationNameInfo NameInfo = 12645 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12646 if (!NameInfo.getName()) 12647 return ExprError(); 12648 12649 if (!E->hasExplicitTemplateArgs()) { 12650 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12651 // Note: it is sufficient to compare the Name component of NameInfo: 12652 // if name has not changed, DNLoc has not changed either. 12653 NameInfo.getName() == E->getDeclName()) 12654 return E; 12655 12656 return getDerived().RebuildDependentScopeDeclRefExpr( 12657 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12658 IsAddressOfOperand, RecoveryTSI); 12659 } 12660 12661 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12662 if (getDerived().TransformTemplateArguments( 12663 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12664 return ExprError(); 12665 12666 return getDerived().RebuildDependentScopeDeclRefExpr( 12667 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12668 RecoveryTSI); 12669 } 12670 12671 template<typename Derived> 12672 ExprResult 12673 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12674 // CXXConstructExprs other than for list-initialization and 12675 // CXXTemporaryObjectExpr are always implicit, so when we have 12676 // a 1-argument construction we just transform that argument. 12677 if (getDerived().AllowSkippingCXXConstructExpr() && 12678 ((E->getNumArgs() == 1 || 12679 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12680 (!getDerived().DropCallArgument(E->getArg(0))) && 12681 !E->isListInitialization())) 12682 return getDerived().TransformInitializer(E->getArg(0), 12683 /*DirectInit*/ false); 12684 12685 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12686 12687 QualType T = getDerived().TransformType(E->getType()); 12688 if (T.isNull()) 12689 return ExprError(); 12690 12691 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12692 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12693 if (!Constructor) 12694 return ExprError(); 12695 12696 bool ArgumentChanged = false; 12697 SmallVector<Expr*, 8> Args; 12698 { 12699 EnterExpressionEvaluationContext Context( 12700 getSema(), EnterExpressionEvaluationContext::InitList, 12701 E->isListInitialization()); 12702 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12703 &ArgumentChanged)) 12704 return ExprError(); 12705 } 12706 12707 if (!getDerived().AlwaysRebuild() && 12708 T == E->getType() && 12709 Constructor == E->getConstructor() && 12710 !ArgumentChanged) { 12711 // Mark the constructor as referenced. 12712 // FIXME: Instantiation-specific 12713 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12714 return E; 12715 } 12716 12717 return getDerived().RebuildCXXConstructExpr( 12718 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12719 E->hadMultipleCandidates(), E->isListInitialization(), 12720 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12721 E->getConstructionKind(), E->getParenOrBraceRange()); 12722 } 12723 12724 template<typename Derived> 12725 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12726 CXXInheritedCtorInitExpr *E) { 12727 QualType T = getDerived().TransformType(E->getType()); 12728 if (T.isNull()) 12729 return ExprError(); 12730 12731 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12732 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12733 if (!Constructor) 12734 return ExprError(); 12735 12736 if (!getDerived().AlwaysRebuild() && 12737 T == E->getType() && 12738 Constructor == E->getConstructor()) { 12739 // Mark the constructor as referenced. 12740 // FIXME: Instantiation-specific 12741 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12742 return E; 12743 } 12744 12745 return getDerived().RebuildCXXInheritedCtorInitExpr( 12746 T, E->getLocation(), Constructor, 12747 E->constructsVBase(), E->inheritedFromVBase()); 12748 } 12749 12750 /// Transform a C++ temporary-binding expression. 12751 /// 12752 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12753 /// transform the subexpression and return that. 12754 template<typename Derived> 12755 ExprResult 12756 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12757 return getDerived().TransformExpr(E->getSubExpr()); 12758 } 12759 12760 /// Transform a C++ expression that contains cleanups that should 12761 /// be run after the expression is evaluated. 12762 /// 12763 /// Since ExprWithCleanups nodes are implicitly generated, we 12764 /// just transform the subexpression and return that. 12765 template<typename Derived> 12766 ExprResult 12767 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12768 return getDerived().TransformExpr(E->getSubExpr()); 12769 } 12770 12771 template<typename Derived> 12772 ExprResult 12773 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12774 CXXTemporaryObjectExpr *E) { 12775 TypeSourceInfo *T = 12776 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12777 if (!T) 12778 return ExprError(); 12779 12780 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12781 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12782 if (!Constructor) 12783 return ExprError(); 12784 12785 bool ArgumentChanged = false; 12786 SmallVector<Expr*, 8> Args; 12787 Args.reserve(E->getNumArgs()); 12788 { 12789 EnterExpressionEvaluationContext Context( 12790 getSema(), EnterExpressionEvaluationContext::InitList, 12791 E->isListInitialization()); 12792 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12793 &ArgumentChanged)) 12794 return ExprError(); 12795 } 12796 12797 if (!getDerived().AlwaysRebuild() && 12798 T == E->getTypeSourceInfo() && 12799 Constructor == E->getConstructor() && 12800 !ArgumentChanged) { 12801 // FIXME: Instantiation-specific 12802 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12803 return SemaRef.MaybeBindToTemporary(E); 12804 } 12805 12806 // FIXME: We should just pass E->isListInitialization(), but we're not 12807 // prepared to handle list-initialization without a child InitListExpr. 12808 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12809 return getDerived().RebuildCXXTemporaryObjectExpr( 12810 T, LParenLoc, Args, E->getEndLoc(), 12811 /*ListInitialization=*/LParenLoc.isInvalid()); 12812 } 12813 12814 template<typename Derived> 12815 ExprResult 12816 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12817 // Transform any init-capture expressions before entering the scope of the 12818 // lambda body, because they are not semantically within that scope. 12819 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12820 struct TransformedInitCapture { 12821 // The location of the ... if the result is retaining a pack expansion. 12822 SourceLocation EllipsisLoc; 12823 // Zero or more expansions of the init-capture. 12824 SmallVector<InitCaptureInfoTy, 4> Expansions; 12825 }; 12826 SmallVector<TransformedInitCapture, 4> InitCaptures; 12827 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12828 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12829 CEnd = E->capture_end(); 12830 C != CEnd; ++C) { 12831 if (!E->isInitCapture(C)) 12832 continue; 12833 12834 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12835 VarDecl *OldVD = C->getCapturedVar(); 12836 12837 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12838 Optional<unsigned> NumExpansions) { 12839 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12840 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12841 12842 if (NewExprInitResult.isInvalid()) { 12843 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12844 return; 12845 } 12846 Expr *NewExprInit = NewExprInitResult.get(); 12847 12848 QualType NewInitCaptureType = 12849 getSema().buildLambdaInitCaptureInitialization( 12850 C->getLocation(), OldVD->getType()->isReferenceType(), 12851 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12852 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12853 NewExprInit); 12854 Result.Expansions.push_back( 12855 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12856 }; 12857 12858 // If this is an init-capture pack, consider expanding the pack now. 12859 if (OldVD->isParameterPack()) { 12860 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12861 ->getTypeLoc() 12862 .castAs<PackExpansionTypeLoc>(); 12863 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12864 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12865 12866 // Determine whether the set of unexpanded parameter packs can and should 12867 // be expanded. 12868 bool Expand = true; 12869 bool RetainExpansion = false; 12870 Optional<unsigned> OrigNumExpansions = 12871 ExpansionTL.getTypePtr()->getNumExpansions(); 12872 Optional<unsigned> NumExpansions = OrigNumExpansions; 12873 if (getDerived().TryExpandParameterPacks( 12874 ExpansionTL.getEllipsisLoc(), 12875 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12876 RetainExpansion, NumExpansions)) 12877 return ExprError(); 12878 if (Expand) { 12879 for (unsigned I = 0; I != *NumExpansions; ++I) { 12880 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12881 SubstInitCapture(SourceLocation(), None); 12882 } 12883 } 12884 if (!Expand || RetainExpansion) { 12885 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12886 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12887 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12888 } 12889 } else { 12890 SubstInitCapture(SourceLocation(), None); 12891 } 12892 } 12893 12894 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12895 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12896 12897 // Transform the template parameters, and add them to the current 12898 // instantiation scope. The null case is handled correctly. 12899 auto TPL = getDerived().TransformTemplateParameterList( 12900 E->getTemplateParameterList()); 12901 LSI->GLTemplateParameterList = TPL; 12902 12903 // Transform the type of the original lambda's call operator. 12904 // The transformation MUST be done in the CurrentInstantiationScope since 12905 // it introduces a mapping of the original to the newly created 12906 // transformed parameters. 12907 TypeSourceInfo *NewCallOpTSI = nullptr; 12908 { 12909 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12910 FunctionProtoTypeLoc OldCallOpFPTL = 12911 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12912 12913 TypeLocBuilder NewCallOpTLBuilder; 12914 SmallVector<QualType, 4> ExceptionStorage; 12915 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12916 QualType NewCallOpType = TransformFunctionProtoType( 12917 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12918 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12919 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12920 ExceptionStorage, Changed); 12921 }); 12922 if (NewCallOpType.isNull()) 12923 return ExprError(); 12924 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12925 NewCallOpType); 12926 } 12927 12928 // Transform the trailing requires clause 12929 ExprResult NewTrailingRequiresClause; 12930 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12931 // FIXME: Concepts: Substitution into requires clause should only happen 12932 // when checking satisfaction. 12933 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12934 12935 // Create the local class that will describe the lambda. 12936 // FIXME: KnownDependent below is wrong when substituting inside a templated 12937 // context that isn't a DeclContext (such as a variable template). 12938 CXXRecordDecl *OldClass = E->getLambdaClass(); 12939 CXXRecordDecl *Class 12940 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12941 NewCallOpTSI, 12942 /*KnownDependent=*/false, 12943 E->getCaptureDefault()); 12944 getDerived().transformedLocalDecl(OldClass, {Class}); 12945 12946 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12947 if (getDerived().ReplacingOriginal()) 12948 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12949 OldClass->getLambdaManglingNumber(), 12950 OldClass->getDeviceLambdaManglingNumber(), 12951 OldClass->getLambdaContextDecl()); 12952 12953 // Build the call operator. 12954 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12955 Class, E->getIntroducerRange(), NewCallOpTSI, 12956 E->getCallOperator()->getEndLoc(), 12957 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12958 E->getCallOperator()->getConstexprKind(), 12959 NewTrailingRequiresClause.get()); 12960 12961 LSI->CallOperator = NewCallOperator; 12962 12963 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12964 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12965 12966 // Number the lambda for linkage purposes if necessary. 12967 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12968 12969 // Introduce the context of the call operator. 12970 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12971 /*NewThisContext*/false); 12972 12973 // Enter the scope of the lambda. 12974 getSema().buildLambdaScope(LSI, NewCallOperator, 12975 E->getIntroducerRange(), 12976 E->getCaptureDefault(), 12977 E->getCaptureDefaultLoc(), 12978 E->hasExplicitParameters(), 12979 E->hasExplicitResultType(), 12980 E->isMutable()); 12981 12982 bool Invalid = false; 12983 12984 // Transform captures. 12985 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12986 CEnd = E->capture_end(); 12987 C != CEnd; ++C) { 12988 // When we hit the first implicit capture, tell Sema that we've finished 12989 // the list of explicit captures. 12990 if (C->isImplicit()) 12991 break; 12992 12993 // Capturing 'this' is trivial. 12994 if (C->capturesThis()) { 12995 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12996 /*BuildAndDiagnose*/ true, nullptr, 12997 C->getCaptureKind() == LCK_StarThis); 12998 continue; 12999 } 13000 // Captured expression will be recaptured during captured variables 13001 // rebuilding. 13002 if (C->capturesVLAType()) 13003 continue; 13004 13005 // Rebuild init-captures, including the implied field declaration. 13006 if (E->isInitCapture(C)) { 13007 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13008 13009 VarDecl *OldVD = C->getCapturedVar(); 13010 llvm::SmallVector<Decl*, 4> NewVDs; 13011 13012 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13013 ExprResult Init = Info.first; 13014 QualType InitQualType = Info.second; 13015 if (Init.isInvalid() || InitQualType.isNull()) { 13016 Invalid = true; 13017 break; 13018 } 13019 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13020 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13021 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13022 if (!NewVD) { 13023 Invalid = true; 13024 break; 13025 } 13026 NewVDs.push_back(NewVD); 13027 getSema().addInitCapture(LSI, NewVD); 13028 } 13029 13030 if (Invalid) 13031 break; 13032 13033 getDerived().transformedLocalDecl(OldVD, NewVDs); 13034 continue; 13035 } 13036 13037 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13038 13039 // Determine the capture kind for Sema. 13040 Sema::TryCaptureKind Kind 13041 = C->isImplicit()? Sema::TryCapture_Implicit 13042 : C->getCaptureKind() == LCK_ByCopy 13043 ? Sema::TryCapture_ExplicitByVal 13044 : Sema::TryCapture_ExplicitByRef; 13045 SourceLocation EllipsisLoc; 13046 if (C->isPackExpansion()) { 13047 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13048 bool ShouldExpand = false; 13049 bool RetainExpansion = false; 13050 Optional<unsigned> NumExpansions; 13051 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13052 C->getLocation(), 13053 Unexpanded, 13054 ShouldExpand, RetainExpansion, 13055 NumExpansions)) { 13056 Invalid = true; 13057 continue; 13058 } 13059 13060 if (ShouldExpand) { 13061 // The transform has determined that we should perform an expansion; 13062 // transform and capture each of the arguments. 13063 // expansion of the pattern. Do so. 13064 VarDecl *Pack = C->getCapturedVar(); 13065 for (unsigned I = 0; I != *NumExpansions; ++I) { 13066 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13067 VarDecl *CapturedVar 13068 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13069 Pack)); 13070 if (!CapturedVar) { 13071 Invalid = true; 13072 continue; 13073 } 13074 13075 // Capture the transformed variable. 13076 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13077 } 13078 13079 // FIXME: Retain a pack expansion if RetainExpansion is true. 13080 13081 continue; 13082 } 13083 13084 EllipsisLoc = C->getEllipsisLoc(); 13085 } 13086 13087 // Transform the captured variable. 13088 VarDecl *CapturedVar 13089 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13090 C->getCapturedVar())); 13091 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13092 Invalid = true; 13093 continue; 13094 } 13095 13096 // Capture the transformed variable. 13097 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13098 EllipsisLoc); 13099 } 13100 getSema().finishLambdaExplicitCaptures(LSI); 13101 13102 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13103 // evaluation context even if we're not transforming the function body. 13104 getSema().PushExpressionEvaluationContext( 13105 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13106 13107 // Instantiate the body of the lambda expression. 13108 StmtResult Body = 13109 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13110 13111 // ActOnLambda* will pop the function scope for us. 13112 FuncScopeCleanup.disable(); 13113 13114 if (Body.isInvalid()) { 13115 SavedContext.pop(); 13116 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13117 /*IsInstantiation=*/true); 13118 return ExprError(); 13119 } 13120 13121 // Copy the LSI before ActOnFinishFunctionBody removes it. 13122 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13123 // the call operator. 13124 auto LSICopy = *LSI; 13125 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13126 /*IsInstantiation*/ true); 13127 SavedContext.pop(); 13128 13129 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13130 &LSICopy); 13131 } 13132 13133 template<typename Derived> 13134 StmtResult 13135 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13136 return TransformStmt(S); 13137 } 13138 13139 template<typename Derived> 13140 StmtResult 13141 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13142 // Transform captures. 13143 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13144 CEnd = E->capture_end(); 13145 C != CEnd; ++C) { 13146 // When we hit the first implicit capture, tell Sema that we've finished 13147 // the list of explicit captures. 13148 if (!C->isImplicit()) 13149 continue; 13150 13151 // Capturing 'this' is trivial. 13152 if (C->capturesThis()) { 13153 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13154 /*BuildAndDiagnose*/ true, nullptr, 13155 C->getCaptureKind() == LCK_StarThis); 13156 continue; 13157 } 13158 // Captured expression will be recaptured during captured variables 13159 // rebuilding. 13160 if (C->capturesVLAType()) 13161 continue; 13162 13163 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13164 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13165 13166 // Transform the captured variable. 13167 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13168 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13169 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13170 return StmtError(); 13171 13172 // Capture the transformed variable. 13173 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13174 } 13175 13176 return S; 13177 } 13178 13179 template<typename Derived> 13180 ExprResult 13181 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13182 CXXUnresolvedConstructExpr *E) { 13183 TypeSourceInfo *T = 13184 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13185 if (!T) 13186 return ExprError(); 13187 13188 bool ArgumentChanged = false; 13189 SmallVector<Expr*, 8> Args; 13190 Args.reserve(E->getNumArgs()); 13191 { 13192 EnterExpressionEvaluationContext Context( 13193 getSema(), EnterExpressionEvaluationContext::InitList, 13194 E->isListInitialization()); 13195 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13196 &ArgumentChanged)) 13197 return ExprError(); 13198 } 13199 13200 if (!getDerived().AlwaysRebuild() && 13201 T == E->getTypeSourceInfo() && 13202 !ArgumentChanged) 13203 return E; 13204 13205 // FIXME: we're faking the locations of the commas 13206 return getDerived().RebuildCXXUnresolvedConstructExpr( 13207 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13208 } 13209 13210 template<typename Derived> 13211 ExprResult 13212 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13213 CXXDependentScopeMemberExpr *E) { 13214 // Transform the base of the expression. 13215 ExprResult Base((Expr*) nullptr); 13216 Expr *OldBase; 13217 QualType BaseType; 13218 QualType ObjectType; 13219 if (!E->isImplicitAccess()) { 13220 OldBase = E->getBase(); 13221 Base = getDerived().TransformExpr(OldBase); 13222 if (Base.isInvalid()) 13223 return ExprError(); 13224 13225 // Start the member reference and compute the object's type. 13226 ParsedType ObjectTy; 13227 bool MayBePseudoDestructor = false; 13228 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13229 E->getOperatorLoc(), 13230 E->isArrow()? tok::arrow : tok::period, 13231 ObjectTy, 13232 MayBePseudoDestructor); 13233 if (Base.isInvalid()) 13234 return ExprError(); 13235 13236 ObjectType = ObjectTy.get(); 13237 BaseType = ((Expr*) Base.get())->getType(); 13238 } else { 13239 OldBase = nullptr; 13240 BaseType = getDerived().TransformType(E->getBaseType()); 13241 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13242 } 13243 13244 // Transform the first part of the nested-name-specifier that qualifies 13245 // the member name. 13246 NamedDecl *FirstQualifierInScope 13247 = getDerived().TransformFirstQualifierInScope( 13248 E->getFirstQualifierFoundInScope(), 13249 E->getQualifierLoc().getBeginLoc()); 13250 13251 NestedNameSpecifierLoc QualifierLoc; 13252 if (E->getQualifier()) { 13253 QualifierLoc 13254 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13255 ObjectType, 13256 FirstQualifierInScope); 13257 if (!QualifierLoc) 13258 return ExprError(); 13259 } 13260 13261 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13262 13263 // TODO: If this is a conversion-function-id, verify that the 13264 // destination type name (if present) resolves the same way after 13265 // instantiation as it did in the local scope. 13266 13267 DeclarationNameInfo NameInfo 13268 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13269 if (!NameInfo.getName()) 13270 return ExprError(); 13271 13272 if (!E->hasExplicitTemplateArgs()) { 13273 // This is a reference to a member without an explicitly-specified 13274 // template argument list. Optimize for this common case. 13275 if (!getDerived().AlwaysRebuild() && 13276 Base.get() == OldBase && 13277 BaseType == E->getBaseType() && 13278 QualifierLoc == E->getQualifierLoc() && 13279 NameInfo.getName() == E->getMember() && 13280 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13281 return E; 13282 13283 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13284 BaseType, 13285 E->isArrow(), 13286 E->getOperatorLoc(), 13287 QualifierLoc, 13288 TemplateKWLoc, 13289 FirstQualifierInScope, 13290 NameInfo, 13291 /*TemplateArgs*/nullptr); 13292 } 13293 13294 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13295 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13296 E->getNumTemplateArgs(), 13297 TransArgs)) 13298 return ExprError(); 13299 13300 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13301 BaseType, 13302 E->isArrow(), 13303 E->getOperatorLoc(), 13304 QualifierLoc, 13305 TemplateKWLoc, 13306 FirstQualifierInScope, 13307 NameInfo, 13308 &TransArgs); 13309 } 13310 13311 template <typename Derived> 13312 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13313 UnresolvedMemberExpr *Old) { 13314 // Transform the base of the expression. 13315 ExprResult Base((Expr *)nullptr); 13316 QualType BaseType; 13317 if (!Old->isImplicitAccess()) { 13318 Base = getDerived().TransformExpr(Old->getBase()); 13319 if (Base.isInvalid()) 13320 return ExprError(); 13321 Base = 13322 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13323 if (Base.isInvalid()) 13324 return ExprError(); 13325 BaseType = Base.get()->getType(); 13326 } else { 13327 BaseType = getDerived().TransformType(Old->getBaseType()); 13328 } 13329 13330 NestedNameSpecifierLoc QualifierLoc; 13331 if (Old->getQualifierLoc()) { 13332 QualifierLoc = 13333 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13334 if (!QualifierLoc) 13335 return ExprError(); 13336 } 13337 13338 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13339 13340 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13341 13342 // Transform the declaration set. 13343 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13344 return ExprError(); 13345 13346 // Determine the naming class. 13347 if (Old->getNamingClass()) { 13348 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13349 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13350 if (!NamingClass) 13351 return ExprError(); 13352 13353 R.setNamingClass(NamingClass); 13354 } 13355 13356 TemplateArgumentListInfo TransArgs; 13357 if (Old->hasExplicitTemplateArgs()) { 13358 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13359 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13360 if (getDerived().TransformTemplateArguments( 13361 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13362 return ExprError(); 13363 } 13364 13365 // FIXME: to do this check properly, we will need to preserve the 13366 // first-qualifier-in-scope here, just in case we had a dependent 13367 // base (and therefore couldn't do the check) and a 13368 // nested-name-qualifier (and therefore could do the lookup). 13369 NamedDecl *FirstQualifierInScope = nullptr; 13370 13371 return getDerived().RebuildUnresolvedMemberExpr( 13372 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13373 TemplateKWLoc, FirstQualifierInScope, R, 13374 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13375 } 13376 13377 template<typename Derived> 13378 ExprResult 13379 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13380 EnterExpressionEvaluationContext Unevaluated( 13381 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13382 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13383 if (SubExpr.isInvalid()) 13384 return ExprError(); 13385 13386 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13387 return E; 13388 13389 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13390 } 13391 13392 template<typename Derived> 13393 ExprResult 13394 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13395 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13396 if (Pattern.isInvalid()) 13397 return ExprError(); 13398 13399 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13400 return E; 13401 13402 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13403 E->getNumExpansions()); 13404 } 13405 13406 template<typename Derived> 13407 ExprResult 13408 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13409 // If E is not value-dependent, then nothing will change when we transform it. 13410 // Note: This is an instantiation-centric view. 13411 if (!E->isValueDependent()) 13412 return E; 13413 13414 EnterExpressionEvaluationContext Unevaluated( 13415 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13416 13417 ArrayRef<TemplateArgument> PackArgs; 13418 TemplateArgument ArgStorage; 13419 13420 // Find the argument list to transform. 13421 if (E->isPartiallySubstituted()) { 13422 PackArgs = E->getPartialArguments(); 13423 } else if (E->isValueDependent()) { 13424 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13425 bool ShouldExpand = false; 13426 bool RetainExpansion = false; 13427 Optional<unsigned> NumExpansions; 13428 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13429 Unexpanded, 13430 ShouldExpand, RetainExpansion, 13431 NumExpansions)) 13432 return ExprError(); 13433 13434 // If we need to expand the pack, build a template argument from it and 13435 // expand that. 13436 if (ShouldExpand) { 13437 auto *Pack = E->getPack(); 13438 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13439 ArgStorage = getSema().Context.getPackExpansionType( 13440 getSema().Context.getTypeDeclType(TTPD), None); 13441 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13442 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13443 } else { 13444 auto *VD = cast<ValueDecl>(Pack); 13445 ExprResult DRE = getSema().BuildDeclRefExpr( 13446 VD, VD->getType().getNonLValueExprType(getSema().Context), 13447 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13448 E->getPackLoc()); 13449 if (DRE.isInvalid()) 13450 return ExprError(); 13451 ArgStorage = new (getSema().Context) PackExpansionExpr( 13452 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13453 } 13454 PackArgs = ArgStorage; 13455 } 13456 } 13457 13458 // If we're not expanding the pack, just transform the decl. 13459 if (!PackArgs.size()) { 13460 auto *Pack = cast_or_null<NamedDecl>( 13461 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13462 if (!Pack) 13463 return ExprError(); 13464 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13465 E->getPackLoc(), 13466 E->getRParenLoc(), None, None); 13467 } 13468 13469 // Try to compute the result without performing a partial substitution. 13470 Optional<unsigned> Result = 0; 13471 for (const TemplateArgument &Arg : PackArgs) { 13472 if (!Arg.isPackExpansion()) { 13473 Result = *Result + 1; 13474 continue; 13475 } 13476 13477 TemplateArgumentLoc ArgLoc; 13478 InventTemplateArgumentLoc(Arg, ArgLoc); 13479 13480 // Find the pattern of the pack expansion. 13481 SourceLocation Ellipsis; 13482 Optional<unsigned> OrigNumExpansions; 13483 TemplateArgumentLoc Pattern = 13484 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13485 OrigNumExpansions); 13486 13487 // Substitute under the pack expansion. Do not expand the pack (yet). 13488 TemplateArgumentLoc OutPattern; 13489 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13490 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13491 /*Uneval*/ true)) 13492 return true; 13493 13494 // See if we can determine the number of arguments from the result. 13495 Optional<unsigned> NumExpansions = 13496 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13497 if (!NumExpansions) { 13498 // No: we must be in an alias template expansion, and we're going to need 13499 // to actually expand the packs. 13500 Result = None; 13501 break; 13502 } 13503 13504 Result = *Result + *NumExpansions; 13505 } 13506 13507 // Common case: we could determine the number of expansions without 13508 // substituting. 13509 if (Result) 13510 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13511 E->getPackLoc(), 13512 E->getRParenLoc(), *Result, None); 13513 13514 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13515 E->getPackLoc()); 13516 { 13517 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13518 typedef TemplateArgumentLocInventIterator< 13519 Derived, const TemplateArgument*> PackLocIterator; 13520 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13521 PackLocIterator(*this, PackArgs.end()), 13522 TransformedPackArgs, /*Uneval*/true)) 13523 return ExprError(); 13524 } 13525 13526 // Check whether we managed to fully-expand the pack. 13527 // FIXME: Is it possible for us to do so and not hit the early exit path? 13528 SmallVector<TemplateArgument, 8> Args; 13529 bool PartialSubstitution = false; 13530 for (auto &Loc : TransformedPackArgs.arguments()) { 13531 Args.push_back(Loc.getArgument()); 13532 if (Loc.getArgument().isPackExpansion()) 13533 PartialSubstitution = true; 13534 } 13535 13536 if (PartialSubstitution) 13537 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13538 E->getPackLoc(), 13539 E->getRParenLoc(), None, Args); 13540 13541 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13542 E->getPackLoc(), E->getRParenLoc(), 13543 Args.size(), None); 13544 } 13545 13546 template<typename Derived> 13547 ExprResult 13548 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13549 SubstNonTypeTemplateParmPackExpr *E) { 13550 // Default behavior is to do nothing with this transformation. 13551 return E; 13552 } 13553 13554 template<typename Derived> 13555 ExprResult 13556 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13557 SubstNonTypeTemplateParmExpr *E) { 13558 // Default behavior is to do nothing with this transformation. 13559 return E; 13560 } 13561 13562 template<typename Derived> 13563 ExprResult 13564 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13565 // Default behavior is to do nothing with this transformation. 13566 return E; 13567 } 13568 13569 template<typename Derived> 13570 ExprResult 13571 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13572 MaterializeTemporaryExpr *E) { 13573 return getDerived().TransformExpr(E->getSubExpr()); 13574 } 13575 13576 template<typename Derived> 13577 ExprResult 13578 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13579 UnresolvedLookupExpr *Callee = nullptr; 13580 if (Expr *OldCallee = E->getCallee()) { 13581 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13582 if (CalleeResult.isInvalid()) 13583 return ExprError(); 13584 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13585 } 13586 13587 Expr *Pattern = E->getPattern(); 13588 13589 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13590 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13591 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13592 13593 // Determine whether the set of unexpanded parameter packs can and should 13594 // be expanded. 13595 bool Expand = true; 13596 bool RetainExpansion = false; 13597 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13598 NumExpansions = OrigNumExpansions; 13599 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13600 Pattern->getSourceRange(), 13601 Unexpanded, 13602 Expand, RetainExpansion, 13603 NumExpansions)) 13604 return true; 13605 13606 if (!Expand) { 13607 // Do not expand any packs here, just transform and rebuild a fold 13608 // expression. 13609 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13610 13611 ExprResult LHS = 13612 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13613 if (LHS.isInvalid()) 13614 return true; 13615 13616 ExprResult RHS = 13617 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13618 if (RHS.isInvalid()) 13619 return true; 13620 13621 if (!getDerived().AlwaysRebuild() && 13622 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13623 return E; 13624 13625 return getDerived().RebuildCXXFoldExpr( 13626 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13627 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13628 } 13629 13630 // Formally a fold expression expands to nested parenthesized expressions. 13631 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13632 // them. 13633 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13634 SemaRef.Diag(E->getEllipsisLoc(), 13635 clang::diag::err_fold_expression_limit_exceeded) 13636 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13637 << E->getSourceRange(); 13638 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13639 return ExprError(); 13640 } 13641 13642 // The transform has determined that we should perform an elementwise 13643 // expansion of the pattern. Do so. 13644 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13645 if (Result.isInvalid()) 13646 return true; 13647 bool LeftFold = E->isLeftFold(); 13648 13649 // If we're retaining an expansion for a right fold, it is the innermost 13650 // component and takes the init (if any). 13651 if (!LeftFold && RetainExpansion) { 13652 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13653 13654 ExprResult Out = getDerived().TransformExpr(Pattern); 13655 if (Out.isInvalid()) 13656 return true; 13657 13658 Result = getDerived().RebuildCXXFoldExpr( 13659 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13660 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13661 if (Result.isInvalid()) 13662 return true; 13663 } 13664 13665 for (unsigned I = 0; I != *NumExpansions; ++I) { 13666 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13667 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13668 ExprResult Out = getDerived().TransformExpr(Pattern); 13669 if (Out.isInvalid()) 13670 return true; 13671 13672 if (Out.get()->containsUnexpandedParameterPack()) { 13673 // We still have a pack; retain a pack expansion for this slice. 13674 Result = getDerived().RebuildCXXFoldExpr( 13675 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13676 E->getOperator(), E->getEllipsisLoc(), 13677 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13678 OrigNumExpansions); 13679 } else if (Result.isUsable()) { 13680 // We've got down to a single element; build a binary operator. 13681 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13682 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13683 if (Callee) 13684 Result = getDerived().RebuildCXXOperatorCallExpr( 13685 BinaryOperator::getOverloadedOperator(E->getOperator()), 13686 E->getEllipsisLoc(), Callee, LHS, RHS); 13687 else 13688 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13689 E->getOperator(), LHS, RHS); 13690 } else 13691 Result = Out; 13692 13693 if (Result.isInvalid()) 13694 return true; 13695 } 13696 13697 // If we're retaining an expansion for a left fold, it is the outermost 13698 // component and takes the complete expansion so far as its init (if any). 13699 if (LeftFold && RetainExpansion) { 13700 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13701 13702 ExprResult Out = getDerived().TransformExpr(Pattern); 13703 if (Out.isInvalid()) 13704 return true; 13705 13706 Result = getDerived().RebuildCXXFoldExpr( 13707 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13708 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13709 if (Result.isInvalid()) 13710 return true; 13711 } 13712 13713 // If we had no init and an empty pack, and we're not retaining an expansion, 13714 // then produce a fallback value or error. 13715 if (Result.isUnset()) 13716 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13717 E->getOperator()); 13718 13719 return Result; 13720 } 13721 13722 template<typename Derived> 13723 ExprResult 13724 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13725 CXXStdInitializerListExpr *E) { 13726 return getDerived().TransformExpr(E->getSubExpr()); 13727 } 13728 13729 template<typename Derived> 13730 ExprResult 13731 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13732 return SemaRef.MaybeBindToTemporary(E); 13733 } 13734 13735 template<typename Derived> 13736 ExprResult 13737 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13738 return E; 13739 } 13740 13741 template<typename Derived> 13742 ExprResult 13743 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13744 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13745 if (SubExpr.isInvalid()) 13746 return ExprError(); 13747 13748 if (!getDerived().AlwaysRebuild() && 13749 SubExpr.get() == E->getSubExpr()) 13750 return E; 13751 13752 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13753 } 13754 13755 template<typename Derived> 13756 ExprResult 13757 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13758 // Transform each of the elements. 13759 SmallVector<Expr *, 8> Elements; 13760 bool ArgChanged = false; 13761 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13762 /*IsCall=*/false, Elements, &ArgChanged)) 13763 return ExprError(); 13764 13765 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13766 return SemaRef.MaybeBindToTemporary(E); 13767 13768 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13769 Elements.data(), 13770 Elements.size()); 13771 } 13772 13773 template<typename Derived> 13774 ExprResult 13775 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13776 ObjCDictionaryLiteral *E) { 13777 // Transform each of the elements. 13778 SmallVector<ObjCDictionaryElement, 8> Elements; 13779 bool ArgChanged = false; 13780 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13781 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13782 13783 if (OrigElement.isPackExpansion()) { 13784 // This key/value element is a pack expansion. 13785 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13786 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13787 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13788 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13789 13790 // Determine whether the set of unexpanded parameter packs can 13791 // and should be expanded. 13792 bool Expand = true; 13793 bool RetainExpansion = false; 13794 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13795 Optional<unsigned> NumExpansions = OrigNumExpansions; 13796 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13797 OrigElement.Value->getEndLoc()); 13798 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13799 PatternRange, Unexpanded, Expand, 13800 RetainExpansion, NumExpansions)) 13801 return ExprError(); 13802 13803 if (!Expand) { 13804 // The transform has determined that we should perform a simple 13805 // transformation on the pack expansion, producing another pack 13806 // expansion. 13807 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13808 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13809 if (Key.isInvalid()) 13810 return ExprError(); 13811 13812 if (Key.get() != OrigElement.Key) 13813 ArgChanged = true; 13814 13815 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13816 if (Value.isInvalid()) 13817 return ExprError(); 13818 13819 if (Value.get() != OrigElement.Value) 13820 ArgChanged = true; 13821 13822 ObjCDictionaryElement Expansion = { 13823 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13824 }; 13825 Elements.push_back(Expansion); 13826 continue; 13827 } 13828 13829 // Record right away that the argument was changed. This needs 13830 // to happen even if the array expands to nothing. 13831 ArgChanged = true; 13832 13833 // The transform has determined that we should perform an elementwise 13834 // expansion of the pattern. Do so. 13835 for (unsigned I = 0; I != *NumExpansions; ++I) { 13836 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13837 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13838 if (Key.isInvalid()) 13839 return ExprError(); 13840 13841 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13842 if (Value.isInvalid()) 13843 return ExprError(); 13844 13845 ObjCDictionaryElement Element = { 13846 Key.get(), Value.get(), SourceLocation(), NumExpansions 13847 }; 13848 13849 // If any unexpanded parameter packs remain, we still have a 13850 // pack expansion. 13851 // FIXME: Can this really happen? 13852 if (Key.get()->containsUnexpandedParameterPack() || 13853 Value.get()->containsUnexpandedParameterPack()) 13854 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13855 13856 Elements.push_back(Element); 13857 } 13858 13859 // FIXME: Retain a pack expansion if RetainExpansion is true. 13860 13861 // We've finished with this pack expansion. 13862 continue; 13863 } 13864 13865 // Transform and check key. 13866 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13867 if (Key.isInvalid()) 13868 return ExprError(); 13869 13870 if (Key.get() != OrigElement.Key) 13871 ArgChanged = true; 13872 13873 // Transform and check value. 13874 ExprResult Value 13875 = getDerived().TransformExpr(OrigElement.Value); 13876 if (Value.isInvalid()) 13877 return ExprError(); 13878 13879 if (Value.get() != OrigElement.Value) 13880 ArgChanged = true; 13881 13882 ObjCDictionaryElement Element = { 13883 Key.get(), Value.get(), SourceLocation(), None 13884 }; 13885 Elements.push_back(Element); 13886 } 13887 13888 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13889 return SemaRef.MaybeBindToTemporary(E); 13890 13891 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13892 Elements); 13893 } 13894 13895 template<typename Derived> 13896 ExprResult 13897 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13898 TypeSourceInfo *EncodedTypeInfo 13899 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13900 if (!EncodedTypeInfo) 13901 return ExprError(); 13902 13903 if (!getDerived().AlwaysRebuild() && 13904 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13905 return E; 13906 13907 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13908 EncodedTypeInfo, 13909 E->getRParenLoc()); 13910 } 13911 13912 template<typename Derived> 13913 ExprResult TreeTransform<Derived>:: 13914 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13915 // This is a kind of implicit conversion, and it needs to get dropped 13916 // and recomputed for the same general reasons that ImplicitCastExprs 13917 // do, as well a more specific one: this expression is only valid when 13918 // it appears *immediately* as an argument expression. 13919 return getDerived().TransformExpr(E->getSubExpr()); 13920 } 13921 13922 template<typename Derived> 13923 ExprResult TreeTransform<Derived>:: 13924 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13925 TypeSourceInfo *TSInfo 13926 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13927 if (!TSInfo) 13928 return ExprError(); 13929 13930 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13931 if (Result.isInvalid()) 13932 return ExprError(); 13933 13934 if (!getDerived().AlwaysRebuild() && 13935 TSInfo == E->getTypeInfoAsWritten() && 13936 Result.get() == E->getSubExpr()) 13937 return E; 13938 13939 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13940 E->getBridgeKeywordLoc(), TSInfo, 13941 Result.get()); 13942 } 13943 13944 template <typename Derived> 13945 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13946 ObjCAvailabilityCheckExpr *E) { 13947 return E; 13948 } 13949 13950 template<typename Derived> 13951 ExprResult 13952 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13953 // Transform arguments. 13954 bool ArgChanged = false; 13955 SmallVector<Expr*, 8> Args; 13956 Args.reserve(E->getNumArgs()); 13957 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13958 &ArgChanged)) 13959 return ExprError(); 13960 13961 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13962 // Class message: transform the receiver type. 13963 TypeSourceInfo *ReceiverTypeInfo 13964 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13965 if (!ReceiverTypeInfo) 13966 return ExprError(); 13967 13968 // If nothing changed, just retain the existing message send. 13969 if (!getDerived().AlwaysRebuild() && 13970 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13971 return SemaRef.MaybeBindToTemporary(E); 13972 13973 // Build a new class message send. 13974 SmallVector<SourceLocation, 16> SelLocs; 13975 E->getSelectorLocs(SelLocs); 13976 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13977 E->getSelector(), 13978 SelLocs, 13979 E->getMethodDecl(), 13980 E->getLeftLoc(), 13981 Args, 13982 E->getRightLoc()); 13983 } 13984 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13985 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13986 if (!E->getMethodDecl()) 13987 return ExprError(); 13988 13989 // Build a new class message send to 'super'. 13990 SmallVector<SourceLocation, 16> SelLocs; 13991 E->getSelectorLocs(SelLocs); 13992 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13993 E->getSelector(), 13994 SelLocs, 13995 E->getReceiverType(), 13996 E->getMethodDecl(), 13997 E->getLeftLoc(), 13998 Args, 13999 E->getRightLoc()); 14000 } 14001 14002 // Instance message: transform the receiver 14003 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14004 "Only class and instance messages may be instantiated"); 14005 ExprResult Receiver 14006 = getDerived().TransformExpr(E->getInstanceReceiver()); 14007 if (Receiver.isInvalid()) 14008 return ExprError(); 14009 14010 // If nothing changed, just retain the existing message send. 14011 if (!getDerived().AlwaysRebuild() && 14012 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14013 return SemaRef.MaybeBindToTemporary(E); 14014 14015 // Build a new instance message send. 14016 SmallVector<SourceLocation, 16> SelLocs; 14017 E->getSelectorLocs(SelLocs); 14018 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14019 E->getSelector(), 14020 SelLocs, 14021 E->getMethodDecl(), 14022 E->getLeftLoc(), 14023 Args, 14024 E->getRightLoc()); 14025 } 14026 14027 template<typename Derived> 14028 ExprResult 14029 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14030 return E; 14031 } 14032 14033 template<typename Derived> 14034 ExprResult 14035 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14036 return E; 14037 } 14038 14039 template<typename Derived> 14040 ExprResult 14041 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14042 // Transform the base expression. 14043 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14044 if (Base.isInvalid()) 14045 return ExprError(); 14046 14047 // We don't need to transform the ivar; it will never change. 14048 14049 // If nothing changed, just retain the existing expression. 14050 if (!getDerived().AlwaysRebuild() && 14051 Base.get() == E->getBase()) 14052 return E; 14053 14054 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14055 E->getLocation(), 14056 E->isArrow(), E->isFreeIvar()); 14057 } 14058 14059 template<typename Derived> 14060 ExprResult 14061 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14062 // 'super' and types never change. Property never changes. Just 14063 // retain the existing expression. 14064 if (!E->isObjectReceiver()) 14065 return E; 14066 14067 // Transform the base expression. 14068 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14069 if (Base.isInvalid()) 14070 return ExprError(); 14071 14072 // We don't need to transform the property; it will never change. 14073 14074 // If nothing changed, just retain the existing expression. 14075 if (!getDerived().AlwaysRebuild() && 14076 Base.get() == E->getBase()) 14077 return E; 14078 14079 if (E->isExplicitProperty()) 14080 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14081 E->getExplicitProperty(), 14082 E->getLocation()); 14083 14084 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14085 SemaRef.Context.PseudoObjectTy, 14086 E->getImplicitPropertyGetter(), 14087 E->getImplicitPropertySetter(), 14088 E->getLocation()); 14089 } 14090 14091 template<typename Derived> 14092 ExprResult 14093 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14094 // Transform the base expression. 14095 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14096 if (Base.isInvalid()) 14097 return ExprError(); 14098 14099 // Transform the key expression. 14100 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14101 if (Key.isInvalid()) 14102 return ExprError(); 14103 14104 // If nothing changed, just retain the existing expression. 14105 if (!getDerived().AlwaysRebuild() && 14106 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14107 return E; 14108 14109 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14110 Base.get(), Key.get(), 14111 E->getAtIndexMethodDecl(), 14112 E->setAtIndexMethodDecl()); 14113 } 14114 14115 template<typename Derived> 14116 ExprResult 14117 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14118 // Transform the base expression. 14119 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14120 if (Base.isInvalid()) 14121 return ExprError(); 14122 14123 // If nothing changed, just retain the existing expression. 14124 if (!getDerived().AlwaysRebuild() && 14125 Base.get() == E->getBase()) 14126 return E; 14127 14128 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14129 E->getOpLoc(), 14130 E->isArrow()); 14131 } 14132 14133 template<typename Derived> 14134 ExprResult 14135 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14136 bool ArgumentChanged = false; 14137 SmallVector<Expr*, 8> SubExprs; 14138 SubExprs.reserve(E->getNumSubExprs()); 14139 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14140 SubExprs, &ArgumentChanged)) 14141 return ExprError(); 14142 14143 if (!getDerived().AlwaysRebuild() && 14144 !ArgumentChanged) 14145 return E; 14146 14147 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14148 SubExprs, 14149 E->getRParenLoc()); 14150 } 14151 14152 template<typename Derived> 14153 ExprResult 14154 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14155 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14156 if (SrcExpr.isInvalid()) 14157 return ExprError(); 14158 14159 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14160 if (!Type) 14161 return ExprError(); 14162 14163 if (!getDerived().AlwaysRebuild() && 14164 Type == E->getTypeSourceInfo() && 14165 SrcExpr.get() == E->getSrcExpr()) 14166 return E; 14167 14168 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14169 SrcExpr.get(), Type, 14170 E->getRParenLoc()); 14171 } 14172 14173 template<typename Derived> 14174 ExprResult 14175 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14176 BlockDecl *oldBlock = E->getBlockDecl(); 14177 14178 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14179 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14180 14181 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14182 blockScope->TheDecl->setBlockMissingReturnType( 14183 oldBlock->blockMissingReturnType()); 14184 14185 SmallVector<ParmVarDecl*, 4> params; 14186 SmallVector<QualType, 4> paramTypes; 14187 14188 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14189 14190 // Parameter substitution. 14191 Sema::ExtParameterInfoBuilder extParamInfos; 14192 if (getDerived().TransformFunctionTypeParams( 14193 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14194 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14195 extParamInfos)) { 14196 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14197 return ExprError(); 14198 } 14199 14200 QualType exprResultType = 14201 getDerived().TransformType(exprFunctionType->getReturnType()); 14202 14203 auto epi = exprFunctionType->getExtProtoInfo(); 14204 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14205 14206 QualType functionType = 14207 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14208 blockScope->FunctionType = functionType; 14209 14210 // Set the parameters on the block decl. 14211 if (!params.empty()) 14212 blockScope->TheDecl->setParams(params); 14213 14214 if (!oldBlock->blockMissingReturnType()) { 14215 blockScope->HasImplicitReturnType = false; 14216 blockScope->ReturnType = exprResultType; 14217 } 14218 14219 // Transform the body 14220 StmtResult body = getDerived().TransformStmt(E->getBody()); 14221 if (body.isInvalid()) { 14222 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14223 return ExprError(); 14224 } 14225 14226 #ifndef NDEBUG 14227 // In builds with assertions, make sure that we captured everything we 14228 // captured before. 14229 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14230 for (const auto &I : oldBlock->captures()) { 14231 VarDecl *oldCapture = I.getVariable(); 14232 14233 // Ignore parameter packs. 14234 if (oldCapture->isParameterPack()) 14235 continue; 14236 14237 VarDecl *newCapture = 14238 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14239 oldCapture)); 14240 assert(blockScope->CaptureMap.count(newCapture)); 14241 } 14242 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14243 } 14244 #endif 14245 14246 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14247 /*Scope=*/nullptr); 14248 } 14249 14250 template<typename Derived> 14251 ExprResult 14252 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14253 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14254 if (SrcExpr.isInvalid()) 14255 return ExprError(); 14256 14257 QualType Type = getDerived().TransformType(E->getType()); 14258 14259 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14260 E->getRParenLoc()); 14261 } 14262 14263 template<typename Derived> 14264 ExprResult 14265 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14266 bool ArgumentChanged = false; 14267 SmallVector<Expr*, 8> SubExprs; 14268 SubExprs.reserve(E->getNumSubExprs()); 14269 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14270 SubExprs, &ArgumentChanged)) 14271 return ExprError(); 14272 14273 if (!getDerived().AlwaysRebuild() && 14274 !ArgumentChanged) 14275 return E; 14276 14277 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14278 E->getOp(), E->getRParenLoc()); 14279 } 14280 14281 //===----------------------------------------------------------------------===// 14282 // Type reconstruction 14283 //===----------------------------------------------------------------------===// 14284 14285 template<typename Derived> 14286 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14287 SourceLocation Star) { 14288 return SemaRef.BuildPointerType(PointeeType, Star, 14289 getDerived().getBaseEntity()); 14290 } 14291 14292 template<typename Derived> 14293 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14294 SourceLocation Star) { 14295 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14296 getDerived().getBaseEntity()); 14297 } 14298 14299 template<typename Derived> 14300 QualType 14301 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14302 bool WrittenAsLValue, 14303 SourceLocation Sigil) { 14304 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14305 Sigil, getDerived().getBaseEntity()); 14306 } 14307 14308 template<typename Derived> 14309 QualType 14310 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14311 QualType ClassType, 14312 SourceLocation Sigil) { 14313 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14314 getDerived().getBaseEntity()); 14315 } 14316 14317 template<typename Derived> 14318 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14319 const ObjCTypeParamDecl *Decl, 14320 SourceLocation ProtocolLAngleLoc, 14321 ArrayRef<ObjCProtocolDecl *> Protocols, 14322 ArrayRef<SourceLocation> ProtocolLocs, 14323 SourceLocation ProtocolRAngleLoc) { 14324 return SemaRef.BuildObjCTypeParamType(Decl, 14325 ProtocolLAngleLoc, Protocols, 14326 ProtocolLocs, ProtocolRAngleLoc, 14327 /*FailOnError=*/true); 14328 } 14329 14330 template<typename Derived> 14331 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14332 QualType BaseType, 14333 SourceLocation Loc, 14334 SourceLocation TypeArgsLAngleLoc, 14335 ArrayRef<TypeSourceInfo *> TypeArgs, 14336 SourceLocation TypeArgsRAngleLoc, 14337 SourceLocation ProtocolLAngleLoc, 14338 ArrayRef<ObjCProtocolDecl *> Protocols, 14339 ArrayRef<SourceLocation> ProtocolLocs, 14340 SourceLocation ProtocolRAngleLoc) { 14341 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14342 TypeArgs, TypeArgsRAngleLoc, 14343 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14344 ProtocolRAngleLoc, 14345 /*FailOnError=*/true); 14346 } 14347 14348 template<typename Derived> 14349 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14350 QualType PointeeType, 14351 SourceLocation Star) { 14352 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14353 } 14354 14355 template<typename Derived> 14356 QualType 14357 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14358 ArrayType::ArraySizeModifier SizeMod, 14359 const llvm::APInt *Size, 14360 Expr *SizeExpr, 14361 unsigned IndexTypeQuals, 14362 SourceRange BracketsRange) { 14363 if (SizeExpr || !Size) 14364 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14365 IndexTypeQuals, BracketsRange, 14366 getDerived().getBaseEntity()); 14367 14368 QualType Types[] = { 14369 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14370 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14371 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14372 }; 14373 const unsigned NumTypes = llvm::array_lengthof(Types); 14374 QualType SizeType; 14375 for (unsigned I = 0; I != NumTypes; ++I) 14376 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14377 SizeType = Types[I]; 14378 break; 14379 } 14380 14381 // Note that we can return a VariableArrayType here in the case where 14382 // the element type was a dependent VariableArrayType. 14383 IntegerLiteral *ArraySize 14384 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14385 /*FIXME*/BracketsRange.getBegin()); 14386 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14387 IndexTypeQuals, BracketsRange, 14388 getDerived().getBaseEntity()); 14389 } 14390 14391 template<typename Derived> 14392 QualType 14393 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14394 ArrayType::ArraySizeModifier SizeMod, 14395 const llvm::APInt &Size, 14396 Expr *SizeExpr, 14397 unsigned IndexTypeQuals, 14398 SourceRange BracketsRange) { 14399 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14400 IndexTypeQuals, BracketsRange); 14401 } 14402 14403 template<typename Derived> 14404 QualType 14405 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14406 ArrayType::ArraySizeModifier SizeMod, 14407 unsigned IndexTypeQuals, 14408 SourceRange BracketsRange) { 14409 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14410 IndexTypeQuals, BracketsRange); 14411 } 14412 14413 template<typename Derived> 14414 QualType 14415 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14416 ArrayType::ArraySizeModifier SizeMod, 14417 Expr *SizeExpr, 14418 unsigned IndexTypeQuals, 14419 SourceRange BracketsRange) { 14420 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14421 SizeExpr, 14422 IndexTypeQuals, BracketsRange); 14423 } 14424 14425 template<typename Derived> 14426 QualType 14427 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14428 ArrayType::ArraySizeModifier SizeMod, 14429 Expr *SizeExpr, 14430 unsigned IndexTypeQuals, 14431 SourceRange BracketsRange) { 14432 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14433 SizeExpr, 14434 IndexTypeQuals, BracketsRange); 14435 } 14436 14437 template <typename Derived> 14438 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14439 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14440 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14441 AttributeLoc); 14442 } 14443 14444 template <typename Derived> 14445 QualType 14446 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14447 unsigned NumElements, 14448 VectorType::VectorKind VecKind) { 14449 // FIXME: semantic checking! 14450 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14451 } 14452 14453 template <typename Derived> 14454 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14455 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14456 VectorType::VectorKind VecKind) { 14457 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14458 } 14459 14460 template<typename Derived> 14461 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14462 unsigned NumElements, 14463 SourceLocation AttributeLoc) { 14464 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14465 NumElements, true); 14466 IntegerLiteral *VectorSize 14467 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14468 AttributeLoc); 14469 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14470 } 14471 14472 template<typename Derived> 14473 QualType 14474 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14475 Expr *SizeExpr, 14476 SourceLocation AttributeLoc) { 14477 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14478 } 14479 14480 template <typename Derived> 14481 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14482 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14483 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14484 NumColumns); 14485 } 14486 14487 template <typename Derived> 14488 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14489 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14490 SourceLocation AttributeLoc) { 14491 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14492 AttributeLoc); 14493 } 14494 14495 template<typename Derived> 14496 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14497 QualType T, 14498 MutableArrayRef<QualType> ParamTypes, 14499 const FunctionProtoType::ExtProtoInfo &EPI) { 14500 return SemaRef.BuildFunctionType(T, ParamTypes, 14501 getDerived().getBaseLocation(), 14502 getDerived().getBaseEntity(), 14503 EPI); 14504 } 14505 14506 template<typename Derived> 14507 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14508 return SemaRef.Context.getFunctionNoProtoType(T); 14509 } 14510 14511 template<typename Derived> 14512 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14513 Decl *D) { 14514 assert(D && "no decl found"); 14515 if (D->isInvalidDecl()) return QualType(); 14516 14517 // FIXME: Doesn't account for ObjCInterfaceDecl! 14518 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14519 // A valid resolved using typename pack expansion decl can have multiple 14520 // UsingDecls, but they must each have exactly one type, and it must be 14521 // the same type in every case. But we must have at least one expansion! 14522 if (UPD->expansions().empty()) { 14523 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14524 << UPD->isCXXClassMember() << UPD; 14525 return QualType(); 14526 } 14527 14528 // We might still have some unresolved types. Try to pick a resolved type 14529 // if we can. The final instantiation will check that the remaining 14530 // unresolved types instantiate to the type we pick. 14531 QualType FallbackT; 14532 QualType T; 14533 for (auto *E : UPD->expansions()) { 14534 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14535 if (ThisT.isNull()) 14536 continue; 14537 else if (ThisT->getAs<UnresolvedUsingType>()) 14538 FallbackT = ThisT; 14539 else if (T.isNull()) 14540 T = ThisT; 14541 else 14542 assert(getSema().Context.hasSameType(ThisT, T) && 14543 "mismatched resolved types in using pack expansion"); 14544 } 14545 return T.isNull() ? FallbackT : T; 14546 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14547 assert(Using->hasTypename() && 14548 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14549 14550 // A valid resolved using typename decl points to exactly one type decl. 14551 assert(++Using->shadow_begin() == Using->shadow_end()); 14552 14553 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14554 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14555 return QualType(); 14556 return SemaRef.Context.getUsingType( 14557 Shadow, SemaRef.Context.getTypeDeclType( 14558 cast<TypeDecl>(Shadow->getTargetDecl()))); 14559 } else { 14560 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14561 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14562 return SemaRef.Context.getTypeDeclType( 14563 cast<UnresolvedUsingTypenameDecl>(D)); 14564 } 14565 } 14566 14567 template <typename Derived> 14568 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14569 SourceLocation) { 14570 return SemaRef.BuildTypeofExprType(E); 14571 } 14572 14573 template<typename Derived> 14574 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14575 return SemaRef.Context.getTypeOfType(Underlying); 14576 } 14577 14578 template <typename Derived> 14579 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14580 return SemaRef.BuildDecltypeType(E); 14581 } 14582 14583 template<typename Derived> 14584 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14585 UnaryTransformType::UTTKind UKind, 14586 SourceLocation Loc) { 14587 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14588 } 14589 14590 template<typename Derived> 14591 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14592 TemplateName Template, 14593 SourceLocation TemplateNameLoc, 14594 TemplateArgumentListInfo &TemplateArgs) { 14595 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14596 } 14597 14598 template<typename Derived> 14599 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14600 SourceLocation KWLoc) { 14601 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14602 } 14603 14604 template<typename Derived> 14605 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14606 SourceLocation KWLoc, 14607 bool isReadPipe) { 14608 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14609 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14610 } 14611 14612 template <typename Derived> 14613 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14614 unsigned NumBits, 14615 SourceLocation Loc) { 14616 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14617 NumBits, true); 14618 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14619 SemaRef.Context.IntTy, Loc); 14620 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14621 } 14622 14623 template <typename Derived> 14624 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14625 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14626 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14627 } 14628 14629 template<typename Derived> 14630 TemplateName 14631 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14632 bool TemplateKW, 14633 TemplateDecl *Template) { 14634 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14635 Template); 14636 } 14637 14638 template<typename Derived> 14639 TemplateName 14640 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14641 SourceLocation TemplateKWLoc, 14642 const IdentifierInfo &Name, 14643 SourceLocation NameLoc, 14644 QualType ObjectType, 14645 NamedDecl *FirstQualifierInScope, 14646 bool AllowInjectedClassName) { 14647 UnqualifiedId TemplateName; 14648 TemplateName.setIdentifier(&Name, NameLoc); 14649 Sema::TemplateTy Template; 14650 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14651 TemplateName, ParsedType::make(ObjectType), 14652 /*EnteringContext=*/false, Template, 14653 AllowInjectedClassName); 14654 return Template.get(); 14655 } 14656 14657 template<typename Derived> 14658 TemplateName 14659 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14660 SourceLocation TemplateKWLoc, 14661 OverloadedOperatorKind Operator, 14662 SourceLocation NameLoc, 14663 QualType ObjectType, 14664 bool AllowInjectedClassName) { 14665 UnqualifiedId Name; 14666 // FIXME: Bogus location information. 14667 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14668 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14669 Sema::TemplateTy Template; 14670 getSema().ActOnTemplateName( 14671 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14672 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14673 return Template.get(); 14674 } 14675 14676 template<typename Derived> 14677 ExprResult 14678 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14679 SourceLocation OpLoc, 14680 Expr *OrigCallee, 14681 Expr *First, 14682 Expr *Second) { 14683 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14684 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14685 14686 if (First->getObjectKind() == OK_ObjCProperty) { 14687 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14688 if (BinaryOperator::isAssignmentOp(Opc)) 14689 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14690 First, Second); 14691 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14692 if (Result.isInvalid()) 14693 return ExprError(); 14694 First = Result.get(); 14695 } 14696 14697 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14698 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14699 if (Result.isInvalid()) 14700 return ExprError(); 14701 Second = Result.get(); 14702 } 14703 14704 // Determine whether this should be a builtin operation. 14705 if (Op == OO_Subscript) { 14706 if (!First->getType()->isOverloadableType() && 14707 !Second->getType()->isOverloadableType()) 14708 return getSema().CreateBuiltinArraySubscriptExpr( 14709 First, Callee->getBeginLoc(), Second, OpLoc); 14710 } else if (Op == OO_Arrow) { 14711 // -> is never a builtin operation. 14712 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14713 } else if (Second == nullptr || isPostIncDec) { 14714 if (!First->getType()->isOverloadableType() || 14715 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14716 // The argument is not of overloadable type, or this is an expression 14717 // of the form &Class::member, so try to create a built-in unary 14718 // operation. 14719 UnaryOperatorKind Opc 14720 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14721 14722 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14723 } 14724 } else { 14725 if (!First->getType()->isOverloadableType() && 14726 !Second->getType()->isOverloadableType()) { 14727 // Neither of the arguments is an overloadable type, so try to 14728 // create a built-in binary operation. 14729 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14730 ExprResult Result 14731 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14732 if (Result.isInvalid()) 14733 return ExprError(); 14734 14735 return Result; 14736 } 14737 } 14738 14739 // Compute the transformed set of functions (and function templates) to be 14740 // used during overload resolution. 14741 UnresolvedSet<16> Functions; 14742 bool RequiresADL; 14743 14744 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14745 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14746 // If the overload could not be resolved in the template definition 14747 // (because we had a dependent argument), ADL is performed as part of 14748 // template instantiation. 14749 RequiresADL = ULE->requiresADL(); 14750 } else { 14751 // If we've resolved this to a particular non-member function, just call 14752 // that function. If we resolved it to a member function, 14753 // CreateOverloaded* will find that function for us. 14754 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14755 if (!isa<CXXMethodDecl>(ND)) 14756 Functions.addDecl(ND); 14757 RequiresADL = false; 14758 } 14759 14760 // Add any functions found via argument-dependent lookup. 14761 Expr *Args[2] = { First, Second }; 14762 unsigned NumArgs = 1 + (Second != nullptr); 14763 14764 // Create the overloaded operator invocation for unary operators. 14765 if (NumArgs == 1 || isPostIncDec) { 14766 UnaryOperatorKind Opc 14767 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14768 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14769 RequiresADL); 14770 } 14771 14772 if (Op == OO_Subscript) { 14773 SourceLocation LBrace; 14774 SourceLocation RBrace; 14775 14776 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14777 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14778 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14779 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14780 } else { 14781 LBrace = Callee->getBeginLoc(); 14782 RBrace = OpLoc; 14783 } 14784 14785 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14786 First, Second); 14787 } 14788 14789 // Create the overloaded operator invocation for binary operators. 14790 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14791 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14792 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14793 if (Result.isInvalid()) 14794 return ExprError(); 14795 14796 return Result; 14797 } 14798 14799 template<typename Derived> 14800 ExprResult 14801 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14802 SourceLocation OperatorLoc, 14803 bool isArrow, 14804 CXXScopeSpec &SS, 14805 TypeSourceInfo *ScopeType, 14806 SourceLocation CCLoc, 14807 SourceLocation TildeLoc, 14808 PseudoDestructorTypeStorage Destroyed) { 14809 QualType BaseType = Base->getType(); 14810 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14811 (!isArrow && !BaseType->getAs<RecordType>()) || 14812 (isArrow && BaseType->getAs<PointerType>() && 14813 !BaseType->castAs<PointerType>()->getPointeeType() 14814 ->template getAs<RecordType>())){ 14815 // This pseudo-destructor expression is still a pseudo-destructor. 14816 return SemaRef.BuildPseudoDestructorExpr( 14817 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14818 CCLoc, TildeLoc, Destroyed); 14819 } 14820 14821 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14822 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14823 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14824 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14825 NameInfo.setNamedTypeInfo(DestroyedType); 14826 14827 // The scope type is now known to be a valid nested name specifier 14828 // component. Tack it on to the end of the nested name specifier. 14829 if (ScopeType) { 14830 if (!ScopeType->getType()->getAs<TagType>()) { 14831 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14832 diag::err_expected_class_or_namespace) 14833 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14834 return ExprError(); 14835 } 14836 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14837 CCLoc); 14838 } 14839 14840 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14841 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14842 OperatorLoc, isArrow, 14843 SS, TemplateKWLoc, 14844 /*FIXME: FirstQualifier*/ nullptr, 14845 NameInfo, 14846 /*TemplateArgs*/ nullptr, 14847 /*S*/nullptr); 14848 } 14849 14850 template<typename Derived> 14851 StmtResult 14852 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14853 SourceLocation Loc = S->getBeginLoc(); 14854 CapturedDecl *CD = S->getCapturedDecl(); 14855 unsigned NumParams = CD->getNumParams(); 14856 unsigned ContextParamPos = CD->getContextParamPosition(); 14857 SmallVector<Sema::CapturedParamNameType, 4> Params; 14858 for (unsigned I = 0; I < NumParams; ++I) { 14859 if (I != ContextParamPos) { 14860 Params.push_back( 14861 std::make_pair( 14862 CD->getParam(I)->getName(), 14863 getDerived().TransformType(CD->getParam(I)->getType()))); 14864 } else { 14865 Params.push_back(std::make_pair(StringRef(), QualType())); 14866 } 14867 } 14868 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14869 S->getCapturedRegionKind(), Params); 14870 StmtResult Body; 14871 { 14872 Sema::CompoundScopeRAII CompoundScope(getSema()); 14873 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14874 } 14875 14876 if (Body.isInvalid()) { 14877 getSema().ActOnCapturedRegionError(); 14878 return StmtError(); 14879 } 14880 14881 return getSema().ActOnCapturedRegionEnd(Body.get()); 14882 } 14883 14884 } // end namespace clang 14885 14886 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14887