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 typedef type. 937 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 938 return SemaRef.Context.getTypeDeclType(Typedef); 939 } 940 941 /// Build a new MacroDefined type. 942 QualType RebuildMacroQualifiedType(QualType T, 943 const IdentifierInfo *MacroII) { 944 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 945 } 946 947 /// Build a new class/struct/union type. 948 QualType RebuildRecordType(RecordDecl *Record) { 949 return SemaRef.Context.getTypeDeclType(Record); 950 } 951 952 /// Build a new Enum type. 953 QualType RebuildEnumType(EnumDecl *Enum) { 954 return SemaRef.Context.getTypeDeclType(Enum); 955 } 956 957 /// Build a new typeof(expr) type. 958 /// 959 /// By default, performs semantic analysis when building the typeof type. 960 /// Subclasses may override this routine to provide different behavior. 961 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 962 963 /// Build a new typeof(type) type. 964 /// 965 /// By default, builds a new TypeOfType with the given underlying type. 966 QualType RebuildTypeOfType(QualType Underlying); 967 968 /// Build a new unary transform type. 969 QualType RebuildUnaryTransformType(QualType BaseType, 970 UnaryTransformType::UTTKind UKind, 971 SourceLocation Loc); 972 973 /// Build a new C++11 decltype type. 974 /// 975 /// By default, performs semantic analysis when building the decltype type. 976 /// Subclasses may override this routine to provide different behavior. 977 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 978 979 /// Build a new C++11 auto type. 980 /// 981 /// By default, builds a new AutoType with the given deduced type. 982 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 983 ConceptDecl *TypeConstraintConcept, 984 ArrayRef<TemplateArgument> TypeConstraintArgs) { 985 // Note, IsDependent is always false here: we implicitly convert an 'auto' 986 // which has been deduced to a dependent type into an undeduced 'auto', so 987 // that we'll retry deduction after the transformation. 988 return SemaRef.Context.getAutoType(Deduced, Keyword, 989 /*IsDependent*/ false, /*IsPack=*/false, 990 TypeConstraintConcept, 991 TypeConstraintArgs); 992 } 993 994 /// By default, builds a new DeducedTemplateSpecializationType with the given 995 /// deduced type. 996 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 997 QualType Deduced) { 998 return SemaRef.Context.getDeducedTemplateSpecializationType( 999 Template, Deduced, /*IsDependent*/ false); 1000 } 1001 1002 /// Build a new template specialization type. 1003 /// 1004 /// By default, performs semantic analysis when building the template 1005 /// specialization type. Subclasses may override this routine to provide 1006 /// different behavior. 1007 QualType RebuildTemplateSpecializationType(TemplateName Template, 1008 SourceLocation TemplateLoc, 1009 TemplateArgumentListInfo &Args); 1010 1011 /// Build a new parenthesized type. 1012 /// 1013 /// By default, builds a new ParenType type from the inner type. 1014 /// Subclasses may override this routine to provide different behavior. 1015 QualType RebuildParenType(QualType InnerType) { 1016 return SemaRef.BuildParenType(InnerType); 1017 } 1018 1019 /// Build a new qualified name type. 1020 /// 1021 /// By default, builds a new ElaboratedType type from the keyword, 1022 /// the nested-name-specifier and the named type. 1023 /// Subclasses may override this routine to provide different behavior. 1024 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1025 ElaboratedTypeKeyword Keyword, 1026 NestedNameSpecifierLoc QualifierLoc, 1027 QualType Named) { 1028 return SemaRef.Context.getElaboratedType(Keyword, 1029 QualifierLoc.getNestedNameSpecifier(), 1030 Named); 1031 } 1032 1033 /// Build a new typename type that refers to a template-id. 1034 /// 1035 /// By default, builds a new DependentNameType type from the 1036 /// nested-name-specifier and the given type. Subclasses may override 1037 /// this routine to provide different behavior. 1038 QualType RebuildDependentTemplateSpecializationType( 1039 ElaboratedTypeKeyword Keyword, 1040 NestedNameSpecifierLoc QualifierLoc, 1041 SourceLocation TemplateKWLoc, 1042 const IdentifierInfo *Name, 1043 SourceLocation NameLoc, 1044 TemplateArgumentListInfo &Args, 1045 bool AllowInjectedClassName) { 1046 // Rebuild the template name. 1047 // TODO: avoid TemplateName abstraction 1048 CXXScopeSpec SS; 1049 SS.Adopt(QualifierLoc); 1050 TemplateName InstName = getDerived().RebuildTemplateName( 1051 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1052 AllowInjectedClassName); 1053 1054 if (InstName.isNull()) 1055 return QualType(); 1056 1057 // If it's still dependent, make a dependent specialization. 1058 if (InstName.getAsDependentTemplateName()) 1059 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1060 QualifierLoc.getNestedNameSpecifier(), 1061 Name, 1062 Args); 1063 1064 // Otherwise, make an elaborated type wrapping a non-dependent 1065 // specialization. 1066 QualType T = 1067 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1068 if (T.isNull()) return QualType(); 1069 1070 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1071 return T; 1072 1073 return SemaRef.Context.getElaboratedType(Keyword, 1074 QualifierLoc.getNestedNameSpecifier(), 1075 T); 1076 } 1077 1078 /// Build a new typename type that refers to an identifier. 1079 /// 1080 /// By default, performs semantic analysis when building the typename type 1081 /// (or elaborated type). Subclasses may override this routine to provide 1082 /// different behavior. 1083 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1084 SourceLocation KeywordLoc, 1085 NestedNameSpecifierLoc QualifierLoc, 1086 const IdentifierInfo *Id, 1087 SourceLocation IdLoc, 1088 bool DeducedTSTContext) { 1089 CXXScopeSpec SS; 1090 SS.Adopt(QualifierLoc); 1091 1092 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1093 // If the name is still dependent, just build a new dependent name type. 1094 if (!SemaRef.computeDeclContext(SS)) 1095 return SemaRef.Context.getDependentNameType(Keyword, 1096 QualifierLoc.getNestedNameSpecifier(), 1097 Id); 1098 } 1099 1100 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1101 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1102 *Id, IdLoc, DeducedTSTContext); 1103 } 1104 1105 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1106 1107 // We had a dependent elaborated-type-specifier that has been transformed 1108 // into a non-dependent elaborated-type-specifier. Find the tag we're 1109 // referring to. 1110 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1111 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1112 if (!DC) 1113 return QualType(); 1114 1115 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1116 return QualType(); 1117 1118 TagDecl *Tag = nullptr; 1119 SemaRef.LookupQualifiedName(Result, DC); 1120 switch (Result.getResultKind()) { 1121 case LookupResult::NotFound: 1122 case LookupResult::NotFoundInCurrentInstantiation: 1123 break; 1124 1125 case LookupResult::Found: 1126 Tag = Result.getAsSingle<TagDecl>(); 1127 break; 1128 1129 case LookupResult::FoundOverloaded: 1130 case LookupResult::FoundUnresolvedValue: 1131 llvm_unreachable("Tag lookup cannot find non-tags"); 1132 1133 case LookupResult::Ambiguous: 1134 // Let the LookupResult structure handle ambiguities. 1135 return QualType(); 1136 } 1137 1138 if (!Tag) { 1139 // Check where the name exists but isn't a tag type and use that to emit 1140 // better diagnostics. 1141 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1142 SemaRef.LookupQualifiedName(Result, DC); 1143 switch (Result.getResultKind()) { 1144 case LookupResult::Found: 1145 case LookupResult::FoundOverloaded: 1146 case LookupResult::FoundUnresolvedValue: { 1147 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1148 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1149 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1150 << NTK << Kind; 1151 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1152 break; 1153 } 1154 default: 1155 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1156 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1157 break; 1158 } 1159 return QualType(); 1160 } 1161 1162 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1163 IdLoc, Id)) { 1164 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1165 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1166 return QualType(); 1167 } 1168 1169 // Build the elaborated-type-specifier type. 1170 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1171 return SemaRef.Context.getElaboratedType(Keyword, 1172 QualifierLoc.getNestedNameSpecifier(), 1173 T); 1174 } 1175 1176 /// Build a new pack expansion type. 1177 /// 1178 /// By default, builds a new PackExpansionType type from the given pattern. 1179 /// Subclasses may override this routine to provide different behavior. 1180 QualType RebuildPackExpansionType(QualType Pattern, 1181 SourceRange PatternRange, 1182 SourceLocation EllipsisLoc, 1183 Optional<unsigned> NumExpansions) { 1184 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1185 NumExpansions); 1186 } 1187 1188 /// Build a new atomic type given its value type. 1189 /// 1190 /// By default, performs semantic analysis when building the atomic type. 1191 /// Subclasses may override this routine to provide different behavior. 1192 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1193 1194 /// Build a new pipe type given its value type. 1195 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1196 bool isReadPipe); 1197 1198 /// Build an extended int given its value type. 1199 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1200 SourceLocation Loc); 1201 1202 /// Build a dependent extended int given its value type. 1203 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1204 SourceLocation Loc); 1205 1206 /// Build a new template name given a nested name specifier, a flag 1207 /// indicating whether the "template" keyword was provided, and the template 1208 /// that the template name refers to. 1209 /// 1210 /// By default, builds the new template name directly. Subclasses may override 1211 /// this routine to provide different behavior. 1212 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1213 bool TemplateKW, 1214 TemplateDecl *Template); 1215 1216 /// Build a new template name given a nested name specifier and the 1217 /// name that is referred to as a template. 1218 /// 1219 /// By default, performs semantic analysis to determine whether the name can 1220 /// be resolved to a specific template, then builds the appropriate kind of 1221 /// template name. Subclasses may override this routine to provide different 1222 /// behavior. 1223 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1224 SourceLocation TemplateKWLoc, 1225 const IdentifierInfo &Name, 1226 SourceLocation NameLoc, QualType ObjectType, 1227 NamedDecl *FirstQualifierInScope, 1228 bool AllowInjectedClassName); 1229 1230 /// Build a new template name given a nested name specifier and the 1231 /// overloaded operator name that is referred to as a template. 1232 /// 1233 /// By default, performs semantic analysis to determine whether the name can 1234 /// be resolved to a specific template, then builds the appropriate kind of 1235 /// template name. Subclasses may override this routine to provide different 1236 /// behavior. 1237 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1238 SourceLocation TemplateKWLoc, 1239 OverloadedOperatorKind Operator, 1240 SourceLocation NameLoc, QualType ObjectType, 1241 bool AllowInjectedClassName); 1242 1243 /// Build a new template name given a template template parameter pack 1244 /// and the 1245 /// 1246 /// By default, performs semantic analysis to determine whether the name can 1247 /// be resolved to a specific template, then builds the appropriate kind of 1248 /// template name. Subclasses may override this routine to provide different 1249 /// behavior. 1250 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1251 const TemplateArgument &ArgPack) { 1252 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1253 } 1254 1255 /// Build a new compound statement. 1256 /// 1257 /// By default, performs semantic analysis to build the new statement. 1258 /// Subclasses may override this routine to provide different behavior. 1259 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1260 MultiStmtArg Statements, 1261 SourceLocation RBraceLoc, 1262 bool IsStmtExpr) { 1263 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1264 IsStmtExpr); 1265 } 1266 1267 /// Build a new case statement. 1268 /// 1269 /// By default, performs semantic analysis to build the new statement. 1270 /// Subclasses may override this routine to provide different behavior. 1271 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1272 Expr *LHS, 1273 SourceLocation EllipsisLoc, 1274 Expr *RHS, 1275 SourceLocation ColonLoc) { 1276 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1277 ColonLoc); 1278 } 1279 1280 /// Attach the body to a new case statement. 1281 /// 1282 /// By default, performs semantic analysis to build the new statement. 1283 /// Subclasses may override this routine to provide different behavior. 1284 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1285 getSema().ActOnCaseStmtBody(S, Body); 1286 return S; 1287 } 1288 1289 /// Build a new default statement. 1290 /// 1291 /// By default, performs semantic analysis to build the new statement. 1292 /// Subclasses may override this routine to provide different behavior. 1293 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1294 SourceLocation ColonLoc, 1295 Stmt *SubStmt) { 1296 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1297 /*CurScope=*/nullptr); 1298 } 1299 1300 /// Build a new label statement. 1301 /// 1302 /// By default, performs semantic analysis to build the new statement. 1303 /// Subclasses may override this routine to provide different behavior. 1304 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1305 SourceLocation ColonLoc, Stmt *SubStmt) { 1306 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1307 } 1308 1309 /// Build a new attributed statement. 1310 /// 1311 /// By default, performs semantic analysis to build the new statement. 1312 /// Subclasses may override this routine to provide different behavior. 1313 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1314 ArrayRef<const Attr *> Attrs, 1315 Stmt *SubStmt) { 1316 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1317 } 1318 1319 /// Build a new "if" statement. 1320 /// 1321 /// By default, performs semantic analysis to build the new statement. 1322 /// Subclasses may override this routine to provide different behavior. 1323 StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind, 1324 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1325 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1326 SourceLocation ElseLoc, Stmt *Else) { 1327 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1328 Then, ElseLoc, Else); 1329 } 1330 1331 /// Start building a new switch statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1336 SourceLocation LParenLoc, Stmt *Init, 1337 Sema::ConditionResult Cond, 1338 SourceLocation RParenLoc) { 1339 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1340 RParenLoc); 1341 } 1342 1343 /// Attach the body to the switch statement. 1344 /// 1345 /// By default, performs semantic analysis to build the new statement. 1346 /// Subclasses may override this routine to provide different behavior. 1347 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1348 Stmt *Switch, Stmt *Body) { 1349 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1350 } 1351 1352 /// Build a new while statement. 1353 /// 1354 /// By default, performs semantic analysis to build the new statement. 1355 /// Subclasses may override this routine to provide different behavior. 1356 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1357 Sema::ConditionResult Cond, 1358 SourceLocation RParenLoc, Stmt *Body) { 1359 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1360 } 1361 1362 /// Build a new do-while statement. 1363 /// 1364 /// By default, performs semantic analysis to build the new statement. 1365 /// Subclasses may override this routine to provide different behavior. 1366 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1367 SourceLocation WhileLoc, SourceLocation LParenLoc, 1368 Expr *Cond, SourceLocation RParenLoc) { 1369 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1370 Cond, RParenLoc); 1371 } 1372 1373 /// Build a new for statement. 1374 /// 1375 /// By default, performs semantic analysis to build the new statement. 1376 /// Subclasses may override this routine to provide different behavior. 1377 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1378 Stmt *Init, Sema::ConditionResult Cond, 1379 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1380 Stmt *Body) { 1381 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1382 Inc, RParenLoc, Body); 1383 } 1384 1385 /// Build a new goto statement. 1386 /// 1387 /// By default, performs semantic analysis to build the new statement. 1388 /// Subclasses may override this routine to provide different behavior. 1389 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1390 LabelDecl *Label) { 1391 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1392 } 1393 1394 /// Build a new indirect goto statement. 1395 /// 1396 /// By default, performs semantic analysis to build the new statement. 1397 /// Subclasses may override this routine to provide different behavior. 1398 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1399 SourceLocation StarLoc, 1400 Expr *Target) { 1401 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1402 } 1403 1404 /// Build a new return statement. 1405 /// 1406 /// By default, performs semantic analysis to build the new statement. 1407 /// Subclasses may override this routine to provide different behavior. 1408 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1409 return getSema().BuildReturnStmt(ReturnLoc, Result); 1410 } 1411 1412 /// Build a new declaration statement. 1413 /// 1414 /// By default, performs semantic analysis to build the new statement. 1415 /// Subclasses may override this routine to provide different behavior. 1416 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1417 SourceLocation StartLoc, SourceLocation EndLoc) { 1418 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1419 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1420 } 1421 1422 /// Build a new inline asm statement. 1423 /// 1424 /// By default, performs semantic analysis to build the new statement. 1425 /// Subclasses may override this routine to provide different behavior. 1426 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1427 bool IsVolatile, unsigned NumOutputs, 1428 unsigned NumInputs, IdentifierInfo **Names, 1429 MultiExprArg Constraints, MultiExprArg Exprs, 1430 Expr *AsmString, MultiExprArg Clobbers, 1431 unsigned NumLabels, 1432 SourceLocation RParenLoc) { 1433 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1434 NumInputs, Names, Constraints, Exprs, 1435 AsmString, Clobbers, NumLabels, RParenLoc); 1436 } 1437 1438 /// Build a new MS style inline asm statement. 1439 /// 1440 /// By default, performs semantic analysis to build the new statement. 1441 /// Subclasses may override this routine to provide different behavior. 1442 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1443 ArrayRef<Token> AsmToks, 1444 StringRef AsmString, 1445 unsigned NumOutputs, unsigned NumInputs, 1446 ArrayRef<StringRef> Constraints, 1447 ArrayRef<StringRef> Clobbers, 1448 ArrayRef<Expr*> Exprs, 1449 SourceLocation EndLoc) { 1450 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1451 NumOutputs, NumInputs, 1452 Constraints, Clobbers, Exprs, EndLoc); 1453 } 1454 1455 /// Build a new co_return statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1460 bool IsImplicit) { 1461 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1462 } 1463 1464 /// Build a new co_await expression. 1465 /// 1466 /// By default, performs semantic analysis to build the new expression. 1467 /// Subclasses may override this routine to provide different behavior. 1468 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1469 bool IsImplicit) { 1470 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1471 } 1472 1473 /// Build a new co_await expression. 1474 /// 1475 /// By default, performs semantic analysis to build the new expression. 1476 /// Subclasses may override this routine to provide different behavior. 1477 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1478 Expr *Result, 1479 UnresolvedLookupExpr *Lookup) { 1480 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1481 } 1482 1483 /// Build a new co_yield expression. 1484 /// 1485 /// By default, performs semantic analysis to build the new expression. 1486 /// Subclasses may override this routine to provide different behavior. 1487 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1488 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1489 } 1490 1491 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1492 return getSema().BuildCoroutineBodyStmt(Args); 1493 } 1494 1495 /// Build a new Objective-C \@try statement. 1496 /// 1497 /// By default, performs semantic analysis to build the new statement. 1498 /// Subclasses may override this routine to provide different behavior. 1499 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1500 Stmt *TryBody, 1501 MultiStmtArg CatchStmts, 1502 Stmt *Finally) { 1503 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1504 Finally); 1505 } 1506 1507 /// Rebuild an Objective-C exception declaration. 1508 /// 1509 /// By default, performs semantic analysis to build the new declaration. 1510 /// Subclasses may override this routine to provide different behavior. 1511 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1512 TypeSourceInfo *TInfo, QualType T) { 1513 return getSema().BuildObjCExceptionDecl(TInfo, T, 1514 ExceptionDecl->getInnerLocStart(), 1515 ExceptionDecl->getLocation(), 1516 ExceptionDecl->getIdentifier()); 1517 } 1518 1519 /// Build a new Objective-C \@catch statement. 1520 /// 1521 /// By default, performs semantic analysis to build the new statement. 1522 /// Subclasses may override this routine to provide different behavior. 1523 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1524 SourceLocation RParenLoc, 1525 VarDecl *Var, 1526 Stmt *Body) { 1527 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1528 Var, Body); 1529 } 1530 1531 /// Build a new Objective-C \@finally statement. 1532 /// 1533 /// By default, performs semantic analysis to build the new statement. 1534 /// Subclasses may override this routine to provide different behavior. 1535 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1536 Stmt *Body) { 1537 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1538 } 1539 1540 /// Build a new Objective-C \@throw statement. 1541 /// 1542 /// By default, performs semantic analysis to build the new statement. 1543 /// Subclasses may override this routine to provide different behavior. 1544 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1545 Expr *Operand) { 1546 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1547 } 1548 1549 /// Build a new OpenMP Canonical loop. 1550 /// 1551 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1552 /// OMPCanonicalLoop. 1553 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1554 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1555 } 1556 1557 /// Build a new OpenMP executable directive. 1558 /// 1559 /// By default, performs semantic analysis to build the new statement. 1560 /// Subclasses may override this routine to provide different behavior. 1561 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1562 DeclarationNameInfo DirName, 1563 OpenMPDirectiveKind CancelRegion, 1564 ArrayRef<OMPClause *> Clauses, 1565 Stmt *AStmt, SourceLocation StartLoc, 1566 SourceLocation EndLoc) { 1567 return getSema().ActOnOpenMPExecutableDirective( 1568 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1569 } 1570 1571 /// Build a new OpenMP 'if' clause. 1572 /// 1573 /// By default, performs semantic analysis to build the new OpenMP clause. 1574 /// Subclasses may override this routine to provide different behavior. 1575 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1576 Expr *Condition, SourceLocation StartLoc, 1577 SourceLocation LParenLoc, 1578 SourceLocation NameModifierLoc, 1579 SourceLocation ColonLoc, 1580 SourceLocation EndLoc) { 1581 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1582 LParenLoc, NameModifierLoc, ColonLoc, 1583 EndLoc); 1584 } 1585 1586 /// Build a new OpenMP 'final' clause. 1587 /// 1588 /// By default, performs semantic analysis to build the new OpenMP clause. 1589 /// Subclasses may override this routine to provide different behavior. 1590 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1591 SourceLocation LParenLoc, 1592 SourceLocation EndLoc) { 1593 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1594 EndLoc); 1595 } 1596 1597 /// Build a new OpenMP 'num_threads' clause. 1598 /// 1599 /// By default, performs semantic analysis to build the new OpenMP clause. 1600 /// Subclasses may override this routine to provide different behavior. 1601 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1602 SourceLocation StartLoc, 1603 SourceLocation LParenLoc, 1604 SourceLocation EndLoc) { 1605 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1606 LParenLoc, EndLoc); 1607 } 1608 1609 /// Build a new OpenMP 'safelen' clause. 1610 /// 1611 /// By default, performs semantic analysis to build the new OpenMP clause. 1612 /// Subclasses may override this routine to provide different behavior. 1613 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1614 SourceLocation LParenLoc, 1615 SourceLocation EndLoc) { 1616 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1617 } 1618 1619 /// Build a new OpenMP 'simdlen' clause. 1620 /// 1621 /// By default, performs semantic analysis to build the new OpenMP clause. 1622 /// Subclasses may override this routine to provide different behavior. 1623 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1624 SourceLocation LParenLoc, 1625 SourceLocation EndLoc) { 1626 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1627 } 1628 1629 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1634 } 1635 1636 /// Build a new OpenMP 'full' clause. 1637 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1638 SourceLocation EndLoc) { 1639 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1640 } 1641 1642 /// Build a new OpenMP 'partial' clause. 1643 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1644 SourceLocation LParenLoc, 1645 SourceLocation EndLoc) { 1646 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1647 EndLoc); 1648 } 1649 1650 /// Build a new OpenMP 'allocator' clause. 1651 /// 1652 /// By default, performs semantic analysis to build the new OpenMP clause. 1653 /// Subclasses may override this routine to provide different behavior. 1654 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1655 SourceLocation LParenLoc, 1656 SourceLocation EndLoc) { 1657 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1658 } 1659 1660 /// Build a new OpenMP 'collapse' clause. 1661 /// 1662 /// By default, performs semantic analysis to build the new OpenMP clause. 1663 /// Subclasses may override this routine to provide different behavior. 1664 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1665 SourceLocation LParenLoc, 1666 SourceLocation EndLoc) { 1667 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1668 EndLoc); 1669 } 1670 1671 /// Build a new OpenMP 'default' clause. 1672 /// 1673 /// By default, performs semantic analysis to build the new OpenMP clause. 1674 /// Subclasses may override this routine to provide different behavior. 1675 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1676 SourceLocation StartLoc, 1677 SourceLocation LParenLoc, 1678 SourceLocation EndLoc) { 1679 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1680 StartLoc, LParenLoc, EndLoc); 1681 } 1682 1683 /// Build a new OpenMP 'proc_bind' clause. 1684 /// 1685 /// By default, performs semantic analysis to build the new OpenMP clause. 1686 /// Subclasses may override this routine to provide different behavior. 1687 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1688 SourceLocation KindKwLoc, 1689 SourceLocation StartLoc, 1690 SourceLocation LParenLoc, 1691 SourceLocation EndLoc) { 1692 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1693 StartLoc, LParenLoc, EndLoc); 1694 } 1695 1696 /// Build a new OpenMP 'schedule' clause. 1697 /// 1698 /// By default, performs semantic analysis to build the new OpenMP clause. 1699 /// Subclasses may override this routine to provide different behavior. 1700 OMPClause *RebuildOMPScheduleClause( 1701 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1702 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1703 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1704 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1705 return getSema().ActOnOpenMPScheduleClause( 1706 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1707 CommaLoc, EndLoc); 1708 } 1709 1710 /// Build a new OpenMP 'ordered' clause. 1711 /// 1712 /// By default, performs semantic analysis to build the new OpenMP clause. 1713 /// Subclasses may override this routine to provide different behavior. 1714 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1715 SourceLocation EndLoc, 1716 SourceLocation LParenLoc, Expr *Num) { 1717 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1718 } 1719 1720 /// Build a new OpenMP 'private' clause. 1721 /// 1722 /// By default, performs semantic analysis to build the new OpenMP clause. 1723 /// Subclasses may override this routine to provide different behavior. 1724 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1725 SourceLocation StartLoc, 1726 SourceLocation LParenLoc, 1727 SourceLocation EndLoc) { 1728 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1729 EndLoc); 1730 } 1731 1732 /// Build a new OpenMP 'firstprivate' clause. 1733 /// 1734 /// By default, performs semantic analysis to build the new OpenMP clause. 1735 /// Subclasses may override this routine to provide different behavior. 1736 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1737 SourceLocation StartLoc, 1738 SourceLocation LParenLoc, 1739 SourceLocation EndLoc) { 1740 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1741 EndLoc); 1742 } 1743 1744 /// Build a new OpenMP 'lastprivate' clause. 1745 /// 1746 /// By default, performs semantic analysis to build the new OpenMP clause. 1747 /// Subclasses may override this routine to provide different behavior. 1748 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1749 OpenMPLastprivateModifier LPKind, 1750 SourceLocation LPKindLoc, 1751 SourceLocation ColonLoc, 1752 SourceLocation StartLoc, 1753 SourceLocation LParenLoc, 1754 SourceLocation EndLoc) { 1755 return getSema().ActOnOpenMPLastprivateClause( 1756 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1757 } 1758 1759 /// Build a new OpenMP 'shared' clause. 1760 /// 1761 /// By default, performs semantic analysis to build the new OpenMP clause. 1762 /// Subclasses may override this routine to provide different behavior. 1763 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1764 SourceLocation StartLoc, 1765 SourceLocation LParenLoc, 1766 SourceLocation EndLoc) { 1767 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1768 EndLoc); 1769 } 1770 1771 /// Build a new OpenMP 'reduction' clause. 1772 /// 1773 /// By default, performs semantic analysis to build the new statement. 1774 /// Subclasses may override this routine to provide different behavior. 1775 OMPClause *RebuildOMPReductionClause( 1776 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1777 SourceLocation StartLoc, SourceLocation LParenLoc, 1778 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1779 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1780 const DeclarationNameInfo &ReductionId, 1781 ArrayRef<Expr *> UnresolvedReductions) { 1782 return getSema().ActOnOpenMPReductionClause( 1783 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1784 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1785 } 1786 1787 /// Build a new OpenMP 'task_reduction' clause. 1788 /// 1789 /// By default, performs semantic analysis to build the new statement. 1790 /// Subclasses may override this routine to provide different behavior. 1791 OMPClause *RebuildOMPTaskReductionClause( 1792 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1793 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1794 CXXScopeSpec &ReductionIdScopeSpec, 1795 const DeclarationNameInfo &ReductionId, 1796 ArrayRef<Expr *> UnresolvedReductions) { 1797 return getSema().ActOnOpenMPTaskReductionClause( 1798 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1799 ReductionId, UnresolvedReductions); 1800 } 1801 1802 /// Build a new OpenMP 'in_reduction' clause. 1803 /// 1804 /// By default, performs semantic analysis to build the new statement. 1805 /// Subclasses may override this routine to provide different behavior. 1806 OMPClause * 1807 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1808 SourceLocation LParenLoc, SourceLocation ColonLoc, 1809 SourceLocation EndLoc, 1810 CXXScopeSpec &ReductionIdScopeSpec, 1811 const DeclarationNameInfo &ReductionId, 1812 ArrayRef<Expr *> UnresolvedReductions) { 1813 return getSema().ActOnOpenMPInReductionClause( 1814 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1815 ReductionId, UnresolvedReductions); 1816 } 1817 1818 /// Build a new OpenMP 'linear' clause. 1819 /// 1820 /// By default, performs semantic analysis to build the new OpenMP clause. 1821 /// Subclasses may override this routine to provide different behavior. 1822 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1823 SourceLocation StartLoc, 1824 SourceLocation LParenLoc, 1825 OpenMPLinearClauseKind Modifier, 1826 SourceLocation ModifierLoc, 1827 SourceLocation ColonLoc, 1828 SourceLocation EndLoc) { 1829 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1830 Modifier, ModifierLoc, ColonLoc, 1831 EndLoc); 1832 } 1833 1834 /// Build a new OpenMP 'aligned' clause. 1835 /// 1836 /// By default, performs semantic analysis to build the new OpenMP clause. 1837 /// Subclasses may override this routine to provide different behavior. 1838 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1839 SourceLocation StartLoc, 1840 SourceLocation LParenLoc, 1841 SourceLocation ColonLoc, 1842 SourceLocation EndLoc) { 1843 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1844 LParenLoc, ColonLoc, EndLoc); 1845 } 1846 1847 /// Build a new OpenMP 'copyin' clause. 1848 /// 1849 /// By default, performs semantic analysis to build the new OpenMP clause. 1850 /// Subclasses may override this routine to provide different behavior. 1851 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1852 SourceLocation StartLoc, 1853 SourceLocation LParenLoc, 1854 SourceLocation EndLoc) { 1855 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1856 EndLoc); 1857 } 1858 1859 /// Build a new OpenMP 'copyprivate' clause. 1860 /// 1861 /// By default, performs semantic analysis to build the new OpenMP clause. 1862 /// Subclasses may override this routine to provide different behavior. 1863 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1864 SourceLocation StartLoc, 1865 SourceLocation LParenLoc, 1866 SourceLocation EndLoc) { 1867 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1868 EndLoc); 1869 } 1870 1871 /// Build a new OpenMP 'flush' pseudo clause. 1872 /// 1873 /// By default, performs semantic analysis to build the new OpenMP clause. 1874 /// Subclasses may override this routine to provide different behavior. 1875 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1876 SourceLocation StartLoc, 1877 SourceLocation LParenLoc, 1878 SourceLocation EndLoc) { 1879 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1880 EndLoc); 1881 } 1882 1883 /// Build a new OpenMP 'depobj' pseudo clause. 1884 /// 1885 /// By default, performs semantic analysis to build the new OpenMP clause. 1886 /// Subclasses may override this routine to provide different behavior. 1887 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1888 SourceLocation LParenLoc, 1889 SourceLocation EndLoc) { 1890 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1891 EndLoc); 1892 } 1893 1894 /// Build a new OpenMP 'depend' pseudo clause. 1895 /// 1896 /// By default, performs semantic analysis to build the new OpenMP clause. 1897 /// Subclasses may override this routine to provide different behavior. 1898 OMPClause * 1899 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1900 SourceLocation DepLoc, SourceLocation ColonLoc, 1901 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1902 SourceLocation LParenLoc, SourceLocation EndLoc) { 1903 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1904 ColonLoc, VarList, StartLoc, 1905 LParenLoc, EndLoc); 1906 } 1907 1908 /// Build a new OpenMP 'device' clause. 1909 /// 1910 /// By default, performs semantic analysis to build the new statement. 1911 /// Subclasses may override this routine to provide different behavior. 1912 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1913 Expr *Device, SourceLocation StartLoc, 1914 SourceLocation LParenLoc, 1915 SourceLocation ModifierLoc, 1916 SourceLocation EndLoc) { 1917 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1918 LParenLoc, ModifierLoc, EndLoc); 1919 } 1920 1921 /// Build a new OpenMP 'map' clause. 1922 /// 1923 /// By default, performs semantic analysis to build the new OpenMP clause. 1924 /// Subclasses may override this routine to provide different behavior. 1925 OMPClause *RebuildOMPMapClause( 1926 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1927 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1928 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1929 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1930 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1931 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1932 return getSema().ActOnOpenMPMapClause( 1933 MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId, 1934 MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs, 1935 /*NoDiagnose=*/false, UnresolvedMappers); 1936 } 1937 1938 /// Build a new OpenMP 'allocate' clause. 1939 /// 1940 /// By default, performs semantic analysis to build the new OpenMP clause. 1941 /// Subclasses may override this routine to provide different behavior. 1942 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1943 SourceLocation StartLoc, 1944 SourceLocation LParenLoc, 1945 SourceLocation ColonLoc, 1946 SourceLocation EndLoc) { 1947 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1948 LParenLoc, ColonLoc, EndLoc); 1949 } 1950 1951 /// Build a new OpenMP 'num_teams' clause. 1952 /// 1953 /// By default, performs semantic analysis to build the new statement. 1954 /// Subclasses may override this routine to provide different behavior. 1955 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1956 SourceLocation LParenLoc, 1957 SourceLocation EndLoc) { 1958 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1959 EndLoc); 1960 } 1961 1962 /// Build a new OpenMP 'thread_limit' clause. 1963 /// 1964 /// By default, performs semantic analysis to build the new statement. 1965 /// Subclasses may override this routine to provide different behavior. 1966 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1967 SourceLocation StartLoc, 1968 SourceLocation LParenLoc, 1969 SourceLocation EndLoc) { 1970 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1971 LParenLoc, EndLoc); 1972 } 1973 1974 /// Build a new OpenMP 'priority' clause. 1975 /// 1976 /// By default, performs semantic analysis to build the new statement. 1977 /// Subclasses may override this routine to provide different behavior. 1978 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1979 SourceLocation LParenLoc, 1980 SourceLocation EndLoc) { 1981 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1982 EndLoc); 1983 } 1984 1985 /// Build a new OpenMP 'grainsize' clause. 1986 /// 1987 /// By default, performs semantic analysis to build the new statement. 1988 /// Subclasses may override this routine to provide different behavior. 1989 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1990 SourceLocation LParenLoc, 1991 SourceLocation EndLoc) { 1992 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1993 EndLoc); 1994 } 1995 1996 /// Build a new OpenMP 'num_tasks' clause. 1997 /// 1998 /// By default, performs semantic analysis to build the new statement. 1999 /// Subclasses may override this routine to provide different behavior. 2000 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 2001 SourceLocation LParenLoc, 2002 SourceLocation EndLoc) { 2003 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 2004 EndLoc); 2005 } 2006 2007 /// Build a new OpenMP 'hint' clause. 2008 /// 2009 /// By default, performs semantic analysis to build the new statement. 2010 /// Subclasses may override this routine to provide different behavior. 2011 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2012 SourceLocation LParenLoc, 2013 SourceLocation EndLoc) { 2014 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2015 } 2016 2017 /// Build a new OpenMP 'detach' clause. 2018 /// 2019 /// By default, performs semantic analysis to build the new statement. 2020 /// Subclasses may override this routine to provide different behavior. 2021 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2022 SourceLocation LParenLoc, 2023 SourceLocation EndLoc) { 2024 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2025 } 2026 2027 /// Build a new OpenMP 'dist_schedule' clause. 2028 /// 2029 /// By default, performs semantic analysis to build the new OpenMP clause. 2030 /// Subclasses may override this routine to provide different behavior. 2031 OMPClause * 2032 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2033 Expr *ChunkSize, SourceLocation StartLoc, 2034 SourceLocation LParenLoc, SourceLocation KindLoc, 2035 SourceLocation CommaLoc, SourceLocation EndLoc) { 2036 return getSema().ActOnOpenMPDistScheduleClause( 2037 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2038 } 2039 2040 /// Build a new OpenMP 'to' clause. 2041 /// 2042 /// By default, performs semantic analysis to build the new statement. 2043 /// Subclasses may override this routine to provide different behavior. 2044 OMPClause * 2045 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2046 ArrayRef<SourceLocation> MotionModifiersLoc, 2047 CXXScopeSpec &MapperIdScopeSpec, 2048 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2049 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2050 ArrayRef<Expr *> UnresolvedMappers) { 2051 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2052 MapperIdScopeSpec, MapperId, ColonLoc, 2053 VarList, Locs, UnresolvedMappers); 2054 } 2055 2056 /// Build a new OpenMP 'from' clause. 2057 /// 2058 /// By default, performs semantic analysis to build the new statement. 2059 /// Subclasses may override this routine to provide different behavior. 2060 OMPClause * 2061 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2062 ArrayRef<SourceLocation> MotionModifiersLoc, 2063 CXXScopeSpec &MapperIdScopeSpec, 2064 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2065 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2066 ArrayRef<Expr *> UnresolvedMappers) { 2067 return getSema().ActOnOpenMPFromClause( 2068 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2069 ColonLoc, VarList, Locs, UnresolvedMappers); 2070 } 2071 2072 /// Build a new OpenMP 'use_device_ptr' clause. 2073 /// 2074 /// By default, performs semantic analysis to build the new OpenMP clause. 2075 /// Subclasses may override this routine to provide different behavior. 2076 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2077 const OMPVarListLocTy &Locs) { 2078 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2079 } 2080 2081 /// Build a new OpenMP 'use_device_addr' clause. 2082 /// 2083 /// By default, performs semantic analysis to build the new OpenMP clause. 2084 /// Subclasses may override this routine to provide different behavior. 2085 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2086 const OMPVarListLocTy &Locs) { 2087 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2088 } 2089 2090 /// Build a new OpenMP 'is_device_ptr' clause. 2091 /// 2092 /// By default, performs semantic analysis to build the new OpenMP clause. 2093 /// Subclasses may override this routine to provide different behavior. 2094 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2095 const OMPVarListLocTy &Locs) { 2096 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2097 } 2098 2099 /// Build a new OpenMP 'defaultmap' clause. 2100 /// 2101 /// By default, performs semantic analysis to build the new OpenMP clause. 2102 /// Subclasses may override this routine to provide different behavior. 2103 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2104 OpenMPDefaultmapClauseKind Kind, 2105 SourceLocation StartLoc, 2106 SourceLocation LParenLoc, 2107 SourceLocation MLoc, 2108 SourceLocation KindLoc, 2109 SourceLocation EndLoc) { 2110 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2111 MLoc, KindLoc, EndLoc); 2112 } 2113 2114 /// Build a new OpenMP 'nontemporal' clause. 2115 /// 2116 /// By default, performs semantic analysis to build the new OpenMP clause. 2117 /// Subclasses may override this routine to provide different behavior. 2118 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2119 SourceLocation StartLoc, 2120 SourceLocation LParenLoc, 2121 SourceLocation EndLoc) { 2122 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2123 EndLoc); 2124 } 2125 2126 /// Build a new OpenMP 'inclusive' clause. 2127 /// 2128 /// By default, performs semantic analysis to build the new OpenMP clause. 2129 /// Subclasses may override this routine to provide different behavior. 2130 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2131 SourceLocation StartLoc, 2132 SourceLocation LParenLoc, 2133 SourceLocation EndLoc) { 2134 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2135 EndLoc); 2136 } 2137 2138 /// Build a new OpenMP 'exclusive' clause. 2139 /// 2140 /// By default, performs semantic analysis to build the new OpenMP clause. 2141 /// Subclasses may override this routine to provide different behavior. 2142 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2143 SourceLocation StartLoc, 2144 SourceLocation LParenLoc, 2145 SourceLocation EndLoc) { 2146 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2147 EndLoc); 2148 } 2149 2150 /// Build a new OpenMP 'uses_allocators' clause. 2151 /// 2152 /// By default, performs semantic analysis to build the new OpenMP clause. 2153 /// Subclasses may override this routine to provide different behavior. 2154 OMPClause *RebuildOMPUsesAllocatorsClause( 2155 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2156 SourceLocation LParenLoc, SourceLocation EndLoc) { 2157 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2158 Data); 2159 } 2160 2161 /// Build a new OpenMP 'affinity' clause. 2162 /// 2163 /// By default, performs semantic analysis to build the new OpenMP clause. 2164 /// Subclasses may override this routine to provide different behavior. 2165 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2166 SourceLocation LParenLoc, 2167 SourceLocation ColonLoc, 2168 SourceLocation EndLoc, Expr *Modifier, 2169 ArrayRef<Expr *> Locators) { 2170 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2171 EndLoc, Modifier, Locators); 2172 } 2173 2174 /// Build a new OpenMP 'order' clause. 2175 /// 2176 /// By default, performs semantic analysis to build the new OpenMP clause. 2177 /// Subclasses may override this routine to provide different behavior. 2178 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2179 SourceLocation KindKwLoc, 2180 SourceLocation StartLoc, 2181 SourceLocation LParenLoc, 2182 SourceLocation EndLoc) { 2183 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2184 LParenLoc, EndLoc); 2185 } 2186 2187 /// Build a new OpenMP 'init' clause. 2188 /// 2189 /// By default, performs semantic analysis to build the new OpenMP clause. 2190 /// Subclasses may override this routine to provide different behavior. 2191 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2192 bool IsTarget, bool IsTargetSync, 2193 SourceLocation StartLoc, 2194 SourceLocation LParenLoc, 2195 SourceLocation VarLoc, 2196 SourceLocation EndLoc) { 2197 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2198 IsTargetSync, StartLoc, LParenLoc, 2199 VarLoc, EndLoc); 2200 } 2201 2202 /// Build a new OpenMP 'use' clause. 2203 /// 2204 /// By default, performs semantic analysis to build the new OpenMP clause. 2205 /// Subclasses may override this routine to provide different behavior. 2206 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2207 SourceLocation LParenLoc, 2208 SourceLocation VarLoc, SourceLocation EndLoc) { 2209 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2210 VarLoc, EndLoc); 2211 } 2212 2213 /// Build a new OpenMP 'destroy' clause. 2214 /// 2215 /// By default, performs semantic analysis to build the new OpenMP clause. 2216 /// Subclasses may override this routine to provide different behavior. 2217 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2218 SourceLocation LParenLoc, 2219 SourceLocation VarLoc, 2220 SourceLocation EndLoc) { 2221 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2222 VarLoc, EndLoc); 2223 } 2224 2225 /// Build a new OpenMP 'novariants' clause. 2226 /// 2227 /// By default, performs semantic analysis to build the new OpenMP clause. 2228 /// Subclasses may override this routine to provide different behavior. 2229 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2230 SourceLocation StartLoc, 2231 SourceLocation LParenLoc, 2232 SourceLocation EndLoc) { 2233 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2234 EndLoc); 2235 } 2236 2237 /// Build a new OpenMP 'nocontext' clause. 2238 /// 2239 /// By default, performs semantic analysis to build the new OpenMP clause. 2240 /// Subclasses may override this routine to provide different behavior. 2241 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2242 SourceLocation LParenLoc, 2243 SourceLocation EndLoc) { 2244 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2245 EndLoc); 2246 } 2247 2248 /// Build a new OpenMP 'filter' clause. 2249 /// 2250 /// By default, performs semantic analysis to build the new OpenMP clause. 2251 /// Subclasses may override this routine to provide different behavior. 2252 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2253 SourceLocation LParenLoc, 2254 SourceLocation EndLoc) { 2255 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2256 EndLoc); 2257 } 2258 2259 /// Build a new OpenMP 'bind' clause. 2260 /// 2261 /// By default, performs semantic analysis to build the new OpenMP clause. 2262 /// Subclasses may override this routine to provide different behavior. 2263 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2264 SourceLocation KindLoc, 2265 SourceLocation StartLoc, 2266 SourceLocation LParenLoc, 2267 SourceLocation EndLoc) { 2268 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2269 EndLoc); 2270 } 2271 2272 /// Rebuild the operand to an Objective-C \@synchronized statement. 2273 /// 2274 /// By default, performs semantic analysis to build the new statement. 2275 /// Subclasses may override this routine to provide different behavior. 2276 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2277 Expr *object) { 2278 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2279 } 2280 2281 /// Build a new Objective-C \@synchronized statement. 2282 /// 2283 /// By default, performs semantic analysis to build the new statement. 2284 /// Subclasses may override this routine to provide different behavior. 2285 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2286 Expr *Object, Stmt *Body) { 2287 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2288 } 2289 2290 /// Build a new Objective-C \@autoreleasepool statement. 2291 /// 2292 /// By default, performs semantic analysis to build the new statement. 2293 /// Subclasses may override this routine to provide different behavior. 2294 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2295 Stmt *Body) { 2296 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2297 } 2298 2299 /// Build a new Objective-C fast enumeration statement. 2300 /// 2301 /// By default, performs semantic analysis to build the new statement. 2302 /// Subclasses may override this routine to provide different behavior. 2303 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2304 Stmt *Element, 2305 Expr *Collection, 2306 SourceLocation RParenLoc, 2307 Stmt *Body) { 2308 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2309 Element, 2310 Collection, 2311 RParenLoc); 2312 if (ForEachStmt.isInvalid()) 2313 return StmtError(); 2314 2315 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2316 } 2317 2318 /// Build a new C++ exception declaration. 2319 /// 2320 /// By default, performs semantic analysis to build the new decaration. 2321 /// Subclasses may override this routine to provide different behavior. 2322 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2323 TypeSourceInfo *Declarator, 2324 SourceLocation StartLoc, 2325 SourceLocation IdLoc, 2326 IdentifierInfo *Id) { 2327 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2328 StartLoc, IdLoc, Id); 2329 if (Var) 2330 getSema().CurContext->addDecl(Var); 2331 return Var; 2332 } 2333 2334 /// Build a new C++ catch statement. 2335 /// 2336 /// By default, performs semantic analysis to build the new statement. 2337 /// Subclasses may override this routine to provide different behavior. 2338 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2339 VarDecl *ExceptionDecl, 2340 Stmt *Handler) { 2341 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2342 Handler)); 2343 } 2344 2345 /// Build a new C++ try statement. 2346 /// 2347 /// By default, performs semantic analysis to build the new statement. 2348 /// Subclasses may override this routine to provide different behavior. 2349 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2350 ArrayRef<Stmt *> Handlers) { 2351 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2352 } 2353 2354 /// Build a new C++0x range-based for statement. 2355 /// 2356 /// By default, performs semantic analysis to build the new statement. 2357 /// Subclasses may override this routine to provide different behavior. 2358 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2359 SourceLocation CoawaitLoc, Stmt *Init, 2360 SourceLocation ColonLoc, Stmt *Range, 2361 Stmt *Begin, Stmt *End, Expr *Cond, 2362 Expr *Inc, Stmt *LoopVar, 2363 SourceLocation RParenLoc) { 2364 // If we've just learned that the range is actually an Objective-C 2365 // collection, treat this as an Objective-C fast enumeration loop. 2366 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2367 if (RangeStmt->isSingleDecl()) { 2368 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2369 if (RangeVar->isInvalidDecl()) 2370 return StmtError(); 2371 2372 Expr *RangeExpr = RangeVar->getInit(); 2373 if (!RangeExpr->isTypeDependent() && 2374 RangeExpr->getType()->isObjCObjectPointerType()) { 2375 // FIXME: Support init-statements in Objective-C++20 ranged for 2376 // statement. 2377 if (Init) { 2378 return SemaRef.Diag(Init->getBeginLoc(), 2379 diag::err_objc_for_range_init_stmt) 2380 << Init->getSourceRange(); 2381 } 2382 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2383 RangeExpr, RParenLoc); 2384 } 2385 } 2386 } 2387 } 2388 2389 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2390 Range, Begin, End, Cond, Inc, LoopVar, 2391 RParenLoc, Sema::BFRK_Rebuild); 2392 } 2393 2394 /// Build a new C++0x range-based for statement. 2395 /// 2396 /// By default, performs semantic analysis to build the new statement. 2397 /// Subclasses may override this routine to provide different behavior. 2398 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2399 bool IsIfExists, 2400 NestedNameSpecifierLoc QualifierLoc, 2401 DeclarationNameInfo NameInfo, 2402 Stmt *Nested) { 2403 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2404 QualifierLoc, NameInfo, Nested); 2405 } 2406 2407 /// Attach body to a C++0x range-based for statement. 2408 /// 2409 /// By default, performs semantic analysis to finish the new statement. 2410 /// Subclasses may override this routine to provide different behavior. 2411 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2412 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2413 } 2414 2415 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2416 Stmt *TryBlock, Stmt *Handler) { 2417 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2418 } 2419 2420 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2421 Stmt *Block) { 2422 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2423 } 2424 2425 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2426 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2427 } 2428 2429 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2430 SourceLocation LParen, 2431 SourceLocation RParen, 2432 TypeSourceInfo *TSI) { 2433 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2434 } 2435 2436 /// Build a new predefined expression. 2437 /// 2438 /// By default, performs semantic analysis to build the new expression. 2439 /// Subclasses may override this routine to provide different behavior. 2440 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2441 PredefinedExpr::IdentKind IK) { 2442 return getSema().BuildPredefinedExpr(Loc, IK); 2443 } 2444 2445 /// Build a new expression that references a declaration. 2446 /// 2447 /// By default, performs semantic analysis to build the new expression. 2448 /// Subclasses may override this routine to provide different behavior. 2449 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2450 LookupResult &R, 2451 bool RequiresADL) { 2452 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2453 } 2454 2455 2456 /// Build a new expression that references a declaration. 2457 /// 2458 /// By default, performs semantic analysis to build the new expression. 2459 /// Subclasses may override this routine to provide different behavior. 2460 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2461 ValueDecl *VD, 2462 const DeclarationNameInfo &NameInfo, 2463 NamedDecl *Found, 2464 TemplateArgumentListInfo *TemplateArgs) { 2465 CXXScopeSpec SS; 2466 SS.Adopt(QualifierLoc); 2467 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2468 TemplateArgs); 2469 } 2470 2471 /// Build a new expression in parentheses. 2472 /// 2473 /// By default, performs semantic analysis to build the new expression. 2474 /// Subclasses may override this routine to provide different behavior. 2475 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2476 SourceLocation RParen) { 2477 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2478 } 2479 2480 /// Build a new pseudo-destructor expression. 2481 /// 2482 /// By default, performs semantic analysis to build the new expression. 2483 /// Subclasses may override this routine to provide different behavior. 2484 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2485 SourceLocation OperatorLoc, 2486 bool isArrow, 2487 CXXScopeSpec &SS, 2488 TypeSourceInfo *ScopeType, 2489 SourceLocation CCLoc, 2490 SourceLocation TildeLoc, 2491 PseudoDestructorTypeStorage Destroyed); 2492 2493 /// Build a new unary operator expression. 2494 /// 2495 /// By default, performs semantic analysis to build the new expression. 2496 /// Subclasses may override this routine to provide different behavior. 2497 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2498 UnaryOperatorKind Opc, 2499 Expr *SubExpr) { 2500 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2501 } 2502 2503 /// Build a new builtin offsetof expression. 2504 /// 2505 /// By default, performs semantic analysis to build the new expression. 2506 /// Subclasses may override this routine to provide different behavior. 2507 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2508 TypeSourceInfo *Type, 2509 ArrayRef<Sema::OffsetOfComponent> Components, 2510 SourceLocation RParenLoc) { 2511 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2512 RParenLoc); 2513 } 2514 2515 /// Build a new sizeof, alignof or vec_step expression with a 2516 /// type argument. 2517 /// 2518 /// By default, performs semantic analysis to build the new expression. 2519 /// Subclasses may override this routine to provide different behavior. 2520 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2521 SourceLocation OpLoc, 2522 UnaryExprOrTypeTrait ExprKind, 2523 SourceRange R) { 2524 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2525 } 2526 2527 /// Build a new sizeof, alignof or vec step expression with an 2528 /// expression argument. 2529 /// 2530 /// By default, performs semantic analysis to build the new expression. 2531 /// Subclasses may override this routine to provide different behavior. 2532 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2533 UnaryExprOrTypeTrait ExprKind, 2534 SourceRange R) { 2535 ExprResult Result 2536 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2537 if (Result.isInvalid()) 2538 return ExprError(); 2539 2540 return Result; 2541 } 2542 2543 /// Build a new array subscript expression. 2544 /// 2545 /// By default, performs semantic analysis to build the new expression. 2546 /// Subclasses may override this routine to provide different behavior. 2547 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2548 SourceLocation LBracketLoc, 2549 Expr *RHS, 2550 SourceLocation RBracketLoc) { 2551 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2552 LBracketLoc, RHS, 2553 RBracketLoc); 2554 } 2555 2556 /// Build a new matrix subscript expression. 2557 /// 2558 /// By default, performs semantic analysis to build the new expression. 2559 /// Subclasses may override this routine to provide different behavior. 2560 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2561 Expr *ColumnIdx, 2562 SourceLocation RBracketLoc) { 2563 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2564 RBracketLoc); 2565 } 2566 2567 /// Build a new array section expression. 2568 /// 2569 /// By default, performs semantic analysis to build the new expression. 2570 /// Subclasses may override this routine to provide different behavior. 2571 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2572 Expr *LowerBound, 2573 SourceLocation ColonLocFirst, 2574 SourceLocation ColonLocSecond, 2575 Expr *Length, Expr *Stride, 2576 SourceLocation RBracketLoc) { 2577 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2578 ColonLocFirst, ColonLocSecond, 2579 Length, Stride, RBracketLoc); 2580 } 2581 2582 /// Build a new array shaping 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 RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2587 SourceLocation RParenLoc, 2588 ArrayRef<Expr *> Dims, 2589 ArrayRef<SourceRange> BracketsRanges) { 2590 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2591 BracketsRanges); 2592 } 2593 2594 /// Build a new iterator expression. 2595 /// 2596 /// By default, performs semantic analysis to build the new expression. 2597 /// Subclasses may override this routine to provide different behavior. 2598 ExprResult RebuildOMPIteratorExpr( 2599 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2600 ArrayRef<Sema::OMPIteratorData> Data) { 2601 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2602 LLoc, RLoc, Data); 2603 } 2604 2605 /// Build a new call expression. 2606 /// 2607 /// By default, performs semantic analysis to build the new expression. 2608 /// Subclasses may override this routine to provide different behavior. 2609 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2610 MultiExprArg Args, 2611 SourceLocation RParenLoc, 2612 Expr *ExecConfig = nullptr) { 2613 return getSema().ActOnCallExpr( 2614 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2615 } 2616 2617 /// Build a new member access expression. 2618 /// 2619 /// By default, performs semantic analysis to build the new expression. 2620 /// Subclasses may override this routine to provide different behavior. 2621 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2622 bool isArrow, 2623 NestedNameSpecifierLoc QualifierLoc, 2624 SourceLocation TemplateKWLoc, 2625 const DeclarationNameInfo &MemberNameInfo, 2626 ValueDecl *Member, 2627 NamedDecl *FoundDecl, 2628 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2629 NamedDecl *FirstQualifierInScope) { 2630 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2631 isArrow); 2632 if (!Member->getDeclName()) { 2633 // We have a reference to an unnamed field. This is always the 2634 // base of an anonymous struct/union member access, i.e. the 2635 // field is always of record type. 2636 assert(Member->getType()->isRecordType() && 2637 "unnamed member not of record type?"); 2638 2639 BaseResult = 2640 getSema().PerformObjectMemberConversion(BaseResult.get(), 2641 QualifierLoc.getNestedNameSpecifier(), 2642 FoundDecl, Member); 2643 if (BaseResult.isInvalid()) 2644 return ExprError(); 2645 Base = BaseResult.get(); 2646 2647 CXXScopeSpec EmptySS; 2648 return getSema().BuildFieldReferenceExpr( 2649 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2650 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2651 } 2652 2653 CXXScopeSpec SS; 2654 SS.Adopt(QualifierLoc); 2655 2656 Base = BaseResult.get(); 2657 QualType BaseType = Base->getType(); 2658 2659 if (isArrow && !BaseType->isPointerType()) 2660 return ExprError(); 2661 2662 // FIXME: this involves duplicating earlier analysis in a lot of 2663 // cases; we should avoid this when possible. 2664 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2665 R.addDecl(FoundDecl); 2666 R.resolveKind(); 2667 2668 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2669 SS, TemplateKWLoc, 2670 FirstQualifierInScope, 2671 R, ExplicitTemplateArgs, 2672 /*S*/nullptr); 2673 } 2674 2675 /// Build a new binary operator expression. 2676 /// 2677 /// By default, performs semantic analysis to build the new expression. 2678 /// Subclasses may override this routine to provide different behavior. 2679 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2680 BinaryOperatorKind Opc, 2681 Expr *LHS, Expr *RHS) { 2682 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2683 } 2684 2685 /// Build a new rewritten operator expression. 2686 /// 2687 /// By default, performs semantic analysis to build the new expression. 2688 /// Subclasses may override this routine to provide different behavior. 2689 ExprResult RebuildCXXRewrittenBinaryOperator( 2690 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2691 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2692 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2693 RHS, /*RequiresADL*/false); 2694 } 2695 2696 /// Build a new conditional operator expression. 2697 /// 2698 /// By default, performs semantic analysis to build the new expression. 2699 /// Subclasses may override this routine to provide different behavior. 2700 ExprResult RebuildConditionalOperator(Expr *Cond, 2701 SourceLocation QuestionLoc, 2702 Expr *LHS, 2703 SourceLocation ColonLoc, 2704 Expr *RHS) { 2705 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2706 LHS, RHS); 2707 } 2708 2709 /// Build a new C-style cast expression. 2710 /// 2711 /// By default, performs semantic analysis to build the new expression. 2712 /// Subclasses may override this routine to provide different behavior. 2713 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2714 TypeSourceInfo *TInfo, 2715 SourceLocation RParenLoc, 2716 Expr *SubExpr) { 2717 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2718 SubExpr); 2719 } 2720 2721 /// Build a new compound literal expression. 2722 /// 2723 /// By default, performs semantic analysis to build the new expression. 2724 /// Subclasses may override this routine to provide different behavior. 2725 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2726 TypeSourceInfo *TInfo, 2727 SourceLocation RParenLoc, 2728 Expr *Init) { 2729 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2730 Init); 2731 } 2732 2733 /// Build a new extended vector element access expression. 2734 /// 2735 /// By default, performs semantic analysis to build the new expression. 2736 /// Subclasses may override this routine to provide different behavior. 2737 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2738 SourceLocation OpLoc, 2739 SourceLocation AccessorLoc, 2740 IdentifierInfo &Accessor) { 2741 2742 CXXScopeSpec SS; 2743 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2744 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2745 OpLoc, /*IsArrow*/ false, 2746 SS, SourceLocation(), 2747 /*FirstQualifierInScope*/ nullptr, 2748 NameInfo, 2749 /* TemplateArgs */ nullptr, 2750 /*S*/ nullptr); 2751 } 2752 2753 /// Build a new initializer list expression. 2754 /// 2755 /// By default, performs semantic analysis to build the new expression. 2756 /// Subclasses may override this routine to provide different behavior. 2757 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2758 MultiExprArg Inits, 2759 SourceLocation RBraceLoc) { 2760 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2761 } 2762 2763 /// Build a new designated initializer expression. 2764 /// 2765 /// By default, performs semantic analysis to build the new expression. 2766 /// Subclasses may override this routine to provide different behavior. 2767 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2768 MultiExprArg ArrayExprs, 2769 SourceLocation EqualOrColonLoc, 2770 bool GNUSyntax, 2771 Expr *Init) { 2772 ExprResult Result 2773 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2774 Init); 2775 if (Result.isInvalid()) 2776 return ExprError(); 2777 2778 return Result; 2779 } 2780 2781 /// Build a new value-initialized expression. 2782 /// 2783 /// By default, builds the implicit value initialization without performing 2784 /// any semantic analysis. Subclasses may override this routine to provide 2785 /// different behavior. 2786 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2787 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2788 } 2789 2790 /// Build a new \c va_arg expression. 2791 /// 2792 /// By default, performs semantic analysis to build the new expression. 2793 /// Subclasses may override this routine to provide different behavior. 2794 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2795 Expr *SubExpr, TypeSourceInfo *TInfo, 2796 SourceLocation RParenLoc) { 2797 return getSema().BuildVAArgExpr(BuiltinLoc, 2798 SubExpr, TInfo, 2799 RParenLoc); 2800 } 2801 2802 /// Build a new expression list in parentheses. 2803 /// 2804 /// By default, performs semantic analysis to build the new expression. 2805 /// Subclasses may override this routine to provide different behavior. 2806 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2807 MultiExprArg SubExprs, 2808 SourceLocation RParenLoc) { 2809 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2810 } 2811 2812 /// Build a new address-of-label expression. 2813 /// 2814 /// By default, performs semantic analysis, using the name of the label 2815 /// rather than attempting to map the label statement itself. 2816 /// Subclasses may override this routine to provide different behavior. 2817 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2818 SourceLocation LabelLoc, LabelDecl *Label) { 2819 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2820 } 2821 2822 /// Build a new GNU statement expression. 2823 /// 2824 /// By default, performs semantic analysis to build the new expression. 2825 /// Subclasses may override this routine to provide different behavior. 2826 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2827 SourceLocation RParenLoc, unsigned TemplateDepth) { 2828 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2829 TemplateDepth); 2830 } 2831 2832 /// Build a new __builtin_choose_expr expression. 2833 /// 2834 /// By default, performs semantic analysis to build the new expression. 2835 /// Subclasses may override this routine to provide different behavior. 2836 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2837 Expr *Cond, Expr *LHS, Expr *RHS, 2838 SourceLocation RParenLoc) { 2839 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2840 Cond, LHS, RHS, 2841 RParenLoc); 2842 } 2843 2844 /// Build a new generic selection 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 RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2849 SourceLocation DefaultLoc, 2850 SourceLocation RParenLoc, 2851 Expr *ControllingExpr, 2852 ArrayRef<TypeSourceInfo *> Types, 2853 ArrayRef<Expr *> Exprs) { 2854 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2855 ControllingExpr, Types, Exprs); 2856 } 2857 2858 /// Build a new overloaded operator call expression. 2859 /// 2860 /// By default, performs semantic analysis to build the new expression. 2861 /// The semantic analysis provides the behavior of template instantiation, 2862 /// copying with transformations that turn what looks like an overloaded 2863 /// operator call into a use of a builtin operator, performing 2864 /// argument-dependent lookup, etc. Subclasses may override this routine to 2865 /// provide different behavior. 2866 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2867 SourceLocation OpLoc, 2868 Expr *Callee, 2869 Expr *First, 2870 Expr *Second); 2871 2872 /// Build a new C++ "named" cast expression, such as static_cast or 2873 /// reinterpret_cast. 2874 /// 2875 /// By default, this routine dispatches to one of the more-specific routines 2876 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2877 /// Subclasses may override this routine to provide different behavior. 2878 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2879 Stmt::StmtClass Class, 2880 SourceLocation LAngleLoc, 2881 TypeSourceInfo *TInfo, 2882 SourceLocation RAngleLoc, 2883 SourceLocation LParenLoc, 2884 Expr *SubExpr, 2885 SourceLocation RParenLoc) { 2886 switch (Class) { 2887 case Stmt::CXXStaticCastExprClass: 2888 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2889 RAngleLoc, LParenLoc, 2890 SubExpr, RParenLoc); 2891 2892 case Stmt::CXXDynamicCastExprClass: 2893 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2894 RAngleLoc, LParenLoc, 2895 SubExpr, RParenLoc); 2896 2897 case Stmt::CXXReinterpretCastExprClass: 2898 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2899 RAngleLoc, LParenLoc, 2900 SubExpr, 2901 RParenLoc); 2902 2903 case Stmt::CXXConstCastExprClass: 2904 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2905 RAngleLoc, LParenLoc, 2906 SubExpr, RParenLoc); 2907 2908 case Stmt::CXXAddrspaceCastExprClass: 2909 return getDerived().RebuildCXXAddrspaceCastExpr( 2910 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2911 2912 default: 2913 llvm_unreachable("Invalid C++ named cast"); 2914 } 2915 } 2916 2917 /// Build a new C++ static_cast expression. 2918 /// 2919 /// By default, performs semantic analysis to build the new expression. 2920 /// Subclasses may override this routine to provide different behavior. 2921 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2922 SourceLocation LAngleLoc, 2923 TypeSourceInfo *TInfo, 2924 SourceLocation RAngleLoc, 2925 SourceLocation LParenLoc, 2926 Expr *SubExpr, 2927 SourceLocation RParenLoc) { 2928 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2929 TInfo, SubExpr, 2930 SourceRange(LAngleLoc, RAngleLoc), 2931 SourceRange(LParenLoc, RParenLoc)); 2932 } 2933 2934 /// Build a new C++ dynamic_cast expression. 2935 /// 2936 /// By default, performs semantic analysis to build the new expression. 2937 /// Subclasses may override this routine to provide different behavior. 2938 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2939 SourceLocation LAngleLoc, 2940 TypeSourceInfo *TInfo, 2941 SourceLocation RAngleLoc, 2942 SourceLocation LParenLoc, 2943 Expr *SubExpr, 2944 SourceLocation RParenLoc) { 2945 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2946 TInfo, SubExpr, 2947 SourceRange(LAngleLoc, RAngleLoc), 2948 SourceRange(LParenLoc, RParenLoc)); 2949 } 2950 2951 /// Build a new C++ reinterpret_cast expression. 2952 /// 2953 /// By default, performs semantic analysis to build the new expression. 2954 /// Subclasses may override this routine to provide different behavior. 2955 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2956 SourceLocation LAngleLoc, 2957 TypeSourceInfo *TInfo, 2958 SourceLocation RAngleLoc, 2959 SourceLocation LParenLoc, 2960 Expr *SubExpr, 2961 SourceLocation RParenLoc) { 2962 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2963 TInfo, SubExpr, 2964 SourceRange(LAngleLoc, RAngleLoc), 2965 SourceRange(LParenLoc, RParenLoc)); 2966 } 2967 2968 /// Build a new C++ const_cast expression. 2969 /// 2970 /// By default, performs semantic analysis to build the new expression. 2971 /// Subclasses may override this routine to provide different behavior. 2972 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2973 SourceLocation LAngleLoc, 2974 TypeSourceInfo *TInfo, 2975 SourceLocation RAngleLoc, 2976 SourceLocation LParenLoc, 2977 Expr *SubExpr, 2978 SourceLocation RParenLoc) { 2979 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2980 TInfo, SubExpr, 2981 SourceRange(LAngleLoc, RAngleLoc), 2982 SourceRange(LParenLoc, RParenLoc)); 2983 } 2984 2985 ExprResult 2986 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2987 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2988 SourceLocation LParenLoc, Expr *SubExpr, 2989 SourceLocation RParenLoc) { 2990 return getSema().BuildCXXNamedCast( 2991 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2992 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2993 } 2994 2995 /// Build a new C++ functional-style cast expression. 2996 /// 2997 /// By default, performs semantic analysis to build the new expression. 2998 /// Subclasses may override this routine to provide different behavior. 2999 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3000 SourceLocation LParenLoc, 3001 Expr *Sub, 3002 SourceLocation RParenLoc, 3003 bool ListInitialization) { 3004 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3005 MultiExprArg(&Sub, 1), RParenLoc, 3006 ListInitialization); 3007 } 3008 3009 /// Build a new C++ __builtin_bit_cast expression. 3010 /// 3011 /// By default, performs semantic analysis to build the new expression. 3012 /// Subclasses may override this routine to provide different behavior. 3013 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3014 TypeSourceInfo *TSI, Expr *Sub, 3015 SourceLocation RParenLoc) { 3016 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3017 } 3018 3019 /// Build a new C++ typeid(type) expression. 3020 /// 3021 /// By default, performs semantic analysis to build the new expression. 3022 /// Subclasses may override this routine to provide different behavior. 3023 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3024 SourceLocation TypeidLoc, 3025 TypeSourceInfo *Operand, 3026 SourceLocation RParenLoc) { 3027 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3028 RParenLoc); 3029 } 3030 3031 3032 /// Build a new C++ typeid(expr) expression. 3033 /// 3034 /// By default, performs semantic analysis to build the new expression. 3035 /// Subclasses may override this routine to provide different behavior. 3036 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3037 SourceLocation TypeidLoc, 3038 Expr *Operand, 3039 SourceLocation RParenLoc) { 3040 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3041 RParenLoc); 3042 } 3043 3044 /// Build a new C++ __uuidof(type) expression. 3045 /// 3046 /// By default, performs semantic analysis to build the new expression. 3047 /// Subclasses may override this routine to provide different behavior. 3048 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3049 TypeSourceInfo *Operand, 3050 SourceLocation RParenLoc) { 3051 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3052 } 3053 3054 /// Build a new C++ __uuidof(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 RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3059 Expr *Operand, SourceLocation RParenLoc) { 3060 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3061 } 3062 3063 /// Build a new C++ "this" expression. 3064 /// 3065 /// By default, builds a new "this" expression without performing any 3066 /// semantic analysis. Subclasses may override this routine to provide 3067 /// different behavior. 3068 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3069 QualType ThisType, 3070 bool isImplicit) { 3071 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3072 } 3073 3074 /// Build a new C++ throw expression. 3075 /// 3076 /// By default, performs semantic analysis to build the new expression. 3077 /// Subclasses may override this routine to provide different behavior. 3078 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3079 bool IsThrownVariableInScope) { 3080 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3081 } 3082 3083 /// Build a new C++ default-argument expression. 3084 /// 3085 /// By default, builds a new default-argument expression, which does not 3086 /// require any semantic analysis. Subclasses may override this routine to 3087 /// provide different behavior. 3088 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3089 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3090 getSema().CurContext); 3091 } 3092 3093 /// Build a new C++11 default-initialization expression. 3094 /// 3095 /// By default, builds a new default field initialization expression, which 3096 /// does not require any semantic analysis. Subclasses may override this 3097 /// routine to provide different behavior. 3098 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3099 FieldDecl *Field) { 3100 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3101 getSema().CurContext); 3102 } 3103 3104 /// Build a new C++ zero-initialization expression. 3105 /// 3106 /// By default, performs semantic analysis to build the new expression. 3107 /// Subclasses may override this routine to provide different behavior. 3108 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3109 SourceLocation LParenLoc, 3110 SourceLocation RParenLoc) { 3111 return getSema().BuildCXXTypeConstructExpr( 3112 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3113 } 3114 3115 /// Build a new C++ "new" expression. 3116 /// 3117 /// By default, performs semantic analysis to build the new expression. 3118 /// Subclasses may override this routine to provide different behavior. 3119 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3120 bool UseGlobal, 3121 SourceLocation PlacementLParen, 3122 MultiExprArg PlacementArgs, 3123 SourceLocation PlacementRParen, 3124 SourceRange TypeIdParens, 3125 QualType AllocatedType, 3126 TypeSourceInfo *AllocatedTypeInfo, 3127 Optional<Expr *> ArraySize, 3128 SourceRange DirectInitRange, 3129 Expr *Initializer) { 3130 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3131 PlacementLParen, 3132 PlacementArgs, 3133 PlacementRParen, 3134 TypeIdParens, 3135 AllocatedType, 3136 AllocatedTypeInfo, 3137 ArraySize, 3138 DirectInitRange, 3139 Initializer); 3140 } 3141 3142 /// Build a new C++ "delete" expression. 3143 /// 3144 /// By default, performs semantic analysis to build the new expression. 3145 /// Subclasses may override this routine to provide different behavior. 3146 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3147 bool IsGlobalDelete, 3148 bool IsArrayForm, 3149 Expr *Operand) { 3150 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3151 Operand); 3152 } 3153 3154 /// Build a new type trait expression. 3155 /// 3156 /// By default, performs semantic analysis to build the new expression. 3157 /// Subclasses may override this routine to provide different behavior. 3158 ExprResult RebuildTypeTrait(TypeTrait Trait, 3159 SourceLocation StartLoc, 3160 ArrayRef<TypeSourceInfo *> Args, 3161 SourceLocation RParenLoc) { 3162 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3163 } 3164 3165 /// Build a new array type trait expression. 3166 /// 3167 /// By default, performs semantic analysis to build the new expression. 3168 /// Subclasses may override this routine to provide different behavior. 3169 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3170 SourceLocation StartLoc, 3171 TypeSourceInfo *TSInfo, 3172 Expr *DimExpr, 3173 SourceLocation RParenLoc) { 3174 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3175 } 3176 3177 /// Build a new expression trait expression. 3178 /// 3179 /// By default, performs semantic analysis to build the new expression. 3180 /// Subclasses may override this routine to provide different behavior. 3181 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3182 SourceLocation StartLoc, 3183 Expr *Queried, 3184 SourceLocation RParenLoc) { 3185 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3186 } 3187 3188 /// Build a new (previously unresolved) declaration reference 3189 /// expression. 3190 /// 3191 /// By default, performs semantic analysis to build the new expression. 3192 /// Subclasses may override this routine to provide different behavior. 3193 ExprResult RebuildDependentScopeDeclRefExpr( 3194 NestedNameSpecifierLoc QualifierLoc, 3195 SourceLocation TemplateKWLoc, 3196 const DeclarationNameInfo &NameInfo, 3197 const TemplateArgumentListInfo *TemplateArgs, 3198 bool IsAddressOfOperand, 3199 TypeSourceInfo **RecoveryTSI) { 3200 CXXScopeSpec SS; 3201 SS.Adopt(QualifierLoc); 3202 3203 if (TemplateArgs || TemplateKWLoc.isValid()) 3204 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3205 TemplateArgs); 3206 3207 return getSema().BuildQualifiedDeclarationNameExpr( 3208 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3209 } 3210 3211 /// Build a new template-id 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 RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3216 SourceLocation TemplateKWLoc, 3217 LookupResult &R, 3218 bool RequiresADL, 3219 const TemplateArgumentListInfo *TemplateArgs) { 3220 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3221 TemplateArgs); 3222 } 3223 3224 /// Build a new object-construction expression. 3225 /// 3226 /// By default, performs semantic analysis to build the new expression. 3227 /// Subclasses may override this routine to provide different behavior. 3228 ExprResult RebuildCXXConstructExpr(QualType T, 3229 SourceLocation Loc, 3230 CXXConstructorDecl *Constructor, 3231 bool IsElidable, 3232 MultiExprArg Args, 3233 bool HadMultipleCandidates, 3234 bool ListInitialization, 3235 bool StdInitListInitialization, 3236 bool RequiresZeroInit, 3237 CXXConstructExpr::ConstructionKind ConstructKind, 3238 SourceRange ParenRange) { 3239 // Reconstruct the constructor we originally found, which might be 3240 // different if this is a call to an inherited constructor. 3241 CXXConstructorDecl *FoundCtor = Constructor; 3242 if (Constructor->isInheritingConstructor()) 3243 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3244 3245 SmallVector<Expr *, 8> ConvertedArgs; 3246 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3247 ConvertedArgs)) 3248 return ExprError(); 3249 3250 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3251 IsElidable, 3252 ConvertedArgs, 3253 HadMultipleCandidates, 3254 ListInitialization, 3255 StdInitListInitialization, 3256 RequiresZeroInit, ConstructKind, 3257 ParenRange); 3258 } 3259 3260 /// Build a new implicit construction via inherited constructor 3261 /// expression. 3262 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3263 CXXConstructorDecl *Constructor, 3264 bool ConstructsVBase, 3265 bool InheritedFromVBase) { 3266 return new (getSema().Context) CXXInheritedCtorInitExpr( 3267 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3268 } 3269 3270 /// Build a new object-construction expression. 3271 /// 3272 /// By default, performs semantic analysis to build the new expression. 3273 /// Subclasses may override this routine to provide different behavior. 3274 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3275 SourceLocation LParenOrBraceLoc, 3276 MultiExprArg Args, 3277 SourceLocation RParenOrBraceLoc, 3278 bool ListInitialization) { 3279 return getSema().BuildCXXTypeConstructExpr( 3280 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3281 } 3282 3283 /// Build a new object-construction expression. 3284 /// 3285 /// By default, performs semantic analysis to build the new expression. 3286 /// Subclasses may override this routine to provide different behavior. 3287 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3288 SourceLocation LParenLoc, 3289 MultiExprArg Args, 3290 SourceLocation RParenLoc, 3291 bool ListInitialization) { 3292 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3293 RParenLoc, ListInitialization); 3294 } 3295 3296 /// Build a new member reference expression. 3297 /// 3298 /// By default, performs semantic analysis to build the new expression. 3299 /// Subclasses may override this routine to provide different behavior. 3300 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3301 QualType BaseType, 3302 bool IsArrow, 3303 SourceLocation OperatorLoc, 3304 NestedNameSpecifierLoc QualifierLoc, 3305 SourceLocation TemplateKWLoc, 3306 NamedDecl *FirstQualifierInScope, 3307 const DeclarationNameInfo &MemberNameInfo, 3308 const TemplateArgumentListInfo *TemplateArgs) { 3309 CXXScopeSpec SS; 3310 SS.Adopt(QualifierLoc); 3311 3312 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3313 OperatorLoc, IsArrow, 3314 SS, TemplateKWLoc, 3315 FirstQualifierInScope, 3316 MemberNameInfo, 3317 TemplateArgs, /*S*/nullptr); 3318 } 3319 3320 /// Build a new member reference expression. 3321 /// 3322 /// By default, performs semantic analysis to build the new expression. 3323 /// Subclasses may override this routine to provide different behavior. 3324 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3325 SourceLocation OperatorLoc, 3326 bool IsArrow, 3327 NestedNameSpecifierLoc QualifierLoc, 3328 SourceLocation TemplateKWLoc, 3329 NamedDecl *FirstQualifierInScope, 3330 LookupResult &R, 3331 const TemplateArgumentListInfo *TemplateArgs) { 3332 CXXScopeSpec SS; 3333 SS.Adopt(QualifierLoc); 3334 3335 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3336 OperatorLoc, IsArrow, 3337 SS, TemplateKWLoc, 3338 FirstQualifierInScope, 3339 R, TemplateArgs, /*S*/nullptr); 3340 } 3341 3342 /// Build a new noexcept 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 RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3347 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3348 } 3349 3350 /// Build a new expression to compute the length of a parameter pack. 3351 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3352 NamedDecl *Pack, 3353 SourceLocation PackLoc, 3354 SourceLocation RParenLoc, 3355 Optional<unsigned> Length, 3356 ArrayRef<TemplateArgument> PartialArgs) { 3357 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3358 RParenLoc, Length, PartialArgs); 3359 } 3360 3361 /// Build a new expression representing a call to a source location 3362 /// builtin. 3363 /// 3364 /// By default, performs semantic analysis to build the new expression. 3365 /// Subclasses may override this routine to provide different behavior. 3366 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3367 SourceLocation BuiltinLoc, 3368 SourceLocation RPLoc, 3369 DeclContext *ParentContext) { 3370 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3371 } 3372 3373 /// Build a new Objective-C boxed expression. 3374 /// 3375 /// By default, performs semantic analysis to build the new expression. 3376 /// Subclasses may override this routine to provide different behavior. 3377 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3378 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3379 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3380 TemplateArgumentListInfo *TALI) { 3381 CXXScopeSpec SS; 3382 SS.Adopt(NNS); 3383 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3384 ConceptNameInfo, 3385 FoundDecl, 3386 NamedConcept, TALI); 3387 if (Result.isInvalid()) 3388 return ExprError(); 3389 return Result; 3390 } 3391 3392 /// \brief Build a new requires expression. 3393 /// 3394 /// By default, performs semantic analysis to build the new expression. 3395 /// Subclasses may override this routine to provide different behavior. 3396 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3397 RequiresExprBodyDecl *Body, 3398 ArrayRef<ParmVarDecl *> LocalParameters, 3399 ArrayRef<concepts::Requirement *> Requirements, 3400 SourceLocation ClosingBraceLoc) { 3401 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3402 LocalParameters, Requirements, ClosingBraceLoc); 3403 } 3404 3405 concepts::TypeRequirement * 3406 RebuildTypeRequirement( 3407 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3408 return SemaRef.BuildTypeRequirement(SubstDiag); 3409 } 3410 3411 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3412 return SemaRef.BuildTypeRequirement(T); 3413 } 3414 3415 concepts::ExprRequirement * 3416 RebuildExprRequirement( 3417 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3418 SourceLocation NoexceptLoc, 3419 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3420 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3421 std::move(Ret)); 3422 } 3423 3424 concepts::ExprRequirement * 3425 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3426 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3427 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3428 std::move(Ret)); 3429 } 3430 3431 concepts::NestedRequirement * 3432 RebuildNestedRequirement( 3433 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3434 return SemaRef.BuildNestedRequirement(SubstDiag); 3435 } 3436 3437 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3438 return SemaRef.BuildNestedRequirement(Constraint); 3439 } 3440 3441 /// \brief Build a new Objective-C boxed expression. 3442 /// 3443 /// By default, performs semantic analysis to build the new expression. 3444 /// Subclasses may override this routine to provide different behavior. 3445 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3446 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3447 } 3448 3449 /// Build a new Objective-C array literal. 3450 /// 3451 /// By default, performs semantic analysis to build the new expression. 3452 /// Subclasses may override this routine to provide different behavior. 3453 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3454 Expr **Elements, unsigned NumElements) { 3455 return getSema().BuildObjCArrayLiteral(Range, 3456 MultiExprArg(Elements, NumElements)); 3457 } 3458 3459 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3460 Expr *Base, Expr *Key, 3461 ObjCMethodDecl *getterMethod, 3462 ObjCMethodDecl *setterMethod) { 3463 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3464 getterMethod, setterMethod); 3465 } 3466 3467 /// Build a new Objective-C dictionary literal. 3468 /// 3469 /// By default, performs semantic analysis to build the new expression. 3470 /// Subclasses may override this routine to provide different behavior. 3471 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3472 MutableArrayRef<ObjCDictionaryElement> Elements) { 3473 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3474 } 3475 3476 /// Build a new Objective-C \@encode expression. 3477 /// 3478 /// By default, performs semantic analysis to build the new expression. 3479 /// Subclasses may override this routine to provide different behavior. 3480 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3481 TypeSourceInfo *EncodeTypeInfo, 3482 SourceLocation RParenLoc) { 3483 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3484 } 3485 3486 /// Build a new Objective-C class message. 3487 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3488 Selector Sel, 3489 ArrayRef<SourceLocation> SelectorLocs, 3490 ObjCMethodDecl *Method, 3491 SourceLocation LBracLoc, 3492 MultiExprArg Args, 3493 SourceLocation RBracLoc) { 3494 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3495 ReceiverTypeInfo->getType(), 3496 /*SuperLoc=*/SourceLocation(), 3497 Sel, Method, LBracLoc, SelectorLocs, 3498 RBracLoc, Args); 3499 } 3500 3501 /// Build a new Objective-C instance message. 3502 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3503 Selector Sel, 3504 ArrayRef<SourceLocation> SelectorLocs, 3505 ObjCMethodDecl *Method, 3506 SourceLocation LBracLoc, 3507 MultiExprArg Args, 3508 SourceLocation RBracLoc) { 3509 return SemaRef.BuildInstanceMessage(Receiver, 3510 Receiver->getType(), 3511 /*SuperLoc=*/SourceLocation(), 3512 Sel, Method, LBracLoc, SelectorLocs, 3513 RBracLoc, Args); 3514 } 3515 3516 /// Build a new Objective-C instance/class message to 'super'. 3517 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3518 Selector Sel, 3519 ArrayRef<SourceLocation> SelectorLocs, 3520 QualType SuperType, 3521 ObjCMethodDecl *Method, 3522 SourceLocation LBracLoc, 3523 MultiExprArg Args, 3524 SourceLocation RBracLoc) { 3525 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3526 SuperType, 3527 SuperLoc, 3528 Sel, Method, LBracLoc, SelectorLocs, 3529 RBracLoc, Args) 3530 : SemaRef.BuildClassMessage(nullptr, 3531 SuperType, 3532 SuperLoc, 3533 Sel, Method, LBracLoc, SelectorLocs, 3534 RBracLoc, Args); 3535 3536 3537 } 3538 3539 /// Build a new Objective-C ivar reference expression. 3540 /// 3541 /// By default, performs semantic analysis to build the new expression. 3542 /// Subclasses may override this routine to provide different behavior. 3543 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3544 SourceLocation IvarLoc, 3545 bool IsArrow, bool IsFreeIvar) { 3546 CXXScopeSpec SS; 3547 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3548 ExprResult Result = getSema().BuildMemberReferenceExpr( 3549 BaseArg, BaseArg->getType(), 3550 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3551 /*FirstQualifierInScope=*/nullptr, NameInfo, 3552 /*TemplateArgs=*/nullptr, 3553 /*S=*/nullptr); 3554 if (IsFreeIvar && Result.isUsable()) 3555 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3556 return Result; 3557 } 3558 3559 /// Build a new Objective-C property reference expression. 3560 /// 3561 /// By default, performs semantic analysis to build the new expression. 3562 /// Subclasses may override this routine to provide different behavior. 3563 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3564 ObjCPropertyDecl *Property, 3565 SourceLocation PropertyLoc) { 3566 CXXScopeSpec SS; 3567 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3568 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3569 /*FIXME:*/PropertyLoc, 3570 /*IsArrow=*/false, 3571 SS, SourceLocation(), 3572 /*FirstQualifierInScope=*/nullptr, 3573 NameInfo, 3574 /*TemplateArgs=*/nullptr, 3575 /*S=*/nullptr); 3576 } 3577 3578 /// Build a new Objective-C property reference expression. 3579 /// 3580 /// By default, performs semantic analysis to build the new expression. 3581 /// Subclasses may override this routine to provide different behavior. 3582 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3583 ObjCMethodDecl *Getter, 3584 ObjCMethodDecl *Setter, 3585 SourceLocation PropertyLoc) { 3586 // Since these expressions can only be value-dependent, we do not 3587 // need to perform semantic analysis again. 3588 return Owned( 3589 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3590 VK_LValue, OK_ObjCProperty, 3591 PropertyLoc, Base)); 3592 } 3593 3594 /// Build a new Objective-C "isa" expression. 3595 /// 3596 /// By default, performs semantic analysis to build the new expression. 3597 /// Subclasses may override this routine to provide different behavior. 3598 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3599 SourceLocation OpLoc, bool IsArrow) { 3600 CXXScopeSpec SS; 3601 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3602 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3603 OpLoc, IsArrow, 3604 SS, SourceLocation(), 3605 /*FirstQualifierInScope=*/nullptr, 3606 NameInfo, 3607 /*TemplateArgs=*/nullptr, 3608 /*S=*/nullptr); 3609 } 3610 3611 /// Build a new shuffle vector expression. 3612 /// 3613 /// By default, performs semantic analysis to build the new expression. 3614 /// Subclasses may override this routine to provide different behavior. 3615 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3616 MultiExprArg SubExprs, 3617 SourceLocation RParenLoc) { 3618 // Find the declaration for __builtin_shufflevector 3619 const IdentifierInfo &Name 3620 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3621 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3622 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3623 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3624 3625 // Build a reference to the __builtin_shufflevector builtin 3626 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3627 Expr *Callee = new (SemaRef.Context) 3628 DeclRefExpr(SemaRef.Context, Builtin, false, 3629 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3630 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3631 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3632 CK_BuiltinFnToFnPtr).get(); 3633 3634 // Build the CallExpr 3635 ExprResult TheCall = CallExpr::Create( 3636 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3637 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3638 FPOptionsOverride()); 3639 3640 // Type-check the __builtin_shufflevector expression. 3641 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3642 } 3643 3644 /// Build a new convert vector expression. 3645 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3646 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3647 SourceLocation RParenLoc) { 3648 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3649 BuiltinLoc, RParenLoc); 3650 } 3651 3652 /// Build a new template argument pack expansion. 3653 /// 3654 /// By default, performs semantic analysis to build a new pack expansion 3655 /// for a template argument. Subclasses may override this routine to provide 3656 /// different behavior. 3657 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3658 SourceLocation EllipsisLoc, 3659 Optional<unsigned> NumExpansions) { 3660 switch (Pattern.getArgument().getKind()) { 3661 case TemplateArgument::Expression: { 3662 ExprResult Result 3663 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3664 EllipsisLoc, NumExpansions); 3665 if (Result.isInvalid()) 3666 return TemplateArgumentLoc(); 3667 3668 return TemplateArgumentLoc(Result.get(), Result.get()); 3669 } 3670 3671 case TemplateArgument::Template: 3672 return TemplateArgumentLoc( 3673 SemaRef.Context, 3674 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3675 NumExpansions), 3676 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3677 EllipsisLoc); 3678 3679 case TemplateArgument::Null: 3680 case TemplateArgument::Integral: 3681 case TemplateArgument::Declaration: 3682 case TemplateArgument::Pack: 3683 case TemplateArgument::TemplateExpansion: 3684 case TemplateArgument::NullPtr: 3685 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3686 3687 case TemplateArgument::Type: 3688 if (TypeSourceInfo *Expansion 3689 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3690 EllipsisLoc, 3691 NumExpansions)) 3692 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3693 Expansion); 3694 break; 3695 } 3696 3697 return TemplateArgumentLoc(); 3698 } 3699 3700 /// Build a new expression pack expansion. 3701 /// 3702 /// By default, performs semantic analysis to build a new pack expansion 3703 /// for an expression. Subclasses may override this routine to provide 3704 /// different behavior. 3705 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3706 Optional<unsigned> NumExpansions) { 3707 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3708 } 3709 3710 /// Build a new C++1z fold-expression. 3711 /// 3712 /// By default, performs semantic analysis in order to build a new fold 3713 /// expression. 3714 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3715 SourceLocation LParenLoc, Expr *LHS, 3716 BinaryOperatorKind Operator, 3717 SourceLocation EllipsisLoc, Expr *RHS, 3718 SourceLocation RParenLoc, 3719 Optional<unsigned> NumExpansions) { 3720 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3721 EllipsisLoc, RHS, RParenLoc, 3722 NumExpansions); 3723 } 3724 3725 /// Build an empty C++1z fold-expression with the given operator. 3726 /// 3727 /// By default, produces the fallback value for the fold-expression, or 3728 /// produce an error if there is no fallback value. 3729 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3730 BinaryOperatorKind Operator) { 3731 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3732 } 3733 3734 /// Build a new atomic operation expression. 3735 /// 3736 /// By default, performs semantic analysis to build the new expression. 3737 /// Subclasses may override this routine to provide different behavior. 3738 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3739 AtomicExpr::AtomicOp Op, 3740 SourceLocation RParenLoc) { 3741 // Use this for all of the locations, since we don't know the difference 3742 // between the call and the expr at this point. 3743 SourceRange Range{BuiltinLoc, RParenLoc}; 3744 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3745 Sema::AtomicArgumentOrder::AST); 3746 } 3747 3748 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3749 ArrayRef<Expr *> SubExprs, QualType Type) { 3750 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3751 } 3752 3753 private: 3754 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3755 QualType ObjectType, 3756 NamedDecl *FirstQualifierInScope, 3757 CXXScopeSpec &SS); 3758 3759 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3760 QualType ObjectType, 3761 NamedDecl *FirstQualifierInScope, 3762 CXXScopeSpec &SS); 3763 3764 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3765 NamedDecl *FirstQualifierInScope, 3766 CXXScopeSpec &SS); 3767 3768 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3769 DependentNameTypeLoc TL, 3770 bool DeducibleTSTContext); 3771 }; 3772 3773 template <typename Derived> 3774 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3775 if (!S) 3776 return S; 3777 3778 switch (S->getStmtClass()) { 3779 case Stmt::NoStmtClass: break; 3780 3781 // Transform individual statement nodes 3782 // Pass SDK into statements that can produce a value 3783 #define STMT(Node, Parent) \ 3784 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3785 #define VALUESTMT(Node, Parent) \ 3786 case Stmt::Node##Class: \ 3787 return getDerived().Transform##Node(cast<Node>(S), SDK); 3788 #define ABSTRACT_STMT(Node) 3789 #define EXPR(Node, Parent) 3790 #include "clang/AST/StmtNodes.inc" 3791 3792 // Transform expressions by calling TransformExpr. 3793 #define STMT(Node, Parent) 3794 #define ABSTRACT_STMT(Stmt) 3795 #define EXPR(Node, Parent) case Stmt::Node##Class: 3796 #include "clang/AST/StmtNodes.inc" 3797 { 3798 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3799 3800 if (SDK == SDK_StmtExprResult) 3801 E = getSema().ActOnStmtExprResult(E); 3802 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3803 } 3804 } 3805 3806 return S; 3807 } 3808 3809 template<typename Derived> 3810 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3811 if (!S) 3812 return S; 3813 3814 switch (S->getClauseKind()) { 3815 default: break; 3816 // Transform individual clause nodes 3817 #define GEN_CLANG_CLAUSE_CLASS 3818 #define CLAUSE_CLASS(Enum, Str, Class) \ 3819 case Enum: \ 3820 return getDerived().Transform##Class(cast<Class>(S)); 3821 #include "llvm/Frontend/OpenMP/OMP.inc" 3822 } 3823 3824 return S; 3825 } 3826 3827 3828 template<typename Derived> 3829 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3830 if (!E) 3831 return E; 3832 3833 switch (E->getStmtClass()) { 3834 case Stmt::NoStmtClass: break; 3835 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3836 #define ABSTRACT_STMT(Stmt) 3837 #define EXPR(Node, Parent) \ 3838 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3839 #include "clang/AST/StmtNodes.inc" 3840 } 3841 3842 return E; 3843 } 3844 3845 template<typename Derived> 3846 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3847 bool NotCopyInit) { 3848 // Initializers are instantiated like expressions, except that various outer 3849 // layers are stripped. 3850 if (!Init) 3851 return Init; 3852 3853 if (auto *FE = dyn_cast<FullExpr>(Init)) 3854 Init = FE->getSubExpr(); 3855 3856 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3857 Init = AIL->getCommonExpr(); 3858 3859 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3860 Init = MTE->getSubExpr(); 3861 3862 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3863 Init = Binder->getSubExpr(); 3864 3865 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3866 Init = ICE->getSubExprAsWritten(); 3867 3868 if (CXXStdInitializerListExpr *ILE = 3869 dyn_cast<CXXStdInitializerListExpr>(Init)) 3870 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3871 3872 // If this is copy-initialization, we only need to reconstruct 3873 // InitListExprs. Other forms of copy-initialization will be a no-op if 3874 // the initializer is already the right type. 3875 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3876 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3877 return getDerived().TransformExpr(Init); 3878 3879 // Revert value-initialization back to empty parens. 3880 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3881 SourceRange Parens = VIE->getSourceRange(); 3882 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3883 Parens.getEnd()); 3884 } 3885 3886 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3887 if (isa<ImplicitValueInitExpr>(Init)) 3888 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3889 SourceLocation()); 3890 3891 // Revert initialization by constructor back to a parenthesized or braced list 3892 // of expressions. Any other form of initializer can just be reused directly. 3893 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3894 return getDerived().TransformExpr(Init); 3895 3896 // If the initialization implicitly converted an initializer list to a 3897 // std::initializer_list object, unwrap the std::initializer_list too. 3898 if (Construct && Construct->isStdInitListInitialization()) 3899 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3900 3901 // Enter a list-init context if this was list initialization. 3902 EnterExpressionEvaluationContext Context( 3903 getSema(), EnterExpressionEvaluationContext::InitList, 3904 Construct->isListInitialization()); 3905 3906 SmallVector<Expr*, 8> NewArgs; 3907 bool ArgChanged = false; 3908 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3909 /*IsCall*/true, NewArgs, &ArgChanged)) 3910 return ExprError(); 3911 3912 // If this was list initialization, revert to syntactic list form. 3913 if (Construct->isListInitialization()) 3914 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3915 Construct->getEndLoc()); 3916 3917 // Build a ParenListExpr to represent anything else. 3918 SourceRange Parens = Construct->getParenOrBraceRange(); 3919 if (Parens.isInvalid()) { 3920 // This was a variable declaration's initialization for which no initializer 3921 // was specified. 3922 assert(NewArgs.empty() && 3923 "no parens or braces but have direct init with arguments?"); 3924 return ExprEmpty(); 3925 } 3926 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3927 Parens.getEnd()); 3928 } 3929 3930 template<typename Derived> 3931 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3932 unsigned NumInputs, 3933 bool IsCall, 3934 SmallVectorImpl<Expr *> &Outputs, 3935 bool *ArgChanged) { 3936 for (unsigned I = 0; I != NumInputs; ++I) { 3937 // If requested, drop call arguments that need to be dropped. 3938 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3939 if (ArgChanged) 3940 *ArgChanged = true; 3941 3942 break; 3943 } 3944 3945 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3946 Expr *Pattern = Expansion->getPattern(); 3947 3948 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3949 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3950 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3951 3952 // Determine whether the set of unexpanded parameter packs can and should 3953 // be expanded. 3954 bool Expand = true; 3955 bool RetainExpansion = false; 3956 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3957 Optional<unsigned> NumExpansions = OrigNumExpansions; 3958 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3959 Pattern->getSourceRange(), 3960 Unexpanded, 3961 Expand, RetainExpansion, 3962 NumExpansions)) 3963 return true; 3964 3965 if (!Expand) { 3966 // The transform has determined that we should perform a simple 3967 // transformation on the pack expansion, producing another pack 3968 // expansion. 3969 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3970 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3971 if (OutPattern.isInvalid()) 3972 return true; 3973 3974 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3975 Expansion->getEllipsisLoc(), 3976 NumExpansions); 3977 if (Out.isInvalid()) 3978 return true; 3979 3980 if (ArgChanged) 3981 *ArgChanged = true; 3982 Outputs.push_back(Out.get()); 3983 continue; 3984 } 3985 3986 // Record right away that the argument was changed. This needs 3987 // to happen even if the array expands to nothing. 3988 if (ArgChanged) *ArgChanged = true; 3989 3990 // The transform has determined that we should perform an elementwise 3991 // expansion of the pattern. Do so. 3992 for (unsigned I = 0; I != *NumExpansions; ++I) { 3993 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3994 ExprResult Out = getDerived().TransformExpr(Pattern); 3995 if (Out.isInvalid()) 3996 return true; 3997 3998 if (Out.get()->containsUnexpandedParameterPack()) { 3999 Out = getDerived().RebuildPackExpansion( 4000 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4001 if (Out.isInvalid()) 4002 return true; 4003 } 4004 4005 Outputs.push_back(Out.get()); 4006 } 4007 4008 // If we're supposed to retain a pack expansion, do so by temporarily 4009 // forgetting the partially-substituted parameter pack. 4010 if (RetainExpansion) { 4011 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4012 4013 ExprResult Out = getDerived().TransformExpr(Pattern); 4014 if (Out.isInvalid()) 4015 return true; 4016 4017 Out = getDerived().RebuildPackExpansion( 4018 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4019 if (Out.isInvalid()) 4020 return true; 4021 4022 Outputs.push_back(Out.get()); 4023 } 4024 4025 continue; 4026 } 4027 4028 ExprResult Result = 4029 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4030 : getDerived().TransformExpr(Inputs[I]); 4031 if (Result.isInvalid()) 4032 return true; 4033 4034 if (Result.get() != Inputs[I] && ArgChanged) 4035 *ArgChanged = true; 4036 4037 Outputs.push_back(Result.get()); 4038 } 4039 4040 return false; 4041 } 4042 4043 template <typename Derived> 4044 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4045 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4046 if (Var) { 4047 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4048 getDerived().TransformDefinition(Var->getLocation(), Var)); 4049 4050 if (!ConditionVar) 4051 return Sema::ConditionError(); 4052 4053 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4054 } 4055 4056 if (Expr) { 4057 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4058 4059 if (CondExpr.isInvalid()) 4060 return Sema::ConditionError(); 4061 4062 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4063 } 4064 4065 return Sema::ConditionResult(); 4066 } 4067 4068 template <typename Derived> 4069 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4070 NestedNameSpecifierLoc NNS, QualType ObjectType, 4071 NamedDecl *FirstQualifierInScope) { 4072 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4073 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4074 Qualifier = Qualifier.getPrefix()) 4075 Qualifiers.push_back(Qualifier); 4076 4077 CXXScopeSpec SS; 4078 while (!Qualifiers.empty()) { 4079 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4080 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4081 4082 switch (QNNS->getKind()) { 4083 case NestedNameSpecifier::Identifier: { 4084 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4085 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4086 ObjectType); 4087 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4088 SS, FirstQualifierInScope, false)) 4089 return NestedNameSpecifierLoc(); 4090 break; 4091 } 4092 4093 case NestedNameSpecifier::Namespace: { 4094 NamespaceDecl *NS = 4095 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4096 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4097 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4098 break; 4099 } 4100 4101 case NestedNameSpecifier::NamespaceAlias: { 4102 NamespaceAliasDecl *Alias = 4103 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4104 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4105 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4106 Q.getLocalEndLoc()); 4107 break; 4108 } 4109 4110 case NestedNameSpecifier::Global: 4111 // There is no meaningful transformation that one could perform on the 4112 // global scope. 4113 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4114 break; 4115 4116 case NestedNameSpecifier::Super: { 4117 CXXRecordDecl *RD = 4118 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4119 SourceLocation(), QNNS->getAsRecordDecl())); 4120 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4121 break; 4122 } 4123 4124 case NestedNameSpecifier::TypeSpecWithTemplate: 4125 case NestedNameSpecifier::TypeSpec: { 4126 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4127 FirstQualifierInScope, SS); 4128 4129 if (!TL) 4130 return NestedNameSpecifierLoc(); 4131 4132 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4133 (SemaRef.getLangOpts().CPlusPlus11 && 4134 TL.getType()->isEnumeralType())) { 4135 assert(!TL.getType().hasLocalQualifiers() && 4136 "Can't get cv-qualifiers here"); 4137 if (TL.getType()->isEnumeralType()) 4138 SemaRef.Diag(TL.getBeginLoc(), 4139 diag::warn_cxx98_compat_enum_nested_name_spec); 4140 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4141 Q.getLocalEndLoc()); 4142 break; 4143 } 4144 // If the nested-name-specifier is an invalid type def, don't emit an 4145 // error because a previous error should have already been emitted. 4146 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4147 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4148 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4149 << TL.getType() << SS.getRange(); 4150 } 4151 return NestedNameSpecifierLoc(); 4152 } 4153 } 4154 4155 // The qualifier-in-scope and object type only apply to the leftmost entity. 4156 FirstQualifierInScope = nullptr; 4157 ObjectType = QualType(); 4158 } 4159 4160 // Don't rebuild the nested-name-specifier if we don't have to. 4161 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4162 !getDerived().AlwaysRebuild()) 4163 return NNS; 4164 4165 // If we can re-use the source-location data from the original 4166 // nested-name-specifier, do so. 4167 if (SS.location_size() == NNS.getDataLength() && 4168 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4169 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4170 4171 // Allocate new nested-name-specifier location information. 4172 return SS.getWithLocInContext(SemaRef.Context); 4173 } 4174 4175 template<typename Derived> 4176 DeclarationNameInfo 4177 TreeTransform<Derived> 4178 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4179 DeclarationName Name = NameInfo.getName(); 4180 if (!Name) 4181 return DeclarationNameInfo(); 4182 4183 switch (Name.getNameKind()) { 4184 case DeclarationName::Identifier: 4185 case DeclarationName::ObjCZeroArgSelector: 4186 case DeclarationName::ObjCOneArgSelector: 4187 case DeclarationName::ObjCMultiArgSelector: 4188 case DeclarationName::CXXOperatorName: 4189 case DeclarationName::CXXLiteralOperatorName: 4190 case DeclarationName::CXXUsingDirective: 4191 return NameInfo; 4192 4193 case DeclarationName::CXXDeductionGuideName: { 4194 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4195 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4196 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4197 if (!NewTemplate) 4198 return DeclarationNameInfo(); 4199 4200 DeclarationNameInfo NewNameInfo(NameInfo); 4201 NewNameInfo.setName( 4202 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4203 return NewNameInfo; 4204 } 4205 4206 case DeclarationName::CXXConstructorName: 4207 case DeclarationName::CXXDestructorName: 4208 case DeclarationName::CXXConversionFunctionName: { 4209 TypeSourceInfo *NewTInfo; 4210 CanQualType NewCanTy; 4211 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4212 NewTInfo = getDerived().TransformType(OldTInfo); 4213 if (!NewTInfo) 4214 return DeclarationNameInfo(); 4215 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4216 } 4217 else { 4218 NewTInfo = nullptr; 4219 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4220 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4221 if (NewT.isNull()) 4222 return DeclarationNameInfo(); 4223 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4224 } 4225 4226 DeclarationName NewName 4227 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4228 NewCanTy); 4229 DeclarationNameInfo NewNameInfo(NameInfo); 4230 NewNameInfo.setName(NewName); 4231 NewNameInfo.setNamedTypeInfo(NewTInfo); 4232 return NewNameInfo; 4233 } 4234 } 4235 4236 llvm_unreachable("Unknown name kind."); 4237 } 4238 4239 template<typename Derived> 4240 TemplateName 4241 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4242 TemplateName Name, 4243 SourceLocation NameLoc, 4244 QualType ObjectType, 4245 NamedDecl *FirstQualifierInScope, 4246 bool AllowInjectedClassName) { 4247 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4248 TemplateDecl *Template = QTN->getTemplateDecl(); 4249 assert(Template && "qualified template name must refer to a template"); 4250 4251 TemplateDecl *TransTemplate 4252 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4253 Template)); 4254 if (!TransTemplate) 4255 return TemplateName(); 4256 4257 if (!getDerived().AlwaysRebuild() && 4258 SS.getScopeRep() == QTN->getQualifier() && 4259 TransTemplate == Template) 4260 return Name; 4261 4262 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4263 TransTemplate); 4264 } 4265 4266 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4267 if (SS.getScopeRep()) { 4268 // These apply to the scope specifier, not the template. 4269 ObjectType = QualType(); 4270 FirstQualifierInScope = nullptr; 4271 } 4272 4273 if (!getDerived().AlwaysRebuild() && 4274 SS.getScopeRep() == DTN->getQualifier() && 4275 ObjectType.isNull()) 4276 return Name; 4277 4278 // FIXME: Preserve the location of the "template" keyword. 4279 SourceLocation TemplateKWLoc = NameLoc; 4280 4281 if (DTN->isIdentifier()) { 4282 return getDerived().RebuildTemplateName(SS, 4283 TemplateKWLoc, 4284 *DTN->getIdentifier(), 4285 NameLoc, 4286 ObjectType, 4287 FirstQualifierInScope, 4288 AllowInjectedClassName); 4289 } 4290 4291 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4292 DTN->getOperator(), NameLoc, 4293 ObjectType, AllowInjectedClassName); 4294 } 4295 4296 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4297 TemplateDecl *TransTemplate 4298 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4299 Template)); 4300 if (!TransTemplate) 4301 return TemplateName(); 4302 4303 if (!getDerived().AlwaysRebuild() && 4304 TransTemplate == Template) 4305 return Name; 4306 4307 return TemplateName(TransTemplate); 4308 } 4309 4310 if (SubstTemplateTemplateParmPackStorage *SubstPack 4311 = Name.getAsSubstTemplateTemplateParmPack()) { 4312 TemplateTemplateParmDecl *TransParam 4313 = cast_or_null<TemplateTemplateParmDecl>( 4314 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4315 if (!TransParam) 4316 return TemplateName(); 4317 4318 if (!getDerived().AlwaysRebuild() && 4319 TransParam == SubstPack->getParameterPack()) 4320 return Name; 4321 4322 return getDerived().RebuildTemplateName(TransParam, 4323 SubstPack->getArgumentPack()); 4324 } 4325 4326 // These should be getting filtered out before they reach the AST. 4327 llvm_unreachable("overloaded function decl survived to here"); 4328 } 4329 4330 template<typename Derived> 4331 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4332 const TemplateArgument &Arg, 4333 TemplateArgumentLoc &Output) { 4334 Output = getSema().getTrivialTemplateArgumentLoc( 4335 Arg, QualType(), getDerived().getBaseLocation()); 4336 } 4337 4338 template <typename Derived> 4339 bool TreeTransform<Derived>::TransformTemplateArgument( 4340 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4341 bool Uneval) { 4342 const TemplateArgument &Arg = Input.getArgument(); 4343 switch (Arg.getKind()) { 4344 case TemplateArgument::Null: 4345 case TemplateArgument::Pack: 4346 llvm_unreachable("Unexpected TemplateArgument"); 4347 4348 case TemplateArgument::Integral: 4349 case TemplateArgument::NullPtr: 4350 case TemplateArgument::Declaration: { 4351 // Transform a resolved template argument straight to a resolved template 4352 // argument. We get here when substituting into an already-substituted 4353 // template type argument during concept satisfaction checking. 4354 QualType T = Arg.getNonTypeTemplateArgumentType(); 4355 QualType NewT = getDerived().TransformType(T); 4356 if (NewT.isNull()) 4357 return true; 4358 4359 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4360 ? Arg.getAsDecl() 4361 : nullptr; 4362 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4363 getDerived().getBaseLocation(), D)) 4364 : nullptr; 4365 if (D && !NewD) 4366 return true; 4367 4368 if (NewT == T && D == NewD) 4369 Output = Input; 4370 else if (Arg.getKind() == TemplateArgument::Integral) 4371 Output = TemplateArgumentLoc( 4372 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4373 TemplateArgumentLocInfo()); 4374 else if (Arg.getKind() == TemplateArgument::NullPtr) 4375 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4376 TemplateArgumentLocInfo()); 4377 else 4378 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4379 TemplateArgumentLocInfo()); 4380 4381 return false; 4382 } 4383 4384 case TemplateArgument::Type: { 4385 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4386 if (!DI) 4387 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4388 4389 DI = getDerived().TransformType(DI); 4390 if (!DI) 4391 return true; 4392 4393 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4394 return false; 4395 } 4396 4397 case TemplateArgument::Template: { 4398 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4399 if (QualifierLoc) { 4400 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4401 if (!QualifierLoc) 4402 return true; 4403 } 4404 4405 CXXScopeSpec SS; 4406 SS.Adopt(QualifierLoc); 4407 TemplateName Template = getDerived().TransformTemplateName( 4408 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4409 if (Template.isNull()) 4410 return true; 4411 4412 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4413 QualifierLoc, Input.getTemplateNameLoc()); 4414 return false; 4415 } 4416 4417 case TemplateArgument::TemplateExpansion: 4418 llvm_unreachable("Caller should expand pack expansions"); 4419 4420 case TemplateArgument::Expression: { 4421 // Template argument expressions are constant expressions. 4422 EnterExpressionEvaluationContext Unevaluated( 4423 getSema(), 4424 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4425 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4426 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4427 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4428 4429 Expr *InputExpr = Input.getSourceExpression(); 4430 if (!InputExpr) 4431 InputExpr = Input.getArgument().getAsExpr(); 4432 4433 ExprResult E = getDerived().TransformExpr(InputExpr); 4434 E = SemaRef.ActOnConstantExpression(E); 4435 if (E.isInvalid()) 4436 return true; 4437 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4438 return false; 4439 } 4440 } 4441 4442 // Work around bogus GCC warning 4443 return true; 4444 } 4445 4446 /// Iterator adaptor that invents template argument location information 4447 /// for each of the template arguments in its underlying iterator. 4448 template<typename Derived, typename InputIterator> 4449 class TemplateArgumentLocInventIterator { 4450 TreeTransform<Derived> &Self; 4451 InputIterator Iter; 4452 4453 public: 4454 typedef TemplateArgumentLoc value_type; 4455 typedef TemplateArgumentLoc reference; 4456 typedef typename std::iterator_traits<InputIterator>::difference_type 4457 difference_type; 4458 typedef std::input_iterator_tag iterator_category; 4459 4460 class pointer { 4461 TemplateArgumentLoc Arg; 4462 4463 public: 4464 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4465 4466 const TemplateArgumentLoc *operator->() const { return &Arg; } 4467 }; 4468 4469 TemplateArgumentLocInventIterator() { } 4470 4471 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4472 InputIterator Iter) 4473 : Self(Self), Iter(Iter) { } 4474 4475 TemplateArgumentLocInventIterator &operator++() { 4476 ++Iter; 4477 return *this; 4478 } 4479 4480 TemplateArgumentLocInventIterator operator++(int) { 4481 TemplateArgumentLocInventIterator Old(*this); 4482 ++(*this); 4483 return Old; 4484 } 4485 4486 reference operator*() const { 4487 TemplateArgumentLoc Result; 4488 Self.InventTemplateArgumentLoc(*Iter, Result); 4489 return Result; 4490 } 4491 4492 pointer operator->() const { return pointer(**this); } 4493 4494 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4495 const TemplateArgumentLocInventIterator &Y) { 4496 return X.Iter == Y.Iter; 4497 } 4498 4499 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4500 const TemplateArgumentLocInventIterator &Y) { 4501 return X.Iter != Y.Iter; 4502 } 4503 }; 4504 4505 template<typename Derived> 4506 template<typename InputIterator> 4507 bool TreeTransform<Derived>::TransformTemplateArguments( 4508 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4509 bool Uneval) { 4510 for (; First != Last; ++First) { 4511 TemplateArgumentLoc Out; 4512 TemplateArgumentLoc In = *First; 4513 4514 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4515 // Unpack argument packs, which we translate them into separate 4516 // arguments. 4517 // FIXME: We could do much better if we could guarantee that the 4518 // TemplateArgumentLocInfo for the pack expansion would be usable for 4519 // all of the template arguments in the argument pack. 4520 typedef TemplateArgumentLocInventIterator<Derived, 4521 TemplateArgument::pack_iterator> 4522 PackLocIterator; 4523 if (TransformTemplateArguments(PackLocIterator(*this, 4524 In.getArgument().pack_begin()), 4525 PackLocIterator(*this, 4526 In.getArgument().pack_end()), 4527 Outputs, Uneval)) 4528 return true; 4529 4530 continue; 4531 } 4532 4533 if (In.getArgument().isPackExpansion()) { 4534 // We have a pack expansion, for which we will be substituting into 4535 // the pattern. 4536 SourceLocation Ellipsis; 4537 Optional<unsigned> OrigNumExpansions; 4538 TemplateArgumentLoc Pattern 4539 = getSema().getTemplateArgumentPackExpansionPattern( 4540 In, Ellipsis, OrigNumExpansions); 4541 4542 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4543 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4544 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4545 4546 // Determine whether the set of unexpanded parameter packs can and should 4547 // be expanded. 4548 bool Expand = true; 4549 bool RetainExpansion = false; 4550 Optional<unsigned> NumExpansions = OrigNumExpansions; 4551 if (getDerived().TryExpandParameterPacks(Ellipsis, 4552 Pattern.getSourceRange(), 4553 Unexpanded, 4554 Expand, 4555 RetainExpansion, 4556 NumExpansions)) 4557 return true; 4558 4559 if (!Expand) { 4560 // The transform has determined that we should perform a simple 4561 // transformation on the pack expansion, producing another pack 4562 // expansion. 4563 TemplateArgumentLoc OutPattern; 4564 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4565 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4566 return true; 4567 4568 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4569 NumExpansions); 4570 if (Out.getArgument().isNull()) 4571 return true; 4572 4573 Outputs.addArgument(Out); 4574 continue; 4575 } 4576 4577 // The transform has determined that we should perform an elementwise 4578 // expansion of the pattern. Do so. 4579 for (unsigned I = 0; I != *NumExpansions; ++I) { 4580 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4581 4582 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4583 return true; 4584 4585 if (Out.getArgument().containsUnexpandedParameterPack()) { 4586 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4587 OrigNumExpansions); 4588 if (Out.getArgument().isNull()) 4589 return true; 4590 } 4591 4592 Outputs.addArgument(Out); 4593 } 4594 4595 // If we're supposed to retain a pack expansion, do so by temporarily 4596 // forgetting the partially-substituted parameter pack. 4597 if (RetainExpansion) { 4598 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4599 4600 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4601 return true; 4602 4603 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4604 OrigNumExpansions); 4605 if (Out.getArgument().isNull()) 4606 return true; 4607 4608 Outputs.addArgument(Out); 4609 } 4610 4611 continue; 4612 } 4613 4614 // The simple case: 4615 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4616 return true; 4617 4618 Outputs.addArgument(Out); 4619 } 4620 4621 return false; 4622 4623 } 4624 4625 //===----------------------------------------------------------------------===// 4626 // Type transformation 4627 //===----------------------------------------------------------------------===// 4628 4629 template<typename Derived> 4630 QualType TreeTransform<Derived>::TransformType(QualType T) { 4631 if (getDerived().AlreadyTransformed(T)) 4632 return T; 4633 4634 // Temporary workaround. All of these transformations should 4635 // eventually turn into transformations on TypeLocs. 4636 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4637 getDerived().getBaseLocation()); 4638 4639 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4640 4641 if (!NewDI) 4642 return QualType(); 4643 4644 return NewDI->getType(); 4645 } 4646 4647 template<typename Derived> 4648 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4649 // Refine the base location to the type's location. 4650 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4651 getDerived().getBaseEntity()); 4652 if (getDerived().AlreadyTransformed(DI->getType())) 4653 return DI; 4654 4655 TypeLocBuilder TLB; 4656 4657 TypeLoc TL = DI->getTypeLoc(); 4658 TLB.reserve(TL.getFullDataSize()); 4659 4660 QualType Result = getDerived().TransformType(TLB, TL); 4661 if (Result.isNull()) 4662 return nullptr; 4663 4664 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4665 } 4666 4667 template<typename Derived> 4668 QualType 4669 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4670 switch (T.getTypeLocClass()) { 4671 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4672 #define TYPELOC(CLASS, PARENT) \ 4673 case TypeLoc::CLASS: \ 4674 return getDerived().Transform##CLASS##Type(TLB, \ 4675 T.castAs<CLASS##TypeLoc>()); 4676 #include "clang/AST/TypeLocNodes.def" 4677 } 4678 4679 llvm_unreachable("unhandled type loc!"); 4680 } 4681 4682 template<typename Derived> 4683 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4684 if (!isa<DependentNameType>(T)) 4685 return TransformType(T); 4686 4687 if (getDerived().AlreadyTransformed(T)) 4688 return T; 4689 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4690 getDerived().getBaseLocation()); 4691 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4692 return NewDI ? NewDI->getType() : QualType(); 4693 } 4694 4695 template<typename Derived> 4696 TypeSourceInfo * 4697 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4698 if (!isa<DependentNameType>(DI->getType())) 4699 return TransformType(DI); 4700 4701 // Refine the base location to the type's location. 4702 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4703 getDerived().getBaseEntity()); 4704 if (getDerived().AlreadyTransformed(DI->getType())) 4705 return DI; 4706 4707 TypeLocBuilder TLB; 4708 4709 TypeLoc TL = DI->getTypeLoc(); 4710 TLB.reserve(TL.getFullDataSize()); 4711 4712 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4713 if (QTL) 4714 TL = QTL.getUnqualifiedLoc(); 4715 4716 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4717 4718 QualType Result = getDerived().TransformDependentNameType( 4719 TLB, DNTL, /*DeducedTSTContext*/true); 4720 if (Result.isNull()) 4721 return nullptr; 4722 4723 if (QTL) { 4724 Result = getDerived().RebuildQualifiedType(Result, QTL); 4725 if (Result.isNull()) 4726 return nullptr; 4727 TLB.TypeWasModifiedSafely(Result); 4728 } 4729 4730 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4731 } 4732 4733 template<typename Derived> 4734 QualType 4735 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4736 QualifiedTypeLoc T) { 4737 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4738 if (Result.isNull()) 4739 return QualType(); 4740 4741 Result = getDerived().RebuildQualifiedType(Result, T); 4742 4743 if (Result.isNull()) 4744 return QualType(); 4745 4746 // RebuildQualifiedType might have updated the type, but not in a way 4747 // that invalidates the TypeLoc. (There's no location information for 4748 // qualifiers.) 4749 TLB.TypeWasModifiedSafely(Result); 4750 4751 return Result; 4752 } 4753 4754 template <typename Derived> 4755 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4756 QualifiedTypeLoc TL) { 4757 4758 SourceLocation Loc = TL.getBeginLoc(); 4759 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4760 4761 if ((T.getAddressSpace() != LangAS::Default && 4762 Quals.getAddressSpace() != LangAS::Default) && 4763 T.getAddressSpace() != Quals.getAddressSpace()) { 4764 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4765 << TL.getType() << T; 4766 return QualType(); 4767 } 4768 4769 // C++ [dcl.fct]p7: 4770 // [When] adding cv-qualifications on top of the function type [...] the 4771 // cv-qualifiers are ignored. 4772 if (T->isFunctionType()) { 4773 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4774 Quals.getAddressSpace()); 4775 return T; 4776 } 4777 4778 // C++ [dcl.ref]p1: 4779 // when the cv-qualifiers are introduced through the use of a typedef-name 4780 // or decltype-specifier [...] the cv-qualifiers are ignored. 4781 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4782 // applied to a reference type. 4783 if (T->isReferenceType()) { 4784 // The only qualifier that applies to a reference type is restrict. 4785 if (!Quals.hasRestrict()) 4786 return T; 4787 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4788 } 4789 4790 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4791 // resulting type. 4792 if (Quals.hasObjCLifetime()) { 4793 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4794 Quals.removeObjCLifetime(); 4795 else if (T.getObjCLifetime()) { 4796 // Objective-C ARC: 4797 // A lifetime qualifier applied to a substituted template parameter 4798 // overrides the lifetime qualifier from the template argument. 4799 const AutoType *AutoTy; 4800 if (const SubstTemplateTypeParmType *SubstTypeParam 4801 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4802 QualType Replacement = SubstTypeParam->getReplacementType(); 4803 Qualifiers Qs = Replacement.getQualifiers(); 4804 Qs.removeObjCLifetime(); 4805 Replacement = SemaRef.Context.getQualifiedType( 4806 Replacement.getUnqualifiedType(), Qs); 4807 T = SemaRef.Context.getSubstTemplateTypeParmType( 4808 SubstTypeParam->getReplacedParameter(), Replacement); 4809 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4810 // 'auto' types behave the same way as template parameters. 4811 QualType Deduced = AutoTy->getDeducedType(); 4812 Qualifiers Qs = Deduced.getQualifiers(); 4813 Qs.removeObjCLifetime(); 4814 Deduced = 4815 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4816 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4817 AutoTy->isDependentType(), 4818 /*isPack=*/false, 4819 AutoTy->getTypeConstraintConcept(), 4820 AutoTy->getTypeConstraintArguments()); 4821 } else { 4822 // Otherwise, complain about the addition of a qualifier to an 4823 // already-qualified type. 4824 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4825 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4826 Quals.removeObjCLifetime(); 4827 } 4828 } 4829 } 4830 4831 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4832 } 4833 4834 template<typename Derived> 4835 TypeLoc 4836 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4837 QualType ObjectType, 4838 NamedDecl *UnqualLookup, 4839 CXXScopeSpec &SS) { 4840 if (getDerived().AlreadyTransformed(TL.getType())) 4841 return TL; 4842 4843 TypeSourceInfo *TSI = 4844 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4845 if (TSI) 4846 return TSI->getTypeLoc(); 4847 return TypeLoc(); 4848 } 4849 4850 template<typename Derived> 4851 TypeSourceInfo * 4852 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4853 QualType ObjectType, 4854 NamedDecl *UnqualLookup, 4855 CXXScopeSpec &SS) { 4856 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4857 return TSInfo; 4858 4859 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4860 UnqualLookup, SS); 4861 } 4862 4863 template <typename Derived> 4864 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4865 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4866 CXXScopeSpec &SS) { 4867 QualType T = TL.getType(); 4868 assert(!getDerived().AlreadyTransformed(T)); 4869 4870 TypeLocBuilder TLB; 4871 QualType Result; 4872 4873 if (isa<TemplateSpecializationType>(T)) { 4874 TemplateSpecializationTypeLoc SpecTL = 4875 TL.castAs<TemplateSpecializationTypeLoc>(); 4876 4877 TemplateName Template = getDerived().TransformTemplateName( 4878 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4879 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4880 if (Template.isNull()) 4881 return nullptr; 4882 4883 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4884 Template); 4885 } else if (isa<DependentTemplateSpecializationType>(T)) { 4886 DependentTemplateSpecializationTypeLoc SpecTL = 4887 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4888 4889 TemplateName Template 4890 = getDerived().RebuildTemplateName(SS, 4891 SpecTL.getTemplateKeywordLoc(), 4892 *SpecTL.getTypePtr()->getIdentifier(), 4893 SpecTL.getTemplateNameLoc(), 4894 ObjectType, UnqualLookup, 4895 /*AllowInjectedClassName*/true); 4896 if (Template.isNull()) 4897 return nullptr; 4898 4899 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4900 SpecTL, 4901 Template, 4902 SS); 4903 } else { 4904 // Nothing special needs to be done for these. 4905 Result = getDerived().TransformType(TLB, TL); 4906 } 4907 4908 if (Result.isNull()) 4909 return nullptr; 4910 4911 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4912 } 4913 4914 template <class TyLoc> static inline 4915 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4916 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4917 NewT.setNameLoc(T.getNameLoc()); 4918 return T.getType(); 4919 } 4920 4921 template<typename Derived> 4922 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4923 BuiltinTypeLoc T) { 4924 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4925 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4926 if (T.needsExtraLocalData()) 4927 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4928 return T.getType(); 4929 } 4930 4931 template<typename Derived> 4932 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4933 ComplexTypeLoc T) { 4934 // FIXME: recurse? 4935 return TransformTypeSpecType(TLB, T); 4936 } 4937 4938 template <typename Derived> 4939 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4940 AdjustedTypeLoc TL) { 4941 // Adjustments applied during transformation are handled elsewhere. 4942 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4943 } 4944 4945 template<typename Derived> 4946 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4947 DecayedTypeLoc TL) { 4948 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4949 if (OriginalType.isNull()) 4950 return QualType(); 4951 4952 QualType Result = TL.getType(); 4953 if (getDerived().AlwaysRebuild() || 4954 OriginalType != TL.getOriginalLoc().getType()) 4955 Result = SemaRef.Context.getDecayedType(OriginalType); 4956 TLB.push<DecayedTypeLoc>(Result); 4957 // Nothing to set for DecayedTypeLoc. 4958 return Result; 4959 } 4960 4961 template<typename Derived> 4962 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4963 PointerTypeLoc TL) { 4964 QualType PointeeType 4965 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4966 if (PointeeType.isNull()) 4967 return QualType(); 4968 4969 QualType Result = TL.getType(); 4970 if (PointeeType->getAs<ObjCObjectType>()) { 4971 // A dependent pointer type 'T *' has is being transformed such 4972 // that an Objective-C class type is being replaced for 'T'. The 4973 // resulting pointer type is an ObjCObjectPointerType, not a 4974 // PointerType. 4975 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4976 4977 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4978 NewT.setStarLoc(TL.getStarLoc()); 4979 return Result; 4980 } 4981 4982 if (getDerived().AlwaysRebuild() || 4983 PointeeType != TL.getPointeeLoc().getType()) { 4984 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4985 if (Result.isNull()) 4986 return QualType(); 4987 } 4988 4989 // Objective-C ARC can add lifetime qualifiers to the type that we're 4990 // pointing to. 4991 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4992 4993 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4994 NewT.setSigilLoc(TL.getSigilLoc()); 4995 return Result; 4996 } 4997 4998 template<typename Derived> 4999 QualType 5000 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5001 BlockPointerTypeLoc TL) { 5002 QualType PointeeType 5003 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5004 if (PointeeType.isNull()) 5005 return QualType(); 5006 5007 QualType Result = TL.getType(); 5008 if (getDerived().AlwaysRebuild() || 5009 PointeeType != TL.getPointeeLoc().getType()) { 5010 Result = getDerived().RebuildBlockPointerType(PointeeType, 5011 TL.getSigilLoc()); 5012 if (Result.isNull()) 5013 return QualType(); 5014 } 5015 5016 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5017 NewT.setSigilLoc(TL.getSigilLoc()); 5018 return Result; 5019 } 5020 5021 /// Transforms a reference type. Note that somewhat paradoxically we 5022 /// don't care whether the type itself is an l-value type or an r-value 5023 /// type; we only care if the type was *written* as an l-value type 5024 /// or an r-value type. 5025 template<typename Derived> 5026 QualType 5027 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5028 ReferenceTypeLoc TL) { 5029 const ReferenceType *T = TL.getTypePtr(); 5030 5031 // Note that this works with the pointee-as-written. 5032 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5033 if (PointeeType.isNull()) 5034 return QualType(); 5035 5036 QualType Result = TL.getType(); 5037 if (getDerived().AlwaysRebuild() || 5038 PointeeType != T->getPointeeTypeAsWritten()) { 5039 Result = getDerived().RebuildReferenceType(PointeeType, 5040 T->isSpelledAsLValue(), 5041 TL.getSigilLoc()); 5042 if (Result.isNull()) 5043 return QualType(); 5044 } 5045 5046 // Objective-C ARC can add lifetime qualifiers to the type that we're 5047 // referring to. 5048 TLB.TypeWasModifiedSafely( 5049 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5050 5051 // r-value references can be rebuilt as l-value references. 5052 ReferenceTypeLoc NewTL; 5053 if (isa<LValueReferenceType>(Result)) 5054 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5055 else 5056 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5057 NewTL.setSigilLoc(TL.getSigilLoc()); 5058 5059 return Result; 5060 } 5061 5062 template<typename Derived> 5063 QualType 5064 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5065 LValueReferenceTypeLoc TL) { 5066 return TransformReferenceType(TLB, TL); 5067 } 5068 5069 template<typename Derived> 5070 QualType 5071 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5072 RValueReferenceTypeLoc TL) { 5073 return TransformReferenceType(TLB, TL); 5074 } 5075 5076 template<typename Derived> 5077 QualType 5078 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5079 MemberPointerTypeLoc TL) { 5080 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5081 if (PointeeType.isNull()) 5082 return QualType(); 5083 5084 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5085 TypeSourceInfo *NewClsTInfo = nullptr; 5086 if (OldClsTInfo) { 5087 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5088 if (!NewClsTInfo) 5089 return QualType(); 5090 } 5091 5092 const MemberPointerType *T = TL.getTypePtr(); 5093 QualType OldClsType = QualType(T->getClass(), 0); 5094 QualType NewClsType; 5095 if (NewClsTInfo) 5096 NewClsType = NewClsTInfo->getType(); 5097 else { 5098 NewClsType = getDerived().TransformType(OldClsType); 5099 if (NewClsType.isNull()) 5100 return QualType(); 5101 } 5102 5103 QualType Result = TL.getType(); 5104 if (getDerived().AlwaysRebuild() || 5105 PointeeType != T->getPointeeType() || 5106 NewClsType != OldClsType) { 5107 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5108 TL.getStarLoc()); 5109 if (Result.isNull()) 5110 return QualType(); 5111 } 5112 5113 // If we had to adjust the pointee type when building a member pointer, make 5114 // sure to push TypeLoc info for it. 5115 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5116 if (MPT && PointeeType != MPT->getPointeeType()) { 5117 assert(isa<AdjustedType>(MPT->getPointeeType())); 5118 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5119 } 5120 5121 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5122 NewTL.setSigilLoc(TL.getSigilLoc()); 5123 NewTL.setClassTInfo(NewClsTInfo); 5124 5125 return Result; 5126 } 5127 5128 template<typename Derived> 5129 QualType 5130 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5131 ConstantArrayTypeLoc TL) { 5132 const ConstantArrayType *T = TL.getTypePtr(); 5133 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5134 if (ElementType.isNull()) 5135 return QualType(); 5136 5137 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5138 Expr *OldSize = TL.getSizeExpr(); 5139 if (!OldSize) 5140 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5141 Expr *NewSize = nullptr; 5142 if (OldSize) { 5143 EnterExpressionEvaluationContext Unevaluated( 5144 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5145 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5146 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5147 } 5148 5149 QualType Result = TL.getType(); 5150 if (getDerived().AlwaysRebuild() || 5151 ElementType != T->getElementType() || 5152 (T->getSizeExpr() && NewSize != OldSize)) { 5153 Result = getDerived().RebuildConstantArrayType(ElementType, 5154 T->getSizeModifier(), 5155 T->getSize(), NewSize, 5156 T->getIndexTypeCVRQualifiers(), 5157 TL.getBracketsRange()); 5158 if (Result.isNull()) 5159 return QualType(); 5160 } 5161 5162 // We might have either a ConstantArrayType or a VariableArrayType now: 5163 // a ConstantArrayType is allowed to have an element type which is a 5164 // VariableArrayType if the type is dependent. Fortunately, all array 5165 // types have the same location layout. 5166 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5167 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5168 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5169 NewTL.setSizeExpr(NewSize); 5170 5171 return Result; 5172 } 5173 5174 template<typename Derived> 5175 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5176 TypeLocBuilder &TLB, 5177 IncompleteArrayTypeLoc TL) { 5178 const IncompleteArrayType *T = TL.getTypePtr(); 5179 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5180 if (ElementType.isNull()) 5181 return QualType(); 5182 5183 QualType Result = TL.getType(); 5184 if (getDerived().AlwaysRebuild() || 5185 ElementType != T->getElementType()) { 5186 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5187 T->getSizeModifier(), 5188 T->getIndexTypeCVRQualifiers(), 5189 TL.getBracketsRange()); 5190 if (Result.isNull()) 5191 return QualType(); 5192 } 5193 5194 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5195 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5196 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5197 NewTL.setSizeExpr(nullptr); 5198 5199 return Result; 5200 } 5201 5202 template<typename Derived> 5203 QualType 5204 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5205 VariableArrayTypeLoc TL) { 5206 const VariableArrayType *T = TL.getTypePtr(); 5207 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5208 if (ElementType.isNull()) 5209 return QualType(); 5210 5211 ExprResult SizeResult; 5212 { 5213 EnterExpressionEvaluationContext Context( 5214 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5215 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5216 } 5217 if (SizeResult.isInvalid()) 5218 return QualType(); 5219 SizeResult = 5220 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5221 if (SizeResult.isInvalid()) 5222 return QualType(); 5223 5224 Expr *Size = SizeResult.get(); 5225 5226 QualType Result = TL.getType(); 5227 if (getDerived().AlwaysRebuild() || 5228 ElementType != T->getElementType() || 5229 Size != T->getSizeExpr()) { 5230 Result = getDerived().RebuildVariableArrayType(ElementType, 5231 T->getSizeModifier(), 5232 Size, 5233 T->getIndexTypeCVRQualifiers(), 5234 TL.getBracketsRange()); 5235 if (Result.isNull()) 5236 return QualType(); 5237 } 5238 5239 // We might have constant size array now, but fortunately it has the same 5240 // location layout. 5241 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5242 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5243 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5244 NewTL.setSizeExpr(Size); 5245 5246 return Result; 5247 } 5248 5249 template<typename Derived> 5250 QualType 5251 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5252 DependentSizedArrayTypeLoc TL) { 5253 const DependentSizedArrayType *T = TL.getTypePtr(); 5254 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5255 if (ElementType.isNull()) 5256 return QualType(); 5257 5258 // Array bounds are constant expressions. 5259 EnterExpressionEvaluationContext Unevaluated( 5260 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5261 5262 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5263 Expr *origSize = TL.getSizeExpr(); 5264 if (!origSize) origSize = T->getSizeExpr(); 5265 5266 ExprResult sizeResult 5267 = getDerived().TransformExpr(origSize); 5268 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5269 if (sizeResult.isInvalid()) 5270 return QualType(); 5271 5272 Expr *size = sizeResult.get(); 5273 5274 QualType Result = TL.getType(); 5275 if (getDerived().AlwaysRebuild() || 5276 ElementType != T->getElementType() || 5277 size != origSize) { 5278 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5279 T->getSizeModifier(), 5280 size, 5281 T->getIndexTypeCVRQualifiers(), 5282 TL.getBracketsRange()); 5283 if (Result.isNull()) 5284 return QualType(); 5285 } 5286 5287 // We might have any sort of array type now, but fortunately they 5288 // all have the same location layout. 5289 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5290 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5291 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5292 NewTL.setSizeExpr(size); 5293 5294 return Result; 5295 } 5296 5297 template <typename Derived> 5298 QualType TreeTransform<Derived>::TransformDependentVectorType( 5299 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5300 const DependentVectorType *T = TL.getTypePtr(); 5301 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5302 if (ElementType.isNull()) 5303 return QualType(); 5304 5305 EnterExpressionEvaluationContext Unevaluated( 5306 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5307 5308 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5309 Size = SemaRef.ActOnConstantExpression(Size); 5310 if (Size.isInvalid()) 5311 return QualType(); 5312 5313 QualType Result = TL.getType(); 5314 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5315 Size.get() != T->getSizeExpr()) { 5316 Result = getDerived().RebuildDependentVectorType( 5317 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5318 if (Result.isNull()) 5319 return QualType(); 5320 } 5321 5322 // Result might be dependent or not. 5323 if (isa<DependentVectorType>(Result)) { 5324 DependentVectorTypeLoc NewTL = 5325 TLB.push<DependentVectorTypeLoc>(Result); 5326 NewTL.setNameLoc(TL.getNameLoc()); 5327 } else { 5328 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5329 NewTL.setNameLoc(TL.getNameLoc()); 5330 } 5331 5332 return Result; 5333 } 5334 5335 template<typename Derived> 5336 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5337 TypeLocBuilder &TLB, 5338 DependentSizedExtVectorTypeLoc TL) { 5339 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5340 5341 // FIXME: ext vector locs should be nested 5342 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5343 if (ElementType.isNull()) 5344 return QualType(); 5345 5346 // Vector sizes are constant expressions. 5347 EnterExpressionEvaluationContext Unevaluated( 5348 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5349 5350 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5351 Size = SemaRef.ActOnConstantExpression(Size); 5352 if (Size.isInvalid()) 5353 return QualType(); 5354 5355 QualType Result = TL.getType(); 5356 if (getDerived().AlwaysRebuild() || 5357 ElementType != T->getElementType() || 5358 Size.get() != T->getSizeExpr()) { 5359 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5360 Size.get(), 5361 T->getAttributeLoc()); 5362 if (Result.isNull()) 5363 return QualType(); 5364 } 5365 5366 // Result might be dependent or not. 5367 if (isa<DependentSizedExtVectorType>(Result)) { 5368 DependentSizedExtVectorTypeLoc NewTL 5369 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5370 NewTL.setNameLoc(TL.getNameLoc()); 5371 } else { 5372 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5373 NewTL.setNameLoc(TL.getNameLoc()); 5374 } 5375 5376 return Result; 5377 } 5378 5379 template <typename Derived> 5380 QualType 5381 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5382 ConstantMatrixTypeLoc TL) { 5383 const ConstantMatrixType *T = TL.getTypePtr(); 5384 QualType ElementType = getDerived().TransformType(T->getElementType()); 5385 if (ElementType.isNull()) 5386 return QualType(); 5387 5388 QualType Result = TL.getType(); 5389 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5390 Result = getDerived().RebuildConstantMatrixType( 5391 ElementType, T->getNumRows(), T->getNumColumns()); 5392 if (Result.isNull()) 5393 return QualType(); 5394 } 5395 5396 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5397 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5398 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5399 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5400 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5401 5402 return Result; 5403 } 5404 5405 template <typename Derived> 5406 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5407 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5408 const DependentSizedMatrixType *T = TL.getTypePtr(); 5409 5410 QualType ElementType = getDerived().TransformType(T->getElementType()); 5411 if (ElementType.isNull()) { 5412 return QualType(); 5413 } 5414 5415 // Matrix dimensions are constant expressions. 5416 EnterExpressionEvaluationContext Unevaluated( 5417 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5418 5419 Expr *origRows = TL.getAttrRowOperand(); 5420 if (!origRows) 5421 origRows = T->getRowExpr(); 5422 Expr *origColumns = TL.getAttrColumnOperand(); 5423 if (!origColumns) 5424 origColumns = T->getColumnExpr(); 5425 5426 ExprResult rowResult = getDerived().TransformExpr(origRows); 5427 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5428 if (rowResult.isInvalid()) 5429 return QualType(); 5430 5431 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5432 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5433 if (columnResult.isInvalid()) 5434 return QualType(); 5435 5436 Expr *rows = rowResult.get(); 5437 Expr *columns = columnResult.get(); 5438 5439 QualType Result = TL.getType(); 5440 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5441 rows != origRows || columns != origColumns) { 5442 Result = getDerived().RebuildDependentSizedMatrixType( 5443 ElementType, rows, columns, T->getAttributeLoc()); 5444 5445 if (Result.isNull()) 5446 return QualType(); 5447 } 5448 5449 // We might have any sort of matrix type now, but fortunately they 5450 // all have the same location layout. 5451 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5452 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5453 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5454 NewTL.setAttrRowOperand(rows); 5455 NewTL.setAttrColumnOperand(columns); 5456 return Result; 5457 } 5458 5459 template <typename Derived> 5460 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5461 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5462 const DependentAddressSpaceType *T = TL.getTypePtr(); 5463 5464 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5465 5466 if (pointeeType.isNull()) 5467 return QualType(); 5468 5469 // Address spaces are constant expressions. 5470 EnterExpressionEvaluationContext Unevaluated( 5471 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5472 5473 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5474 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5475 if (AddrSpace.isInvalid()) 5476 return QualType(); 5477 5478 QualType Result = TL.getType(); 5479 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5480 AddrSpace.get() != T->getAddrSpaceExpr()) { 5481 Result = getDerived().RebuildDependentAddressSpaceType( 5482 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5483 if (Result.isNull()) 5484 return QualType(); 5485 } 5486 5487 // Result might be dependent or not. 5488 if (isa<DependentAddressSpaceType>(Result)) { 5489 DependentAddressSpaceTypeLoc NewTL = 5490 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5491 5492 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5493 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5494 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5495 5496 } else { 5497 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5498 Result, getDerived().getBaseLocation()); 5499 TransformType(TLB, DI->getTypeLoc()); 5500 } 5501 5502 return Result; 5503 } 5504 5505 template <typename Derived> 5506 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5507 VectorTypeLoc TL) { 5508 const VectorType *T = TL.getTypePtr(); 5509 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5510 if (ElementType.isNull()) 5511 return QualType(); 5512 5513 QualType Result = TL.getType(); 5514 if (getDerived().AlwaysRebuild() || 5515 ElementType != T->getElementType()) { 5516 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5517 T->getVectorKind()); 5518 if (Result.isNull()) 5519 return QualType(); 5520 } 5521 5522 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5523 NewTL.setNameLoc(TL.getNameLoc()); 5524 5525 return Result; 5526 } 5527 5528 template<typename Derived> 5529 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5530 ExtVectorTypeLoc TL) { 5531 const VectorType *T = TL.getTypePtr(); 5532 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5533 if (ElementType.isNull()) 5534 return QualType(); 5535 5536 QualType Result = TL.getType(); 5537 if (getDerived().AlwaysRebuild() || 5538 ElementType != T->getElementType()) { 5539 Result = getDerived().RebuildExtVectorType(ElementType, 5540 T->getNumElements(), 5541 /*FIXME*/ SourceLocation()); 5542 if (Result.isNull()) 5543 return QualType(); 5544 } 5545 5546 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5547 NewTL.setNameLoc(TL.getNameLoc()); 5548 5549 return Result; 5550 } 5551 5552 template <typename Derived> 5553 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5554 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5555 bool ExpectParameterPack) { 5556 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5557 TypeSourceInfo *NewDI = nullptr; 5558 5559 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5560 // If we're substituting into a pack expansion type and we know the 5561 // length we want to expand to, just substitute for the pattern. 5562 TypeLoc OldTL = OldDI->getTypeLoc(); 5563 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5564 5565 TypeLocBuilder TLB; 5566 TypeLoc NewTL = OldDI->getTypeLoc(); 5567 TLB.reserve(NewTL.getFullDataSize()); 5568 5569 QualType Result = getDerived().TransformType(TLB, 5570 OldExpansionTL.getPatternLoc()); 5571 if (Result.isNull()) 5572 return nullptr; 5573 5574 Result = RebuildPackExpansionType(Result, 5575 OldExpansionTL.getPatternLoc().getSourceRange(), 5576 OldExpansionTL.getEllipsisLoc(), 5577 NumExpansions); 5578 if (Result.isNull()) 5579 return nullptr; 5580 5581 PackExpansionTypeLoc NewExpansionTL 5582 = TLB.push<PackExpansionTypeLoc>(Result); 5583 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5584 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5585 } else 5586 NewDI = getDerived().TransformType(OldDI); 5587 if (!NewDI) 5588 return nullptr; 5589 5590 if (NewDI == OldDI && indexAdjustment == 0) 5591 return OldParm; 5592 5593 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5594 OldParm->getDeclContext(), 5595 OldParm->getInnerLocStart(), 5596 OldParm->getLocation(), 5597 OldParm->getIdentifier(), 5598 NewDI->getType(), 5599 NewDI, 5600 OldParm->getStorageClass(), 5601 /* DefArg */ nullptr); 5602 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5603 OldParm->getFunctionScopeIndex() + indexAdjustment); 5604 transformedLocalDecl(OldParm, {newParm}); 5605 return newParm; 5606 } 5607 5608 template <typename Derived> 5609 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5610 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5611 const QualType *ParamTypes, 5612 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5613 SmallVectorImpl<QualType> &OutParamTypes, 5614 SmallVectorImpl<ParmVarDecl *> *PVars, 5615 Sema::ExtParameterInfoBuilder &PInfos) { 5616 int indexAdjustment = 0; 5617 5618 unsigned NumParams = Params.size(); 5619 for (unsigned i = 0; i != NumParams; ++i) { 5620 if (ParmVarDecl *OldParm = Params[i]) { 5621 assert(OldParm->getFunctionScopeIndex() == i); 5622 5623 Optional<unsigned> NumExpansions; 5624 ParmVarDecl *NewParm = nullptr; 5625 if (OldParm->isParameterPack()) { 5626 // We have a function parameter pack that may need to be expanded. 5627 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5628 5629 // Find the parameter packs that could be expanded. 5630 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5631 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5632 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5633 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5634 5635 // Determine whether we should expand the parameter packs. 5636 bool ShouldExpand = false; 5637 bool RetainExpansion = false; 5638 Optional<unsigned> OrigNumExpansions; 5639 if (Unexpanded.size() > 0) { 5640 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5641 NumExpansions = OrigNumExpansions; 5642 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5643 Pattern.getSourceRange(), 5644 Unexpanded, 5645 ShouldExpand, 5646 RetainExpansion, 5647 NumExpansions)) { 5648 return true; 5649 } 5650 } else { 5651 #ifndef NDEBUG 5652 const AutoType *AT = 5653 Pattern.getType().getTypePtr()->getContainedAutoType(); 5654 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5655 "Could not find parameter packs or undeduced auto type!"); 5656 #endif 5657 } 5658 5659 if (ShouldExpand) { 5660 // Expand the function parameter pack into multiple, separate 5661 // parameters. 5662 getDerived().ExpandingFunctionParameterPack(OldParm); 5663 for (unsigned I = 0; I != *NumExpansions; ++I) { 5664 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5665 ParmVarDecl *NewParm 5666 = getDerived().TransformFunctionTypeParam(OldParm, 5667 indexAdjustment++, 5668 OrigNumExpansions, 5669 /*ExpectParameterPack=*/false); 5670 if (!NewParm) 5671 return true; 5672 5673 if (ParamInfos) 5674 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5675 OutParamTypes.push_back(NewParm->getType()); 5676 if (PVars) 5677 PVars->push_back(NewParm); 5678 } 5679 5680 // If we're supposed to retain a pack expansion, do so by temporarily 5681 // forgetting the partially-substituted parameter pack. 5682 if (RetainExpansion) { 5683 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5684 ParmVarDecl *NewParm 5685 = getDerived().TransformFunctionTypeParam(OldParm, 5686 indexAdjustment++, 5687 OrigNumExpansions, 5688 /*ExpectParameterPack=*/false); 5689 if (!NewParm) 5690 return true; 5691 5692 if (ParamInfos) 5693 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5694 OutParamTypes.push_back(NewParm->getType()); 5695 if (PVars) 5696 PVars->push_back(NewParm); 5697 } 5698 5699 // The next parameter should have the same adjustment as the 5700 // last thing we pushed, but we post-incremented indexAdjustment 5701 // on every push. Also, if we push nothing, the adjustment should 5702 // go down by one. 5703 indexAdjustment--; 5704 5705 // We're done with the pack expansion. 5706 continue; 5707 } 5708 5709 // We'll substitute the parameter now without expanding the pack 5710 // expansion. 5711 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5712 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5713 indexAdjustment, 5714 NumExpansions, 5715 /*ExpectParameterPack=*/true); 5716 assert(NewParm->isParameterPack() && 5717 "Parameter pack no longer a parameter pack after " 5718 "transformation."); 5719 } else { 5720 NewParm = getDerived().TransformFunctionTypeParam( 5721 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5722 } 5723 5724 if (!NewParm) 5725 return true; 5726 5727 if (ParamInfos) 5728 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5729 OutParamTypes.push_back(NewParm->getType()); 5730 if (PVars) 5731 PVars->push_back(NewParm); 5732 continue; 5733 } 5734 5735 // Deal with the possibility that we don't have a parameter 5736 // declaration for this parameter. 5737 QualType OldType = ParamTypes[i]; 5738 bool IsPackExpansion = false; 5739 Optional<unsigned> NumExpansions; 5740 QualType NewType; 5741 if (const PackExpansionType *Expansion 5742 = dyn_cast<PackExpansionType>(OldType)) { 5743 // We have a function parameter pack that may need to be expanded. 5744 QualType Pattern = Expansion->getPattern(); 5745 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5746 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5747 5748 // Determine whether we should expand the parameter packs. 5749 bool ShouldExpand = false; 5750 bool RetainExpansion = false; 5751 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5752 Unexpanded, 5753 ShouldExpand, 5754 RetainExpansion, 5755 NumExpansions)) { 5756 return true; 5757 } 5758 5759 if (ShouldExpand) { 5760 // Expand the function parameter pack into multiple, separate 5761 // parameters. 5762 for (unsigned I = 0; I != *NumExpansions; ++I) { 5763 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5764 QualType NewType = getDerived().TransformType(Pattern); 5765 if (NewType.isNull()) 5766 return true; 5767 5768 if (NewType->containsUnexpandedParameterPack()) { 5769 NewType = 5770 getSema().getASTContext().getPackExpansionType(NewType, None); 5771 5772 if (NewType.isNull()) 5773 return true; 5774 } 5775 5776 if (ParamInfos) 5777 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5778 OutParamTypes.push_back(NewType); 5779 if (PVars) 5780 PVars->push_back(nullptr); 5781 } 5782 5783 // We're done with the pack expansion. 5784 continue; 5785 } 5786 5787 // If we're supposed to retain a pack expansion, do so by temporarily 5788 // forgetting the partially-substituted parameter pack. 5789 if (RetainExpansion) { 5790 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5791 QualType NewType = getDerived().TransformType(Pattern); 5792 if (NewType.isNull()) 5793 return true; 5794 5795 if (ParamInfos) 5796 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5797 OutParamTypes.push_back(NewType); 5798 if (PVars) 5799 PVars->push_back(nullptr); 5800 } 5801 5802 // We'll substitute the parameter now without expanding the pack 5803 // expansion. 5804 OldType = Expansion->getPattern(); 5805 IsPackExpansion = true; 5806 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5807 NewType = getDerived().TransformType(OldType); 5808 } else { 5809 NewType = getDerived().TransformType(OldType); 5810 } 5811 5812 if (NewType.isNull()) 5813 return true; 5814 5815 if (IsPackExpansion) 5816 NewType = getSema().Context.getPackExpansionType(NewType, 5817 NumExpansions); 5818 5819 if (ParamInfos) 5820 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5821 OutParamTypes.push_back(NewType); 5822 if (PVars) 5823 PVars->push_back(nullptr); 5824 } 5825 5826 #ifndef NDEBUG 5827 if (PVars) { 5828 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5829 if (ParmVarDecl *parm = (*PVars)[i]) 5830 assert(parm->getFunctionScopeIndex() == i); 5831 } 5832 #endif 5833 5834 return false; 5835 } 5836 5837 template<typename Derived> 5838 QualType 5839 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5840 FunctionProtoTypeLoc TL) { 5841 SmallVector<QualType, 4> ExceptionStorage; 5842 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5843 return getDerived().TransformFunctionProtoType( 5844 TLB, TL, nullptr, Qualifiers(), 5845 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5846 return This->getDerived().TransformExceptionSpec( 5847 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5848 }); 5849 } 5850 5851 template<typename Derived> template<typename Fn> 5852 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5853 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5854 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5855 5856 // Transform the parameters and return type. 5857 // 5858 // We are required to instantiate the params and return type in source order. 5859 // When the function has a trailing return type, we instantiate the 5860 // parameters before the return type, since the return type can then refer 5861 // to the parameters themselves (via decltype, sizeof, etc.). 5862 // 5863 SmallVector<QualType, 4> ParamTypes; 5864 SmallVector<ParmVarDecl*, 4> ParamDecls; 5865 Sema::ExtParameterInfoBuilder ExtParamInfos; 5866 const FunctionProtoType *T = TL.getTypePtr(); 5867 5868 QualType ResultType; 5869 5870 if (T->hasTrailingReturn()) { 5871 if (getDerived().TransformFunctionTypeParams( 5872 TL.getBeginLoc(), TL.getParams(), 5873 TL.getTypePtr()->param_type_begin(), 5874 T->getExtParameterInfosOrNull(), 5875 ParamTypes, &ParamDecls, ExtParamInfos)) 5876 return QualType(); 5877 5878 { 5879 // C++11 [expr.prim.general]p3: 5880 // If a declaration declares a member function or member function 5881 // template of a class X, the expression this is a prvalue of type 5882 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5883 // and the end of the function-definition, member-declarator, or 5884 // declarator. 5885 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5886 5887 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5888 if (ResultType.isNull()) 5889 return QualType(); 5890 } 5891 } 5892 else { 5893 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5894 if (ResultType.isNull()) 5895 return QualType(); 5896 5897 if (getDerived().TransformFunctionTypeParams( 5898 TL.getBeginLoc(), TL.getParams(), 5899 TL.getTypePtr()->param_type_begin(), 5900 T->getExtParameterInfosOrNull(), 5901 ParamTypes, &ParamDecls, ExtParamInfos)) 5902 return QualType(); 5903 } 5904 5905 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5906 5907 bool EPIChanged = false; 5908 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5909 return QualType(); 5910 5911 // Handle extended parameter information. 5912 if (auto NewExtParamInfos = 5913 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5914 if (!EPI.ExtParameterInfos || 5915 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5916 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5917 EPIChanged = true; 5918 } 5919 EPI.ExtParameterInfos = NewExtParamInfos; 5920 } else if (EPI.ExtParameterInfos) { 5921 EPIChanged = true; 5922 EPI.ExtParameterInfos = nullptr; 5923 } 5924 5925 QualType Result = TL.getType(); 5926 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5927 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5928 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5929 if (Result.isNull()) 5930 return QualType(); 5931 } 5932 5933 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5934 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5935 NewTL.setLParenLoc(TL.getLParenLoc()); 5936 NewTL.setRParenLoc(TL.getRParenLoc()); 5937 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5938 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5939 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5940 NewTL.setParam(i, ParamDecls[i]); 5941 5942 return Result; 5943 } 5944 5945 template<typename Derived> 5946 bool TreeTransform<Derived>::TransformExceptionSpec( 5947 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5948 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5949 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5950 5951 // Instantiate a dynamic noexcept expression, if any. 5952 if (isComputedNoexcept(ESI.Type)) { 5953 EnterExpressionEvaluationContext Unevaluated( 5954 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5955 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5956 if (NoexceptExpr.isInvalid()) 5957 return true; 5958 5959 ExceptionSpecificationType EST = ESI.Type; 5960 NoexceptExpr = 5961 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5962 if (NoexceptExpr.isInvalid()) 5963 return true; 5964 5965 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5966 Changed = true; 5967 ESI.NoexceptExpr = NoexceptExpr.get(); 5968 ESI.Type = EST; 5969 } 5970 5971 if (ESI.Type != EST_Dynamic) 5972 return false; 5973 5974 // Instantiate a dynamic exception specification's type. 5975 for (QualType T : ESI.Exceptions) { 5976 if (const PackExpansionType *PackExpansion = 5977 T->getAs<PackExpansionType>()) { 5978 Changed = true; 5979 5980 // We have a pack expansion. Instantiate it. 5981 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5982 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5983 Unexpanded); 5984 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5985 5986 // Determine whether the set of unexpanded parameter packs can and 5987 // should 5988 // be expanded. 5989 bool Expand = false; 5990 bool RetainExpansion = false; 5991 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5992 // FIXME: Track the location of the ellipsis (and track source location 5993 // information for the types in the exception specification in general). 5994 if (getDerived().TryExpandParameterPacks( 5995 Loc, SourceRange(), Unexpanded, Expand, 5996 RetainExpansion, NumExpansions)) 5997 return true; 5998 5999 if (!Expand) { 6000 // We can't expand this pack expansion into separate arguments yet; 6001 // just substitute into the pattern and create a new pack expansion 6002 // type. 6003 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6004 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6005 if (U.isNull()) 6006 return true; 6007 6008 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6009 Exceptions.push_back(U); 6010 continue; 6011 } 6012 6013 // Substitute into the pack expansion pattern for each slice of the 6014 // pack. 6015 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6016 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6017 6018 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6019 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6020 return true; 6021 6022 Exceptions.push_back(U); 6023 } 6024 } else { 6025 QualType U = getDerived().TransformType(T); 6026 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6027 return true; 6028 if (T != U) 6029 Changed = true; 6030 6031 Exceptions.push_back(U); 6032 } 6033 } 6034 6035 ESI.Exceptions = Exceptions; 6036 if (ESI.Exceptions.empty()) 6037 ESI.Type = EST_DynamicNone; 6038 return false; 6039 } 6040 6041 template<typename Derived> 6042 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6043 TypeLocBuilder &TLB, 6044 FunctionNoProtoTypeLoc TL) { 6045 const FunctionNoProtoType *T = TL.getTypePtr(); 6046 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6047 if (ResultType.isNull()) 6048 return QualType(); 6049 6050 QualType Result = TL.getType(); 6051 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6052 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6053 6054 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6055 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6056 NewTL.setLParenLoc(TL.getLParenLoc()); 6057 NewTL.setRParenLoc(TL.getRParenLoc()); 6058 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6059 6060 return Result; 6061 } 6062 6063 template<typename Derived> QualType 6064 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 6065 UnresolvedUsingTypeLoc TL) { 6066 const UnresolvedUsingType *T = TL.getTypePtr(); 6067 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6068 if (!D) 6069 return QualType(); 6070 6071 QualType Result = TL.getType(); 6072 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6073 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6074 if (Result.isNull()) 6075 return QualType(); 6076 } 6077 6078 // We might get an arbitrary type spec type back. We should at 6079 // least always get a type spec type, though. 6080 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6081 NewTL.setNameLoc(TL.getNameLoc()); 6082 6083 return Result; 6084 } 6085 6086 template<typename Derived> 6087 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6088 TypedefTypeLoc TL) { 6089 const TypedefType *T = TL.getTypePtr(); 6090 TypedefNameDecl *Typedef 6091 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6092 T->getDecl())); 6093 if (!Typedef) 6094 return QualType(); 6095 6096 QualType Result = TL.getType(); 6097 if (getDerived().AlwaysRebuild() || 6098 Typedef != T->getDecl()) { 6099 Result = getDerived().RebuildTypedefType(Typedef); 6100 if (Result.isNull()) 6101 return QualType(); 6102 } 6103 6104 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6105 NewTL.setNameLoc(TL.getNameLoc()); 6106 6107 return Result; 6108 } 6109 6110 template<typename Derived> 6111 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6112 TypeOfExprTypeLoc TL) { 6113 // typeof expressions are not potentially evaluated contexts 6114 EnterExpressionEvaluationContext Unevaluated( 6115 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6116 Sema::ReuseLambdaContextDecl); 6117 6118 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6119 if (E.isInvalid()) 6120 return QualType(); 6121 6122 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6123 if (E.isInvalid()) 6124 return QualType(); 6125 6126 QualType Result = TL.getType(); 6127 if (getDerived().AlwaysRebuild() || 6128 E.get() != TL.getUnderlyingExpr()) { 6129 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6130 if (Result.isNull()) 6131 return QualType(); 6132 } 6133 else E.get(); 6134 6135 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6136 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6137 NewTL.setLParenLoc(TL.getLParenLoc()); 6138 NewTL.setRParenLoc(TL.getRParenLoc()); 6139 6140 return Result; 6141 } 6142 6143 template<typename Derived> 6144 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6145 TypeOfTypeLoc TL) { 6146 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6147 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6148 if (!New_Under_TI) 6149 return QualType(); 6150 6151 QualType Result = TL.getType(); 6152 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6153 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6154 if (Result.isNull()) 6155 return QualType(); 6156 } 6157 6158 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6159 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6160 NewTL.setLParenLoc(TL.getLParenLoc()); 6161 NewTL.setRParenLoc(TL.getRParenLoc()); 6162 NewTL.setUnderlyingTInfo(New_Under_TI); 6163 6164 return Result; 6165 } 6166 6167 template<typename Derived> 6168 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6169 DecltypeTypeLoc TL) { 6170 const DecltypeType *T = TL.getTypePtr(); 6171 6172 // decltype expressions are not potentially evaluated contexts 6173 EnterExpressionEvaluationContext Unevaluated( 6174 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6175 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6176 6177 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6178 if (E.isInvalid()) 6179 return QualType(); 6180 6181 E = getSema().ActOnDecltypeExpression(E.get()); 6182 if (E.isInvalid()) 6183 return QualType(); 6184 6185 QualType Result = TL.getType(); 6186 if (getDerived().AlwaysRebuild() || 6187 E.get() != T->getUnderlyingExpr()) { 6188 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6189 if (Result.isNull()) 6190 return QualType(); 6191 } 6192 else E.get(); 6193 6194 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6195 NewTL.setNameLoc(TL.getNameLoc()); 6196 6197 return Result; 6198 } 6199 6200 template<typename Derived> 6201 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6202 TypeLocBuilder &TLB, 6203 UnaryTransformTypeLoc TL) { 6204 QualType Result = TL.getType(); 6205 if (Result->isDependentType()) { 6206 const UnaryTransformType *T = TL.getTypePtr(); 6207 QualType NewBase = 6208 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6209 Result = getDerived().RebuildUnaryTransformType(NewBase, 6210 T->getUTTKind(), 6211 TL.getKWLoc()); 6212 if (Result.isNull()) 6213 return QualType(); 6214 } 6215 6216 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6217 NewTL.setKWLoc(TL.getKWLoc()); 6218 NewTL.setParensRange(TL.getParensRange()); 6219 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6220 return Result; 6221 } 6222 6223 template<typename Derived> 6224 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6225 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6226 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6227 6228 CXXScopeSpec SS; 6229 TemplateName TemplateName = getDerived().TransformTemplateName( 6230 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6231 if (TemplateName.isNull()) 6232 return QualType(); 6233 6234 QualType OldDeduced = T->getDeducedType(); 6235 QualType NewDeduced; 6236 if (!OldDeduced.isNull()) { 6237 NewDeduced = getDerived().TransformType(OldDeduced); 6238 if (NewDeduced.isNull()) 6239 return QualType(); 6240 } 6241 6242 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6243 TemplateName, NewDeduced); 6244 if (Result.isNull()) 6245 return QualType(); 6246 6247 DeducedTemplateSpecializationTypeLoc NewTL = 6248 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6249 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6250 6251 return Result; 6252 } 6253 6254 template<typename Derived> 6255 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6256 RecordTypeLoc TL) { 6257 const RecordType *T = TL.getTypePtr(); 6258 RecordDecl *Record 6259 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6260 T->getDecl())); 6261 if (!Record) 6262 return QualType(); 6263 6264 QualType Result = TL.getType(); 6265 if (getDerived().AlwaysRebuild() || 6266 Record != T->getDecl()) { 6267 Result = getDerived().RebuildRecordType(Record); 6268 if (Result.isNull()) 6269 return QualType(); 6270 } 6271 6272 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6273 NewTL.setNameLoc(TL.getNameLoc()); 6274 6275 return Result; 6276 } 6277 6278 template<typename Derived> 6279 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6280 EnumTypeLoc TL) { 6281 const EnumType *T = TL.getTypePtr(); 6282 EnumDecl *Enum 6283 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6284 T->getDecl())); 6285 if (!Enum) 6286 return QualType(); 6287 6288 QualType Result = TL.getType(); 6289 if (getDerived().AlwaysRebuild() || 6290 Enum != T->getDecl()) { 6291 Result = getDerived().RebuildEnumType(Enum); 6292 if (Result.isNull()) 6293 return QualType(); 6294 } 6295 6296 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6297 NewTL.setNameLoc(TL.getNameLoc()); 6298 6299 return Result; 6300 } 6301 6302 template<typename Derived> 6303 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6304 TypeLocBuilder &TLB, 6305 InjectedClassNameTypeLoc TL) { 6306 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6307 TL.getTypePtr()->getDecl()); 6308 if (!D) return QualType(); 6309 6310 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6311 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6312 return T; 6313 } 6314 6315 template<typename Derived> 6316 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6317 TypeLocBuilder &TLB, 6318 TemplateTypeParmTypeLoc TL) { 6319 return TransformTypeSpecType(TLB, TL); 6320 } 6321 6322 template<typename Derived> 6323 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6324 TypeLocBuilder &TLB, 6325 SubstTemplateTypeParmTypeLoc TL) { 6326 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6327 6328 // Substitute into the replacement type, which itself might involve something 6329 // that needs to be transformed. This only tends to occur with default 6330 // template arguments of template template parameters. 6331 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6332 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6333 if (Replacement.isNull()) 6334 return QualType(); 6335 6336 // Always canonicalize the replacement type. 6337 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6338 QualType Result 6339 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6340 Replacement); 6341 6342 // Propagate type-source information. 6343 SubstTemplateTypeParmTypeLoc NewTL 6344 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6345 NewTL.setNameLoc(TL.getNameLoc()); 6346 return Result; 6347 6348 } 6349 6350 template<typename Derived> 6351 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6352 TypeLocBuilder &TLB, 6353 SubstTemplateTypeParmPackTypeLoc TL) { 6354 return TransformTypeSpecType(TLB, TL); 6355 } 6356 6357 template<typename Derived> 6358 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6359 TypeLocBuilder &TLB, 6360 TemplateSpecializationTypeLoc TL) { 6361 const TemplateSpecializationType *T = TL.getTypePtr(); 6362 6363 // The nested-name-specifier never matters in a TemplateSpecializationType, 6364 // because we can't have a dependent nested-name-specifier anyway. 6365 CXXScopeSpec SS; 6366 TemplateName Template 6367 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6368 TL.getTemplateNameLoc()); 6369 if (Template.isNull()) 6370 return QualType(); 6371 6372 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6373 } 6374 6375 template<typename Derived> 6376 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6377 AtomicTypeLoc TL) { 6378 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6379 if (ValueType.isNull()) 6380 return QualType(); 6381 6382 QualType Result = TL.getType(); 6383 if (getDerived().AlwaysRebuild() || 6384 ValueType != TL.getValueLoc().getType()) { 6385 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6386 if (Result.isNull()) 6387 return QualType(); 6388 } 6389 6390 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6391 NewTL.setKWLoc(TL.getKWLoc()); 6392 NewTL.setLParenLoc(TL.getLParenLoc()); 6393 NewTL.setRParenLoc(TL.getRParenLoc()); 6394 6395 return Result; 6396 } 6397 6398 template <typename Derived> 6399 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6400 PipeTypeLoc TL) { 6401 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6402 if (ValueType.isNull()) 6403 return QualType(); 6404 6405 QualType Result = TL.getType(); 6406 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6407 const PipeType *PT = Result->castAs<PipeType>(); 6408 bool isReadPipe = PT->isReadOnly(); 6409 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6410 if (Result.isNull()) 6411 return QualType(); 6412 } 6413 6414 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6415 NewTL.setKWLoc(TL.getKWLoc()); 6416 6417 return Result; 6418 } 6419 6420 template <typename Derived> 6421 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6422 ExtIntTypeLoc TL) { 6423 const ExtIntType *EIT = TL.getTypePtr(); 6424 QualType Result = TL.getType(); 6425 6426 if (getDerived().AlwaysRebuild()) { 6427 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6428 EIT->getNumBits(), TL.getNameLoc()); 6429 if (Result.isNull()) 6430 return QualType(); 6431 } 6432 6433 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6434 NewTL.setNameLoc(TL.getNameLoc()); 6435 return Result; 6436 } 6437 6438 template <typename Derived> 6439 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6440 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6441 const DependentExtIntType *EIT = TL.getTypePtr(); 6442 6443 EnterExpressionEvaluationContext Unevaluated( 6444 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6445 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6446 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6447 6448 if (BitsExpr.isInvalid()) 6449 return QualType(); 6450 6451 QualType Result = TL.getType(); 6452 6453 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6454 Result = getDerived().RebuildDependentExtIntType( 6455 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6456 6457 if (Result.isNull()) 6458 return QualType(); 6459 } 6460 6461 if (isa<DependentExtIntType>(Result)) { 6462 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6463 NewTL.setNameLoc(TL.getNameLoc()); 6464 } else { 6465 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6466 NewTL.setNameLoc(TL.getNameLoc()); 6467 } 6468 return Result; 6469 } 6470 6471 /// Simple iterator that traverses the template arguments in a 6472 /// container that provides a \c getArgLoc() member function. 6473 /// 6474 /// This iterator is intended to be used with the iterator form of 6475 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6476 template<typename ArgLocContainer> 6477 class TemplateArgumentLocContainerIterator { 6478 ArgLocContainer *Container; 6479 unsigned Index; 6480 6481 public: 6482 typedef TemplateArgumentLoc value_type; 6483 typedef TemplateArgumentLoc reference; 6484 typedef int difference_type; 6485 typedef std::input_iterator_tag iterator_category; 6486 6487 class pointer { 6488 TemplateArgumentLoc Arg; 6489 6490 public: 6491 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6492 6493 const TemplateArgumentLoc *operator->() const { 6494 return &Arg; 6495 } 6496 }; 6497 6498 6499 TemplateArgumentLocContainerIterator() {} 6500 6501 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6502 unsigned Index) 6503 : Container(&Container), Index(Index) { } 6504 6505 TemplateArgumentLocContainerIterator &operator++() { 6506 ++Index; 6507 return *this; 6508 } 6509 6510 TemplateArgumentLocContainerIterator operator++(int) { 6511 TemplateArgumentLocContainerIterator Old(*this); 6512 ++(*this); 6513 return Old; 6514 } 6515 6516 TemplateArgumentLoc operator*() const { 6517 return Container->getArgLoc(Index); 6518 } 6519 6520 pointer operator->() const { 6521 return pointer(Container->getArgLoc(Index)); 6522 } 6523 6524 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6525 const TemplateArgumentLocContainerIterator &Y) { 6526 return X.Container == Y.Container && X.Index == Y.Index; 6527 } 6528 6529 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6530 const TemplateArgumentLocContainerIterator &Y) { 6531 return !(X == Y); 6532 } 6533 }; 6534 6535 template<typename Derived> 6536 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6537 AutoTypeLoc TL) { 6538 const AutoType *T = TL.getTypePtr(); 6539 QualType OldDeduced = T->getDeducedType(); 6540 QualType NewDeduced; 6541 if (!OldDeduced.isNull()) { 6542 NewDeduced = getDerived().TransformType(OldDeduced); 6543 if (NewDeduced.isNull()) 6544 return QualType(); 6545 } 6546 6547 ConceptDecl *NewCD = nullptr; 6548 TemplateArgumentListInfo NewTemplateArgs; 6549 NestedNameSpecifierLoc NewNestedNameSpec; 6550 if (T->isConstrained()) { 6551 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6552 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6553 6554 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6555 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6556 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6557 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6558 ArgIterator(TL, 6559 TL.getNumArgs()), 6560 NewTemplateArgs)) 6561 return QualType(); 6562 6563 if (TL.getNestedNameSpecifierLoc()) { 6564 NewNestedNameSpec 6565 = getDerived().TransformNestedNameSpecifierLoc( 6566 TL.getNestedNameSpecifierLoc()); 6567 if (!NewNestedNameSpec) 6568 return QualType(); 6569 } 6570 } 6571 6572 QualType Result = TL.getType(); 6573 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6574 T->isDependentType() || T->isConstrained()) { 6575 // FIXME: Maybe don't rebuild if all template arguments are the same. 6576 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6577 NewArgList.reserve(NewArgList.size()); 6578 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6579 NewArgList.push_back(ArgLoc.getArgument()); 6580 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6581 NewArgList); 6582 if (Result.isNull()) 6583 return QualType(); 6584 } 6585 6586 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6587 NewTL.setNameLoc(TL.getNameLoc()); 6588 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6589 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6590 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6591 NewTL.setFoundDecl(TL.getFoundDecl()); 6592 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6593 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6594 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6595 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6596 6597 return Result; 6598 } 6599 6600 template <typename Derived> 6601 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6602 TypeLocBuilder &TLB, 6603 TemplateSpecializationTypeLoc TL, 6604 TemplateName Template) { 6605 TemplateArgumentListInfo NewTemplateArgs; 6606 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6607 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6608 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6609 ArgIterator; 6610 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6611 ArgIterator(TL, TL.getNumArgs()), 6612 NewTemplateArgs)) 6613 return QualType(); 6614 6615 // FIXME: maybe don't rebuild if all the template arguments are the same. 6616 6617 QualType Result = 6618 getDerived().RebuildTemplateSpecializationType(Template, 6619 TL.getTemplateNameLoc(), 6620 NewTemplateArgs); 6621 6622 if (!Result.isNull()) { 6623 // Specializations of template template parameters are represented as 6624 // TemplateSpecializationTypes, and substitution of type alias templates 6625 // within a dependent context can transform them into 6626 // DependentTemplateSpecializationTypes. 6627 if (isa<DependentTemplateSpecializationType>(Result)) { 6628 DependentTemplateSpecializationTypeLoc NewTL 6629 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6630 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6631 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6632 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6633 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6634 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6635 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6636 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6637 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6638 return Result; 6639 } 6640 6641 TemplateSpecializationTypeLoc NewTL 6642 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6643 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6644 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6645 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6646 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6647 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6648 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6649 } 6650 6651 return Result; 6652 } 6653 6654 template <typename Derived> 6655 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6656 TypeLocBuilder &TLB, 6657 DependentTemplateSpecializationTypeLoc TL, 6658 TemplateName Template, 6659 CXXScopeSpec &SS) { 6660 TemplateArgumentListInfo NewTemplateArgs; 6661 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6662 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6663 typedef TemplateArgumentLocContainerIterator< 6664 DependentTemplateSpecializationTypeLoc> ArgIterator; 6665 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6666 ArgIterator(TL, TL.getNumArgs()), 6667 NewTemplateArgs)) 6668 return QualType(); 6669 6670 // FIXME: maybe don't rebuild if all the template arguments are the same. 6671 6672 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6673 QualType Result 6674 = getSema().Context.getDependentTemplateSpecializationType( 6675 TL.getTypePtr()->getKeyword(), 6676 DTN->getQualifier(), 6677 DTN->getIdentifier(), 6678 NewTemplateArgs); 6679 6680 DependentTemplateSpecializationTypeLoc NewTL 6681 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6682 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6683 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 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 QualType Result 6694 = getDerived().RebuildTemplateSpecializationType(Template, 6695 TL.getTemplateNameLoc(), 6696 NewTemplateArgs); 6697 6698 if (!Result.isNull()) { 6699 /// FIXME: Wrap this in an elaborated-type-specifier? 6700 TemplateSpecializationTypeLoc NewTL 6701 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6702 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6703 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6704 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6705 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6706 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6707 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6708 } 6709 6710 return Result; 6711 } 6712 6713 template<typename Derived> 6714 QualType 6715 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6716 ElaboratedTypeLoc TL) { 6717 const ElaboratedType *T = TL.getTypePtr(); 6718 6719 NestedNameSpecifierLoc QualifierLoc; 6720 // NOTE: the qualifier in an ElaboratedType is optional. 6721 if (TL.getQualifierLoc()) { 6722 QualifierLoc 6723 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6724 if (!QualifierLoc) 6725 return QualType(); 6726 } 6727 6728 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6729 if (NamedT.isNull()) 6730 return QualType(); 6731 6732 // C++0x [dcl.type.elab]p2: 6733 // If the identifier resolves to a typedef-name or the simple-template-id 6734 // resolves to an alias template specialization, the 6735 // elaborated-type-specifier is ill-formed. 6736 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6737 if (const TemplateSpecializationType *TST = 6738 NamedT->getAs<TemplateSpecializationType>()) { 6739 TemplateName Template = TST->getTemplateName(); 6740 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6741 Template.getAsTemplateDecl())) { 6742 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6743 diag::err_tag_reference_non_tag) 6744 << TAT << Sema::NTK_TypeAliasTemplate 6745 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6746 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6747 } 6748 } 6749 } 6750 6751 QualType Result = TL.getType(); 6752 if (getDerived().AlwaysRebuild() || 6753 QualifierLoc != TL.getQualifierLoc() || 6754 NamedT != T->getNamedType()) { 6755 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6756 T->getKeyword(), 6757 QualifierLoc, NamedT); 6758 if (Result.isNull()) 6759 return QualType(); 6760 } 6761 6762 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6763 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6764 NewTL.setQualifierLoc(QualifierLoc); 6765 return Result; 6766 } 6767 6768 template<typename Derived> 6769 QualType TreeTransform<Derived>::TransformAttributedType( 6770 TypeLocBuilder &TLB, 6771 AttributedTypeLoc TL) { 6772 const AttributedType *oldType = TL.getTypePtr(); 6773 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6774 if (modifiedType.isNull()) 6775 return QualType(); 6776 6777 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6778 const Attr *oldAttr = TL.getAttr(); 6779 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6780 if (oldAttr && !newAttr) 6781 return QualType(); 6782 6783 QualType result = TL.getType(); 6784 6785 // FIXME: dependent operand expressions? 6786 if (getDerived().AlwaysRebuild() || 6787 modifiedType != oldType->getModifiedType()) { 6788 // TODO: this is really lame; we should really be rebuilding the 6789 // equivalent type from first principles. 6790 QualType equivalentType 6791 = getDerived().TransformType(oldType->getEquivalentType()); 6792 if (equivalentType.isNull()) 6793 return QualType(); 6794 6795 // Check whether we can add nullability; it is only represented as 6796 // type sugar, and therefore cannot be diagnosed in any other way. 6797 if (auto nullability = oldType->getImmediateNullability()) { 6798 if (!modifiedType->canHaveNullability()) { 6799 SemaRef.Diag(TL.getAttr()->getLocation(), 6800 diag::err_nullability_nonpointer) 6801 << DiagNullabilityKind(*nullability, false) << modifiedType; 6802 return QualType(); 6803 } 6804 } 6805 6806 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6807 modifiedType, 6808 equivalentType); 6809 } 6810 6811 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6812 newTL.setAttr(newAttr); 6813 return result; 6814 } 6815 6816 template<typename Derived> 6817 QualType 6818 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6819 ParenTypeLoc TL) { 6820 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6821 if (Inner.isNull()) 6822 return QualType(); 6823 6824 QualType Result = TL.getType(); 6825 if (getDerived().AlwaysRebuild() || 6826 Inner != TL.getInnerLoc().getType()) { 6827 Result = getDerived().RebuildParenType(Inner); 6828 if (Result.isNull()) 6829 return QualType(); 6830 } 6831 6832 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6833 NewTL.setLParenLoc(TL.getLParenLoc()); 6834 NewTL.setRParenLoc(TL.getRParenLoc()); 6835 return Result; 6836 } 6837 6838 template <typename Derived> 6839 QualType 6840 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6841 MacroQualifiedTypeLoc TL) { 6842 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6843 if (Inner.isNull()) 6844 return QualType(); 6845 6846 QualType Result = TL.getType(); 6847 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6848 Result = 6849 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6850 if (Result.isNull()) 6851 return QualType(); 6852 } 6853 6854 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6855 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6856 return Result; 6857 } 6858 6859 template<typename Derived> 6860 QualType TreeTransform<Derived>::TransformDependentNameType( 6861 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6862 return TransformDependentNameType(TLB, TL, false); 6863 } 6864 6865 template<typename Derived> 6866 QualType TreeTransform<Derived>::TransformDependentNameType( 6867 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6868 const DependentNameType *T = TL.getTypePtr(); 6869 6870 NestedNameSpecifierLoc QualifierLoc 6871 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6872 if (!QualifierLoc) 6873 return QualType(); 6874 6875 QualType Result 6876 = getDerived().RebuildDependentNameType(T->getKeyword(), 6877 TL.getElaboratedKeywordLoc(), 6878 QualifierLoc, 6879 T->getIdentifier(), 6880 TL.getNameLoc(), 6881 DeducedTSTContext); 6882 if (Result.isNull()) 6883 return QualType(); 6884 6885 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6886 QualType NamedT = ElabT->getNamedType(); 6887 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6888 6889 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6890 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6891 NewTL.setQualifierLoc(QualifierLoc); 6892 } else { 6893 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6894 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6895 NewTL.setQualifierLoc(QualifierLoc); 6896 NewTL.setNameLoc(TL.getNameLoc()); 6897 } 6898 return Result; 6899 } 6900 6901 template<typename Derived> 6902 QualType TreeTransform<Derived>:: 6903 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6904 DependentTemplateSpecializationTypeLoc TL) { 6905 NestedNameSpecifierLoc QualifierLoc; 6906 if (TL.getQualifierLoc()) { 6907 QualifierLoc 6908 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6909 if (!QualifierLoc) 6910 return QualType(); 6911 } 6912 6913 return getDerived() 6914 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6915 } 6916 6917 template<typename Derived> 6918 QualType TreeTransform<Derived>:: 6919 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6920 DependentTemplateSpecializationTypeLoc TL, 6921 NestedNameSpecifierLoc QualifierLoc) { 6922 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6923 6924 TemplateArgumentListInfo NewTemplateArgs; 6925 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6926 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6927 6928 typedef TemplateArgumentLocContainerIterator< 6929 DependentTemplateSpecializationTypeLoc> ArgIterator; 6930 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6931 ArgIterator(TL, TL.getNumArgs()), 6932 NewTemplateArgs)) 6933 return QualType(); 6934 6935 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6936 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6937 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6938 /*AllowInjectedClassName*/ false); 6939 if (Result.isNull()) 6940 return QualType(); 6941 6942 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6943 QualType NamedT = ElabT->getNamedType(); 6944 6945 // Copy information relevant to the template specialization. 6946 TemplateSpecializationTypeLoc NamedTL 6947 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6948 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6949 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6950 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6951 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6952 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6953 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6954 6955 // Copy information relevant to the elaborated type. 6956 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6957 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6958 NewTL.setQualifierLoc(QualifierLoc); 6959 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6960 DependentTemplateSpecializationTypeLoc SpecTL 6961 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6962 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6963 SpecTL.setQualifierLoc(QualifierLoc); 6964 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6965 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6966 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6967 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6968 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6969 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6970 } else { 6971 TemplateSpecializationTypeLoc SpecTL 6972 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6973 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6974 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6975 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6976 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6977 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6978 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6979 } 6980 return Result; 6981 } 6982 6983 template<typename Derived> 6984 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6985 PackExpansionTypeLoc TL) { 6986 QualType Pattern 6987 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6988 if (Pattern.isNull()) 6989 return QualType(); 6990 6991 QualType Result = TL.getType(); 6992 if (getDerived().AlwaysRebuild() || 6993 Pattern != TL.getPatternLoc().getType()) { 6994 Result = getDerived().RebuildPackExpansionType(Pattern, 6995 TL.getPatternLoc().getSourceRange(), 6996 TL.getEllipsisLoc(), 6997 TL.getTypePtr()->getNumExpansions()); 6998 if (Result.isNull()) 6999 return QualType(); 7000 } 7001 7002 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7003 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7004 return Result; 7005 } 7006 7007 template<typename Derived> 7008 QualType 7009 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7010 ObjCInterfaceTypeLoc TL) { 7011 // ObjCInterfaceType is never dependent. 7012 TLB.pushFullCopy(TL); 7013 return TL.getType(); 7014 } 7015 7016 template<typename Derived> 7017 QualType 7018 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7019 ObjCTypeParamTypeLoc TL) { 7020 const ObjCTypeParamType *T = TL.getTypePtr(); 7021 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7022 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7023 if (!OTP) 7024 return QualType(); 7025 7026 QualType Result = TL.getType(); 7027 if (getDerived().AlwaysRebuild() || 7028 OTP != T->getDecl()) { 7029 Result = getDerived().RebuildObjCTypeParamType(OTP, 7030 TL.getProtocolLAngleLoc(), 7031 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7032 TL.getNumProtocols()), 7033 TL.getProtocolLocs(), 7034 TL.getProtocolRAngleLoc()); 7035 if (Result.isNull()) 7036 return QualType(); 7037 } 7038 7039 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7040 if (TL.getNumProtocols()) { 7041 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7042 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7043 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7044 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7045 } 7046 return Result; 7047 } 7048 7049 template<typename Derived> 7050 QualType 7051 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7052 ObjCObjectTypeLoc TL) { 7053 // Transform base type. 7054 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7055 if (BaseType.isNull()) 7056 return QualType(); 7057 7058 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7059 7060 // Transform type arguments. 7061 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7062 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7063 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7064 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7065 QualType TypeArg = TypeArgInfo->getType(); 7066 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7067 AnyChanged = true; 7068 7069 // We have a pack expansion. Instantiate it. 7070 const auto *PackExpansion = PackExpansionLoc.getType() 7071 ->castAs<PackExpansionType>(); 7072 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7073 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7074 Unexpanded); 7075 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7076 7077 // Determine whether the set of unexpanded parameter packs can 7078 // and should be expanded. 7079 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7080 bool Expand = false; 7081 bool RetainExpansion = false; 7082 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7083 if (getDerived().TryExpandParameterPacks( 7084 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7085 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7086 return QualType(); 7087 7088 if (!Expand) { 7089 // We can't expand this pack expansion into separate arguments yet; 7090 // just substitute into the pattern and create a new pack expansion 7091 // type. 7092 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7093 7094 TypeLocBuilder TypeArgBuilder; 7095 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7096 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7097 PatternLoc); 7098 if (NewPatternType.isNull()) 7099 return QualType(); 7100 7101 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7102 NewPatternType, NumExpansions); 7103 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7104 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7105 NewTypeArgInfos.push_back( 7106 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7107 continue; 7108 } 7109 7110 // Substitute into the pack expansion pattern for each slice of the 7111 // pack. 7112 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7113 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7114 7115 TypeLocBuilder TypeArgBuilder; 7116 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7117 7118 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7119 PatternLoc); 7120 if (NewTypeArg.isNull()) 7121 return QualType(); 7122 7123 NewTypeArgInfos.push_back( 7124 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7125 } 7126 7127 continue; 7128 } 7129 7130 TypeLocBuilder TypeArgBuilder; 7131 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7132 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7133 if (NewTypeArg.isNull()) 7134 return QualType(); 7135 7136 // If nothing changed, just keep the old TypeSourceInfo. 7137 if (NewTypeArg == TypeArg) { 7138 NewTypeArgInfos.push_back(TypeArgInfo); 7139 continue; 7140 } 7141 7142 NewTypeArgInfos.push_back( 7143 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7144 AnyChanged = true; 7145 } 7146 7147 QualType Result = TL.getType(); 7148 if (getDerived().AlwaysRebuild() || AnyChanged) { 7149 // Rebuild the type. 7150 Result = getDerived().RebuildObjCObjectType( 7151 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7152 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7153 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7154 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7155 7156 if (Result.isNull()) 7157 return QualType(); 7158 } 7159 7160 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7161 NewT.setHasBaseTypeAsWritten(true); 7162 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7163 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7164 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7165 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7166 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7167 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7168 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7169 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7170 return Result; 7171 } 7172 7173 template<typename Derived> 7174 QualType 7175 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7176 ObjCObjectPointerTypeLoc TL) { 7177 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7178 if (PointeeType.isNull()) 7179 return QualType(); 7180 7181 QualType Result = TL.getType(); 7182 if (getDerived().AlwaysRebuild() || 7183 PointeeType != TL.getPointeeLoc().getType()) { 7184 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7185 TL.getStarLoc()); 7186 if (Result.isNull()) 7187 return QualType(); 7188 } 7189 7190 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7191 NewT.setStarLoc(TL.getStarLoc()); 7192 return Result; 7193 } 7194 7195 //===----------------------------------------------------------------------===// 7196 // Statement transformation 7197 //===----------------------------------------------------------------------===// 7198 template<typename Derived> 7199 StmtResult 7200 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7201 return S; 7202 } 7203 7204 template<typename Derived> 7205 StmtResult 7206 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7207 return getDerived().TransformCompoundStmt(S, false); 7208 } 7209 7210 template<typename Derived> 7211 StmtResult 7212 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7213 bool IsStmtExpr) { 7214 Sema::CompoundScopeRAII CompoundScope(getSema()); 7215 7216 const Stmt *ExprResult = S->getStmtExprResult(); 7217 bool SubStmtInvalid = false; 7218 bool SubStmtChanged = false; 7219 SmallVector<Stmt*, 8> Statements; 7220 for (auto *B : S->body()) { 7221 StmtResult Result = getDerived().TransformStmt( 7222 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7223 7224 if (Result.isInvalid()) { 7225 // Immediately fail if this was a DeclStmt, since it's very 7226 // likely that this will cause problems for future statements. 7227 if (isa<DeclStmt>(B)) 7228 return StmtError(); 7229 7230 // Otherwise, just keep processing substatements and fail later. 7231 SubStmtInvalid = true; 7232 continue; 7233 } 7234 7235 SubStmtChanged = SubStmtChanged || Result.get() != B; 7236 Statements.push_back(Result.getAs<Stmt>()); 7237 } 7238 7239 if (SubStmtInvalid) 7240 return StmtError(); 7241 7242 if (!getDerived().AlwaysRebuild() && 7243 !SubStmtChanged) 7244 return S; 7245 7246 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7247 Statements, 7248 S->getRBracLoc(), 7249 IsStmtExpr); 7250 } 7251 7252 template<typename Derived> 7253 StmtResult 7254 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7255 ExprResult LHS, RHS; 7256 { 7257 EnterExpressionEvaluationContext Unevaluated( 7258 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7259 7260 // Transform the left-hand case value. 7261 LHS = getDerived().TransformExpr(S->getLHS()); 7262 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7263 if (LHS.isInvalid()) 7264 return StmtError(); 7265 7266 // Transform the right-hand case value (for the GNU case-range extension). 7267 RHS = getDerived().TransformExpr(S->getRHS()); 7268 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7269 if (RHS.isInvalid()) 7270 return StmtError(); 7271 } 7272 7273 // Build the case statement. 7274 // Case statements are always rebuilt so that they will attached to their 7275 // transformed switch statement. 7276 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7277 LHS.get(), 7278 S->getEllipsisLoc(), 7279 RHS.get(), 7280 S->getColonLoc()); 7281 if (Case.isInvalid()) 7282 return StmtError(); 7283 7284 // Transform the statement following the case 7285 StmtResult SubStmt = 7286 getDerived().TransformStmt(S->getSubStmt()); 7287 if (SubStmt.isInvalid()) 7288 return StmtError(); 7289 7290 // Attach the body to the case statement 7291 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7292 } 7293 7294 template <typename Derived> 7295 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7296 // Transform the statement following the default case 7297 StmtResult SubStmt = 7298 getDerived().TransformStmt(S->getSubStmt()); 7299 if (SubStmt.isInvalid()) 7300 return StmtError(); 7301 7302 // Default statements are always rebuilt 7303 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7304 SubStmt.get()); 7305 } 7306 7307 template<typename Derived> 7308 StmtResult 7309 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7310 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7311 if (SubStmt.isInvalid()) 7312 return StmtError(); 7313 7314 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7315 S->getDecl()); 7316 if (!LD) 7317 return StmtError(); 7318 7319 // If we're transforming "in-place" (we're not creating new local 7320 // declarations), assume we're replacing the old label statement 7321 // and clear out the reference to it. 7322 if (LD == S->getDecl()) 7323 S->getDecl()->setStmt(nullptr); 7324 7325 // FIXME: Pass the real colon location in. 7326 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7327 cast<LabelDecl>(LD), SourceLocation(), 7328 SubStmt.get()); 7329 } 7330 7331 template <typename Derived> 7332 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7333 if (!R) 7334 return R; 7335 7336 switch (R->getKind()) { 7337 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7338 #define ATTR(X) 7339 #define PRAGMA_SPELLING_ATTR(X) \ 7340 case attr::X: \ 7341 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7342 #include "clang/Basic/AttrList.inc" 7343 default: 7344 return R; 7345 } 7346 } 7347 7348 template <typename Derived> 7349 StmtResult 7350 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7351 StmtDiscardKind SDK) { 7352 bool AttrsChanged = false; 7353 SmallVector<const Attr *, 1> Attrs; 7354 7355 // Visit attributes and keep track if any are transformed. 7356 for (const auto *I : S->getAttrs()) { 7357 const Attr *R = getDerived().TransformAttr(I); 7358 AttrsChanged |= (I != R); 7359 if (R) 7360 Attrs.push_back(R); 7361 } 7362 7363 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7364 if (SubStmt.isInvalid()) 7365 return StmtError(); 7366 7367 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7368 return S; 7369 7370 // If transforming the attributes failed for all of the attributes in the 7371 // statement, don't make an AttributedStmt without attributes. 7372 if (Attrs.empty()) 7373 return SubStmt; 7374 7375 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7376 SubStmt.get()); 7377 } 7378 7379 template<typename Derived> 7380 StmtResult 7381 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7382 // Transform the initialization statement 7383 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7384 if (Init.isInvalid()) 7385 return StmtError(); 7386 7387 Sema::ConditionResult Cond; 7388 if (!S->isConsteval()) { 7389 // Transform the condition 7390 Cond = getDerived().TransformCondition( 7391 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7392 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7393 : Sema::ConditionKind::Boolean); 7394 if (Cond.isInvalid()) 7395 return StmtError(); 7396 } 7397 7398 // If this is a constexpr if, determine which arm we should instantiate. 7399 llvm::Optional<bool> ConstexprConditionValue; 7400 if (S->isConstexpr()) 7401 ConstexprConditionValue = Cond.getKnownValue(); 7402 7403 // Transform the "then" branch. 7404 StmtResult Then; 7405 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7406 Then = getDerived().TransformStmt(S->getThen()); 7407 if (Then.isInvalid()) 7408 return StmtError(); 7409 } else { 7410 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7411 } 7412 7413 // Transform the "else" branch. 7414 StmtResult Else; 7415 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7416 Else = getDerived().TransformStmt(S->getElse()); 7417 if (Else.isInvalid()) 7418 return StmtError(); 7419 } 7420 7421 if (!getDerived().AlwaysRebuild() && 7422 Init.get() == S->getInit() && 7423 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7424 Then.get() == S->getThen() && 7425 Else.get() == S->getElse()) 7426 return S; 7427 7428 return getDerived().RebuildIfStmt( 7429 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7430 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7431 } 7432 7433 template<typename Derived> 7434 StmtResult 7435 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7436 // Transform the initialization statement 7437 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7438 if (Init.isInvalid()) 7439 return StmtError(); 7440 7441 // Transform the condition. 7442 Sema::ConditionResult Cond = getDerived().TransformCondition( 7443 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7444 Sema::ConditionKind::Switch); 7445 if (Cond.isInvalid()) 7446 return StmtError(); 7447 7448 // Rebuild the switch statement. 7449 StmtResult Switch = 7450 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7451 Init.get(), Cond, S->getRParenLoc()); 7452 if (Switch.isInvalid()) 7453 return StmtError(); 7454 7455 // Transform the body of the switch statement. 7456 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7457 if (Body.isInvalid()) 7458 return StmtError(); 7459 7460 // Complete the switch statement. 7461 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7462 Body.get()); 7463 } 7464 7465 template<typename Derived> 7466 StmtResult 7467 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7468 // Transform the condition 7469 Sema::ConditionResult Cond = getDerived().TransformCondition( 7470 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7471 Sema::ConditionKind::Boolean); 7472 if (Cond.isInvalid()) 7473 return StmtError(); 7474 7475 // Transform the body 7476 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7477 if (Body.isInvalid()) 7478 return StmtError(); 7479 7480 if (!getDerived().AlwaysRebuild() && 7481 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7482 Body.get() == S->getBody()) 7483 return Owned(S); 7484 7485 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7486 Cond, S->getRParenLoc(), Body.get()); 7487 } 7488 7489 template<typename Derived> 7490 StmtResult 7491 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7492 // Transform the body 7493 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7494 if (Body.isInvalid()) 7495 return StmtError(); 7496 7497 // Transform the condition 7498 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7499 if (Cond.isInvalid()) 7500 return StmtError(); 7501 7502 if (!getDerived().AlwaysRebuild() && 7503 Cond.get() == S->getCond() && 7504 Body.get() == S->getBody()) 7505 return S; 7506 7507 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7508 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7509 S->getRParenLoc()); 7510 } 7511 7512 template<typename Derived> 7513 StmtResult 7514 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7515 if (getSema().getLangOpts().OpenMP) 7516 getSema().startOpenMPLoop(); 7517 7518 // Transform the initialization statement 7519 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7520 if (Init.isInvalid()) 7521 return StmtError(); 7522 7523 // In OpenMP loop region loop control variable must be captured and be 7524 // private. Perform analysis of first part (if any). 7525 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7526 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7527 7528 // Transform the condition 7529 Sema::ConditionResult Cond = getDerived().TransformCondition( 7530 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7531 Sema::ConditionKind::Boolean); 7532 if (Cond.isInvalid()) 7533 return StmtError(); 7534 7535 // Transform the increment 7536 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7537 if (Inc.isInvalid()) 7538 return StmtError(); 7539 7540 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7541 if (S->getInc() && !FullInc.get()) 7542 return StmtError(); 7543 7544 // Transform the body 7545 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7546 if (Body.isInvalid()) 7547 return StmtError(); 7548 7549 if (!getDerived().AlwaysRebuild() && 7550 Init.get() == S->getInit() && 7551 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7552 Inc.get() == S->getInc() && 7553 Body.get() == S->getBody()) 7554 return S; 7555 7556 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7557 Init.get(), Cond, FullInc, 7558 S->getRParenLoc(), Body.get()); 7559 } 7560 7561 template<typename Derived> 7562 StmtResult 7563 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7564 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7565 S->getLabel()); 7566 if (!LD) 7567 return StmtError(); 7568 7569 // Goto statements must always be rebuilt, to resolve the label. 7570 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7571 cast<LabelDecl>(LD)); 7572 } 7573 7574 template<typename Derived> 7575 StmtResult 7576 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7577 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7578 if (Target.isInvalid()) 7579 return StmtError(); 7580 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7581 7582 if (!getDerived().AlwaysRebuild() && 7583 Target.get() == S->getTarget()) 7584 return S; 7585 7586 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7587 Target.get()); 7588 } 7589 7590 template<typename Derived> 7591 StmtResult 7592 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7593 return S; 7594 } 7595 7596 template<typename Derived> 7597 StmtResult 7598 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7599 return S; 7600 } 7601 7602 template<typename Derived> 7603 StmtResult 7604 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7605 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7606 /*NotCopyInit*/false); 7607 if (Result.isInvalid()) 7608 return StmtError(); 7609 7610 // FIXME: We always rebuild the return statement because there is no way 7611 // to tell whether the return type of the function has changed. 7612 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7613 } 7614 7615 template<typename Derived> 7616 StmtResult 7617 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7618 bool DeclChanged = false; 7619 SmallVector<Decl *, 4> Decls; 7620 for (auto *D : S->decls()) { 7621 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7622 if (!Transformed) 7623 return StmtError(); 7624 7625 if (Transformed != D) 7626 DeclChanged = true; 7627 7628 Decls.push_back(Transformed); 7629 } 7630 7631 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7632 return S; 7633 7634 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7635 } 7636 7637 template<typename Derived> 7638 StmtResult 7639 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7640 7641 SmallVector<Expr*, 8> Constraints; 7642 SmallVector<Expr*, 8> Exprs; 7643 SmallVector<IdentifierInfo *, 4> Names; 7644 7645 ExprResult AsmString; 7646 SmallVector<Expr*, 8> Clobbers; 7647 7648 bool ExprsChanged = false; 7649 7650 // Go through the outputs. 7651 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7652 Names.push_back(S->getOutputIdentifier(I)); 7653 7654 // No need to transform the constraint literal. 7655 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7656 7657 // Transform the output expr. 7658 Expr *OutputExpr = S->getOutputExpr(I); 7659 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7660 if (Result.isInvalid()) 7661 return StmtError(); 7662 7663 ExprsChanged |= Result.get() != OutputExpr; 7664 7665 Exprs.push_back(Result.get()); 7666 } 7667 7668 // Go through the inputs. 7669 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7670 Names.push_back(S->getInputIdentifier(I)); 7671 7672 // No need to transform the constraint literal. 7673 Constraints.push_back(S->getInputConstraintLiteral(I)); 7674 7675 // Transform the input expr. 7676 Expr *InputExpr = S->getInputExpr(I); 7677 ExprResult Result = getDerived().TransformExpr(InputExpr); 7678 if (Result.isInvalid()) 7679 return StmtError(); 7680 7681 ExprsChanged |= Result.get() != InputExpr; 7682 7683 Exprs.push_back(Result.get()); 7684 } 7685 7686 // Go through the Labels. 7687 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7688 Names.push_back(S->getLabelIdentifier(I)); 7689 7690 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7691 if (Result.isInvalid()) 7692 return StmtError(); 7693 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7694 Exprs.push_back(Result.get()); 7695 } 7696 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7697 return S; 7698 7699 // Go through the clobbers. 7700 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7701 Clobbers.push_back(S->getClobberStringLiteral(I)); 7702 7703 // No need to transform the asm string literal. 7704 AsmString = S->getAsmString(); 7705 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7706 S->isVolatile(), S->getNumOutputs(), 7707 S->getNumInputs(), Names.data(), 7708 Constraints, Exprs, AsmString.get(), 7709 Clobbers, S->getNumLabels(), 7710 S->getRParenLoc()); 7711 } 7712 7713 template<typename Derived> 7714 StmtResult 7715 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7716 ArrayRef<Token> AsmToks = 7717 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7718 7719 bool HadError = false, HadChange = false; 7720 7721 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7722 SmallVector<Expr*, 8> TransformedExprs; 7723 TransformedExprs.reserve(SrcExprs.size()); 7724 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7725 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7726 if (!Result.isUsable()) { 7727 HadError = true; 7728 } else { 7729 HadChange |= (Result.get() != SrcExprs[i]); 7730 TransformedExprs.push_back(Result.get()); 7731 } 7732 } 7733 7734 if (HadError) return StmtError(); 7735 if (!HadChange && !getDerived().AlwaysRebuild()) 7736 return Owned(S); 7737 7738 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7739 AsmToks, S->getAsmString(), 7740 S->getNumOutputs(), S->getNumInputs(), 7741 S->getAllConstraints(), S->getClobbers(), 7742 TransformedExprs, S->getEndLoc()); 7743 } 7744 7745 // C++ Coroutines TS 7746 7747 template<typename Derived> 7748 StmtResult 7749 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7750 auto *ScopeInfo = SemaRef.getCurFunction(); 7751 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7752 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7753 ScopeInfo->NeedsCoroutineSuspends && 7754 ScopeInfo->CoroutineSuspends.first == nullptr && 7755 ScopeInfo->CoroutineSuspends.second == nullptr && 7756 "expected clean scope info"); 7757 7758 // Set that we have (possibly-invalid) suspend points before we do anything 7759 // that may fail. 7760 ScopeInfo->setNeedsCoroutineSuspends(false); 7761 7762 // We re-build the coroutine promise object (and the coroutine parameters its 7763 // type and constructor depend on) based on the types used in our current 7764 // function. We must do so, and set it on the current FunctionScopeInfo, 7765 // before attempting to transform the other parts of the coroutine body 7766 // statement, such as the implicit suspend statements (because those 7767 // statements reference the FunctionScopeInfo::CoroutinePromise). 7768 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7769 return StmtError(); 7770 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7771 if (!Promise) 7772 return StmtError(); 7773 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7774 ScopeInfo->CoroutinePromise = Promise; 7775 7776 // Transform the implicit coroutine statements constructed using dependent 7777 // types during the previous parse: initial and final suspensions, the return 7778 // object, and others. We also transform the coroutine function's body. 7779 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7780 if (InitSuspend.isInvalid()) 7781 return StmtError(); 7782 StmtResult FinalSuspend = 7783 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7784 if (FinalSuspend.isInvalid() || 7785 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7786 return StmtError(); 7787 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7788 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7789 7790 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7791 if (BodyRes.isInvalid()) 7792 return StmtError(); 7793 7794 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7795 if (Builder.isInvalid()) 7796 return StmtError(); 7797 7798 Expr *ReturnObject = S->getReturnValueInit(); 7799 assert(ReturnObject && "the return object is expected to be valid"); 7800 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7801 /*NoCopyInit*/ false); 7802 if (Res.isInvalid()) 7803 return StmtError(); 7804 Builder.ReturnValue = Res.get(); 7805 7806 // If during the previous parse the coroutine still had a dependent promise 7807 // statement, we may need to build some implicit coroutine statements 7808 // (such as exception and fallthrough handlers) for the first time. 7809 if (S->hasDependentPromiseType()) { 7810 // We can only build these statements, however, if the current promise type 7811 // is not dependent. 7812 if (!Promise->getType()->isDependentType()) { 7813 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7814 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7815 "these nodes should not have been built yet"); 7816 if (!Builder.buildDependentStatements()) 7817 return StmtError(); 7818 } 7819 } else { 7820 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7821 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7822 if (Res.isInvalid()) 7823 return StmtError(); 7824 Builder.OnFallthrough = Res.get(); 7825 } 7826 7827 if (auto *OnException = S->getExceptionHandler()) { 7828 StmtResult Res = getDerived().TransformStmt(OnException); 7829 if (Res.isInvalid()) 7830 return StmtError(); 7831 Builder.OnException = Res.get(); 7832 } 7833 7834 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7835 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7836 if (Res.isInvalid()) 7837 return StmtError(); 7838 Builder.ReturnStmtOnAllocFailure = Res.get(); 7839 } 7840 7841 // Transform any additional statements we may have already built 7842 assert(S->getAllocate() && S->getDeallocate() && 7843 "allocation and deallocation calls must already be built"); 7844 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7845 if (AllocRes.isInvalid()) 7846 return StmtError(); 7847 Builder.Allocate = AllocRes.get(); 7848 7849 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7850 if (DeallocRes.isInvalid()) 7851 return StmtError(); 7852 Builder.Deallocate = DeallocRes.get(); 7853 7854 assert(S->getResultDecl() && "ResultDecl must already be built"); 7855 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7856 if (ResultDecl.isInvalid()) 7857 return StmtError(); 7858 Builder.ResultDecl = ResultDecl.get(); 7859 7860 if (auto *ReturnStmt = S->getReturnStmt()) { 7861 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7862 if (Res.isInvalid()) 7863 return StmtError(); 7864 Builder.ReturnStmt = Res.get(); 7865 } 7866 } 7867 7868 return getDerived().RebuildCoroutineBodyStmt(Builder); 7869 } 7870 7871 template<typename Derived> 7872 StmtResult 7873 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7874 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7875 /*NotCopyInit*/false); 7876 if (Result.isInvalid()) 7877 return StmtError(); 7878 7879 // Always rebuild; we don't know if this needs to be injected into a new 7880 // context or if the promise type has changed. 7881 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7882 S->isImplicit()); 7883 } 7884 7885 template<typename Derived> 7886 ExprResult 7887 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7888 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7889 /*NotCopyInit*/false); 7890 if (Result.isInvalid()) 7891 return ExprError(); 7892 7893 // Always rebuild; we don't know if this needs to be injected into a new 7894 // context or if the promise type has changed. 7895 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7896 E->isImplicit()); 7897 } 7898 7899 template <typename Derived> 7900 ExprResult 7901 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7902 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7903 /*NotCopyInit*/ false); 7904 if (OperandResult.isInvalid()) 7905 return ExprError(); 7906 7907 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7908 E->getOperatorCoawaitLookup()); 7909 7910 if (LookupResult.isInvalid()) 7911 return ExprError(); 7912 7913 // Always rebuild; we don't know if this needs to be injected into a new 7914 // context or if the promise type has changed. 7915 return getDerived().RebuildDependentCoawaitExpr( 7916 E->getKeywordLoc(), OperandResult.get(), 7917 cast<UnresolvedLookupExpr>(LookupResult.get())); 7918 } 7919 7920 template<typename Derived> 7921 ExprResult 7922 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7923 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7924 /*NotCopyInit*/false); 7925 if (Result.isInvalid()) 7926 return ExprError(); 7927 7928 // Always rebuild; we don't know if this needs to be injected into a new 7929 // context or if the promise type has changed. 7930 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7931 } 7932 7933 // Objective-C Statements. 7934 7935 template<typename Derived> 7936 StmtResult 7937 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7938 // Transform the body of the @try. 7939 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7940 if (TryBody.isInvalid()) 7941 return StmtError(); 7942 7943 // Transform the @catch statements (if present). 7944 bool AnyCatchChanged = false; 7945 SmallVector<Stmt*, 8> CatchStmts; 7946 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7947 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7948 if (Catch.isInvalid()) 7949 return StmtError(); 7950 if (Catch.get() != S->getCatchStmt(I)) 7951 AnyCatchChanged = true; 7952 CatchStmts.push_back(Catch.get()); 7953 } 7954 7955 // Transform the @finally statement (if present). 7956 StmtResult Finally; 7957 if (S->getFinallyStmt()) { 7958 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7959 if (Finally.isInvalid()) 7960 return StmtError(); 7961 } 7962 7963 // If nothing changed, just retain this statement. 7964 if (!getDerived().AlwaysRebuild() && 7965 TryBody.get() == S->getTryBody() && 7966 !AnyCatchChanged && 7967 Finally.get() == S->getFinallyStmt()) 7968 return S; 7969 7970 // Build a new statement. 7971 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7972 CatchStmts, Finally.get()); 7973 } 7974 7975 template<typename Derived> 7976 StmtResult 7977 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7978 // Transform the @catch parameter, if there is one. 7979 VarDecl *Var = nullptr; 7980 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7981 TypeSourceInfo *TSInfo = nullptr; 7982 if (FromVar->getTypeSourceInfo()) { 7983 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7984 if (!TSInfo) 7985 return StmtError(); 7986 } 7987 7988 QualType T; 7989 if (TSInfo) 7990 T = TSInfo->getType(); 7991 else { 7992 T = getDerived().TransformType(FromVar->getType()); 7993 if (T.isNull()) 7994 return StmtError(); 7995 } 7996 7997 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7998 if (!Var) 7999 return StmtError(); 8000 } 8001 8002 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8003 if (Body.isInvalid()) 8004 return StmtError(); 8005 8006 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8007 S->getRParenLoc(), 8008 Var, Body.get()); 8009 } 8010 8011 template<typename Derived> 8012 StmtResult 8013 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8014 // Transform the body. 8015 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8016 if (Body.isInvalid()) 8017 return StmtError(); 8018 8019 // If nothing changed, just retain this statement. 8020 if (!getDerived().AlwaysRebuild() && 8021 Body.get() == S->getFinallyBody()) 8022 return S; 8023 8024 // Build a new statement. 8025 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8026 Body.get()); 8027 } 8028 8029 template<typename Derived> 8030 StmtResult 8031 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8032 ExprResult Operand; 8033 if (S->getThrowExpr()) { 8034 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8035 if (Operand.isInvalid()) 8036 return StmtError(); 8037 } 8038 8039 if (!getDerived().AlwaysRebuild() && 8040 Operand.get() == S->getThrowExpr()) 8041 return S; 8042 8043 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8044 } 8045 8046 template<typename Derived> 8047 StmtResult 8048 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8049 ObjCAtSynchronizedStmt *S) { 8050 // Transform the object we are locking. 8051 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8052 if (Object.isInvalid()) 8053 return StmtError(); 8054 Object = 8055 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8056 Object.get()); 8057 if (Object.isInvalid()) 8058 return StmtError(); 8059 8060 // Transform the body. 8061 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8062 if (Body.isInvalid()) 8063 return StmtError(); 8064 8065 // If nothing change, just retain the current statement. 8066 if (!getDerived().AlwaysRebuild() && 8067 Object.get() == S->getSynchExpr() && 8068 Body.get() == S->getSynchBody()) 8069 return S; 8070 8071 // Build a new statement. 8072 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8073 Object.get(), Body.get()); 8074 } 8075 8076 template<typename Derived> 8077 StmtResult 8078 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8079 ObjCAutoreleasePoolStmt *S) { 8080 // Transform the body. 8081 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8082 if (Body.isInvalid()) 8083 return StmtError(); 8084 8085 // If nothing changed, just retain this statement. 8086 if (!getDerived().AlwaysRebuild() && 8087 Body.get() == S->getSubStmt()) 8088 return S; 8089 8090 // Build a new statement. 8091 return getDerived().RebuildObjCAutoreleasePoolStmt( 8092 S->getAtLoc(), Body.get()); 8093 } 8094 8095 template<typename Derived> 8096 StmtResult 8097 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8098 ObjCForCollectionStmt *S) { 8099 // Transform the element statement. 8100 StmtResult Element = 8101 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8102 if (Element.isInvalid()) 8103 return StmtError(); 8104 8105 // Transform the collection expression. 8106 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8107 if (Collection.isInvalid()) 8108 return StmtError(); 8109 8110 // Transform the body. 8111 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8112 if (Body.isInvalid()) 8113 return StmtError(); 8114 8115 // If nothing changed, just retain this statement. 8116 if (!getDerived().AlwaysRebuild() && 8117 Element.get() == S->getElement() && 8118 Collection.get() == S->getCollection() && 8119 Body.get() == S->getBody()) 8120 return S; 8121 8122 // Build a new statement. 8123 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8124 Element.get(), 8125 Collection.get(), 8126 S->getRParenLoc(), 8127 Body.get()); 8128 } 8129 8130 template <typename Derived> 8131 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8132 // Transform the exception declaration, if any. 8133 VarDecl *Var = nullptr; 8134 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8135 TypeSourceInfo *T = 8136 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8137 if (!T) 8138 return StmtError(); 8139 8140 Var = getDerived().RebuildExceptionDecl( 8141 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8142 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8143 if (!Var || Var->isInvalidDecl()) 8144 return StmtError(); 8145 } 8146 8147 // Transform the actual exception handler. 8148 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8149 if (Handler.isInvalid()) 8150 return StmtError(); 8151 8152 if (!getDerived().AlwaysRebuild() && !Var && 8153 Handler.get() == S->getHandlerBlock()) 8154 return S; 8155 8156 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8157 } 8158 8159 template <typename Derived> 8160 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8161 // Transform the try block itself. 8162 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8163 if (TryBlock.isInvalid()) 8164 return StmtError(); 8165 8166 // Transform the handlers. 8167 bool HandlerChanged = false; 8168 SmallVector<Stmt *, 8> Handlers; 8169 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8170 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8171 if (Handler.isInvalid()) 8172 return StmtError(); 8173 8174 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8175 Handlers.push_back(Handler.getAs<Stmt>()); 8176 } 8177 8178 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8179 !HandlerChanged) 8180 return S; 8181 8182 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8183 Handlers); 8184 } 8185 8186 template<typename Derived> 8187 StmtResult 8188 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8189 StmtResult Init = 8190 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8191 if (Init.isInvalid()) 8192 return StmtError(); 8193 8194 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8195 if (Range.isInvalid()) 8196 return StmtError(); 8197 8198 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8199 if (Begin.isInvalid()) 8200 return StmtError(); 8201 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8202 if (End.isInvalid()) 8203 return StmtError(); 8204 8205 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8206 if (Cond.isInvalid()) 8207 return StmtError(); 8208 if (Cond.get()) 8209 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8210 if (Cond.isInvalid()) 8211 return StmtError(); 8212 if (Cond.get()) 8213 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8214 8215 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8216 if (Inc.isInvalid()) 8217 return StmtError(); 8218 if (Inc.get()) 8219 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8220 8221 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8222 if (LoopVar.isInvalid()) 8223 return StmtError(); 8224 8225 StmtResult NewStmt = S; 8226 if (getDerived().AlwaysRebuild() || 8227 Init.get() != S->getInit() || 8228 Range.get() != S->getRangeStmt() || 8229 Begin.get() != S->getBeginStmt() || 8230 End.get() != S->getEndStmt() || 8231 Cond.get() != S->getCond() || 8232 Inc.get() != S->getInc() || 8233 LoopVar.get() != S->getLoopVarStmt()) { 8234 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8235 S->getCoawaitLoc(), Init.get(), 8236 S->getColonLoc(), Range.get(), 8237 Begin.get(), End.get(), 8238 Cond.get(), 8239 Inc.get(), LoopVar.get(), 8240 S->getRParenLoc()); 8241 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8242 // Might not have attached any initializer to the loop variable. 8243 getSema().ActOnInitializerError( 8244 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8245 return StmtError(); 8246 } 8247 } 8248 8249 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8250 if (Body.isInvalid()) 8251 return StmtError(); 8252 8253 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8254 // it now so we have a new statement to attach the body to. 8255 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8256 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8257 S->getCoawaitLoc(), Init.get(), 8258 S->getColonLoc(), Range.get(), 8259 Begin.get(), End.get(), 8260 Cond.get(), 8261 Inc.get(), LoopVar.get(), 8262 S->getRParenLoc()); 8263 if (NewStmt.isInvalid()) 8264 return StmtError(); 8265 } 8266 8267 if (NewStmt.get() == S) 8268 return S; 8269 8270 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8271 } 8272 8273 template<typename Derived> 8274 StmtResult 8275 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8276 MSDependentExistsStmt *S) { 8277 // Transform the nested-name-specifier, if any. 8278 NestedNameSpecifierLoc QualifierLoc; 8279 if (S->getQualifierLoc()) { 8280 QualifierLoc 8281 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8282 if (!QualifierLoc) 8283 return StmtError(); 8284 } 8285 8286 // Transform the declaration name. 8287 DeclarationNameInfo NameInfo = S->getNameInfo(); 8288 if (NameInfo.getName()) { 8289 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8290 if (!NameInfo.getName()) 8291 return StmtError(); 8292 } 8293 8294 // Check whether anything changed. 8295 if (!getDerived().AlwaysRebuild() && 8296 QualifierLoc == S->getQualifierLoc() && 8297 NameInfo.getName() == S->getNameInfo().getName()) 8298 return S; 8299 8300 // Determine whether this name exists, if we can. 8301 CXXScopeSpec SS; 8302 SS.Adopt(QualifierLoc); 8303 bool Dependent = false; 8304 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8305 case Sema::IER_Exists: 8306 if (S->isIfExists()) 8307 break; 8308 8309 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8310 8311 case Sema::IER_DoesNotExist: 8312 if (S->isIfNotExists()) 8313 break; 8314 8315 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8316 8317 case Sema::IER_Dependent: 8318 Dependent = true; 8319 break; 8320 8321 case Sema::IER_Error: 8322 return StmtError(); 8323 } 8324 8325 // We need to continue with the instantiation, so do so now. 8326 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8327 if (SubStmt.isInvalid()) 8328 return StmtError(); 8329 8330 // If we have resolved the name, just transform to the substatement. 8331 if (!Dependent) 8332 return SubStmt; 8333 8334 // The name is still dependent, so build a dependent expression again. 8335 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8336 S->isIfExists(), 8337 QualifierLoc, 8338 NameInfo, 8339 SubStmt.get()); 8340 } 8341 8342 template<typename Derived> 8343 ExprResult 8344 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8345 NestedNameSpecifierLoc QualifierLoc; 8346 if (E->getQualifierLoc()) { 8347 QualifierLoc 8348 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8349 if (!QualifierLoc) 8350 return ExprError(); 8351 } 8352 8353 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8354 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8355 if (!PD) 8356 return ExprError(); 8357 8358 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8359 if (Base.isInvalid()) 8360 return ExprError(); 8361 8362 return new (SemaRef.getASTContext()) 8363 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8364 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8365 QualifierLoc, E->getMemberLoc()); 8366 } 8367 8368 template <typename Derived> 8369 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8370 MSPropertySubscriptExpr *E) { 8371 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8372 if (BaseRes.isInvalid()) 8373 return ExprError(); 8374 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8375 if (IdxRes.isInvalid()) 8376 return ExprError(); 8377 8378 if (!getDerived().AlwaysRebuild() && 8379 BaseRes.get() == E->getBase() && 8380 IdxRes.get() == E->getIdx()) 8381 return E; 8382 8383 return getDerived().RebuildArraySubscriptExpr( 8384 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8385 } 8386 8387 template <typename Derived> 8388 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8389 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8390 if (TryBlock.isInvalid()) 8391 return StmtError(); 8392 8393 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8394 if (Handler.isInvalid()) 8395 return StmtError(); 8396 8397 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8398 Handler.get() == S->getHandler()) 8399 return S; 8400 8401 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8402 TryBlock.get(), Handler.get()); 8403 } 8404 8405 template <typename Derived> 8406 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8407 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8408 if (Block.isInvalid()) 8409 return StmtError(); 8410 8411 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8412 } 8413 8414 template <typename Derived> 8415 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8416 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8417 if (FilterExpr.isInvalid()) 8418 return StmtError(); 8419 8420 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8421 if (Block.isInvalid()) 8422 return StmtError(); 8423 8424 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8425 Block.get()); 8426 } 8427 8428 template <typename Derived> 8429 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8430 if (isa<SEHFinallyStmt>(Handler)) 8431 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8432 else 8433 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8434 } 8435 8436 template<typename Derived> 8437 StmtResult 8438 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8439 return S; 8440 } 8441 8442 //===----------------------------------------------------------------------===// 8443 // OpenMP directive transformation 8444 //===----------------------------------------------------------------------===// 8445 8446 template <typename Derived> 8447 StmtResult 8448 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8449 // OMPCanonicalLoops are eliminated during transformation, since they will be 8450 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8451 // after transformation. 8452 return getDerived().TransformStmt(L->getLoopStmt()); 8453 } 8454 8455 template <typename Derived> 8456 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8457 OMPExecutableDirective *D) { 8458 8459 // Transform the clauses 8460 llvm::SmallVector<OMPClause *, 16> TClauses; 8461 ArrayRef<OMPClause *> Clauses = D->clauses(); 8462 TClauses.reserve(Clauses.size()); 8463 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8464 I != E; ++I) { 8465 if (*I) { 8466 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8467 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8468 getDerived().getSema().EndOpenMPClause(); 8469 if (Clause) 8470 TClauses.push_back(Clause); 8471 } else { 8472 TClauses.push_back(nullptr); 8473 } 8474 } 8475 StmtResult AssociatedStmt; 8476 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8477 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8478 /*CurScope=*/nullptr); 8479 StmtResult Body; 8480 { 8481 Sema::CompoundScopeRAII CompoundScope(getSema()); 8482 Stmt *CS; 8483 if (D->getDirectiveKind() == OMPD_atomic || 8484 D->getDirectiveKind() == OMPD_critical || 8485 D->getDirectiveKind() == OMPD_section || 8486 D->getDirectiveKind() == OMPD_master) 8487 CS = D->getAssociatedStmt(); 8488 else 8489 CS = D->getRawStmt(); 8490 Body = getDerived().TransformStmt(CS); 8491 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8492 getSema().getLangOpts().OpenMPIRBuilder) 8493 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8494 } 8495 AssociatedStmt = 8496 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8497 if (AssociatedStmt.isInvalid()) { 8498 return StmtError(); 8499 } 8500 } 8501 if (TClauses.size() != Clauses.size()) { 8502 return StmtError(); 8503 } 8504 8505 // Transform directive name for 'omp critical' directive. 8506 DeclarationNameInfo DirName; 8507 if (D->getDirectiveKind() == OMPD_critical) { 8508 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8509 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8510 } 8511 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8512 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8513 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8514 } else if (D->getDirectiveKind() == OMPD_cancel) { 8515 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8516 } 8517 8518 return getDerived().RebuildOMPExecutableDirective( 8519 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8520 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8521 } 8522 8523 template <typename Derived> 8524 StmtResult 8525 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8526 // TODO: Fix This 8527 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8528 << getOpenMPDirectiveName(D->getDirectiveKind()); 8529 return StmtError(); 8530 } 8531 8532 template <typename Derived> 8533 StmtResult 8534 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8535 DeclarationNameInfo DirName; 8536 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8537 D->getBeginLoc()); 8538 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8539 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8540 return Res; 8541 } 8542 8543 template <typename Derived> 8544 StmtResult 8545 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8546 DeclarationNameInfo DirName; 8547 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8548 D->getBeginLoc()); 8549 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8550 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8551 return Res; 8552 } 8553 8554 template <typename Derived> 8555 StmtResult 8556 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8557 DeclarationNameInfo DirName; 8558 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8559 nullptr, D->getBeginLoc()); 8560 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8561 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8562 return Res; 8563 } 8564 8565 template <typename Derived> 8566 StmtResult 8567 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8568 DeclarationNameInfo DirName; 8569 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8570 nullptr, D->getBeginLoc()); 8571 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8572 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8573 return Res; 8574 } 8575 8576 template <typename Derived> 8577 StmtResult 8578 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8579 DeclarationNameInfo DirName; 8580 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8581 D->getBeginLoc()); 8582 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8583 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8584 return Res; 8585 } 8586 8587 template <typename Derived> 8588 StmtResult 8589 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8590 DeclarationNameInfo DirName; 8591 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8592 D->getBeginLoc()); 8593 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8594 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8595 return Res; 8596 } 8597 8598 template <typename Derived> 8599 StmtResult 8600 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8601 DeclarationNameInfo DirName; 8602 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8603 D->getBeginLoc()); 8604 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8605 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8606 return Res; 8607 } 8608 8609 template <typename Derived> 8610 StmtResult 8611 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8612 DeclarationNameInfo DirName; 8613 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8614 D->getBeginLoc()); 8615 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8616 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8617 return Res; 8618 } 8619 8620 template <typename Derived> 8621 StmtResult 8622 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8623 DeclarationNameInfo DirName; 8624 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8625 D->getBeginLoc()); 8626 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8627 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8628 return Res; 8629 } 8630 8631 template <typename Derived> 8632 StmtResult 8633 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8634 DeclarationNameInfo DirName; 8635 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8636 D->getBeginLoc()); 8637 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8638 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8639 return Res; 8640 } 8641 8642 template <typename Derived> 8643 StmtResult 8644 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8645 getDerived().getSema().StartOpenMPDSABlock( 8646 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8647 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8648 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8649 return Res; 8650 } 8651 8652 template <typename Derived> 8653 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8654 OMPParallelForDirective *D) { 8655 DeclarationNameInfo DirName; 8656 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8657 nullptr, D->getBeginLoc()); 8658 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8659 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8660 return Res; 8661 } 8662 8663 template <typename Derived> 8664 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8665 OMPParallelForSimdDirective *D) { 8666 DeclarationNameInfo DirName; 8667 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8668 nullptr, D->getBeginLoc()); 8669 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8670 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8671 return Res; 8672 } 8673 8674 template <typename Derived> 8675 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8676 OMPParallelMasterDirective *D) { 8677 DeclarationNameInfo DirName; 8678 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8679 nullptr, D->getBeginLoc()); 8680 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8681 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8682 return Res; 8683 } 8684 8685 template <typename Derived> 8686 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8687 OMPParallelSectionsDirective *D) { 8688 DeclarationNameInfo DirName; 8689 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8690 nullptr, D->getBeginLoc()); 8691 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8692 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8693 return Res; 8694 } 8695 8696 template <typename Derived> 8697 StmtResult 8698 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8699 DeclarationNameInfo DirName; 8700 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8701 D->getBeginLoc()); 8702 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8703 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8704 return Res; 8705 } 8706 8707 template <typename Derived> 8708 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8709 OMPTaskyieldDirective *D) { 8710 DeclarationNameInfo DirName; 8711 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8712 D->getBeginLoc()); 8713 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8714 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8715 return Res; 8716 } 8717 8718 template <typename Derived> 8719 StmtResult 8720 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8721 DeclarationNameInfo DirName; 8722 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8723 D->getBeginLoc()); 8724 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8725 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8726 return Res; 8727 } 8728 8729 template <typename Derived> 8730 StmtResult 8731 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8732 DeclarationNameInfo DirName; 8733 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8734 D->getBeginLoc()); 8735 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8736 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8737 return Res; 8738 } 8739 8740 template <typename Derived> 8741 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8742 OMPTaskgroupDirective *D) { 8743 DeclarationNameInfo DirName; 8744 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8745 D->getBeginLoc()); 8746 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8747 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8748 return Res; 8749 } 8750 8751 template <typename Derived> 8752 StmtResult 8753 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8754 DeclarationNameInfo DirName; 8755 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8756 D->getBeginLoc()); 8757 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8758 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8759 return Res; 8760 } 8761 8762 template <typename Derived> 8763 StmtResult 8764 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8765 DeclarationNameInfo DirName; 8766 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8767 D->getBeginLoc()); 8768 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8769 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8770 return Res; 8771 } 8772 8773 template <typename Derived> 8774 StmtResult 8775 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8776 DeclarationNameInfo DirName; 8777 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8778 D->getBeginLoc()); 8779 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8780 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8781 return Res; 8782 } 8783 8784 template <typename Derived> 8785 StmtResult 8786 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8787 DeclarationNameInfo DirName; 8788 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8789 D->getBeginLoc()); 8790 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8791 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8792 return Res; 8793 } 8794 8795 template <typename Derived> 8796 StmtResult 8797 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8798 DeclarationNameInfo DirName; 8799 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8800 D->getBeginLoc()); 8801 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8802 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8803 return Res; 8804 } 8805 8806 template <typename Derived> 8807 StmtResult 8808 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8809 DeclarationNameInfo DirName; 8810 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8811 D->getBeginLoc()); 8812 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8813 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8814 return Res; 8815 } 8816 8817 template <typename Derived> 8818 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8819 OMPTargetDataDirective *D) { 8820 DeclarationNameInfo DirName; 8821 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8822 D->getBeginLoc()); 8823 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8824 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8825 return Res; 8826 } 8827 8828 template <typename Derived> 8829 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8830 OMPTargetEnterDataDirective *D) { 8831 DeclarationNameInfo DirName; 8832 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8833 nullptr, D->getBeginLoc()); 8834 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8835 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8836 return Res; 8837 } 8838 8839 template <typename Derived> 8840 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8841 OMPTargetExitDataDirective *D) { 8842 DeclarationNameInfo DirName; 8843 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8844 nullptr, D->getBeginLoc()); 8845 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8846 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8847 return Res; 8848 } 8849 8850 template <typename Derived> 8851 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8852 OMPTargetParallelDirective *D) { 8853 DeclarationNameInfo DirName; 8854 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8855 nullptr, D->getBeginLoc()); 8856 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8857 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8858 return Res; 8859 } 8860 8861 template <typename Derived> 8862 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8863 OMPTargetParallelForDirective *D) { 8864 DeclarationNameInfo DirName; 8865 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8866 nullptr, D->getBeginLoc()); 8867 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8868 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8869 return Res; 8870 } 8871 8872 template <typename Derived> 8873 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8874 OMPTargetUpdateDirective *D) { 8875 DeclarationNameInfo DirName; 8876 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8877 nullptr, D->getBeginLoc()); 8878 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8879 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8880 return Res; 8881 } 8882 8883 template <typename Derived> 8884 StmtResult 8885 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8886 DeclarationNameInfo DirName; 8887 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8888 D->getBeginLoc()); 8889 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8890 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8891 return Res; 8892 } 8893 8894 template <typename Derived> 8895 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8896 OMPCancellationPointDirective *D) { 8897 DeclarationNameInfo DirName; 8898 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8899 nullptr, D->getBeginLoc()); 8900 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8901 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8902 return Res; 8903 } 8904 8905 template <typename Derived> 8906 StmtResult 8907 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8908 DeclarationNameInfo DirName; 8909 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8910 D->getBeginLoc()); 8911 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8912 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8913 return Res; 8914 } 8915 8916 template <typename Derived> 8917 StmtResult 8918 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8919 DeclarationNameInfo DirName; 8920 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8921 D->getBeginLoc()); 8922 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8923 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8924 return Res; 8925 } 8926 8927 template <typename Derived> 8928 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8929 OMPTaskLoopSimdDirective *D) { 8930 DeclarationNameInfo DirName; 8931 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8932 nullptr, D->getBeginLoc()); 8933 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8934 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8935 return Res; 8936 } 8937 8938 template <typename Derived> 8939 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8940 OMPMasterTaskLoopDirective *D) { 8941 DeclarationNameInfo DirName; 8942 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8943 nullptr, D->getBeginLoc()); 8944 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8945 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8946 return Res; 8947 } 8948 8949 template <typename Derived> 8950 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8951 OMPMasterTaskLoopSimdDirective *D) { 8952 DeclarationNameInfo DirName; 8953 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8954 nullptr, D->getBeginLoc()); 8955 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8956 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8957 return Res; 8958 } 8959 8960 template <typename Derived> 8961 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8962 OMPParallelMasterTaskLoopDirective *D) { 8963 DeclarationNameInfo DirName; 8964 getDerived().getSema().StartOpenMPDSABlock( 8965 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8966 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8967 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8968 return Res; 8969 } 8970 8971 template <typename Derived> 8972 StmtResult 8973 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8974 OMPParallelMasterTaskLoopSimdDirective *D) { 8975 DeclarationNameInfo DirName; 8976 getDerived().getSema().StartOpenMPDSABlock( 8977 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8978 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8979 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8980 return Res; 8981 } 8982 8983 template <typename Derived> 8984 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8985 OMPDistributeDirective *D) { 8986 DeclarationNameInfo DirName; 8987 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8988 D->getBeginLoc()); 8989 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8990 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8991 return Res; 8992 } 8993 8994 template <typename Derived> 8995 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8996 OMPDistributeParallelForDirective *D) { 8997 DeclarationNameInfo DirName; 8998 getDerived().getSema().StartOpenMPDSABlock( 8999 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9000 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9001 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9002 return Res; 9003 } 9004 9005 template <typename Derived> 9006 StmtResult 9007 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9008 OMPDistributeParallelForSimdDirective *D) { 9009 DeclarationNameInfo DirName; 9010 getDerived().getSema().StartOpenMPDSABlock( 9011 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9012 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9013 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9014 return Res; 9015 } 9016 9017 template <typename Derived> 9018 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9019 OMPDistributeSimdDirective *D) { 9020 DeclarationNameInfo DirName; 9021 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9022 nullptr, D->getBeginLoc()); 9023 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9024 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9025 return Res; 9026 } 9027 9028 template <typename Derived> 9029 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9030 OMPTargetParallelForSimdDirective *D) { 9031 DeclarationNameInfo DirName; 9032 getDerived().getSema().StartOpenMPDSABlock( 9033 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9034 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9035 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9036 return Res; 9037 } 9038 9039 template <typename Derived> 9040 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9041 OMPTargetSimdDirective *D) { 9042 DeclarationNameInfo DirName; 9043 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9044 D->getBeginLoc()); 9045 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9046 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9047 return Res; 9048 } 9049 9050 template <typename Derived> 9051 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9052 OMPTeamsDistributeDirective *D) { 9053 DeclarationNameInfo DirName; 9054 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9055 nullptr, D->getBeginLoc()); 9056 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9057 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9058 return Res; 9059 } 9060 9061 template <typename Derived> 9062 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9063 OMPTeamsDistributeSimdDirective *D) { 9064 DeclarationNameInfo DirName; 9065 getDerived().getSema().StartOpenMPDSABlock( 9066 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9067 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9068 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9069 return Res; 9070 } 9071 9072 template <typename Derived> 9073 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9074 OMPTeamsDistributeParallelForSimdDirective *D) { 9075 DeclarationNameInfo DirName; 9076 getDerived().getSema().StartOpenMPDSABlock( 9077 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9078 D->getBeginLoc()); 9079 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9080 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9081 return Res; 9082 } 9083 9084 template <typename Derived> 9085 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9086 OMPTeamsDistributeParallelForDirective *D) { 9087 DeclarationNameInfo DirName; 9088 getDerived().getSema().StartOpenMPDSABlock( 9089 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9090 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9091 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9092 return Res; 9093 } 9094 9095 template <typename Derived> 9096 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9097 OMPTargetTeamsDirective *D) { 9098 DeclarationNameInfo DirName; 9099 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9100 nullptr, D->getBeginLoc()); 9101 auto Res = getDerived().TransformOMPExecutableDirective(D); 9102 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9103 return Res; 9104 } 9105 9106 template <typename Derived> 9107 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9108 OMPTargetTeamsDistributeDirective *D) { 9109 DeclarationNameInfo DirName; 9110 getDerived().getSema().StartOpenMPDSABlock( 9111 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9112 auto Res = getDerived().TransformOMPExecutableDirective(D); 9113 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9114 return Res; 9115 } 9116 9117 template <typename Derived> 9118 StmtResult 9119 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9120 OMPTargetTeamsDistributeParallelForDirective *D) { 9121 DeclarationNameInfo DirName; 9122 getDerived().getSema().StartOpenMPDSABlock( 9123 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9124 D->getBeginLoc()); 9125 auto Res = getDerived().TransformOMPExecutableDirective(D); 9126 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9127 return Res; 9128 } 9129 9130 template <typename Derived> 9131 StmtResult TreeTransform<Derived>:: 9132 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9133 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9134 DeclarationNameInfo DirName; 9135 getDerived().getSema().StartOpenMPDSABlock( 9136 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9137 D->getBeginLoc()); 9138 auto Res = getDerived().TransformOMPExecutableDirective(D); 9139 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9140 return Res; 9141 } 9142 9143 template <typename Derived> 9144 StmtResult 9145 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9146 OMPTargetTeamsDistributeSimdDirective *D) { 9147 DeclarationNameInfo DirName; 9148 getDerived().getSema().StartOpenMPDSABlock( 9149 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9150 auto Res = getDerived().TransformOMPExecutableDirective(D); 9151 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9152 return Res; 9153 } 9154 9155 template <typename Derived> 9156 StmtResult 9157 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9158 DeclarationNameInfo DirName; 9159 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9160 D->getBeginLoc()); 9161 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9162 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9163 return Res; 9164 } 9165 9166 template <typename Derived> 9167 StmtResult 9168 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9169 DeclarationNameInfo DirName; 9170 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9171 D->getBeginLoc()); 9172 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9173 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9174 return Res; 9175 } 9176 9177 template <typename Derived> 9178 StmtResult 9179 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9180 DeclarationNameInfo DirName; 9181 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9182 D->getBeginLoc()); 9183 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9184 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9185 return Res; 9186 } 9187 9188 template <typename Derived> 9189 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9190 OMPGenericLoopDirective *D) { 9191 DeclarationNameInfo DirName; 9192 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9193 D->getBeginLoc()); 9194 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9195 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9196 return Res; 9197 } 9198 9199 //===----------------------------------------------------------------------===// 9200 // OpenMP clause transformation 9201 //===----------------------------------------------------------------------===// 9202 template <typename Derived> 9203 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9204 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9205 if (Cond.isInvalid()) 9206 return nullptr; 9207 return getDerived().RebuildOMPIfClause( 9208 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9209 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9210 } 9211 9212 template <typename Derived> 9213 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9214 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9215 if (Cond.isInvalid()) 9216 return nullptr; 9217 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9218 C->getLParenLoc(), C->getEndLoc()); 9219 } 9220 9221 template <typename Derived> 9222 OMPClause * 9223 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9224 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9225 if (NumThreads.isInvalid()) 9226 return nullptr; 9227 return getDerived().RebuildOMPNumThreadsClause( 9228 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9229 } 9230 9231 template <typename Derived> 9232 OMPClause * 9233 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9234 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9235 if (E.isInvalid()) 9236 return nullptr; 9237 return getDerived().RebuildOMPSafelenClause( 9238 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9239 } 9240 9241 template <typename Derived> 9242 OMPClause * 9243 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9244 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9245 if (E.isInvalid()) 9246 return nullptr; 9247 return getDerived().RebuildOMPAllocatorClause( 9248 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9249 } 9250 9251 template <typename Derived> 9252 OMPClause * 9253 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9254 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9255 if (E.isInvalid()) 9256 return nullptr; 9257 return getDerived().RebuildOMPSimdlenClause( 9258 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9259 } 9260 9261 template <typename Derived> 9262 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9263 SmallVector<Expr *, 4> TransformedSizes; 9264 TransformedSizes.reserve(C->getNumSizes()); 9265 bool Changed = false; 9266 for (Expr *E : C->getSizesRefs()) { 9267 if (!E) { 9268 TransformedSizes.push_back(nullptr); 9269 continue; 9270 } 9271 9272 ExprResult T = getDerived().TransformExpr(E); 9273 if (T.isInvalid()) 9274 return nullptr; 9275 if (E != T.get()) 9276 Changed = true; 9277 TransformedSizes.push_back(T.get()); 9278 } 9279 9280 if (!Changed && !getDerived().AlwaysRebuild()) 9281 return C; 9282 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9283 C->getLParenLoc(), C->getEndLoc()); 9284 } 9285 9286 template <typename Derived> 9287 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9288 if (!getDerived().AlwaysRebuild()) 9289 return C; 9290 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9291 } 9292 9293 template <typename Derived> 9294 OMPClause * 9295 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9296 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9297 if (T.isInvalid()) 9298 return nullptr; 9299 Expr *Factor = T.get(); 9300 bool Changed = Factor != C->getFactor(); 9301 9302 if (!Changed && !getDerived().AlwaysRebuild()) 9303 return C; 9304 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9305 C->getEndLoc()); 9306 } 9307 9308 template <typename Derived> 9309 OMPClause * 9310 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9311 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9312 if (E.isInvalid()) 9313 return nullptr; 9314 return getDerived().RebuildOMPCollapseClause( 9315 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9316 } 9317 9318 template <typename Derived> 9319 OMPClause * 9320 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9321 return getDerived().RebuildOMPDefaultClause( 9322 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9323 C->getLParenLoc(), C->getEndLoc()); 9324 } 9325 9326 template <typename Derived> 9327 OMPClause * 9328 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9329 return getDerived().RebuildOMPProcBindClause( 9330 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9331 C->getLParenLoc(), C->getEndLoc()); 9332 } 9333 9334 template <typename Derived> 9335 OMPClause * 9336 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9337 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9338 if (E.isInvalid()) 9339 return nullptr; 9340 return getDerived().RebuildOMPScheduleClause( 9341 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9342 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9343 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9344 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9345 } 9346 9347 template <typename Derived> 9348 OMPClause * 9349 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9350 ExprResult E; 9351 if (auto *Num = C->getNumForLoops()) { 9352 E = getDerived().TransformExpr(Num); 9353 if (E.isInvalid()) 9354 return nullptr; 9355 } 9356 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9357 C->getLParenLoc(), E.get()); 9358 } 9359 9360 template <typename Derived> 9361 OMPClause * 9362 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9363 ExprResult E; 9364 if (Expr *Evt = C->getEventHandler()) { 9365 E = getDerived().TransformExpr(Evt); 9366 if (E.isInvalid()) 9367 return nullptr; 9368 } 9369 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9370 C->getLParenLoc(), C->getEndLoc()); 9371 } 9372 9373 template <typename Derived> 9374 OMPClause * 9375 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9376 // No need to rebuild this clause, no template-dependent parameters. 9377 return C; 9378 } 9379 9380 template <typename Derived> 9381 OMPClause * 9382 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9383 // No need to rebuild this clause, no template-dependent parameters. 9384 return C; 9385 } 9386 9387 template <typename Derived> 9388 OMPClause * 9389 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9390 // No need to rebuild this clause, no template-dependent parameters. 9391 return C; 9392 } 9393 9394 template <typename Derived> 9395 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9396 // No need to rebuild this clause, no template-dependent parameters. 9397 return C; 9398 } 9399 9400 template <typename Derived> 9401 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9402 // No need to rebuild this clause, no template-dependent parameters. 9403 return C; 9404 } 9405 9406 template <typename Derived> 9407 OMPClause * 9408 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9409 // No need to rebuild this clause, no template-dependent parameters. 9410 return C; 9411 } 9412 9413 template <typename Derived> 9414 OMPClause * 9415 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9416 // No need to rebuild this clause, no template-dependent parameters. 9417 return C; 9418 } 9419 9420 template <typename Derived> 9421 OMPClause * 9422 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9423 // No need to rebuild this clause, no template-dependent parameters. 9424 return C; 9425 } 9426 9427 template <typename Derived> 9428 OMPClause * 9429 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9430 // No need to rebuild this clause, no template-dependent parameters. 9431 return C; 9432 } 9433 9434 template <typename Derived> 9435 OMPClause * 9436 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9437 // No need to rebuild this clause, no template-dependent parameters. 9438 return C; 9439 } 9440 9441 template <typename Derived> 9442 OMPClause * 9443 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9444 // No need to rebuild this clause, no template-dependent parameters. 9445 return C; 9446 } 9447 9448 template <typename Derived> 9449 OMPClause * 9450 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9451 // No need to rebuild this clause, no template-dependent parameters. 9452 return C; 9453 } 9454 9455 template <typename Derived> 9456 OMPClause * 9457 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9458 // No need to rebuild this clause, no template-dependent parameters. 9459 return C; 9460 } 9461 9462 template <typename Derived> 9463 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9464 // No need to rebuild this clause, no template-dependent parameters. 9465 return C; 9466 } 9467 9468 template <typename Derived> 9469 OMPClause * 9470 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9471 // No need to rebuild this clause, no template-dependent parameters. 9472 return C; 9473 } 9474 9475 template <typename Derived> 9476 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9477 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9478 if (IVR.isInvalid()) 9479 return nullptr; 9480 9481 llvm::SmallVector<Expr *, 8> PrefExprs; 9482 PrefExprs.reserve(C->varlist_size() - 1); 9483 for (Expr *E : llvm::drop_begin(C->varlists())) { 9484 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9485 if (ER.isInvalid()) 9486 return nullptr; 9487 PrefExprs.push_back(ER.get()); 9488 } 9489 return getDerived().RebuildOMPInitClause( 9490 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9491 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9492 } 9493 9494 template <typename Derived> 9495 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9496 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9497 if (ER.isInvalid()) 9498 return nullptr; 9499 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9500 C->getLParenLoc(), C->getVarLoc(), 9501 C->getEndLoc()); 9502 } 9503 9504 template <typename Derived> 9505 OMPClause * 9506 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9507 ExprResult ER; 9508 if (Expr *IV = C->getInteropVar()) { 9509 ER = getDerived().TransformExpr(IV); 9510 if (ER.isInvalid()) 9511 return nullptr; 9512 } 9513 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9514 C->getLParenLoc(), C->getVarLoc(), 9515 C->getEndLoc()); 9516 } 9517 9518 template <typename Derived> 9519 OMPClause * 9520 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9521 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9522 if (Cond.isInvalid()) 9523 return nullptr; 9524 return getDerived().RebuildOMPNovariantsClause( 9525 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9526 } 9527 9528 template <typename Derived> 9529 OMPClause * 9530 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9531 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9532 if (Cond.isInvalid()) 9533 return nullptr; 9534 return getDerived().RebuildOMPNocontextClause( 9535 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9536 } 9537 9538 template <typename Derived> 9539 OMPClause * 9540 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9541 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9542 if (ThreadID.isInvalid()) 9543 return nullptr; 9544 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9545 C->getLParenLoc(), C->getEndLoc()); 9546 } 9547 9548 template <typename Derived> 9549 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9550 OMPUnifiedAddressClause *C) { 9551 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9552 } 9553 9554 template <typename Derived> 9555 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9556 OMPUnifiedSharedMemoryClause *C) { 9557 llvm_unreachable( 9558 "unified_shared_memory clause cannot appear in dependent context"); 9559 } 9560 9561 template <typename Derived> 9562 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9563 OMPReverseOffloadClause *C) { 9564 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9565 } 9566 9567 template <typename Derived> 9568 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9569 OMPDynamicAllocatorsClause *C) { 9570 llvm_unreachable( 9571 "dynamic_allocators clause cannot appear in dependent context"); 9572 } 9573 9574 template <typename Derived> 9575 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9576 OMPAtomicDefaultMemOrderClause *C) { 9577 llvm_unreachable( 9578 "atomic_default_mem_order clause cannot appear in dependent context"); 9579 } 9580 9581 template <typename Derived> 9582 OMPClause * 9583 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9584 llvm::SmallVector<Expr *, 16> Vars; 9585 Vars.reserve(C->varlist_size()); 9586 for (auto *VE : C->varlists()) { 9587 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9588 if (EVar.isInvalid()) 9589 return nullptr; 9590 Vars.push_back(EVar.get()); 9591 } 9592 return getDerived().RebuildOMPPrivateClause( 9593 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9594 } 9595 9596 template <typename Derived> 9597 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9598 OMPFirstprivateClause *C) { 9599 llvm::SmallVector<Expr *, 16> Vars; 9600 Vars.reserve(C->varlist_size()); 9601 for (auto *VE : C->varlists()) { 9602 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9603 if (EVar.isInvalid()) 9604 return nullptr; 9605 Vars.push_back(EVar.get()); 9606 } 9607 return getDerived().RebuildOMPFirstprivateClause( 9608 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9609 } 9610 9611 template <typename Derived> 9612 OMPClause * 9613 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9614 llvm::SmallVector<Expr *, 16> Vars; 9615 Vars.reserve(C->varlist_size()); 9616 for (auto *VE : C->varlists()) { 9617 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9618 if (EVar.isInvalid()) 9619 return nullptr; 9620 Vars.push_back(EVar.get()); 9621 } 9622 return getDerived().RebuildOMPLastprivateClause( 9623 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9624 C->getLParenLoc(), C->getEndLoc()); 9625 } 9626 9627 template <typename Derived> 9628 OMPClause * 9629 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9630 llvm::SmallVector<Expr *, 16> Vars; 9631 Vars.reserve(C->varlist_size()); 9632 for (auto *VE : C->varlists()) { 9633 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9634 if (EVar.isInvalid()) 9635 return nullptr; 9636 Vars.push_back(EVar.get()); 9637 } 9638 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9639 C->getLParenLoc(), C->getEndLoc()); 9640 } 9641 9642 template <typename Derived> 9643 OMPClause * 9644 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9645 llvm::SmallVector<Expr *, 16> Vars; 9646 Vars.reserve(C->varlist_size()); 9647 for (auto *VE : C->varlists()) { 9648 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9649 if (EVar.isInvalid()) 9650 return nullptr; 9651 Vars.push_back(EVar.get()); 9652 } 9653 CXXScopeSpec ReductionIdScopeSpec; 9654 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9655 9656 DeclarationNameInfo NameInfo = C->getNameInfo(); 9657 if (NameInfo.getName()) { 9658 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9659 if (!NameInfo.getName()) 9660 return nullptr; 9661 } 9662 // Build a list of all UDR decls with the same names ranged by the Scopes. 9663 // The Scope boundary is a duplication of the previous decl. 9664 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9665 for (auto *E : C->reduction_ops()) { 9666 // Transform all the decls. 9667 if (E) { 9668 auto *ULE = cast<UnresolvedLookupExpr>(E); 9669 UnresolvedSet<8> Decls; 9670 for (auto *D : ULE->decls()) { 9671 NamedDecl *InstD = 9672 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9673 Decls.addDecl(InstD, InstD->getAccess()); 9674 } 9675 UnresolvedReductions.push_back( 9676 UnresolvedLookupExpr::Create( 9677 SemaRef.Context, /*NamingClass=*/nullptr, 9678 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9679 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9680 Decls.begin(), Decls.end())); 9681 } else 9682 UnresolvedReductions.push_back(nullptr); 9683 } 9684 return getDerived().RebuildOMPReductionClause( 9685 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9686 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9687 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9688 } 9689 9690 template <typename Derived> 9691 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9692 OMPTaskReductionClause *C) { 9693 llvm::SmallVector<Expr *, 16> Vars; 9694 Vars.reserve(C->varlist_size()); 9695 for (auto *VE : C->varlists()) { 9696 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9697 if (EVar.isInvalid()) 9698 return nullptr; 9699 Vars.push_back(EVar.get()); 9700 } 9701 CXXScopeSpec ReductionIdScopeSpec; 9702 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9703 9704 DeclarationNameInfo NameInfo = C->getNameInfo(); 9705 if (NameInfo.getName()) { 9706 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9707 if (!NameInfo.getName()) 9708 return nullptr; 9709 } 9710 // Build a list of all UDR decls with the same names ranged by the Scopes. 9711 // The Scope boundary is a duplication of the previous decl. 9712 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9713 for (auto *E : C->reduction_ops()) { 9714 // Transform all the decls. 9715 if (E) { 9716 auto *ULE = cast<UnresolvedLookupExpr>(E); 9717 UnresolvedSet<8> Decls; 9718 for (auto *D : ULE->decls()) { 9719 NamedDecl *InstD = 9720 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9721 Decls.addDecl(InstD, InstD->getAccess()); 9722 } 9723 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9724 SemaRef.Context, /*NamingClass=*/nullptr, 9725 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9726 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9727 } else 9728 UnresolvedReductions.push_back(nullptr); 9729 } 9730 return getDerived().RebuildOMPTaskReductionClause( 9731 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9732 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9733 } 9734 9735 template <typename Derived> 9736 OMPClause * 9737 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9738 llvm::SmallVector<Expr *, 16> Vars; 9739 Vars.reserve(C->varlist_size()); 9740 for (auto *VE : C->varlists()) { 9741 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9742 if (EVar.isInvalid()) 9743 return nullptr; 9744 Vars.push_back(EVar.get()); 9745 } 9746 CXXScopeSpec ReductionIdScopeSpec; 9747 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9748 9749 DeclarationNameInfo NameInfo = C->getNameInfo(); 9750 if (NameInfo.getName()) { 9751 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9752 if (!NameInfo.getName()) 9753 return nullptr; 9754 } 9755 // Build a list of all UDR decls with the same names ranged by the Scopes. 9756 // The Scope boundary is a duplication of the previous decl. 9757 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9758 for (auto *E : C->reduction_ops()) { 9759 // Transform all the decls. 9760 if (E) { 9761 auto *ULE = cast<UnresolvedLookupExpr>(E); 9762 UnresolvedSet<8> Decls; 9763 for (auto *D : ULE->decls()) { 9764 NamedDecl *InstD = 9765 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9766 Decls.addDecl(InstD, InstD->getAccess()); 9767 } 9768 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9769 SemaRef.Context, /*NamingClass=*/nullptr, 9770 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9771 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9772 } else 9773 UnresolvedReductions.push_back(nullptr); 9774 } 9775 return getDerived().RebuildOMPInReductionClause( 9776 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9777 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9778 } 9779 9780 template <typename Derived> 9781 OMPClause * 9782 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9783 llvm::SmallVector<Expr *, 16> Vars; 9784 Vars.reserve(C->varlist_size()); 9785 for (auto *VE : C->varlists()) { 9786 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9787 if (EVar.isInvalid()) 9788 return nullptr; 9789 Vars.push_back(EVar.get()); 9790 } 9791 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9792 if (Step.isInvalid()) 9793 return nullptr; 9794 return getDerived().RebuildOMPLinearClause( 9795 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9796 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9797 } 9798 9799 template <typename Derived> 9800 OMPClause * 9801 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9802 llvm::SmallVector<Expr *, 16> Vars; 9803 Vars.reserve(C->varlist_size()); 9804 for (auto *VE : C->varlists()) { 9805 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9806 if (EVar.isInvalid()) 9807 return nullptr; 9808 Vars.push_back(EVar.get()); 9809 } 9810 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9811 if (Alignment.isInvalid()) 9812 return nullptr; 9813 return getDerived().RebuildOMPAlignedClause( 9814 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9815 C->getColonLoc(), C->getEndLoc()); 9816 } 9817 9818 template <typename Derived> 9819 OMPClause * 9820 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9821 llvm::SmallVector<Expr *, 16> Vars; 9822 Vars.reserve(C->varlist_size()); 9823 for (auto *VE : C->varlists()) { 9824 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9825 if (EVar.isInvalid()) 9826 return nullptr; 9827 Vars.push_back(EVar.get()); 9828 } 9829 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9830 C->getLParenLoc(), C->getEndLoc()); 9831 } 9832 9833 template <typename Derived> 9834 OMPClause * 9835 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9836 llvm::SmallVector<Expr *, 16> Vars; 9837 Vars.reserve(C->varlist_size()); 9838 for (auto *VE : C->varlists()) { 9839 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9840 if (EVar.isInvalid()) 9841 return nullptr; 9842 Vars.push_back(EVar.get()); 9843 } 9844 return getDerived().RebuildOMPCopyprivateClause( 9845 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9846 } 9847 9848 template <typename Derived> 9849 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9850 llvm::SmallVector<Expr *, 16> Vars; 9851 Vars.reserve(C->varlist_size()); 9852 for (auto *VE : C->varlists()) { 9853 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9854 if (EVar.isInvalid()) 9855 return nullptr; 9856 Vars.push_back(EVar.get()); 9857 } 9858 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9859 C->getLParenLoc(), C->getEndLoc()); 9860 } 9861 9862 template <typename Derived> 9863 OMPClause * 9864 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9865 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9866 if (E.isInvalid()) 9867 return nullptr; 9868 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9869 C->getLParenLoc(), C->getEndLoc()); 9870 } 9871 9872 template <typename Derived> 9873 OMPClause * 9874 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9875 llvm::SmallVector<Expr *, 16> Vars; 9876 Expr *DepModifier = C->getModifier(); 9877 if (DepModifier) { 9878 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9879 if (DepModRes.isInvalid()) 9880 return nullptr; 9881 DepModifier = DepModRes.get(); 9882 } 9883 Vars.reserve(C->varlist_size()); 9884 for (auto *VE : C->varlists()) { 9885 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9886 if (EVar.isInvalid()) 9887 return nullptr; 9888 Vars.push_back(EVar.get()); 9889 } 9890 return getDerived().RebuildOMPDependClause( 9891 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9892 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9893 C->getEndLoc()); 9894 } 9895 9896 template <typename Derived> 9897 OMPClause * 9898 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9899 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9900 if (E.isInvalid()) 9901 return nullptr; 9902 return getDerived().RebuildOMPDeviceClause( 9903 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9904 C->getModifierLoc(), C->getEndLoc()); 9905 } 9906 9907 template <typename Derived, class T> 9908 bool transformOMPMappableExprListClause( 9909 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9910 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9911 DeclarationNameInfo &MapperIdInfo, 9912 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9913 // Transform expressions in the list. 9914 Vars.reserve(C->varlist_size()); 9915 for (auto *VE : C->varlists()) { 9916 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9917 if (EVar.isInvalid()) 9918 return true; 9919 Vars.push_back(EVar.get()); 9920 } 9921 // Transform mapper scope specifier and identifier. 9922 NestedNameSpecifierLoc QualifierLoc; 9923 if (C->getMapperQualifierLoc()) { 9924 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9925 C->getMapperQualifierLoc()); 9926 if (!QualifierLoc) 9927 return true; 9928 } 9929 MapperIdScopeSpec.Adopt(QualifierLoc); 9930 MapperIdInfo = C->getMapperIdInfo(); 9931 if (MapperIdInfo.getName()) { 9932 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9933 if (!MapperIdInfo.getName()) 9934 return true; 9935 } 9936 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9937 // the previous user-defined mapper lookup in dependent environment. 9938 for (auto *E : C->mapperlists()) { 9939 // Transform all the decls. 9940 if (E) { 9941 auto *ULE = cast<UnresolvedLookupExpr>(E); 9942 UnresolvedSet<8> Decls; 9943 for (auto *D : ULE->decls()) { 9944 NamedDecl *InstD = 9945 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9946 Decls.addDecl(InstD, InstD->getAccess()); 9947 } 9948 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9949 TT.getSema().Context, /*NamingClass=*/nullptr, 9950 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9951 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9952 Decls.end())); 9953 } else { 9954 UnresolvedMappers.push_back(nullptr); 9955 } 9956 } 9957 return false; 9958 } 9959 9960 template <typename Derived> 9961 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9962 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9963 llvm::SmallVector<Expr *, 16> Vars; 9964 CXXScopeSpec MapperIdScopeSpec; 9965 DeclarationNameInfo MapperIdInfo; 9966 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9967 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9968 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9969 return nullptr; 9970 return getDerived().RebuildOMPMapClause( 9971 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9972 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9973 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9974 } 9975 9976 template <typename Derived> 9977 OMPClause * 9978 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9979 Expr *Allocator = C->getAllocator(); 9980 if (Allocator) { 9981 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9982 if (AllocatorRes.isInvalid()) 9983 return nullptr; 9984 Allocator = AllocatorRes.get(); 9985 } 9986 llvm::SmallVector<Expr *, 16> Vars; 9987 Vars.reserve(C->varlist_size()); 9988 for (auto *VE : C->varlists()) { 9989 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9990 if (EVar.isInvalid()) 9991 return nullptr; 9992 Vars.push_back(EVar.get()); 9993 } 9994 return getDerived().RebuildOMPAllocateClause( 9995 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9996 C->getEndLoc()); 9997 } 9998 9999 template <typename Derived> 10000 OMPClause * 10001 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10002 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10003 if (E.isInvalid()) 10004 return nullptr; 10005 return getDerived().RebuildOMPNumTeamsClause( 10006 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10007 } 10008 10009 template <typename Derived> 10010 OMPClause * 10011 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10012 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10013 if (E.isInvalid()) 10014 return nullptr; 10015 return getDerived().RebuildOMPThreadLimitClause( 10016 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10017 } 10018 10019 template <typename Derived> 10020 OMPClause * 10021 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10022 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10023 if (E.isInvalid()) 10024 return nullptr; 10025 return getDerived().RebuildOMPPriorityClause( 10026 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10027 } 10028 10029 template <typename Derived> 10030 OMPClause * 10031 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10032 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10033 if (E.isInvalid()) 10034 return nullptr; 10035 return getDerived().RebuildOMPGrainsizeClause( 10036 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10037 } 10038 10039 template <typename Derived> 10040 OMPClause * 10041 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10042 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10043 if (E.isInvalid()) 10044 return nullptr; 10045 return getDerived().RebuildOMPNumTasksClause( 10046 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10047 } 10048 10049 template <typename Derived> 10050 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10051 ExprResult E = getDerived().TransformExpr(C->getHint()); 10052 if (E.isInvalid()) 10053 return nullptr; 10054 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10055 C->getLParenLoc(), C->getEndLoc()); 10056 } 10057 10058 template <typename Derived> 10059 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10060 OMPDistScheduleClause *C) { 10061 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10062 if (E.isInvalid()) 10063 return nullptr; 10064 return getDerived().RebuildOMPDistScheduleClause( 10065 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10066 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10067 } 10068 10069 template <typename Derived> 10070 OMPClause * 10071 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10072 // Rebuild Defaultmap Clause since we need to invoke the checking of 10073 // defaultmap(none:variable-category) after template initialization. 10074 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10075 C->getDefaultmapKind(), 10076 C->getBeginLoc(), 10077 C->getLParenLoc(), 10078 C->getDefaultmapModifierLoc(), 10079 C->getDefaultmapKindLoc(), 10080 C->getEndLoc()); 10081 } 10082 10083 template <typename Derived> 10084 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10085 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10086 llvm::SmallVector<Expr *, 16> Vars; 10087 CXXScopeSpec MapperIdScopeSpec; 10088 DeclarationNameInfo MapperIdInfo; 10089 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10090 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10091 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10092 return nullptr; 10093 return getDerived().RebuildOMPToClause( 10094 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10095 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10096 } 10097 10098 template <typename Derived> 10099 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10100 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10101 llvm::SmallVector<Expr *, 16> Vars; 10102 CXXScopeSpec MapperIdScopeSpec; 10103 DeclarationNameInfo MapperIdInfo; 10104 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10105 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10106 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10107 return nullptr; 10108 return getDerived().RebuildOMPFromClause( 10109 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10110 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10111 } 10112 10113 template <typename Derived> 10114 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10115 OMPUseDevicePtrClause *C) { 10116 llvm::SmallVector<Expr *, 16> Vars; 10117 Vars.reserve(C->varlist_size()); 10118 for (auto *VE : C->varlists()) { 10119 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10120 if (EVar.isInvalid()) 10121 return nullptr; 10122 Vars.push_back(EVar.get()); 10123 } 10124 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10125 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10126 } 10127 10128 template <typename Derived> 10129 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10130 OMPUseDeviceAddrClause *C) { 10131 llvm::SmallVector<Expr *, 16> Vars; 10132 Vars.reserve(C->varlist_size()); 10133 for (auto *VE : C->varlists()) { 10134 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10135 if (EVar.isInvalid()) 10136 return nullptr; 10137 Vars.push_back(EVar.get()); 10138 } 10139 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10140 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10141 } 10142 10143 template <typename Derived> 10144 OMPClause * 10145 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10146 llvm::SmallVector<Expr *, 16> Vars; 10147 Vars.reserve(C->varlist_size()); 10148 for (auto *VE : C->varlists()) { 10149 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10150 if (EVar.isInvalid()) 10151 return nullptr; 10152 Vars.push_back(EVar.get()); 10153 } 10154 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10155 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10156 } 10157 10158 template <typename Derived> 10159 OMPClause * 10160 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10161 llvm::SmallVector<Expr *, 16> Vars; 10162 Vars.reserve(C->varlist_size()); 10163 for (auto *VE : C->varlists()) { 10164 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10165 if (EVar.isInvalid()) 10166 return nullptr; 10167 Vars.push_back(EVar.get()); 10168 } 10169 return getDerived().RebuildOMPNontemporalClause( 10170 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10171 } 10172 10173 template <typename Derived> 10174 OMPClause * 10175 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10176 llvm::SmallVector<Expr *, 16> Vars; 10177 Vars.reserve(C->varlist_size()); 10178 for (auto *VE : C->varlists()) { 10179 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10180 if (EVar.isInvalid()) 10181 return nullptr; 10182 Vars.push_back(EVar.get()); 10183 } 10184 return getDerived().RebuildOMPInclusiveClause( 10185 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10186 } 10187 10188 template <typename Derived> 10189 OMPClause * 10190 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10191 llvm::SmallVector<Expr *, 16> Vars; 10192 Vars.reserve(C->varlist_size()); 10193 for (auto *VE : C->varlists()) { 10194 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10195 if (EVar.isInvalid()) 10196 return nullptr; 10197 Vars.push_back(EVar.get()); 10198 } 10199 return getDerived().RebuildOMPExclusiveClause( 10200 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10201 } 10202 10203 template <typename Derived> 10204 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10205 OMPUsesAllocatorsClause *C) { 10206 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10207 Data.reserve(C->getNumberOfAllocators()); 10208 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10209 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10210 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10211 if (Allocator.isInvalid()) 10212 continue; 10213 ExprResult AllocatorTraits; 10214 if (Expr *AT = D.AllocatorTraits) { 10215 AllocatorTraits = getDerived().TransformExpr(AT); 10216 if (AllocatorTraits.isInvalid()) 10217 continue; 10218 } 10219 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10220 NewD.Allocator = Allocator.get(); 10221 NewD.AllocatorTraits = AllocatorTraits.get(); 10222 NewD.LParenLoc = D.LParenLoc; 10223 NewD.RParenLoc = D.RParenLoc; 10224 } 10225 return getDerived().RebuildOMPUsesAllocatorsClause( 10226 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10227 } 10228 10229 template <typename Derived> 10230 OMPClause * 10231 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10232 SmallVector<Expr *, 4> Locators; 10233 Locators.reserve(C->varlist_size()); 10234 ExprResult ModifierRes; 10235 if (Expr *Modifier = C->getModifier()) { 10236 ModifierRes = getDerived().TransformExpr(Modifier); 10237 if (ModifierRes.isInvalid()) 10238 return nullptr; 10239 } 10240 for (Expr *E : C->varlists()) { 10241 ExprResult Locator = getDerived().TransformExpr(E); 10242 if (Locator.isInvalid()) 10243 continue; 10244 Locators.push_back(Locator.get()); 10245 } 10246 return getDerived().RebuildOMPAffinityClause( 10247 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10248 ModifierRes.get(), Locators); 10249 } 10250 10251 template <typename Derived> 10252 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10253 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10254 C->getBeginLoc(), C->getLParenLoc(), 10255 C->getEndLoc()); 10256 } 10257 10258 template <typename Derived> 10259 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10260 return getDerived().RebuildOMPBindClause( 10261 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10262 C->getLParenLoc(), C->getEndLoc()); 10263 } 10264 10265 //===----------------------------------------------------------------------===// 10266 // Expression transformation 10267 //===----------------------------------------------------------------------===// 10268 template<typename Derived> 10269 ExprResult 10270 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10271 return TransformExpr(E->getSubExpr()); 10272 } 10273 10274 template <typename Derived> 10275 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10276 SYCLUniqueStableNameExpr *E) { 10277 if (!E->isTypeDependent()) 10278 return E; 10279 10280 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10281 10282 if (!NewT) 10283 return ExprError(); 10284 10285 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10286 return E; 10287 10288 return getDerived().RebuildSYCLUniqueStableNameExpr( 10289 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10290 } 10291 10292 template<typename Derived> 10293 ExprResult 10294 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10295 if (!E->isTypeDependent()) 10296 return E; 10297 10298 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10299 E->getIdentKind()); 10300 } 10301 10302 template<typename Derived> 10303 ExprResult 10304 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10305 NestedNameSpecifierLoc QualifierLoc; 10306 if (E->getQualifierLoc()) { 10307 QualifierLoc 10308 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10309 if (!QualifierLoc) 10310 return ExprError(); 10311 } 10312 10313 ValueDecl *ND 10314 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10315 E->getDecl())); 10316 if (!ND) 10317 return ExprError(); 10318 10319 NamedDecl *Found = ND; 10320 if (E->getFoundDecl() != E->getDecl()) { 10321 Found = cast_or_null<NamedDecl>( 10322 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10323 if (!Found) 10324 return ExprError(); 10325 } 10326 10327 DeclarationNameInfo NameInfo = E->getNameInfo(); 10328 if (NameInfo.getName()) { 10329 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10330 if (!NameInfo.getName()) 10331 return ExprError(); 10332 } 10333 10334 if (!getDerived().AlwaysRebuild() && 10335 QualifierLoc == E->getQualifierLoc() && 10336 ND == E->getDecl() && 10337 Found == E->getFoundDecl() && 10338 NameInfo.getName() == E->getDecl()->getDeclName() && 10339 !E->hasExplicitTemplateArgs()) { 10340 10341 // Mark it referenced in the new context regardless. 10342 // FIXME: this is a bit instantiation-specific. 10343 SemaRef.MarkDeclRefReferenced(E); 10344 10345 return E; 10346 } 10347 10348 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10349 if (E->hasExplicitTemplateArgs()) { 10350 TemplateArgs = &TransArgs; 10351 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10352 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10353 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10354 E->getNumTemplateArgs(), 10355 TransArgs)) 10356 return ExprError(); 10357 } 10358 10359 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10360 Found, TemplateArgs); 10361 } 10362 10363 template<typename Derived> 10364 ExprResult 10365 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10366 return E; 10367 } 10368 10369 template <typename Derived> 10370 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10371 FixedPointLiteral *E) { 10372 return E; 10373 } 10374 10375 template<typename Derived> 10376 ExprResult 10377 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10378 return E; 10379 } 10380 10381 template<typename Derived> 10382 ExprResult 10383 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10384 return E; 10385 } 10386 10387 template<typename Derived> 10388 ExprResult 10389 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10390 return E; 10391 } 10392 10393 template<typename Derived> 10394 ExprResult 10395 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10396 return E; 10397 } 10398 10399 template<typename Derived> 10400 ExprResult 10401 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10402 if (FunctionDecl *FD = E->getDirectCallee()) 10403 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10404 return SemaRef.MaybeBindToTemporary(E); 10405 } 10406 10407 template<typename Derived> 10408 ExprResult 10409 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10410 ExprResult ControllingExpr = 10411 getDerived().TransformExpr(E->getControllingExpr()); 10412 if (ControllingExpr.isInvalid()) 10413 return ExprError(); 10414 10415 SmallVector<Expr *, 4> AssocExprs; 10416 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10417 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10418 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10419 if (TSI) { 10420 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10421 if (!AssocType) 10422 return ExprError(); 10423 AssocTypes.push_back(AssocType); 10424 } else { 10425 AssocTypes.push_back(nullptr); 10426 } 10427 10428 ExprResult AssocExpr = 10429 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10430 if (AssocExpr.isInvalid()) 10431 return ExprError(); 10432 AssocExprs.push_back(AssocExpr.get()); 10433 } 10434 10435 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10436 E->getDefaultLoc(), 10437 E->getRParenLoc(), 10438 ControllingExpr.get(), 10439 AssocTypes, 10440 AssocExprs); 10441 } 10442 10443 template<typename Derived> 10444 ExprResult 10445 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10446 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10447 if (SubExpr.isInvalid()) 10448 return ExprError(); 10449 10450 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10451 return E; 10452 10453 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10454 E->getRParen()); 10455 } 10456 10457 /// The operand of a unary address-of operator has special rules: it's 10458 /// allowed to refer to a non-static member of a class even if there's no 'this' 10459 /// object available. 10460 template<typename Derived> 10461 ExprResult 10462 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10463 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10464 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10465 else 10466 return getDerived().TransformExpr(E); 10467 } 10468 10469 template<typename Derived> 10470 ExprResult 10471 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10472 ExprResult SubExpr; 10473 if (E->getOpcode() == UO_AddrOf) 10474 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10475 else 10476 SubExpr = TransformExpr(E->getSubExpr()); 10477 if (SubExpr.isInvalid()) 10478 return ExprError(); 10479 10480 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10481 return E; 10482 10483 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10484 E->getOpcode(), 10485 SubExpr.get()); 10486 } 10487 10488 template<typename Derived> 10489 ExprResult 10490 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10491 // Transform the type. 10492 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10493 if (!Type) 10494 return ExprError(); 10495 10496 // Transform all of the components into components similar to what the 10497 // parser uses. 10498 // FIXME: It would be slightly more efficient in the non-dependent case to 10499 // just map FieldDecls, rather than requiring the rebuilder to look for 10500 // the fields again. However, __builtin_offsetof is rare enough in 10501 // template code that we don't care. 10502 bool ExprChanged = false; 10503 typedef Sema::OffsetOfComponent Component; 10504 SmallVector<Component, 4> Components; 10505 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10506 const OffsetOfNode &ON = E->getComponent(I); 10507 Component Comp; 10508 Comp.isBrackets = true; 10509 Comp.LocStart = ON.getSourceRange().getBegin(); 10510 Comp.LocEnd = ON.getSourceRange().getEnd(); 10511 switch (ON.getKind()) { 10512 case OffsetOfNode::Array: { 10513 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10514 ExprResult Index = getDerived().TransformExpr(FromIndex); 10515 if (Index.isInvalid()) 10516 return ExprError(); 10517 10518 ExprChanged = ExprChanged || Index.get() != FromIndex; 10519 Comp.isBrackets = true; 10520 Comp.U.E = Index.get(); 10521 break; 10522 } 10523 10524 case OffsetOfNode::Field: 10525 case OffsetOfNode::Identifier: 10526 Comp.isBrackets = false; 10527 Comp.U.IdentInfo = ON.getFieldName(); 10528 if (!Comp.U.IdentInfo) 10529 continue; 10530 10531 break; 10532 10533 case OffsetOfNode::Base: 10534 // Will be recomputed during the rebuild. 10535 continue; 10536 } 10537 10538 Components.push_back(Comp); 10539 } 10540 10541 // If nothing changed, retain the existing expression. 10542 if (!getDerived().AlwaysRebuild() && 10543 Type == E->getTypeSourceInfo() && 10544 !ExprChanged) 10545 return E; 10546 10547 // Build a new offsetof expression. 10548 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10549 Components, E->getRParenLoc()); 10550 } 10551 10552 template<typename Derived> 10553 ExprResult 10554 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10555 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10556 "opaque value expression requires transformation"); 10557 return E; 10558 } 10559 10560 template<typename Derived> 10561 ExprResult 10562 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10563 return E; 10564 } 10565 10566 template <typename Derived> 10567 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10568 llvm::SmallVector<Expr *, 8> Children; 10569 bool Changed = false; 10570 for (Expr *C : E->subExpressions()) { 10571 ExprResult NewC = getDerived().TransformExpr(C); 10572 if (NewC.isInvalid()) 10573 return ExprError(); 10574 Children.push_back(NewC.get()); 10575 10576 Changed |= NewC.get() != C; 10577 } 10578 if (!getDerived().AlwaysRebuild() && !Changed) 10579 return E; 10580 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10581 Children, E->getType()); 10582 } 10583 10584 template<typename Derived> 10585 ExprResult 10586 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10587 // Rebuild the syntactic form. The original syntactic form has 10588 // opaque-value expressions in it, so strip those away and rebuild 10589 // the result. This is a really awful way of doing this, but the 10590 // better solution (rebuilding the semantic expressions and 10591 // rebinding OVEs as necessary) doesn't work; we'd need 10592 // TreeTransform to not strip away implicit conversions. 10593 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10594 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10595 if (result.isInvalid()) return ExprError(); 10596 10597 // If that gives us a pseudo-object result back, the pseudo-object 10598 // expression must have been an lvalue-to-rvalue conversion which we 10599 // should reapply. 10600 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10601 result = SemaRef.checkPseudoObjectRValue(result.get()); 10602 10603 return result; 10604 } 10605 10606 template<typename Derived> 10607 ExprResult 10608 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10609 UnaryExprOrTypeTraitExpr *E) { 10610 if (E->isArgumentType()) { 10611 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10612 10613 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10614 if (!NewT) 10615 return ExprError(); 10616 10617 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10618 return E; 10619 10620 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10621 E->getKind(), 10622 E->getSourceRange()); 10623 } 10624 10625 // C++0x [expr.sizeof]p1: 10626 // The operand is either an expression, which is an unevaluated operand 10627 // [...] 10628 EnterExpressionEvaluationContext Unevaluated( 10629 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10630 Sema::ReuseLambdaContextDecl); 10631 10632 // Try to recover if we have something like sizeof(T::X) where X is a type. 10633 // Notably, there must be *exactly* one set of parens if X is a type. 10634 TypeSourceInfo *RecoveryTSI = nullptr; 10635 ExprResult SubExpr; 10636 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10637 if (auto *DRE = 10638 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10639 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10640 PE, DRE, false, &RecoveryTSI); 10641 else 10642 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10643 10644 if (RecoveryTSI) { 10645 return getDerived().RebuildUnaryExprOrTypeTrait( 10646 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10647 } else if (SubExpr.isInvalid()) 10648 return ExprError(); 10649 10650 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10651 return E; 10652 10653 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10654 E->getOperatorLoc(), 10655 E->getKind(), 10656 E->getSourceRange()); 10657 } 10658 10659 template<typename Derived> 10660 ExprResult 10661 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10662 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10663 if (LHS.isInvalid()) 10664 return ExprError(); 10665 10666 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10667 if (RHS.isInvalid()) 10668 return ExprError(); 10669 10670 10671 if (!getDerived().AlwaysRebuild() && 10672 LHS.get() == E->getLHS() && 10673 RHS.get() == E->getRHS()) 10674 return E; 10675 10676 return getDerived().RebuildArraySubscriptExpr( 10677 LHS.get(), 10678 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10679 } 10680 10681 template <typename Derived> 10682 ExprResult 10683 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10684 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10685 if (Base.isInvalid()) 10686 return ExprError(); 10687 10688 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10689 if (RowIdx.isInvalid()) 10690 return ExprError(); 10691 10692 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10693 if (ColumnIdx.isInvalid()) 10694 return ExprError(); 10695 10696 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10697 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10698 return E; 10699 10700 return getDerived().RebuildMatrixSubscriptExpr( 10701 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10702 } 10703 10704 template <typename Derived> 10705 ExprResult 10706 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10707 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10708 if (Base.isInvalid()) 10709 return ExprError(); 10710 10711 ExprResult LowerBound; 10712 if (E->getLowerBound()) { 10713 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10714 if (LowerBound.isInvalid()) 10715 return ExprError(); 10716 } 10717 10718 ExprResult Length; 10719 if (E->getLength()) { 10720 Length = getDerived().TransformExpr(E->getLength()); 10721 if (Length.isInvalid()) 10722 return ExprError(); 10723 } 10724 10725 ExprResult Stride; 10726 if (Expr *Str = E->getStride()) { 10727 Stride = getDerived().TransformExpr(Str); 10728 if (Stride.isInvalid()) 10729 return ExprError(); 10730 } 10731 10732 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10733 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10734 return E; 10735 10736 return getDerived().RebuildOMPArraySectionExpr( 10737 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10738 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10739 E->getRBracketLoc()); 10740 } 10741 10742 template <typename Derived> 10743 ExprResult 10744 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10745 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10746 if (Base.isInvalid()) 10747 return ExprError(); 10748 10749 SmallVector<Expr *, 4> Dims; 10750 bool ErrorFound = false; 10751 for (Expr *Dim : E->getDimensions()) { 10752 ExprResult DimRes = getDerived().TransformExpr(Dim); 10753 if (DimRes.isInvalid()) { 10754 ErrorFound = true; 10755 continue; 10756 } 10757 Dims.push_back(DimRes.get()); 10758 } 10759 10760 if (ErrorFound) 10761 return ExprError(); 10762 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10763 E->getRParenLoc(), Dims, 10764 E->getBracketsRanges()); 10765 } 10766 10767 template <typename Derived> 10768 ExprResult 10769 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10770 unsigned NumIterators = E->numOfIterators(); 10771 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10772 10773 bool ErrorFound = false; 10774 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10775 for (unsigned I = 0; I < NumIterators; ++I) { 10776 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10777 Data[I].DeclIdent = D->getIdentifier(); 10778 Data[I].DeclIdentLoc = D->getLocation(); 10779 if (D->getLocation() == D->getBeginLoc()) { 10780 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10781 "Implicit type must be int."); 10782 } else { 10783 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10784 QualType DeclTy = getDerived().TransformType(D->getType()); 10785 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10786 } 10787 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10788 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10789 ExprResult End = getDerived().TransformExpr(Range.End); 10790 ExprResult Step = getDerived().TransformExpr(Range.Step); 10791 ErrorFound = ErrorFound || 10792 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10793 !Data[I].Type.get().isNull())) || 10794 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10795 if (ErrorFound) 10796 continue; 10797 Data[I].Range.Begin = Begin.get(); 10798 Data[I].Range.End = End.get(); 10799 Data[I].Range.Step = Step.get(); 10800 Data[I].AssignLoc = E->getAssignLoc(I); 10801 Data[I].ColonLoc = E->getColonLoc(I); 10802 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10803 NeedToRebuild = 10804 NeedToRebuild || 10805 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10806 D->getType().getTypePtrOrNull()) || 10807 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10808 Range.Step != Data[I].Range.Step; 10809 } 10810 if (ErrorFound) 10811 return ExprError(); 10812 if (!NeedToRebuild) 10813 return E; 10814 10815 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10816 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10817 if (!Res.isUsable()) 10818 return Res; 10819 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10820 for (unsigned I = 0; I < NumIterators; ++I) 10821 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10822 IE->getIteratorDecl(I)); 10823 return Res; 10824 } 10825 10826 template<typename Derived> 10827 ExprResult 10828 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10829 // Transform the callee. 10830 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10831 if (Callee.isInvalid()) 10832 return ExprError(); 10833 10834 // Transform arguments. 10835 bool ArgChanged = false; 10836 SmallVector<Expr*, 8> Args; 10837 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10838 &ArgChanged)) 10839 return ExprError(); 10840 10841 if (!getDerived().AlwaysRebuild() && 10842 Callee.get() == E->getCallee() && 10843 !ArgChanged) 10844 return SemaRef.MaybeBindToTemporary(E); 10845 10846 // FIXME: Wrong source location information for the '('. 10847 SourceLocation FakeLParenLoc 10848 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10849 10850 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10851 if (E->hasStoredFPFeatures()) { 10852 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10853 getSema().CurFPFeatures = 10854 NewOverrides.applyOverrides(getSema().getLangOpts()); 10855 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10856 } 10857 10858 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10859 Args, 10860 E->getRParenLoc()); 10861 } 10862 10863 template<typename Derived> 10864 ExprResult 10865 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10866 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10867 if (Base.isInvalid()) 10868 return ExprError(); 10869 10870 NestedNameSpecifierLoc QualifierLoc; 10871 if (E->hasQualifier()) { 10872 QualifierLoc 10873 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10874 10875 if (!QualifierLoc) 10876 return ExprError(); 10877 } 10878 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10879 10880 ValueDecl *Member 10881 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10882 E->getMemberDecl())); 10883 if (!Member) 10884 return ExprError(); 10885 10886 NamedDecl *FoundDecl = E->getFoundDecl(); 10887 if (FoundDecl == E->getMemberDecl()) { 10888 FoundDecl = Member; 10889 } else { 10890 FoundDecl = cast_or_null<NamedDecl>( 10891 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10892 if (!FoundDecl) 10893 return ExprError(); 10894 } 10895 10896 if (!getDerived().AlwaysRebuild() && 10897 Base.get() == E->getBase() && 10898 QualifierLoc == E->getQualifierLoc() && 10899 Member == E->getMemberDecl() && 10900 FoundDecl == E->getFoundDecl() && 10901 !E->hasExplicitTemplateArgs()) { 10902 10903 // Mark it referenced in the new context regardless. 10904 // FIXME: this is a bit instantiation-specific. 10905 SemaRef.MarkMemberReferenced(E); 10906 10907 return E; 10908 } 10909 10910 TemplateArgumentListInfo TransArgs; 10911 if (E->hasExplicitTemplateArgs()) { 10912 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10913 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10914 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10915 E->getNumTemplateArgs(), 10916 TransArgs)) 10917 return ExprError(); 10918 } 10919 10920 // FIXME: Bogus source location for the operator 10921 SourceLocation FakeOperatorLoc = 10922 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10923 10924 // FIXME: to do this check properly, we will need to preserve the 10925 // first-qualifier-in-scope here, just in case we had a dependent 10926 // base (and therefore couldn't do the check) and a 10927 // nested-name-qualifier (and therefore could do the lookup). 10928 NamedDecl *FirstQualifierInScope = nullptr; 10929 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10930 if (MemberNameInfo.getName()) { 10931 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10932 if (!MemberNameInfo.getName()) 10933 return ExprError(); 10934 } 10935 10936 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10937 E->isArrow(), 10938 QualifierLoc, 10939 TemplateKWLoc, 10940 MemberNameInfo, 10941 Member, 10942 FoundDecl, 10943 (E->hasExplicitTemplateArgs() 10944 ? &TransArgs : nullptr), 10945 FirstQualifierInScope); 10946 } 10947 10948 template<typename Derived> 10949 ExprResult 10950 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10951 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10952 if (LHS.isInvalid()) 10953 return ExprError(); 10954 10955 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10956 if (RHS.isInvalid()) 10957 return ExprError(); 10958 10959 if (!getDerived().AlwaysRebuild() && 10960 LHS.get() == E->getLHS() && 10961 RHS.get() == E->getRHS()) 10962 return E; 10963 10964 if (E->isCompoundAssignmentOp()) 10965 // FPFeatures has already been established from trailing storage 10966 return getDerived().RebuildBinaryOperator( 10967 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10968 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10969 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10970 getSema().CurFPFeatures = 10971 NewOverrides.applyOverrides(getSema().getLangOpts()); 10972 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10973 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10974 LHS.get(), RHS.get()); 10975 } 10976 10977 template <typename Derived> 10978 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10979 CXXRewrittenBinaryOperator *E) { 10980 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10981 10982 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10983 if (LHS.isInvalid()) 10984 return ExprError(); 10985 10986 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10987 if (RHS.isInvalid()) 10988 return ExprError(); 10989 10990 if (!getDerived().AlwaysRebuild() && 10991 LHS.get() == Decomp.LHS && 10992 RHS.get() == Decomp.RHS) 10993 return E; 10994 10995 // Extract the already-resolved callee declarations so that we can restrict 10996 // ourselves to using them as the unqualified lookup results when rebuilding. 10997 UnresolvedSet<2> UnqualLookups; 10998 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10999 const_cast<Expr *>(Decomp.InnerBinOp)}; 11000 for (Expr *PossibleBinOp : PossibleBinOps) { 11001 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11002 if (!Op) 11003 continue; 11004 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11005 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11006 continue; 11007 11008 // Transform the callee in case we built a call to a local extern 11009 // declaration. 11010 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11011 E->getOperatorLoc(), Callee->getFoundDecl())); 11012 if (!Found) 11013 return ExprError(); 11014 UnqualLookups.addDecl(Found); 11015 } 11016 11017 return getDerived().RebuildCXXRewrittenBinaryOperator( 11018 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11019 } 11020 11021 template<typename Derived> 11022 ExprResult 11023 TreeTransform<Derived>::TransformCompoundAssignOperator( 11024 CompoundAssignOperator *E) { 11025 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11026 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11027 getSema().CurFPFeatures = 11028 NewOverrides.applyOverrides(getSema().getLangOpts()); 11029 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11030 return getDerived().TransformBinaryOperator(E); 11031 } 11032 11033 template<typename Derived> 11034 ExprResult TreeTransform<Derived>:: 11035 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11036 // Just rebuild the common and RHS expressions and see whether we 11037 // get any changes. 11038 11039 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11040 if (commonExpr.isInvalid()) 11041 return ExprError(); 11042 11043 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11044 if (rhs.isInvalid()) 11045 return ExprError(); 11046 11047 if (!getDerived().AlwaysRebuild() && 11048 commonExpr.get() == e->getCommon() && 11049 rhs.get() == e->getFalseExpr()) 11050 return e; 11051 11052 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11053 e->getQuestionLoc(), 11054 nullptr, 11055 e->getColonLoc(), 11056 rhs.get()); 11057 } 11058 11059 template<typename Derived> 11060 ExprResult 11061 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11062 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11063 if (Cond.isInvalid()) 11064 return ExprError(); 11065 11066 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11067 if (LHS.isInvalid()) 11068 return ExprError(); 11069 11070 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11071 if (RHS.isInvalid()) 11072 return ExprError(); 11073 11074 if (!getDerived().AlwaysRebuild() && 11075 Cond.get() == E->getCond() && 11076 LHS.get() == E->getLHS() && 11077 RHS.get() == E->getRHS()) 11078 return E; 11079 11080 return getDerived().RebuildConditionalOperator(Cond.get(), 11081 E->getQuestionLoc(), 11082 LHS.get(), 11083 E->getColonLoc(), 11084 RHS.get()); 11085 } 11086 11087 template<typename Derived> 11088 ExprResult 11089 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11090 // Implicit casts are eliminated during transformation, since they 11091 // will be recomputed by semantic analysis after transformation. 11092 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11093 } 11094 11095 template<typename Derived> 11096 ExprResult 11097 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11098 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11099 if (!Type) 11100 return ExprError(); 11101 11102 ExprResult SubExpr 11103 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11104 if (SubExpr.isInvalid()) 11105 return ExprError(); 11106 11107 if (!getDerived().AlwaysRebuild() && 11108 Type == E->getTypeInfoAsWritten() && 11109 SubExpr.get() == E->getSubExpr()) 11110 return E; 11111 11112 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11113 Type, 11114 E->getRParenLoc(), 11115 SubExpr.get()); 11116 } 11117 11118 template<typename Derived> 11119 ExprResult 11120 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11121 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11122 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11123 if (!NewT) 11124 return ExprError(); 11125 11126 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11127 if (Init.isInvalid()) 11128 return ExprError(); 11129 11130 if (!getDerived().AlwaysRebuild() && 11131 OldT == NewT && 11132 Init.get() == E->getInitializer()) 11133 return SemaRef.MaybeBindToTemporary(E); 11134 11135 // Note: the expression type doesn't necessarily match the 11136 // type-as-written, but that's okay, because it should always be 11137 // derivable from the initializer. 11138 11139 return getDerived().RebuildCompoundLiteralExpr( 11140 E->getLParenLoc(), NewT, 11141 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11142 } 11143 11144 template<typename Derived> 11145 ExprResult 11146 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11147 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11148 if (Base.isInvalid()) 11149 return ExprError(); 11150 11151 if (!getDerived().AlwaysRebuild() && 11152 Base.get() == E->getBase()) 11153 return E; 11154 11155 // FIXME: Bad source location 11156 SourceLocation FakeOperatorLoc = 11157 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11158 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11159 E->getAccessorLoc(), 11160 E->getAccessor()); 11161 } 11162 11163 template<typename Derived> 11164 ExprResult 11165 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11166 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11167 E = Syntactic; 11168 11169 bool InitChanged = false; 11170 11171 EnterExpressionEvaluationContext Context( 11172 getSema(), EnterExpressionEvaluationContext::InitList); 11173 11174 SmallVector<Expr*, 4> Inits; 11175 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11176 Inits, &InitChanged)) 11177 return ExprError(); 11178 11179 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11180 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11181 // in some cases. We can't reuse it in general, because the syntactic and 11182 // semantic forms are linked, and we can't know that semantic form will 11183 // match even if the syntactic form does. 11184 } 11185 11186 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11187 E->getRBraceLoc()); 11188 } 11189 11190 template<typename Derived> 11191 ExprResult 11192 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11193 Designation Desig; 11194 11195 // transform the initializer value 11196 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11197 if (Init.isInvalid()) 11198 return ExprError(); 11199 11200 // transform the designators. 11201 SmallVector<Expr*, 4> ArrayExprs; 11202 bool ExprChanged = false; 11203 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11204 if (D.isFieldDesignator()) { 11205 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11206 D.getDotLoc(), 11207 D.getFieldLoc())); 11208 if (D.getField()) { 11209 FieldDecl *Field = cast_or_null<FieldDecl>( 11210 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11211 if (Field != D.getField()) 11212 // Rebuild the expression when the transformed FieldDecl is 11213 // different to the already assigned FieldDecl. 11214 ExprChanged = true; 11215 } else { 11216 // Ensure that the designator expression is rebuilt when there isn't 11217 // a resolved FieldDecl in the designator as we don't want to assign 11218 // a FieldDecl to a pattern designator that will be instantiated again. 11219 ExprChanged = true; 11220 } 11221 continue; 11222 } 11223 11224 if (D.isArrayDesignator()) { 11225 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11226 if (Index.isInvalid()) 11227 return ExprError(); 11228 11229 Desig.AddDesignator( 11230 Designator::getArray(Index.get(), D.getLBracketLoc())); 11231 11232 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11233 ArrayExprs.push_back(Index.get()); 11234 continue; 11235 } 11236 11237 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11238 ExprResult Start 11239 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11240 if (Start.isInvalid()) 11241 return ExprError(); 11242 11243 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11244 if (End.isInvalid()) 11245 return ExprError(); 11246 11247 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11248 End.get(), 11249 D.getLBracketLoc(), 11250 D.getEllipsisLoc())); 11251 11252 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11253 End.get() != E->getArrayRangeEnd(D); 11254 11255 ArrayExprs.push_back(Start.get()); 11256 ArrayExprs.push_back(End.get()); 11257 } 11258 11259 if (!getDerived().AlwaysRebuild() && 11260 Init.get() == E->getInit() && 11261 !ExprChanged) 11262 return E; 11263 11264 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11265 E->getEqualOrColonLoc(), 11266 E->usesGNUSyntax(), Init.get()); 11267 } 11268 11269 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11270 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11271 template<typename Derived> 11272 ExprResult 11273 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11274 DesignatedInitUpdateExpr *E) { 11275 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11276 "initializer"); 11277 return ExprError(); 11278 } 11279 11280 template<typename Derived> 11281 ExprResult 11282 TreeTransform<Derived>::TransformNoInitExpr( 11283 NoInitExpr *E) { 11284 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11285 return ExprError(); 11286 } 11287 11288 template<typename Derived> 11289 ExprResult 11290 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11291 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11292 return ExprError(); 11293 } 11294 11295 template<typename Derived> 11296 ExprResult 11297 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11298 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11299 return ExprError(); 11300 } 11301 11302 template<typename Derived> 11303 ExprResult 11304 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11305 ImplicitValueInitExpr *E) { 11306 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11307 11308 // FIXME: Will we ever have proper type location here? Will we actually 11309 // need to transform the type? 11310 QualType T = getDerived().TransformType(E->getType()); 11311 if (T.isNull()) 11312 return ExprError(); 11313 11314 if (!getDerived().AlwaysRebuild() && 11315 T == E->getType()) 11316 return E; 11317 11318 return getDerived().RebuildImplicitValueInitExpr(T); 11319 } 11320 11321 template<typename Derived> 11322 ExprResult 11323 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11324 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11325 if (!TInfo) 11326 return ExprError(); 11327 11328 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11329 if (SubExpr.isInvalid()) 11330 return ExprError(); 11331 11332 if (!getDerived().AlwaysRebuild() && 11333 TInfo == E->getWrittenTypeInfo() && 11334 SubExpr.get() == E->getSubExpr()) 11335 return E; 11336 11337 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11338 TInfo, E->getRParenLoc()); 11339 } 11340 11341 template<typename Derived> 11342 ExprResult 11343 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11344 bool ArgumentChanged = false; 11345 SmallVector<Expr*, 4> Inits; 11346 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11347 &ArgumentChanged)) 11348 return ExprError(); 11349 11350 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11351 Inits, 11352 E->getRParenLoc()); 11353 } 11354 11355 /// Transform an address-of-label expression. 11356 /// 11357 /// By default, the transformation of an address-of-label expression always 11358 /// rebuilds the expression, so that the label identifier can be resolved to 11359 /// the corresponding label statement by semantic analysis. 11360 template<typename Derived> 11361 ExprResult 11362 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11363 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11364 E->getLabel()); 11365 if (!LD) 11366 return ExprError(); 11367 11368 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11369 cast<LabelDecl>(LD)); 11370 } 11371 11372 template<typename Derived> 11373 ExprResult 11374 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11375 SemaRef.ActOnStartStmtExpr(); 11376 StmtResult SubStmt 11377 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11378 if (SubStmt.isInvalid()) { 11379 SemaRef.ActOnStmtExprError(); 11380 return ExprError(); 11381 } 11382 11383 unsigned OldDepth = E->getTemplateDepth(); 11384 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11385 11386 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11387 SubStmt.get() == E->getSubStmt()) { 11388 // Calling this an 'error' is unintuitive, but it does the right thing. 11389 SemaRef.ActOnStmtExprError(); 11390 return SemaRef.MaybeBindToTemporary(E); 11391 } 11392 11393 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11394 E->getRParenLoc(), NewDepth); 11395 } 11396 11397 template<typename Derived> 11398 ExprResult 11399 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11400 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11401 if (Cond.isInvalid()) 11402 return ExprError(); 11403 11404 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11405 if (LHS.isInvalid()) 11406 return ExprError(); 11407 11408 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11409 if (RHS.isInvalid()) 11410 return ExprError(); 11411 11412 if (!getDerived().AlwaysRebuild() && 11413 Cond.get() == E->getCond() && 11414 LHS.get() == E->getLHS() && 11415 RHS.get() == E->getRHS()) 11416 return E; 11417 11418 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11419 Cond.get(), LHS.get(), RHS.get(), 11420 E->getRParenLoc()); 11421 } 11422 11423 template<typename Derived> 11424 ExprResult 11425 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11426 return E; 11427 } 11428 11429 template<typename Derived> 11430 ExprResult 11431 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11432 switch (E->getOperator()) { 11433 case OO_New: 11434 case OO_Delete: 11435 case OO_Array_New: 11436 case OO_Array_Delete: 11437 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11438 11439 case OO_Call: { 11440 // This is a call to an object's operator(). 11441 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11442 11443 // Transform the object itself. 11444 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11445 if (Object.isInvalid()) 11446 return ExprError(); 11447 11448 // FIXME: Poor location information 11449 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11450 static_cast<Expr *>(Object.get())->getEndLoc()); 11451 11452 // Transform the call arguments. 11453 SmallVector<Expr*, 8> Args; 11454 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11455 Args)) 11456 return ExprError(); 11457 11458 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11459 E->getEndLoc()); 11460 } 11461 11462 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11463 case OO_##Name: 11464 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11465 #include "clang/Basic/OperatorKinds.def" 11466 case OO_Subscript: 11467 // Handled below. 11468 break; 11469 11470 case OO_Conditional: 11471 llvm_unreachable("conditional operator is not actually overloadable"); 11472 11473 case OO_None: 11474 case NUM_OVERLOADED_OPERATORS: 11475 llvm_unreachable("not an overloaded operator?"); 11476 } 11477 11478 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11479 if (Callee.isInvalid()) 11480 return ExprError(); 11481 11482 ExprResult First; 11483 if (E->getOperator() == OO_Amp) 11484 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11485 else 11486 First = getDerived().TransformExpr(E->getArg(0)); 11487 if (First.isInvalid()) 11488 return ExprError(); 11489 11490 ExprResult Second; 11491 if (E->getNumArgs() == 2) { 11492 Second = getDerived().TransformExpr(E->getArg(1)); 11493 if (Second.isInvalid()) 11494 return ExprError(); 11495 } 11496 11497 if (!getDerived().AlwaysRebuild() && 11498 Callee.get() == E->getCallee() && 11499 First.get() == E->getArg(0) && 11500 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11501 return SemaRef.MaybeBindToTemporary(E); 11502 11503 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11504 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11505 getSema().CurFPFeatures = 11506 NewOverrides.applyOverrides(getSema().getLangOpts()); 11507 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11508 11509 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11510 E->getOperatorLoc(), 11511 Callee.get(), 11512 First.get(), 11513 Second.get()); 11514 } 11515 11516 template<typename Derived> 11517 ExprResult 11518 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11519 return getDerived().TransformCallExpr(E); 11520 } 11521 11522 template <typename Derived> 11523 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11524 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11525 getSema().CurContext != E->getParentContext(); 11526 11527 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11528 return E; 11529 11530 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11531 E->getEndLoc(), 11532 getSema().CurContext); 11533 } 11534 11535 template<typename Derived> 11536 ExprResult 11537 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11538 // Transform the callee. 11539 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11540 if (Callee.isInvalid()) 11541 return ExprError(); 11542 11543 // Transform exec config. 11544 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11545 if (EC.isInvalid()) 11546 return ExprError(); 11547 11548 // Transform arguments. 11549 bool ArgChanged = false; 11550 SmallVector<Expr*, 8> Args; 11551 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11552 &ArgChanged)) 11553 return ExprError(); 11554 11555 if (!getDerived().AlwaysRebuild() && 11556 Callee.get() == E->getCallee() && 11557 !ArgChanged) 11558 return SemaRef.MaybeBindToTemporary(E); 11559 11560 // FIXME: Wrong source location information for the '('. 11561 SourceLocation FakeLParenLoc 11562 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11563 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11564 Args, 11565 E->getRParenLoc(), EC.get()); 11566 } 11567 11568 template<typename Derived> 11569 ExprResult 11570 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11571 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11572 if (!Type) 11573 return ExprError(); 11574 11575 ExprResult SubExpr 11576 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11577 if (SubExpr.isInvalid()) 11578 return ExprError(); 11579 11580 if (!getDerived().AlwaysRebuild() && 11581 Type == E->getTypeInfoAsWritten() && 11582 SubExpr.get() == E->getSubExpr()) 11583 return E; 11584 return getDerived().RebuildCXXNamedCastExpr( 11585 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11586 Type, E->getAngleBrackets().getEnd(), 11587 // FIXME. this should be '(' location 11588 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11589 } 11590 11591 template<typename Derived> 11592 ExprResult 11593 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11594 TypeSourceInfo *TSI = 11595 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11596 if (!TSI) 11597 return ExprError(); 11598 11599 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11600 if (Sub.isInvalid()) 11601 return ExprError(); 11602 11603 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11604 Sub.get(), BCE->getEndLoc()); 11605 } 11606 11607 template<typename Derived> 11608 ExprResult 11609 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11610 return getDerived().TransformCXXNamedCastExpr(E); 11611 } 11612 11613 template<typename Derived> 11614 ExprResult 11615 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11616 return getDerived().TransformCXXNamedCastExpr(E); 11617 } 11618 11619 template<typename Derived> 11620 ExprResult 11621 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11622 CXXReinterpretCastExpr *E) { 11623 return getDerived().TransformCXXNamedCastExpr(E); 11624 } 11625 11626 template<typename Derived> 11627 ExprResult 11628 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11629 return getDerived().TransformCXXNamedCastExpr(E); 11630 } 11631 11632 template<typename Derived> 11633 ExprResult 11634 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11635 return getDerived().TransformCXXNamedCastExpr(E); 11636 } 11637 11638 template<typename Derived> 11639 ExprResult 11640 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11641 CXXFunctionalCastExpr *E) { 11642 TypeSourceInfo *Type = 11643 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11644 if (!Type) 11645 return ExprError(); 11646 11647 ExprResult SubExpr 11648 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11649 if (SubExpr.isInvalid()) 11650 return ExprError(); 11651 11652 if (!getDerived().AlwaysRebuild() && 11653 Type == E->getTypeInfoAsWritten() && 11654 SubExpr.get() == E->getSubExpr()) 11655 return E; 11656 11657 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11658 E->getLParenLoc(), 11659 SubExpr.get(), 11660 E->getRParenLoc(), 11661 E->isListInitialization()); 11662 } 11663 11664 template<typename Derived> 11665 ExprResult 11666 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11667 if (E->isTypeOperand()) { 11668 TypeSourceInfo *TInfo 11669 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11670 if (!TInfo) 11671 return ExprError(); 11672 11673 if (!getDerived().AlwaysRebuild() && 11674 TInfo == E->getTypeOperandSourceInfo()) 11675 return E; 11676 11677 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11678 TInfo, E->getEndLoc()); 11679 } 11680 11681 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11682 // type. We must not unilaterally enter unevaluated context here, as then 11683 // semantic processing can re-transform an already transformed operand. 11684 Expr *Op = E->getExprOperand(); 11685 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11686 if (E->isGLValue()) 11687 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11688 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11689 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11690 11691 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11692 Sema::ReuseLambdaContextDecl); 11693 11694 ExprResult SubExpr = getDerived().TransformExpr(Op); 11695 if (SubExpr.isInvalid()) 11696 return ExprError(); 11697 11698 if (!getDerived().AlwaysRebuild() && 11699 SubExpr.get() == E->getExprOperand()) 11700 return E; 11701 11702 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11703 SubExpr.get(), E->getEndLoc()); 11704 } 11705 11706 template<typename Derived> 11707 ExprResult 11708 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11709 if (E->isTypeOperand()) { 11710 TypeSourceInfo *TInfo 11711 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11712 if (!TInfo) 11713 return ExprError(); 11714 11715 if (!getDerived().AlwaysRebuild() && 11716 TInfo == E->getTypeOperandSourceInfo()) 11717 return E; 11718 11719 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11720 TInfo, E->getEndLoc()); 11721 } 11722 11723 EnterExpressionEvaluationContext Unevaluated( 11724 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11725 11726 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11727 if (SubExpr.isInvalid()) 11728 return ExprError(); 11729 11730 if (!getDerived().AlwaysRebuild() && 11731 SubExpr.get() == E->getExprOperand()) 11732 return E; 11733 11734 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11735 SubExpr.get(), E->getEndLoc()); 11736 } 11737 11738 template<typename Derived> 11739 ExprResult 11740 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11741 return E; 11742 } 11743 11744 template<typename Derived> 11745 ExprResult 11746 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11747 CXXNullPtrLiteralExpr *E) { 11748 return E; 11749 } 11750 11751 template<typename Derived> 11752 ExprResult 11753 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11754 QualType T = getSema().getCurrentThisType(); 11755 11756 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11757 // Mark it referenced in the new context regardless. 11758 // FIXME: this is a bit instantiation-specific. 11759 getSema().MarkThisReferenced(E); 11760 return E; 11761 } 11762 11763 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11764 } 11765 11766 template<typename Derived> 11767 ExprResult 11768 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11769 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11770 if (SubExpr.isInvalid()) 11771 return ExprError(); 11772 11773 if (!getDerived().AlwaysRebuild() && 11774 SubExpr.get() == E->getSubExpr()) 11775 return E; 11776 11777 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11778 E->isThrownVariableInScope()); 11779 } 11780 11781 template<typename Derived> 11782 ExprResult 11783 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11784 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11785 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11786 if (!Param) 11787 return ExprError(); 11788 11789 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11790 E->getUsedContext() == SemaRef.CurContext) 11791 return E; 11792 11793 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11794 } 11795 11796 template<typename Derived> 11797 ExprResult 11798 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11799 FieldDecl *Field = cast_or_null<FieldDecl>( 11800 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11801 if (!Field) 11802 return ExprError(); 11803 11804 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11805 E->getUsedContext() == SemaRef.CurContext) 11806 return E; 11807 11808 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11809 } 11810 11811 template<typename Derived> 11812 ExprResult 11813 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11814 CXXScalarValueInitExpr *E) { 11815 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11816 if (!T) 11817 return ExprError(); 11818 11819 if (!getDerived().AlwaysRebuild() && 11820 T == E->getTypeSourceInfo()) 11821 return E; 11822 11823 return getDerived().RebuildCXXScalarValueInitExpr(T, 11824 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11825 E->getRParenLoc()); 11826 } 11827 11828 template<typename Derived> 11829 ExprResult 11830 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11831 // Transform the type that we're allocating 11832 TypeSourceInfo *AllocTypeInfo = 11833 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11834 if (!AllocTypeInfo) 11835 return ExprError(); 11836 11837 // Transform the size of the array we're allocating (if any). 11838 Optional<Expr *> ArraySize; 11839 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11840 ExprResult NewArraySize; 11841 if (*OldArraySize) { 11842 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11843 if (NewArraySize.isInvalid()) 11844 return ExprError(); 11845 } 11846 ArraySize = NewArraySize.get(); 11847 } 11848 11849 // Transform the placement arguments (if any). 11850 bool ArgumentChanged = false; 11851 SmallVector<Expr*, 8> PlacementArgs; 11852 if (getDerived().TransformExprs(E->getPlacementArgs(), 11853 E->getNumPlacementArgs(), true, 11854 PlacementArgs, &ArgumentChanged)) 11855 return ExprError(); 11856 11857 // Transform the initializer (if any). 11858 Expr *OldInit = E->getInitializer(); 11859 ExprResult NewInit; 11860 if (OldInit) 11861 NewInit = getDerived().TransformInitializer(OldInit, true); 11862 if (NewInit.isInvalid()) 11863 return ExprError(); 11864 11865 // Transform new operator and delete operator. 11866 FunctionDecl *OperatorNew = nullptr; 11867 if (E->getOperatorNew()) { 11868 OperatorNew = cast_or_null<FunctionDecl>( 11869 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11870 if (!OperatorNew) 11871 return ExprError(); 11872 } 11873 11874 FunctionDecl *OperatorDelete = nullptr; 11875 if (E->getOperatorDelete()) { 11876 OperatorDelete = cast_or_null<FunctionDecl>( 11877 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11878 if (!OperatorDelete) 11879 return ExprError(); 11880 } 11881 11882 if (!getDerived().AlwaysRebuild() && 11883 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11884 ArraySize == E->getArraySize() && 11885 NewInit.get() == OldInit && 11886 OperatorNew == E->getOperatorNew() && 11887 OperatorDelete == E->getOperatorDelete() && 11888 !ArgumentChanged) { 11889 // Mark any declarations we need as referenced. 11890 // FIXME: instantiation-specific. 11891 if (OperatorNew) 11892 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11893 if (OperatorDelete) 11894 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11895 11896 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11897 QualType ElementType 11898 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11899 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11900 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11901 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11902 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11903 } 11904 } 11905 } 11906 11907 return E; 11908 } 11909 11910 QualType AllocType = AllocTypeInfo->getType(); 11911 if (!ArraySize) { 11912 // If no array size was specified, but the new expression was 11913 // instantiated with an array type (e.g., "new T" where T is 11914 // instantiated with "int[4]"), extract the outer bound from the 11915 // array type as our array size. We do this with constant and 11916 // dependently-sized array types. 11917 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11918 if (!ArrayT) { 11919 // Do nothing 11920 } else if (const ConstantArrayType *ConsArrayT 11921 = dyn_cast<ConstantArrayType>(ArrayT)) { 11922 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11923 SemaRef.Context.getSizeType(), 11924 /*FIXME:*/ E->getBeginLoc()); 11925 AllocType = ConsArrayT->getElementType(); 11926 } else if (const DependentSizedArrayType *DepArrayT 11927 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11928 if (DepArrayT->getSizeExpr()) { 11929 ArraySize = DepArrayT->getSizeExpr(); 11930 AllocType = DepArrayT->getElementType(); 11931 } 11932 } 11933 } 11934 11935 return getDerived().RebuildCXXNewExpr( 11936 E->getBeginLoc(), E->isGlobalNew(), 11937 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11938 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11939 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11940 } 11941 11942 template<typename Derived> 11943 ExprResult 11944 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11945 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11946 if (Operand.isInvalid()) 11947 return ExprError(); 11948 11949 // Transform the delete operator, if known. 11950 FunctionDecl *OperatorDelete = nullptr; 11951 if (E->getOperatorDelete()) { 11952 OperatorDelete = cast_or_null<FunctionDecl>( 11953 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11954 if (!OperatorDelete) 11955 return ExprError(); 11956 } 11957 11958 if (!getDerived().AlwaysRebuild() && 11959 Operand.get() == E->getArgument() && 11960 OperatorDelete == E->getOperatorDelete()) { 11961 // Mark any declarations we need as referenced. 11962 // FIXME: instantiation-specific. 11963 if (OperatorDelete) 11964 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11965 11966 if (!E->getArgument()->isTypeDependent()) { 11967 QualType Destroyed = SemaRef.Context.getBaseElementType( 11968 E->getDestroyedType()); 11969 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11970 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11971 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11972 SemaRef.LookupDestructor(Record)); 11973 } 11974 } 11975 11976 return E; 11977 } 11978 11979 return getDerived().RebuildCXXDeleteExpr( 11980 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11981 } 11982 11983 template<typename Derived> 11984 ExprResult 11985 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11986 CXXPseudoDestructorExpr *E) { 11987 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11988 if (Base.isInvalid()) 11989 return ExprError(); 11990 11991 ParsedType ObjectTypePtr; 11992 bool MayBePseudoDestructor = false; 11993 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11994 E->getOperatorLoc(), 11995 E->isArrow()? tok::arrow : tok::period, 11996 ObjectTypePtr, 11997 MayBePseudoDestructor); 11998 if (Base.isInvalid()) 11999 return ExprError(); 12000 12001 QualType ObjectType = ObjectTypePtr.get(); 12002 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12003 if (QualifierLoc) { 12004 QualifierLoc 12005 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12006 if (!QualifierLoc) 12007 return ExprError(); 12008 } 12009 CXXScopeSpec SS; 12010 SS.Adopt(QualifierLoc); 12011 12012 PseudoDestructorTypeStorage Destroyed; 12013 if (E->getDestroyedTypeInfo()) { 12014 TypeSourceInfo *DestroyedTypeInfo 12015 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12016 ObjectType, nullptr, SS); 12017 if (!DestroyedTypeInfo) 12018 return ExprError(); 12019 Destroyed = DestroyedTypeInfo; 12020 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12021 // We aren't likely to be able to resolve the identifier down to a type 12022 // now anyway, so just retain the identifier. 12023 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12024 E->getDestroyedTypeLoc()); 12025 } else { 12026 // Look for a destructor known with the given name. 12027 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12028 *E->getDestroyedTypeIdentifier(), 12029 E->getDestroyedTypeLoc(), 12030 /*Scope=*/nullptr, 12031 SS, ObjectTypePtr, 12032 false); 12033 if (!T) 12034 return ExprError(); 12035 12036 Destroyed 12037 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12038 E->getDestroyedTypeLoc()); 12039 } 12040 12041 TypeSourceInfo *ScopeTypeInfo = nullptr; 12042 if (E->getScopeTypeInfo()) { 12043 CXXScopeSpec EmptySS; 12044 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12045 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12046 if (!ScopeTypeInfo) 12047 return ExprError(); 12048 } 12049 12050 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12051 E->getOperatorLoc(), 12052 E->isArrow(), 12053 SS, 12054 ScopeTypeInfo, 12055 E->getColonColonLoc(), 12056 E->getTildeLoc(), 12057 Destroyed); 12058 } 12059 12060 template <typename Derived> 12061 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12062 bool RequiresADL, 12063 LookupResult &R) { 12064 // Transform all the decls. 12065 bool AllEmptyPacks = true; 12066 for (auto *OldD : Old->decls()) { 12067 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12068 if (!InstD) { 12069 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12070 // This can happen because of dependent hiding. 12071 if (isa<UsingShadowDecl>(OldD)) 12072 continue; 12073 else { 12074 R.clear(); 12075 return true; 12076 } 12077 } 12078 12079 // Expand using pack declarations. 12080 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12081 ArrayRef<NamedDecl*> Decls = SingleDecl; 12082 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12083 Decls = UPD->expansions(); 12084 12085 // Expand using declarations. 12086 for (auto *D : Decls) { 12087 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12088 for (auto *SD : UD->shadows()) 12089 R.addDecl(SD); 12090 } else { 12091 R.addDecl(D); 12092 } 12093 } 12094 12095 AllEmptyPacks &= Decls.empty(); 12096 }; 12097 12098 // C++ [temp.res]/8.4.2: 12099 // The program is ill-formed, no diagnostic required, if [...] lookup for 12100 // a name in the template definition found a using-declaration, but the 12101 // lookup in the corresponding scope in the instantiation odoes not find 12102 // any declarations because the using-declaration was a pack expansion and 12103 // the corresponding pack is empty 12104 if (AllEmptyPacks && !RequiresADL) { 12105 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12106 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12107 return true; 12108 } 12109 12110 // Resolve a kind, but don't do any further analysis. If it's 12111 // ambiguous, the callee needs to deal with it. 12112 R.resolveKind(); 12113 return false; 12114 } 12115 12116 template<typename Derived> 12117 ExprResult 12118 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12119 UnresolvedLookupExpr *Old) { 12120 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12121 Sema::LookupOrdinaryName); 12122 12123 // Transform the declaration set. 12124 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12125 return ExprError(); 12126 12127 // Rebuild the nested-name qualifier, if present. 12128 CXXScopeSpec SS; 12129 if (Old->getQualifierLoc()) { 12130 NestedNameSpecifierLoc QualifierLoc 12131 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12132 if (!QualifierLoc) 12133 return ExprError(); 12134 12135 SS.Adopt(QualifierLoc); 12136 } 12137 12138 if (Old->getNamingClass()) { 12139 CXXRecordDecl *NamingClass 12140 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12141 Old->getNameLoc(), 12142 Old->getNamingClass())); 12143 if (!NamingClass) { 12144 R.clear(); 12145 return ExprError(); 12146 } 12147 12148 R.setNamingClass(NamingClass); 12149 } 12150 12151 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12152 12153 // If we have neither explicit template arguments, nor the template keyword, 12154 // it's a normal declaration name or member reference. 12155 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12156 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12157 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12158 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12159 // give a good diagnostic. 12160 if (D && D->isCXXInstanceMember()) { 12161 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12162 /*TemplateArgs=*/nullptr, 12163 /*Scope=*/nullptr); 12164 } 12165 12166 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12167 } 12168 12169 // If we have template arguments, rebuild them, then rebuild the 12170 // templateid expression. 12171 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12172 if (Old->hasExplicitTemplateArgs() && 12173 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12174 Old->getNumTemplateArgs(), 12175 TransArgs)) { 12176 R.clear(); 12177 return ExprError(); 12178 } 12179 12180 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12181 Old->requiresADL(), &TransArgs); 12182 } 12183 12184 template<typename Derived> 12185 ExprResult 12186 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12187 bool ArgChanged = false; 12188 SmallVector<TypeSourceInfo *, 4> Args; 12189 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12190 TypeSourceInfo *From = E->getArg(I); 12191 TypeLoc FromTL = From->getTypeLoc(); 12192 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12193 TypeLocBuilder TLB; 12194 TLB.reserve(FromTL.getFullDataSize()); 12195 QualType To = getDerived().TransformType(TLB, FromTL); 12196 if (To.isNull()) 12197 return ExprError(); 12198 12199 if (To == From->getType()) 12200 Args.push_back(From); 12201 else { 12202 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12203 ArgChanged = true; 12204 } 12205 continue; 12206 } 12207 12208 ArgChanged = true; 12209 12210 // We have a pack expansion. Instantiate it. 12211 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12212 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12213 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12214 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12215 12216 // Determine whether the set of unexpanded parameter packs can and should 12217 // be expanded. 12218 bool Expand = true; 12219 bool RetainExpansion = false; 12220 Optional<unsigned> OrigNumExpansions = 12221 ExpansionTL.getTypePtr()->getNumExpansions(); 12222 Optional<unsigned> NumExpansions = OrigNumExpansions; 12223 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12224 PatternTL.getSourceRange(), 12225 Unexpanded, 12226 Expand, RetainExpansion, 12227 NumExpansions)) 12228 return ExprError(); 12229 12230 if (!Expand) { 12231 // The transform has determined that we should perform a simple 12232 // transformation on the pack expansion, producing another pack 12233 // expansion. 12234 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12235 12236 TypeLocBuilder TLB; 12237 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12238 12239 QualType To = getDerived().TransformType(TLB, PatternTL); 12240 if (To.isNull()) 12241 return ExprError(); 12242 12243 To = getDerived().RebuildPackExpansionType(To, 12244 PatternTL.getSourceRange(), 12245 ExpansionTL.getEllipsisLoc(), 12246 NumExpansions); 12247 if (To.isNull()) 12248 return ExprError(); 12249 12250 PackExpansionTypeLoc ToExpansionTL 12251 = TLB.push<PackExpansionTypeLoc>(To); 12252 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12253 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12254 continue; 12255 } 12256 12257 // Expand the pack expansion by substituting for each argument in the 12258 // pack(s). 12259 for (unsigned I = 0; I != *NumExpansions; ++I) { 12260 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12261 TypeLocBuilder TLB; 12262 TLB.reserve(PatternTL.getFullDataSize()); 12263 QualType To = getDerived().TransformType(TLB, PatternTL); 12264 if (To.isNull()) 12265 return ExprError(); 12266 12267 if (To->containsUnexpandedParameterPack()) { 12268 To = getDerived().RebuildPackExpansionType(To, 12269 PatternTL.getSourceRange(), 12270 ExpansionTL.getEllipsisLoc(), 12271 NumExpansions); 12272 if (To.isNull()) 12273 return ExprError(); 12274 12275 PackExpansionTypeLoc ToExpansionTL 12276 = TLB.push<PackExpansionTypeLoc>(To); 12277 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12278 } 12279 12280 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12281 } 12282 12283 if (!RetainExpansion) 12284 continue; 12285 12286 // If we're supposed to retain a pack expansion, do so by temporarily 12287 // forgetting the partially-substituted parameter pack. 12288 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12289 12290 TypeLocBuilder TLB; 12291 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12292 12293 QualType To = getDerived().TransformType(TLB, PatternTL); 12294 if (To.isNull()) 12295 return ExprError(); 12296 12297 To = getDerived().RebuildPackExpansionType(To, 12298 PatternTL.getSourceRange(), 12299 ExpansionTL.getEllipsisLoc(), 12300 NumExpansions); 12301 if (To.isNull()) 12302 return ExprError(); 12303 12304 PackExpansionTypeLoc ToExpansionTL 12305 = TLB.push<PackExpansionTypeLoc>(To); 12306 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12307 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12308 } 12309 12310 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12311 return E; 12312 12313 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12314 E->getEndLoc()); 12315 } 12316 12317 template<typename Derived> 12318 ExprResult 12319 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12320 ConceptSpecializationExpr *E) { 12321 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12322 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12323 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12324 Old->NumTemplateArgs, TransArgs)) 12325 return ExprError(); 12326 12327 return getDerived().RebuildConceptSpecializationExpr( 12328 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12329 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12330 &TransArgs); 12331 } 12332 12333 template<typename Derived> 12334 ExprResult 12335 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12336 SmallVector<ParmVarDecl*, 4> TransParams; 12337 SmallVector<QualType, 4> TransParamTypes; 12338 Sema::ExtParameterInfoBuilder ExtParamInfos; 12339 12340 // C++2a [expr.prim.req]p2 12341 // Expressions appearing within a requirement-body are unevaluated operands. 12342 EnterExpressionEvaluationContext Ctx( 12343 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12344 12345 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12346 getSema().Context, getSema().CurContext, 12347 E->getBody()->getBeginLoc()); 12348 12349 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12350 12351 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12352 E->getLocalParameters(), 12353 /*ParamTypes=*/nullptr, 12354 /*ParamInfos=*/nullptr, 12355 TransParamTypes, &TransParams, 12356 ExtParamInfos)) 12357 return ExprError(); 12358 12359 for (ParmVarDecl *Param : TransParams) 12360 Param->setDeclContext(Body); 12361 12362 SmallVector<concepts::Requirement *, 4> TransReqs; 12363 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12364 TransReqs)) 12365 return ExprError(); 12366 12367 for (concepts::Requirement *Req : TransReqs) { 12368 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12369 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12370 ER->getReturnTypeRequirement() 12371 .getTypeConstraintTemplateParameterList()->getParam(0) 12372 ->setDeclContext(Body); 12373 } 12374 } 12375 } 12376 12377 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12378 TransParams, TransReqs, 12379 E->getRBraceLoc()); 12380 } 12381 12382 template<typename Derived> 12383 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12384 ArrayRef<concepts::Requirement *> Reqs, 12385 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12386 for (concepts::Requirement *Req : Reqs) { 12387 concepts::Requirement *TransReq = nullptr; 12388 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12389 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12390 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12391 TransReq = getDerived().TransformExprRequirement(ExprReq); 12392 else 12393 TransReq = getDerived().TransformNestedRequirement( 12394 cast<concepts::NestedRequirement>(Req)); 12395 if (!TransReq) 12396 return true; 12397 Transformed.push_back(TransReq); 12398 } 12399 return false; 12400 } 12401 12402 template<typename Derived> 12403 concepts::TypeRequirement * 12404 TreeTransform<Derived>::TransformTypeRequirement( 12405 concepts::TypeRequirement *Req) { 12406 if (Req->isSubstitutionFailure()) { 12407 if (getDerived().AlwaysRebuild()) 12408 return getDerived().RebuildTypeRequirement( 12409 Req->getSubstitutionDiagnostic()); 12410 return Req; 12411 } 12412 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12413 if (!TransType) 12414 return nullptr; 12415 return getDerived().RebuildTypeRequirement(TransType); 12416 } 12417 12418 template<typename Derived> 12419 concepts::ExprRequirement * 12420 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12421 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12422 if (Req->isExprSubstitutionFailure()) 12423 TransExpr = Req->getExprSubstitutionDiagnostic(); 12424 else { 12425 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12426 if (TransExprRes.isInvalid()) 12427 return nullptr; 12428 TransExpr = TransExprRes.get(); 12429 } 12430 12431 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12432 const auto &RetReq = Req->getReturnTypeRequirement(); 12433 if (RetReq.isEmpty()) 12434 TransRetReq.emplace(); 12435 else if (RetReq.isSubstitutionFailure()) 12436 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12437 else if (RetReq.isTypeConstraint()) { 12438 TemplateParameterList *OrigTPL = 12439 RetReq.getTypeConstraintTemplateParameterList(); 12440 TemplateParameterList *TPL = 12441 getDerived().TransformTemplateParameterList(OrigTPL); 12442 if (!TPL) 12443 return nullptr; 12444 TransRetReq.emplace(TPL); 12445 } 12446 assert(TransRetReq.hasValue() && 12447 "All code paths leading here must set TransRetReq"); 12448 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12449 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12450 Req->getNoexceptLoc(), 12451 std::move(*TransRetReq)); 12452 return getDerived().RebuildExprRequirement( 12453 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12454 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12455 } 12456 12457 template<typename Derived> 12458 concepts::NestedRequirement * 12459 TreeTransform<Derived>::TransformNestedRequirement( 12460 concepts::NestedRequirement *Req) { 12461 if (Req->isSubstitutionFailure()) { 12462 if (getDerived().AlwaysRebuild()) 12463 return getDerived().RebuildNestedRequirement( 12464 Req->getSubstitutionDiagnostic()); 12465 return Req; 12466 } 12467 ExprResult TransConstraint = 12468 getDerived().TransformExpr(Req->getConstraintExpr()); 12469 if (TransConstraint.isInvalid()) 12470 return nullptr; 12471 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12472 } 12473 12474 template<typename Derived> 12475 ExprResult 12476 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12477 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12478 if (!T) 12479 return ExprError(); 12480 12481 if (!getDerived().AlwaysRebuild() && 12482 T == E->getQueriedTypeSourceInfo()) 12483 return E; 12484 12485 ExprResult SubExpr; 12486 { 12487 EnterExpressionEvaluationContext Unevaluated( 12488 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12489 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12490 if (SubExpr.isInvalid()) 12491 return ExprError(); 12492 12493 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12494 return E; 12495 } 12496 12497 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12498 SubExpr.get(), E->getEndLoc()); 12499 } 12500 12501 template<typename Derived> 12502 ExprResult 12503 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12504 ExprResult SubExpr; 12505 { 12506 EnterExpressionEvaluationContext Unevaluated( 12507 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12508 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12509 if (SubExpr.isInvalid()) 12510 return ExprError(); 12511 12512 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12513 return E; 12514 } 12515 12516 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12517 SubExpr.get(), E->getEndLoc()); 12518 } 12519 12520 template <typename Derived> 12521 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12522 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12523 TypeSourceInfo **RecoveryTSI) { 12524 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12525 DRE, AddrTaken, RecoveryTSI); 12526 12527 // Propagate both errors and recovered types, which return ExprEmpty. 12528 if (!NewDRE.isUsable()) 12529 return NewDRE; 12530 12531 // We got an expr, wrap it up in parens. 12532 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12533 return PE; 12534 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12535 PE->getRParen()); 12536 } 12537 12538 template <typename Derived> 12539 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12540 DependentScopeDeclRefExpr *E) { 12541 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12542 nullptr); 12543 } 12544 12545 template <typename Derived> 12546 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12547 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12548 TypeSourceInfo **RecoveryTSI) { 12549 assert(E->getQualifierLoc()); 12550 NestedNameSpecifierLoc QualifierLoc = 12551 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12552 if (!QualifierLoc) 12553 return ExprError(); 12554 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12555 12556 // TODO: If this is a conversion-function-id, verify that the 12557 // destination type name (if present) resolves the same way after 12558 // instantiation as it did in the local scope. 12559 12560 DeclarationNameInfo NameInfo = 12561 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12562 if (!NameInfo.getName()) 12563 return ExprError(); 12564 12565 if (!E->hasExplicitTemplateArgs()) { 12566 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12567 // Note: it is sufficient to compare the Name component of NameInfo: 12568 // if name has not changed, DNLoc has not changed either. 12569 NameInfo.getName() == E->getDeclName()) 12570 return E; 12571 12572 return getDerived().RebuildDependentScopeDeclRefExpr( 12573 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12574 IsAddressOfOperand, RecoveryTSI); 12575 } 12576 12577 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12578 if (getDerived().TransformTemplateArguments( 12579 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12580 return ExprError(); 12581 12582 return getDerived().RebuildDependentScopeDeclRefExpr( 12583 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12584 RecoveryTSI); 12585 } 12586 12587 template<typename Derived> 12588 ExprResult 12589 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12590 // CXXConstructExprs other than for list-initialization and 12591 // CXXTemporaryObjectExpr are always implicit, so when we have 12592 // a 1-argument construction we just transform that argument. 12593 if (getDerived().AllowSkippingCXXConstructExpr() && 12594 ((E->getNumArgs() == 1 || 12595 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12596 (!getDerived().DropCallArgument(E->getArg(0))) && 12597 !E->isListInitialization())) 12598 return getDerived().TransformInitializer(E->getArg(0), 12599 /*DirectInit*/ false); 12600 12601 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12602 12603 QualType T = getDerived().TransformType(E->getType()); 12604 if (T.isNull()) 12605 return ExprError(); 12606 12607 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12608 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12609 if (!Constructor) 12610 return ExprError(); 12611 12612 bool ArgumentChanged = false; 12613 SmallVector<Expr*, 8> Args; 12614 { 12615 EnterExpressionEvaluationContext Context( 12616 getSema(), EnterExpressionEvaluationContext::InitList, 12617 E->isListInitialization()); 12618 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12619 &ArgumentChanged)) 12620 return ExprError(); 12621 } 12622 12623 if (!getDerived().AlwaysRebuild() && 12624 T == E->getType() && 12625 Constructor == E->getConstructor() && 12626 !ArgumentChanged) { 12627 // Mark the constructor as referenced. 12628 // FIXME: Instantiation-specific 12629 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12630 return E; 12631 } 12632 12633 return getDerived().RebuildCXXConstructExpr( 12634 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12635 E->hadMultipleCandidates(), E->isListInitialization(), 12636 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12637 E->getConstructionKind(), E->getParenOrBraceRange()); 12638 } 12639 12640 template<typename Derived> 12641 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12642 CXXInheritedCtorInitExpr *E) { 12643 QualType T = getDerived().TransformType(E->getType()); 12644 if (T.isNull()) 12645 return ExprError(); 12646 12647 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12648 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12649 if (!Constructor) 12650 return ExprError(); 12651 12652 if (!getDerived().AlwaysRebuild() && 12653 T == E->getType() && 12654 Constructor == E->getConstructor()) { 12655 // Mark the constructor as referenced. 12656 // FIXME: Instantiation-specific 12657 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12658 return E; 12659 } 12660 12661 return getDerived().RebuildCXXInheritedCtorInitExpr( 12662 T, E->getLocation(), Constructor, 12663 E->constructsVBase(), E->inheritedFromVBase()); 12664 } 12665 12666 /// Transform a C++ temporary-binding expression. 12667 /// 12668 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12669 /// transform the subexpression and return that. 12670 template<typename Derived> 12671 ExprResult 12672 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12673 return getDerived().TransformExpr(E->getSubExpr()); 12674 } 12675 12676 /// Transform a C++ expression that contains cleanups that should 12677 /// be run after the expression is evaluated. 12678 /// 12679 /// Since ExprWithCleanups nodes are implicitly generated, we 12680 /// just transform the subexpression and return that. 12681 template<typename Derived> 12682 ExprResult 12683 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12684 return getDerived().TransformExpr(E->getSubExpr()); 12685 } 12686 12687 template<typename Derived> 12688 ExprResult 12689 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12690 CXXTemporaryObjectExpr *E) { 12691 TypeSourceInfo *T = 12692 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12693 if (!T) 12694 return ExprError(); 12695 12696 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12697 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12698 if (!Constructor) 12699 return ExprError(); 12700 12701 bool ArgumentChanged = false; 12702 SmallVector<Expr*, 8> Args; 12703 Args.reserve(E->getNumArgs()); 12704 { 12705 EnterExpressionEvaluationContext Context( 12706 getSema(), EnterExpressionEvaluationContext::InitList, 12707 E->isListInitialization()); 12708 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12709 &ArgumentChanged)) 12710 return ExprError(); 12711 } 12712 12713 if (!getDerived().AlwaysRebuild() && 12714 T == E->getTypeSourceInfo() && 12715 Constructor == E->getConstructor() && 12716 !ArgumentChanged) { 12717 // FIXME: Instantiation-specific 12718 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12719 return SemaRef.MaybeBindToTemporary(E); 12720 } 12721 12722 // FIXME: We should just pass E->isListInitialization(), but we're not 12723 // prepared to handle list-initialization without a child InitListExpr. 12724 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12725 return getDerived().RebuildCXXTemporaryObjectExpr( 12726 T, LParenLoc, Args, E->getEndLoc(), 12727 /*ListInitialization=*/LParenLoc.isInvalid()); 12728 } 12729 12730 template<typename Derived> 12731 ExprResult 12732 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12733 // Transform any init-capture expressions before entering the scope of the 12734 // lambda body, because they are not semantically within that scope. 12735 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12736 struct TransformedInitCapture { 12737 // The location of the ... if the result is retaining a pack expansion. 12738 SourceLocation EllipsisLoc; 12739 // Zero or more expansions of the init-capture. 12740 SmallVector<InitCaptureInfoTy, 4> Expansions; 12741 }; 12742 SmallVector<TransformedInitCapture, 4> InitCaptures; 12743 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12744 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12745 CEnd = E->capture_end(); 12746 C != CEnd; ++C) { 12747 if (!E->isInitCapture(C)) 12748 continue; 12749 12750 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12751 VarDecl *OldVD = C->getCapturedVar(); 12752 12753 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12754 Optional<unsigned> NumExpansions) { 12755 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12756 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12757 12758 if (NewExprInitResult.isInvalid()) { 12759 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12760 return; 12761 } 12762 Expr *NewExprInit = NewExprInitResult.get(); 12763 12764 QualType NewInitCaptureType = 12765 getSema().buildLambdaInitCaptureInitialization( 12766 C->getLocation(), OldVD->getType()->isReferenceType(), 12767 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12768 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12769 NewExprInit); 12770 Result.Expansions.push_back( 12771 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12772 }; 12773 12774 // If this is an init-capture pack, consider expanding the pack now. 12775 if (OldVD->isParameterPack()) { 12776 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12777 ->getTypeLoc() 12778 .castAs<PackExpansionTypeLoc>(); 12779 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12780 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12781 12782 // Determine whether the set of unexpanded parameter packs can and should 12783 // be expanded. 12784 bool Expand = true; 12785 bool RetainExpansion = false; 12786 Optional<unsigned> OrigNumExpansions = 12787 ExpansionTL.getTypePtr()->getNumExpansions(); 12788 Optional<unsigned> NumExpansions = OrigNumExpansions; 12789 if (getDerived().TryExpandParameterPacks( 12790 ExpansionTL.getEllipsisLoc(), 12791 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12792 RetainExpansion, NumExpansions)) 12793 return ExprError(); 12794 if (Expand) { 12795 for (unsigned I = 0; I != *NumExpansions; ++I) { 12796 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12797 SubstInitCapture(SourceLocation(), None); 12798 } 12799 } 12800 if (!Expand || RetainExpansion) { 12801 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12802 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12803 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12804 } 12805 } else { 12806 SubstInitCapture(SourceLocation(), None); 12807 } 12808 } 12809 12810 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12811 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12812 12813 // Transform the template parameters, and add them to the current 12814 // instantiation scope. The null case is handled correctly. 12815 auto TPL = getDerived().TransformTemplateParameterList( 12816 E->getTemplateParameterList()); 12817 LSI->GLTemplateParameterList = TPL; 12818 12819 // Transform the type of the original lambda's call operator. 12820 // The transformation MUST be done in the CurrentInstantiationScope since 12821 // it introduces a mapping of the original to the newly created 12822 // transformed parameters. 12823 TypeSourceInfo *NewCallOpTSI = nullptr; 12824 { 12825 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12826 FunctionProtoTypeLoc OldCallOpFPTL = 12827 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12828 12829 TypeLocBuilder NewCallOpTLBuilder; 12830 SmallVector<QualType, 4> ExceptionStorage; 12831 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12832 QualType NewCallOpType = TransformFunctionProtoType( 12833 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12834 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12835 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12836 ExceptionStorage, Changed); 12837 }); 12838 if (NewCallOpType.isNull()) 12839 return ExprError(); 12840 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12841 NewCallOpType); 12842 } 12843 12844 // Transform the trailing requires clause 12845 ExprResult NewTrailingRequiresClause; 12846 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12847 // FIXME: Concepts: Substitution into requires clause should only happen 12848 // when checking satisfaction. 12849 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12850 12851 // Create the local class that will describe the lambda. 12852 // FIXME: KnownDependent below is wrong when substituting inside a templated 12853 // context that isn't a DeclContext (such as a variable template). 12854 CXXRecordDecl *OldClass = E->getLambdaClass(); 12855 CXXRecordDecl *Class 12856 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12857 NewCallOpTSI, 12858 /*KnownDependent=*/false, 12859 E->getCaptureDefault()); 12860 getDerived().transformedLocalDecl(OldClass, {Class}); 12861 12862 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12863 if (getDerived().ReplacingOriginal()) 12864 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12865 OldClass->getLambdaManglingNumber(), 12866 OldClass->getDeviceLambdaManglingNumber(), 12867 OldClass->getLambdaContextDecl()); 12868 12869 // Build the call operator. 12870 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12871 Class, E->getIntroducerRange(), NewCallOpTSI, 12872 E->getCallOperator()->getEndLoc(), 12873 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12874 E->getCallOperator()->getConstexprKind(), 12875 NewTrailingRequiresClause.get()); 12876 12877 LSI->CallOperator = NewCallOperator; 12878 12879 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12880 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12881 12882 // Number the lambda for linkage purposes if necessary. 12883 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12884 12885 // Introduce the context of the call operator. 12886 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12887 /*NewThisContext*/false); 12888 12889 // Enter the scope of the lambda. 12890 getSema().buildLambdaScope(LSI, NewCallOperator, 12891 E->getIntroducerRange(), 12892 E->getCaptureDefault(), 12893 E->getCaptureDefaultLoc(), 12894 E->hasExplicitParameters(), 12895 E->hasExplicitResultType(), 12896 E->isMutable()); 12897 12898 bool Invalid = false; 12899 12900 // Transform captures. 12901 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12902 CEnd = E->capture_end(); 12903 C != CEnd; ++C) { 12904 // When we hit the first implicit capture, tell Sema that we've finished 12905 // the list of explicit captures. 12906 if (C->isImplicit()) 12907 break; 12908 12909 // Capturing 'this' is trivial. 12910 if (C->capturesThis()) { 12911 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12912 /*BuildAndDiagnose*/ true, nullptr, 12913 C->getCaptureKind() == LCK_StarThis); 12914 continue; 12915 } 12916 // Captured expression will be recaptured during captured variables 12917 // rebuilding. 12918 if (C->capturesVLAType()) 12919 continue; 12920 12921 // Rebuild init-captures, including the implied field declaration. 12922 if (E->isInitCapture(C)) { 12923 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12924 12925 VarDecl *OldVD = C->getCapturedVar(); 12926 llvm::SmallVector<Decl*, 4> NewVDs; 12927 12928 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12929 ExprResult Init = Info.first; 12930 QualType InitQualType = Info.second; 12931 if (Init.isInvalid() || InitQualType.isNull()) { 12932 Invalid = true; 12933 break; 12934 } 12935 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12936 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12937 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12938 if (!NewVD) { 12939 Invalid = true; 12940 break; 12941 } 12942 NewVDs.push_back(NewVD); 12943 getSema().addInitCapture(LSI, NewVD); 12944 } 12945 12946 if (Invalid) 12947 break; 12948 12949 getDerived().transformedLocalDecl(OldVD, NewVDs); 12950 continue; 12951 } 12952 12953 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12954 12955 // Determine the capture kind for Sema. 12956 Sema::TryCaptureKind Kind 12957 = C->isImplicit()? Sema::TryCapture_Implicit 12958 : C->getCaptureKind() == LCK_ByCopy 12959 ? Sema::TryCapture_ExplicitByVal 12960 : Sema::TryCapture_ExplicitByRef; 12961 SourceLocation EllipsisLoc; 12962 if (C->isPackExpansion()) { 12963 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12964 bool ShouldExpand = false; 12965 bool RetainExpansion = false; 12966 Optional<unsigned> NumExpansions; 12967 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12968 C->getLocation(), 12969 Unexpanded, 12970 ShouldExpand, RetainExpansion, 12971 NumExpansions)) { 12972 Invalid = true; 12973 continue; 12974 } 12975 12976 if (ShouldExpand) { 12977 // The transform has determined that we should perform an expansion; 12978 // transform and capture each of the arguments. 12979 // expansion of the pattern. Do so. 12980 VarDecl *Pack = C->getCapturedVar(); 12981 for (unsigned I = 0; I != *NumExpansions; ++I) { 12982 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12983 VarDecl *CapturedVar 12984 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12985 Pack)); 12986 if (!CapturedVar) { 12987 Invalid = true; 12988 continue; 12989 } 12990 12991 // Capture the transformed variable. 12992 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12993 } 12994 12995 // FIXME: Retain a pack expansion if RetainExpansion is true. 12996 12997 continue; 12998 } 12999 13000 EllipsisLoc = C->getEllipsisLoc(); 13001 } 13002 13003 // Transform the captured variable. 13004 VarDecl *CapturedVar 13005 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13006 C->getCapturedVar())); 13007 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13008 Invalid = true; 13009 continue; 13010 } 13011 13012 // Capture the transformed variable. 13013 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13014 EllipsisLoc); 13015 } 13016 getSema().finishLambdaExplicitCaptures(LSI); 13017 13018 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13019 // evaluation context even if we're not transforming the function body. 13020 getSema().PushExpressionEvaluationContext( 13021 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13022 13023 // Instantiate the body of the lambda expression. 13024 StmtResult Body = 13025 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13026 13027 // ActOnLambda* will pop the function scope for us. 13028 FuncScopeCleanup.disable(); 13029 13030 if (Body.isInvalid()) { 13031 SavedContext.pop(); 13032 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13033 /*IsInstantiation=*/true); 13034 return ExprError(); 13035 } 13036 13037 // Copy the LSI before ActOnFinishFunctionBody removes it. 13038 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13039 // the call operator. 13040 auto LSICopy = *LSI; 13041 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13042 /*IsInstantiation*/ true); 13043 SavedContext.pop(); 13044 13045 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13046 &LSICopy); 13047 } 13048 13049 template<typename Derived> 13050 StmtResult 13051 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13052 return TransformStmt(S); 13053 } 13054 13055 template<typename Derived> 13056 StmtResult 13057 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13058 // Transform captures. 13059 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13060 CEnd = E->capture_end(); 13061 C != CEnd; ++C) { 13062 // When we hit the first implicit capture, tell Sema that we've finished 13063 // the list of explicit captures. 13064 if (!C->isImplicit()) 13065 continue; 13066 13067 // Capturing 'this' is trivial. 13068 if (C->capturesThis()) { 13069 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13070 /*BuildAndDiagnose*/ true, nullptr, 13071 C->getCaptureKind() == LCK_StarThis); 13072 continue; 13073 } 13074 // Captured expression will be recaptured during captured variables 13075 // rebuilding. 13076 if (C->capturesVLAType()) 13077 continue; 13078 13079 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13080 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13081 13082 // Transform the captured variable. 13083 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13084 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13085 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13086 return StmtError(); 13087 13088 // Capture the transformed variable. 13089 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13090 } 13091 13092 return S; 13093 } 13094 13095 template<typename Derived> 13096 ExprResult 13097 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13098 CXXUnresolvedConstructExpr *E) { 13099 TypeSourceInfo *T = 13100 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13101 if (!T) 13102 return ExprError(); 13103 13104 bool ArgumentChanged = false; 13105 SmallVector<Expr*, 8> Args; 13106 Args.reserve(E->getNumArgs()); 13107 { 13108 EnterExpressionEvaluationContext Context( 13109 getSema(), EnterExpressionEvaluationContext::InitList, 13110 E->isListInitialization()); 13111 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13112 &ArgumentChanged)) 13113 return ExprError(); 13114 } 13115 13116 if (!getDerived().AlwaysRebuild() && 13117 T == E->getTypeSourceInfo() && 13118 !ArgumentChanged) 13119 return E; 13120 13121 // FIXME: we're faking the locations of the commas 13122 return getDerived().RebuildCXXUnresolvedConstructExpr( 13123 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13124 } 13125 13126 template<typename Derived> 13127 ExprResult 13128 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13129 CXXDependentScopeMemberExpr *E) { 13130 // Transform the base of the expression. 13131 ExprResult Base((Expr*) nullptr); 13132 Expr *OldBase; 13133 QualType BaseType; 13134 QualType ObjectType; 13135 if (!E->isImplicitAccess()) { 13136 OldBase = E->getBase(); 13137 Base = getDerived().TransformExpr(OldBase); 13138 if (Base.isInvalid()) 13139 return ExprError(); 13140 13141 // Start the member reference and compute the object's type. 13142 ParsedType ObjectTy; 13143 bool MayBePseudoDestructor = false; 13144 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13145 E->getOperatorLoc(), 13146 E->isArrow()? tok::arrow : tok::period, 13147 ObjectTy, 13148 MayBePseudoDestructor); 13149 if (Base.isInvalid()) 13150 return ExprError(); 13151 13152 ObjectType = ObjectTy.get(); 13153 BaseType = ((Expr*) Base.get())->getType(); 13154 } else { 13155 OldBase = nullptr; 13156 BaseType = getDerived().TransformType(E->getBaseType()); 13157 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13158 } 13159 13160 // Transform the first part of the nested-name-specifier that qualifies 13161 // the member name. 13162 NamedDecl *FirstQualifierInScope 13163 = getDerived().TransformFirstQualifierInScope( 13164 E->getFirstQualifierFoundInScope(), 13165 E->getQualifierLoc().getBeginLoc()); 13166 13167 NestedNameSpecifierLoc QualifierLoc; 13168 if (E->getQualifier()) { 13169 QualifierLoc 13170 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13171 ObjectType, 13172 FirstQualifierInScope); 13173 if (!QualifierLoc) 13174 return ExprError(); 13175 } 13176 13177 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13178 13179 // TODO: If this is a conversion-function-id, verify that the 13180 // destination type name (if present) resolves the same way after 13181 // instantiation as it did in the local scope. 13182 13183 DeclarationNameInfo NameInfo 13184 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13185 if (!NameInfo.getName()) 13186 return ExprError(); 13187 13188 if (!E->hasExplicitTemplateArgs()) { 13189 // This is a reference to a member without an explicitly-specified 13190 // template argument list. Optimize for this common case. 13191 if (!getDerived().AlwaysRebuild() && 13192 Base.get() == OldBase && 13193 BaseType == E->getBaseType() && 13194 QualifierLoc == E->getQualifierLoc() && 13195 NameInfo.getName() == E->getMember() && 13196 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13197 return E; 13198 13199 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13200 BaseType, 13201 E->isArrow(), 13202 E->getOperatorLoc(), 13203 QualifierLoc, 13204 TemplateKWLoc, 13205 FirstQualifierInScope, 13206 NameInfo, 13207 /*TemplateArgs*/nullptr); 13208 } 13209 13210 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13211 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13212 E->getNumTemplateArgs(), 13213 TransArgs)) 13214 return ExprError(); 13215 13216 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13217 BaseType, 13218 E->isArrow(), 13219 E->getOperatorLoc(), 13220 QualifierLoc, 13221 TemplateKWLoc, 13222 FirstQualifierInScope, 13223 NameInfo, 13224 &TransArgs); 13225 } 13226 13227 template <typename Derived> 13228 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13229 UnresolvedMemberExpr *Old) { 13230 // Transform the base of the expression. 13231 ExprResult Base((Expr *)nullptr); 13232 QualType BaseType; 13233 if (!Old->isImplicitAccess()) { 13234 Base = getDerived().TransformExpr(Old->getBase()); 13235 if (Base.isInvalid()) 13236 return ExprError(); 13237 Base = 13238 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13239 if (Base.isInvalid()) 13240 return ExprError(); 13241 BaseType = Base.get()->getType(); 13242 } else { 13243 BaseType = getDerived().TransformType(Old->getBaseType()); 13244 } 13245 13246 NestedNameSpecifierLoc QualifierLoc; 13247 if (Old->getQualifierLoc()) { 13248 QualifierLoc = 13249 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13250 if (!QualifierLoc) 13251 return ExprError(); 13252 } 13253 13254 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13255 13256 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13257 13258 // Transform the declaration set. 13259 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13260 return ExprError(); 13261 13262 // Determine the naming class. 13263 if (Old->getNamingClass()) { 13264 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13265 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13266 if (!NamingClass) 13267 return ExprError(); 13268 13269 R.setNamingClass(NamingClass); 13270 } 13271 13272 TemplateArgumentListInfo TransArgs; 13273 if (Old->hasExplicitTemplateArgs()) { 13274 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13275 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13276 if (getDerived().TransformTemplateArguments( 13277 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13278 return ExprError(); 13279 } 13280 13281 // FIXME: to do this check properly, we will need to preserve the 13282 // first-qualifier-in-scope here, just in case we had a dependent 13283 // base (and therefore couldn't do the check) and a 13284 // nested-name-qualifier (and therefore could do the lookup). 13285 NamedDecl *FirstQualifierInScope = nullptr; 13286 13287 return getDerived().RebuildUnresolvedMemberExpr( 13288 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13289 TemplateKWLoc, FirstQualifierInScope, R, 13290 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13291 } 13292 13293 template<typename Derived> 13294 ExprResult 13295 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13296 EnterExpressionEvaluationContext Unevaluated( 13297 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13298 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13299 if (SubExpr.isInvalid()) 13300 return ExprError(); 13301 13302 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13303 return E; 13304 13305 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13306 } 13307 13308 template<typename Derived> 13309 ExprResult 13310 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13311 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13312 if (Pattern.isInvalid()) 13313 return ExprError(); 13314 13315 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13316 return E; 13317 13318 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13319 E->getNumExpansions()); 13320 } 13321 13322 template<typename Derived> 13323 ExprResult 13324 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13325 // If E is not value-dependent, then nothing will change when we transform it. 13326 // Note: This is an instantiation-centric view. 13327 if (!E->isValueDependent()) 13328 return E; 13329 13330 EnterExpressionEvaluationContext Unevaluated( 13331 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13332 13333 ArrayRef<TemplateArgument> PackArgs; 13334 TemplateArgument ArgStorage; 13335 13336 // Find the argument list to transform. 13337 if (E->isPartiallySubstituted()) { 13338 PackArgs = E->getPartialArguments(); 13339 } else if (E->isValueDependent()) { 13340 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13341 bool ShouldExpand = false; 13342 bool RetainExpansion = false; 13343 Optional<unsigned> NumExpansions; 13344 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13345 Unexpanded, 13346 ShouldExpand, RetainExpansion, 13347 NumExpansions)) 13348 return ExprError(); 13349 13350 // If we need to expand the pack, build a template argument from it and 13351 // expand that. 13352 if (ShouldExpand) { 13353 auto *Pack = E->getPack(); 13354 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13355 ArgStorage = getSema().Context.getPackExpansionType( 13356 getSema().Context.getTypeDeclType(TTPD), None); 13357 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13358 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13359 } else { 13360 auto *VD = cast<ValueDecl>(Pack); 13361 ExprResult DRE = getSema().BuildDeclRefExpr( 13362 VD, VD->getType().getNonLValueExprType(getSema().Context), 13363 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13364 E->getPackLoc()); 13365 if (DRE.isInvalid()) 13366 return ExprError(); 13367 ArgStorage = new (getSema().Context) PackExpansionExpr( 13368 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13369 } 13370 PackArgs = ArgStorage; 13371 } 13372 } 13373 13374 // If we're not expanding the pack, just transform the decl. 13375 if (!PackArgs.size()) { 13376 auto *Pack = cast_or_null<NamedDecl>( 13377 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13378 if (!Pack) 13379 return ExprError(); 13380 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13381 E->getPackLoc(), 13382 E->getRParenLoc(), None, None); 13383 } 13384 13385 // Try to compute the result without performing a partial substitution. 13386 Optional<unsigned> Result = 0; 13387 for (const TemplateArgument &Arg : PackArgs) { 13388 if (!Arg.isPackExpansion()) { 13389 Result = *Result + 1; 13390 continue; 13391 } 13392 13393 TemplateArgumentLoc ArgLoc; 13394 InventTemplateArgumentLoc(Arg, ArgLoc); 13395 13396 // Find the pattern of the pack expansion. 13397 SourceLocation Ellipsis; 13398 Optional<unsigned> OrigNumExpansions; 13399 TemplateArgumentLoc Pattern = 13400 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13401 OrigNumExpansions); 13402 13403 // Substitute under the pack expansion. Do not expand the pack (yet). 13404 TemplateArgumentLoc OutPattern; 13405 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13406 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13407 /*Uneval*/ true)) 13408 return true; 13409 13410 // See if we can determine the number of arguments from the result. 13411 Optional<unsigned> NumExpansions = 13412 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13413 if (!NumExpansions) { 13414 // No: we must be in an alias template expansion, and we're going to need 13415 // to actually expand the packs. 13416 Result = None; 13417 break; 13418 } 13419 13420 Result = *Result + *NumExpansions; 13421 } 13422 13423 // Common case: we could determine the number of expansions without 13424 // substituting. 13425 if (Result) 13426 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13427 E->getPackLoc(), 13428 E->getRParenLoc(), *Result, None); 13429 13430 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13431 E->getPackLoc()); 13432 { 13433 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13434 typedef TemplateArgumentLocInventIterator< 13435 Derived, const TemplateArgument*> PackLocIterator; 13436 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13437 PackLocIterator(*this, PackArgs.end()), 13438 TransformedPackArgs, /*Uneval*/true)) 13439 return ExprError(); 13440 } 13441 13442 // Check whether we managed to fully-expand the pack. 13443 // FIXME: Is it possible for us to do so and not hit the early exit path? 13444 SmallVector<TemplateArgument, 8> Args; 13445 bool PartialSubstitution = false; 13446 for (auto &Loc : TransformedPackArgs.arguments()) { 13447 Args.push_back(Loc.getArgument()); 13448 if (Loc.getArgument().isPackExpansion()) 13449 PartialSubstitution = true; 13450 } 13451 13452 if (PartialSubstitution) 13453 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13454 E->getPackLoc(), 13455 E->getRParenLoc(), None, Args); 13456 13457 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13458 E->getPackLoc(), E->getRParenLoc(), 13459 Args.size(), None); 13460 } 13461 13462 template<typename Derived> 13463 ExprResult 13464 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13465 SubstNonTypeTemplateParmPackExpr *E) { 13466 // Default behavior is to do nothing with this transformation. 13467 return E; 13468 } 13469 13470 template<typename Derived> 13471 ExprResult 13472 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13473 SubstNonTypeTemplateParmExpr *E) { 13474 // Default behavior is to do nothing with this transformation. 13475 return E; 13476 } 13477 13478 template<typename Derived> 13479 ExprResult 13480 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13481 // Default behavior is to do nothing with this transformation. 13482 return E; 13483 } 13484 13485 template<typename Derived> 13486 ExprResult 13487 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13488 MaterializeTemporaryExpr *E) { 13489 return getDerived().TransformExpr(E->getSubExpr()); 13490 } 13491 13492 template<typename Derived> 13493 ExprResult 13494 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13495 UnresolvedLookupExpr *Callee = nullptr; 13496 if (Expr *OldCallee = E->getCallee()) { 13497 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13498 if (CalleeResult.isInvalid()) 13499 return ExprError(); 13500 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13501 } 13502 13503 Expr *Pattern = E->getPattern(); 13504 13505 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13506 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13507 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13508 13509 // Determine whether the set of unexpanded parameter packs can and should 13510 // be expanded. 13511 bool Expand = true; 13512 bool RetainExpansion = false; 13513 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13514 NumExpansions = OrigNumExpansions; 13515 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13516 Pattern->getSourceRange(), 13517 Unexpanded, 13518 Expand, RetainExpansion, 13519 NumExpansions)) 13520 return true; 13521 13522 if (!Expand) { 13523 // Do not expand any packs here, just transform and rebuild a fold 13524 // expression. 13525 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13526 13527 ExprResult LHS = 13528 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13529 if (LHS.isInvalid()) 13530 return true; 13531 13532 ExprResult RHS = 13533 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13534 if (RHS.isInvalid()) 13535 return true; 13536 13537 if (!getDerived().AlwaysRebuild() && 13538 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13539 return E; 13540 13541 return getDerived().RebuildCXXFoldExpr( 13542 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13543 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13544 } 13545 13546 // Formally a fold expression expands to nested parenthesized expressions. 13547 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13548 // them. 13549 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13550 SemaRef.Diag(E->getEllipsisLoc(), 13551 clang::diag::err_fold_expression_limit_exceeded) 13552 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13553 << E->getSourceRange(); 13554 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13555 return ExprError(); 13556 } 13557 13558 // The transform has determined that we should perform an elementwise 13559 // expansion of the pattern. Do so. 13560 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13561 if (Result.isInvalid()) 13562 return true; 13563 bool LeftFold = E->isLeftFold(); 13564 13565 // If we're retaining an expansion for a right fold, it is the innermost 13566 // component and takes the init (if any). 13567 if (!LeftFold && RetainExpansion) { 13568 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13569 13570 ExprResult Out = getDerived().TransformExpr(Pattern); 13571 if (Out.isInvalid()) 13572 return true; 13573 13574 Result = getDerived().RebuildCXXFoldExpr( 13575 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13576 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13577 if (Result.isInvalid()) 13578 return true; 13579 } 13580 13581 for (unsigned I = 0; I != *NumExpansions; ++I) { 13582 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13583 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13584 ExprResult Out = getDerived().TransformExpr(Pattern); 13585 if (Out.isInvalid()) 13586 return true; 13587 13588 if (Out.get()->containsUnexpandedParameterPack()) { 13589 // We still have a pack; retain a pack expansion for this slice. 13590 Result = getDerived().RebuildCXXFoldExpr( 13591 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13592 E->getOperator(), E->getEllipsisLoc(), 13593 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13594 OrigNumExpansions); 13595 } else if (Result.isUsable()) { 13596 // We've got down to a single element; build a binary operator. 13597 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13598 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13599 if (Callee) 13600 Result = getDerived().RebuildCXXOperatorCallExpr( 13601 BinaryOperator::getOverloadedOperator(E->getOperator()), 13602 E->getEllipsisLoc(), Callee, LHS, RHS); 13603 else 13604 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13605 E->getOperator(), LHS, RHS); 13606 } else 13607 Result = Out; 13608 13609 if (Result.isInvalid()) 13610 return true; 13611 } 13612 13613 // If we're retaining an expansion for a left fold, it is the outermost 13614 // component and takes the complete expansion so far as its init (if any). 13615 if (LeftFold && RetainExpansion) { 13616 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13617 13618 ExprResult Out = getDerived().TransformExpr(Pattern); 13619 if (Out.isInvalid()) 13620 return true; 13621 13622 Result = getDerived().RebuildCXXFoldExpr( 13623 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13624 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13625 if (Result.isInvalid()) 13626 return true; 13627 } 13628 13629 // If we had no init and an empty pack, and we're not retaining an expansion, 13630 // then produce a fallback value or error. 13631 if (Result.isUnset()) 13632 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13633 E->getOperator()); 13634 13635 return Result; 13636 } 13637 13638 template<typename Derived> 13639 ExprResult 13640 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13641 CXXStdInitializerListExpr *E) { 13642 return getDerived().TransformExpr(E->getSubExpr()); 13643 } 13644 13645 template<typename Derived> 13646 ExprResult 13647 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13648 return SemaRef.MaybeBindToTemporary(E); 13649 } 13650 13651 template<typename Derived> 13652 ExprResult 13653 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13654 return E; 13655 } 13656 13657 template<typename Derived> 13658 ExprResult 13659 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13660 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13661 if (SubExpr.isInvalid()) 13662 return ExprError(); 13663 13664 if (!getDerived().AlwaysRebuild() && 13665 SubExpr.get() == E->getSubExpr()) 13666 return E; 13667 13668 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13669 } 13670 13671 template<typename Derived> 13672 ExprResult 13673 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13674 // Transform each of the elements. 13675 SmallVector<Expr *, 8> Elements; 13676 bool ArgChanged = false; 13677 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13678 /*IsCall=*/false, Elements, &ArgChanged)) 13679 return ExprError(); 13680 13681 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13682 return SemaRef.MaybeBindToTemporary(E); 13683 13684 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13685 Elements.data(), 13686 Elements.size()); 13687 } 13688 13689 template<typename Derived> 13690 ExprResult 13691 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13692 ObjCDictionaryLiteral *E) { 13693 // Transform each of the elements. 13694 SmallVector<ObjCDictionaryElement, 8> Elements; 13695 bool ArgChanged = false; 13696 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13697 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13698 13699 if (OrigElement.isPackExpansion()) { 13700 // This key/value element is a pack expansion. 13701 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13702 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13703 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13704 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13705 13706 // Determine whether the set of unexpanded parameter packs can 13707 // and should be expanded. 13708 bool Expand = true; 13709 bool RetainExpansion = false; 13710 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13711 Optional<unsigned> NumExpansions = OrigNumExpansions; 13712 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13713 OrigElement.Value->getEndLoc()); 13714 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13715 PatternRange, Unexpanded, Expand, 13716 RetainExpansion, NumExpansions)) 13717 return ExprError(); 13718 13719 if (!Expand) { 13720 // The transform has determined that we should perform a simple 13721 // transformation on the pack expansion, producing another pack 13722 // expansion. 13723 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13724 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13725 if (Key.isInvalid()) 13726 return ExprError(); 13727 13728 if (Key.get() != OrigElement.Key) 13729 ArgChanged = true; 13730 13731 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13732 if (Value.isInvalid()) 13733 return ExprError(); 13734 13735 if (Value.get() != OrigElement.Value) 13736 ArgChanged = true; 13737 13738 ObjCDictionaryElement Expansion = { 13739 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13740 }; 13741 Elements.push_back(Expansion); 13742 continue; 13743 } 13744 13745 // Record right away that the argument was changed. This needs 13746 // to happen even if the array expands to nothing. 13747 ArgChanged = true; 13748 13749 // The transform has determined that we should perform an elementwise 13750 // expansion of the pattern. Do so. 13751 for (unsigned I = 0; I != *NumExpansions; ++I) { 13752 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13753 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13754 if (Key.isInvalid()) 13755 return ExprError(); 13756 13757 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13758 if (Value.isInvalid()) 13759 return ExprError(); 13760 13761 ObjCDictionaryElement Element = { 13762 Key.get(), Value.get(), SourceLocation(), NumExpansions 13763 }; 13764 13765 // If any unexpanded parameter packs remain, we still have a 13766 // pack expansion. 13767 // FIXME: Can this really happen? 13768 if (Key.get()->containsUnexpandedParameterPack() || 13769 Value.get()->containsUnexpandedParameterPack()) 13770 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13771 13772 Elements.push_back(Element); 13773 } 13774 13775 // FIXME: Retain a pack expansion if RetainExpansion is true. 13776 13777 // We've finished with this pack expansion. 13778 continue; 13779 } 13780 13781 // Transform and check key. 13782 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13783 if (Key.isInvalid()) 13784 return ExprError(); 13785 13786 if (Key.get() != OrigElement.Key) 13787 ArgChanged = true; 13788 13789 // Transform and check value. 13790 ExprResult Value 13791 = getDerived().TransformExpr(OrigElement.Value); 13792 if (Value.isInvalid()) 13793 return ExprError(); 13794 13795 if (Value.get() != OrigElement.Value) 13796 ArgChanged = true; 13797 13798 ObjCDictionaryElement Element = { 13799 Key.get(), Value.get(), SourceLocation(), None 13800 }; 13801 Elements.push_back(Element); 13802 } 13803 13804 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13805 return SemaRef.MaybeBindToTemporary(E); 13806 13807 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13808 Elements); 13809 } 13810 13811 template<typename Derived> 13812 ExprResult 13813 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13814 TypeSourceInfo *EncodedTypeInfo 13815 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13816 if (!EncodedTypeInfo) 13817 return ExprError(); 13818 13819 if (!getDerived().AlwaysRebuild() && 13820 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13821 return E; 13822 13823 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13824 EncodedTypeInfo, 13825 E->getRParenLoc()); 13826 } 13827 13828 template<typename Derived> 13829 ExprResult TreeTransform<Derived>:: 13830 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13831 // This is a kind of implicit conversion, and it needs to get dropped 13832 // and recomputed for the same general reasons that ImplicitCastExprs 13833 // do, as well a more specific one: this expression is only valid when 13834 // it appears *immediately* as an argument expression. 13835 return getDerived().TransformExpr(E->getSubExpr()); 13836 } 13837 13838 template<typename Derived> 13839 ExprResult TreeTransform<Derived>:: 13840 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13841 TypeSourceInfo *TSInfo 13842 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13843 if (!TSInfo) 13844 return ExprError(); 13845 13846 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13847 if (Result.isInvalid()) 13848 return ExprError(); 13849 13850 if (!getDerived().AlwaysRebuild() && 13851 TSInfo == E->getTypeInfoAsWritten() && 13852 Result.get() == E->getSubExpr()) 13853 return E; 13854 13855 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13856 E->getBridgeKeywordLoc(), TSInfo, 13857 Result.get()); 13858 } 13859 13860 template <typename Derived> 13861 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13862 ObjCAvailabilityCheckExpr *E) { 13863 return E; 13864 } 13865 13866 template<typename Derived> 13867 ExprResult 13868 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13869 // Transform arguments. 13870 bool ArgChanged = false; 13871 SmallVector<Expr*, 8> Args; 13872 Args.reserve(E->getNumArgs()); 13873 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13874 &ArgChanged)) 13875 return ExprError(); 13876 13877 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13878 // Class message: transform the receiver type. 13879 TypeSourceInfo *ReceiverTypeInfo 13880 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13881 if (!ReceiverTypeInfo) 13882 return ExprError(); 13883 13884 // If nothing changed, just retain the existing message send. 13885 if (!getDerived().AlwaysRebuild() && 13886 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13887 return SemaRef.MaybeBindToTemporary(E); 13888 13889 // Build a new class message send. 13890 SmallVector<SourceLocation, 16> SelLocs; 13891 E->getSelectorLocs(SelLocs); 13892 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13893 E->getSelector(), 13894 SelLocs, 13895 E->getMethodDecl(), 13896 E->getLeftLoc(), 13897 Args, 13898 E->getRightLoc()); 13899 } 13900 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13901 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13902 if (!E->getMethodDecl()) 13903 return ExprError(); 13904 13905 // Build a new class message send to 'super'. 13906 SmallVector<SourceLocation, 16> SelLocs; 13907 E->getSelectorLocs(SelLocs); 13908 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13909 E->getSelector(), 13910 SelLocs, 13911 E->getReceiverType(), 13912 E->getMethodDecl(), 13913 E->getLeftLoc(), 13914 Args, 13915 E->getRightLoc()); 13916 } 13917 13918 // Instance message: transform the receiver 13919 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13920 "Only class and instance messages may be instantiated"); 13921 ExprResult Receiver 13922 = getDerived().TransformExpr(E->getInstanceReceiver()); 13923 if (Receiver.isInvalid()) 13924 return ExprError(); 13925 13926 // If nothing changed, just retain the existing message send. 13927 if (!getDerived().AlwaysRebuild() && 13928 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13929 return SemaRef.MaybeBindToTemporary(E); 13930 13931 // Build a new instance message send. 13932 SmallVector<SourceLocation, 16> SelLocs; 13933 E->getSelectorLocs(SelLocs); 13934 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13935 E->getSelector(), 13936 SelLocs, 13937 E->getMethodDecl(), 13938 E->getLeftLoc(), 13939 Args, 13940 E->getRightLoc()); 13941 } 13942 13943 template<typename Derived> 13944 ExprResult 13945 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13946 return E; 13947 } 13948 13949 template<typename Derived> 13950 ExprResult 13951 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13952 return E; 13953 } 13954 13955 template<typename Derived> 13956 ExprResult 13957 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13958 // Transform the base expression. 13959 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13960 if (Base.isInvalid()) 13961 return ExprError(); 13962 13963 // We don't need to transform the ivar; it will never change. 13964 13965 // If nothing changed, just retain the existing expression. 13966 if (!getDerived().AlwaysRebuild() && 13967 Base.get() == E->getBase()) 13968 return E; 13969 13970 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13971 E->getLocation(), 13972 E->isArrow(), E->isFreeIvar()); 13973 } 13974 13975 template<typename Derived> 13976 ExprResult 13977 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13978 // 'super' and types never change. Property never changes. Just 13979 // retain the existing expression. 13980 if (!E->isObjectReceiver()) 13981 return E; 13982 13983 // Transform the base expression. 13984 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13985 if (Base.isInvalid()) 13986 return ExprError(); 13987 13988 // We don't need to transform the property; it will never change. 13989 13990 // If nothing changed, just retain the existing expression. 13991 if (!getDerived().AlwaysRebuild() && 13992 Base.get() == E->getBase()) 13993 return E; 13994 13995 if (E->isExplicitProperty()) 13996 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13997 E->getExplicitProperty(), 13998 E->getLocation()); 13999 14000 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14001 SemaRef.Context.PseudoObjectTy, 14002 E->getImplicitPropertyGetter(), 14003 E->getImplicitPropertySetter(), 14004 E->getLocation()); 14005 } 14006 14007 template<typename Derived> 14008 ExprResult 14009 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14010 // Transform the base expression. 14011 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14012 if (Base.isInvalid()) 14013 return ExprError(); 14014 14015 // Transform the key expression. 14016 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14017 if (Key.isInvalid()) 14018 return ExprError(); 14019 14020 // If nothing changed, just retain the existing expression. 14021 if (!getDerived().AlwaysRebuild() && 14022 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14023 return E; 14024 14025 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14026 Base.get(), Key.get(), 14027 E->getAtIndexMethodDecl(), 14028 E->setAtIndexMethodDecl()); 14029 } 14030 14031 template<typename Derived> 14032 ExprResult 14033 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14034 // Transform the base expression. 14035 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14036 if (Base.isInvalid()) 14037 return ExprError(); 14038 14039 // If nothing changed, just retain the existing expression. 14040 if (!getDerived().AlwaysRebuild() && 14041 Base.get() == E->getBase()) 14042 return E; 14043 14044 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14045 E->getOpLoc(), 14046 E->isArrow()); 14047 } 14048 14049 template<typename Derived> 14050 ExprResult 14051 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14052 bool ArgumentChanged = false; 14053 SmallVector<Expr*, 8> SubExprs; 14054 SubExprs.reserve(E->getNumSubExprs()); 14055 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14056 SubExprs, &ArgumentChanged)) 14057 return ExprError(); 14058 14059 if (!getDerived().AlwaysRebuild() && 14060 !ArgumentChanged) 14061 return E; 14062 14063 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14064 SubExprs, 14065 E->getRParenLoc()); 14066 } 14067 14068 template<typename Derived> 14069 ExprResult 14070 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14071 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14072 if (SrcExpr.isInvalid()) 14073 return ExprError(); 14074 14075 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14076 if (!Type) 14077 return ExprError(); 14078 14079 if (!getDerived().AlwaysRebuild() && 14080 Type == E->getTypeSourceInfo() && 14081 SrcExpr.get() == E->getSrcExpr()) 14082 return E; 14083 14084 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14085 SrcExpr.get(), Type, 14086 E->getRParenLoc()); 14087 } 14088 14089 template<typename Derived> 14090 ExprResult 14091 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14092 BlockDecl *oldBlock = E->getBlockDecl(); 14093 14094 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14095 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14096 14097 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14098 blockScope->TheDecl->setBlockMissingReturnType( 14099 oldBlock->blockMissingReturnType()); 14100 14101 SmallVector<ParmVarDecl*, 4> params; 14102 SmallVector<QualType, 4> paramTypes; 14103 14104 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14105 14106 // Parameter substitution. 14107 Sema::ExtParameterInfoBuilder extParamInfos; 14108 if (getDerived().TransformFunctionTypeParams( 14109 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14110 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14111 extParamInfos)) { 14112 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14113 return ExprError(); 14114 } 14115 14116 QualType exprResultType = 14117 getDerived().TransformType(exprFunctionType->getReturnType()); 14118 14119 auto epi = exprFunctionType->getExtProtoInfo(); 14120 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14121 14122 QualType functionType = 14123 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14124 blockScope->FunctionType = functionType; 14125 14126 // Set the parameters on the block decl. 14127 if (!params.empty()) 14128 blockScope->TheDecl->setParams(params); 14129 14130 if (!oldBlock->blockMissingReturnType()) { 14131 blockScope->HasImplicitReturnType = false; 14132 blockScope->ReturnType = exprResultType; 14133 } 14134 14135 // Transform the body 14136 StmtResult body = getDerived().TransformStmt(E->getBody()); 14137 if (body.isInvalid()) { 14138 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14139 return ExprError(); 14140 } 14141 14142 #ifndef NDEBUG 14143 // In builds with assertions, make sure that we captured everything we 14144 // captured before. 14145 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14146 for (const auto &I : oldBlock->captures()) { 14147 VarDecl *oldCapture = I.getVariable(); 14148 14149 // Ignore parameter packs. 14150 if (oldCapture->isParameterPack()) 14151 continue; 14152 14153 VarDecl *newCapture = 14154 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14155 oldCapture)); 14156 assert(blockScope->CaptureMap.count(newCapture)); 14157 } 14158 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14159 } 14160 #endif 14161 14162 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14163 /*Scope=*/nullptr); 14164 } 14165 14166 template<typename Derived> 14167 ExprResult 14168 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14169 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14170 if (SrcExpr.isInvalid()) 14171 return ExprError(); 14172 14173 QualType Type = getDerived().TransformType(E->getType()); 14174 14175 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14176 E->getRParenLoc()); 14177 } 14178 14179 template<typename Derived> 14180 ExprResult 14181 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14182 bool ArgumentChanged = false; 14183 SmallVector<Expr*, 8> SubExprs; 14184 SubExprs.reserve(E->getNumSubExprs()); 14185 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14186 SubExprs, &ArgumentChanged)) 14187 return ExprError(); 14188 14189 if (!getDerived().AlwaysRebuild() && 14190 !ArgumentChanged) 14191 return E; 14192 14193 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14194 E->getOp(), E->getRParenLoc()); 14195 } 14196 14197 //===----------------------------------------------------------------------===// 14198 // Type reconstruction 14199 //===----------------------------------------------------------------------===// 14200 14201 template<typename Derived> 14202 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14203 SourceLocation Star) { 14204 return SemaRef.BuildPointerType(PointeeType, Star, 14205 getDerived().getBaseEntity()); 14206 } 14207 14208 template<typename Derived> 14209 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14210 SourceLocation Star) { 14211 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14212 getDerived().getBaseEntity()); 14213 } 14214 14215 template<typename Derived> 14216 QualType 14217 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14218 bool WrittenAsLValue, 14219 SourceLocation Sigil) { 14220 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14221 Sigil, getDerived().getBaseEntity()); 14222 } 14223 14224 template<typename Derived> 14225 QualType 14226 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14227 QualType ClassType, 14228 SourceLocation Sigil) { 14229 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14230 getDerived().getBaseEntity()); 14231 } 14232 14233 template<typename Derived> 14234 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14235 const ObjCTypeParamDecl *Decl, 14236 SourceLocation ProtocolLAngleLoc, 14237 ArrayRef<ObjCProtocolDecl *> Protocols, 14238 ArrayRef<SourceLocation> ProtocolLocs, 14239 SourceLocation ProtocolRAngleLoc) { 14240 return SemaRef.BuildObjCTypeParamType(Decl, 14241 ProtocolLAngleLoc, Protocols, 14242 ProtocolLocs, ProtocolRAngleLoc, 14243 /*FailOnError=*/true); 14244 } 14245 14246 template<typename Derived> 14247 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14248 QualType BaseType, 14249 SourceLocation Loc, 14250 SourceLocation TypeArgsLAngleLoc, 14251 ArrayRef<TypeSourceInfo *> TypeArgs, 14252 SourceLocation TypeArgsRAngleLoc, 14253 SourceLocation ProtocolLAngleLoc, 14254 ArrayRef<ObjCProtocolDecl *> Protocols, 14255 ArrayRef<SourceLocation> ProtocolLocs, 14256 SourceLocation ProtocolRAngleLoc) { 14257 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14258 TypeArgs, TypeArgsRAngleLoc, 14259 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14260 ProtocolRAngleLoc, 14261 /*FailOnError=*/true); 14262 } 14263 14264 template<typename Derived> 14265 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14266 QualType PointeeType, 14267 SourceLocation Star) { 14268 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14269 } 14270 14271 template<typename Derived> 14272 QualType 14273 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14274 ArrayType::ArraySizeModifier SizeMod, 14275 const llvm::APInt *Size, 14276 Expr *SizeExpr, 14277 unsigned IndexTypeQuals, 14278 SourceRange BracketsRange) { 14279 if (SizeExpr || !Size) 14280 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14281 IndexTypeQuals, BracketsRange, 14282 getDerived().getBaseEntity()); 14283 14284 QualType Types[] = { 14285 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14286 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14287 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14288 }; 14289 const unsigned NumTypes = llvm::array_lengthof(Types); 14290 QualType SizeType; 14291 for (unsigned I = 0; I != NumTypes; ++I) 14292 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14293 SizeType = Types[I]; 14294 break; 14295 } 14296 14297 // Note that we can return a VariableArrayType here in the case where 14298 // the element type was a dependent VariableArrayType. 14299 IntegerLiteral *ArraySize 14300 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14301 /*FIXME*/BracketsRange.getBegin()); 14302 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14303 IndexTypeQuals, BracketsRange, 14304 getDerived().getBaseEntity()); 14305 } 14306 14307 template<typename Derived> 14308 QualType 14309 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14310 ArrayType::ArraySizeModifier SizeMod, 14311 const llvm::APInt &Size, 14312 Expr *SizeExpr, 14313 unsigned IndexTypeQuals, 14314 SourceRange BracketsRange) { 14315 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14316 IndexTypeQuals, BracketsRange); 14317 } 14318 14319 template<typename Derived> 14320 QualType 14321 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14322 ArrayType::ArraySizeModifier SizeMod, 14323 unsigned IndexTypeQuals, 14324 SourceRange BracketsRange) { 14325 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14326 IndexTypeQuals, BracketsRange); 14327 } 14328 14329 template<typename Derived> 14330 QualType 14331 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14332 ArrayType::ArraySizeModifier SizeMod, 14333 Expr *SizeExpr, 14334 unsigned IndexTypeQuals, 14335 SourceRange BracketsRange) { 14336 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14337 SizeExpr, 14338 IndexTypeQuals, BracketsRange); 14339 } 14340 14341 template<typename Derived> 14342 QualType 14343 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14344 ArrayType::ArraySizeModifier SizeMod, 14345 Expr *SizeExpr, 14346 unsigned IndexTypeQuals, 14347 SourceRange BracketsRange) { 14348 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14349 SizeExpr, 14350 IndexTypeQuals, BracketsRange); 14351 } 14352 14353 template <typename Derived> 14354 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14355 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14356 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14357 AttributeLoc); 14358 } 14359 14360 template <typename Derived> 14361 QualType 14362 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14363 unsigned NumElements, 14364 VectorType::VectorKind VecKind) { 14365 // FIXME: semantic checking! 14366 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14367 } 14368 14369 template <typename Derived> 14370 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14371 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14372 VectorType::VectorKind VecKind) { 14373 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14374 } 14375 14376 template<typename Derived> 14377 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14378 unsigned NumElements, 14379 SourceLocation AttributeLoc) { 14380 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14381 NumElements, true); 14382 IntegerLiteral *VectorSize 14383 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14384 AttributeLoc); 14385 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14386 } 14387 14388 template<typename Derived> 14389 QualType 14390 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14391 Expr *SizeExpr, 14392 SourceLocation AttributeLoc) { 14393 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14394 } 14395 14396 template <typename Derived> 14397 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14398 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14399 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14400 NumColumns); 14401 } 14402 14403 template <typename Derived> 14404 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14405 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14406 SourceLocation AttributeLoc) { 14407 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14408 AttributeLoc); 14409 } 14410 14411 template<typename Derived> 14412 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14413 QualType T, 14414 MutableArrayRef<QualType> ParamTypes, 14415 const FunctionProtoType::ExtProtoInfo &EPI) { 14416 return SemaRef.BuildFunctionType(T, ParamTypes, 14417 getDerived().getBaseLocation(), 14418 getDerived().getBaseEntity(), 14419 EPI); 14420 } 14421 14422 template<typename Derived> 14423 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14424 return SemaRef.Context.getFunctionNoProtoType(T); 14425 } 14426 14427 template<typename Derived> 14428 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14429 Decl *D) { 14430 assert(D && "no decl found"); 14431 if (D->isInvalidDecl()) return QualType(); 14432 14433 // FIXME: Doesn't account for ObjCInterfaceDecl! 14434 TypeDecl *Ty; 14435 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14436 // A valid resolved using typename pack expansion decl can have multiple 14437 // UsingDecls, but they must each have exactly one type, and it must be 14438 // the same type in every case. But we must have at least one expansion! 14439 if (UPD->expansions().empty()) { 14440 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14441 << UPD->isCXXClassMember() << UPD; 14442 return QualType(); 14443 } 14444 14445 // We might still have some unresolved types. Try to pick a resolved type 14446 // if we can. The final instantiation will check that the remaining 14447 // unresolved types instantiate to the type we pick. 14448 QualType FallbackT; 14449 QualType T; 14450 for (auto *E : UPD->expansions()) { 14451 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14452 if (ThisT.isNull()) 14453 continue; 14454 else if (ThisT->getAs<UnresolvedUsingType>()) 14455 FallbackT = ThisT; 14456 else if (T.isNull()) 14457 T = ThisT; 14458 else 14459 assert(getSema().Context.hasSameType(ThisT, T) && 14460 "mismatched resolved types in using pack expansion"); 14461 } 14462 return T.isNull() ? FallbackT : T; 14463 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14464 assert(Using->hasTypename() && 14465 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14466 14467 // A valid resolved using typename decl points to exactly one type decl. 14468 assert(++Using->shadow_begin() == Using->shadow_end()); 14469 14470 NamedDecl *Target = Using->shadow_begin()->getTargetDecl(); 14471 if (SemaRef.DiagnoseUseOfDecl(Target, Loc)) 14472 return QualType(); 14473 Ty = cast<TypeDecl>(Target); 14474 } else { 14475 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14476 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14477 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14478 } 14479 14480 return SemaRef.Context.getTypeDeclType(Ty); 14481 } 14482 14483 template<typename Derived> 14484 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14485 SourceLocation Loc) { 14486 return SemaRef.BuildTypeofExprType(E, Loc); 14487 } 14488 14489 template<typename Derived> 14490 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14491 return SemaRef.Context.getTypeOfType(Underlying); 14492 } 14493 14494 template<typename Derived> 14495 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14496 SourceLocation Loc) { 14497 return SemaRef.BuildDecltypeType(E, Loc); 14498 } 14499 14500 template<typename Derived> 14501 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14502 UnaryTransformType::UTTKind UKind, 14503 SourceLocation Loc) { 14504 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14505 } 14506 14507 template<typename Derived> 14508 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14509 TemplateName Template, 14510 SourceLocation TemplateNameLoc, 14511 TemplateArgumentListInfo &TemplateArgs) { 14512 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14513 } 14514 14515 template<typename Derived> 14516 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14517 SourceLocation KWLoc) { 14518 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14519 } 14520 14521 template<typename Derived> 14522 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14523 SourceLocation KWLoc, 14524 bool isReadPipe) { 14525 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14526 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14527 } 14528 14529 template <typename Derived> 14530 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14531 unsigned NumBits, 14532 SourceLocation Loc) { 14533 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14534 NumBits, true); 14535 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14536 SemaRef.Context.IntTy, Loc); 14537 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14538 } 14539 14540 template <typename Derived> 14541 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14542 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14543 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14544 } 14545 14546 template<typename Derived> 14547 TemplateName 14548 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14549 bool TemplateKW, 14550 TemplateDecl *Template) { 14551 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14552 Template); 14553 } 14554 14555 template<typename Derived> 14556 TemplateName 14557 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14558 SourceLocation TemplateKWLoc, 14559 const IdentifierInfo &Name, 14560 SourceLocation NameLoc, 14561 QualType ObjectType, 14562 NamedDecl *FirstQualifierInScope, 14563 bool AllowInjectedClassName) { 14564 UnqualifiedId TemplateName; 14565 TemplateName.setIdentifier(&Name, NameLoc); 14566 Sema::TemplateTy Template; 14567 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14568 TemplateName, ParsedType::make(ObjectType), 14569 /*EnteringContext=*/false, Template, 14570 AllowInjectedClassName); 14571 return Template.get(); 14572 } 14573 14574 template<typename Derived> 14575 TemplateName 14576 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14577 SourceLocation TemplateKWLoc, 14578 OverloadedOperatorKind Operator, 14579 SourceLocation NameLoc, 14580 QualType ObjectType, 14581 bool AllowInjectedClassName) { 14582 UnqualifiedId Name; 14583 // FIXME: Bogus location information. 14584 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14585 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14586 Sema::TemplateTy Template; 14587 getSema().ActOnTemplateName( 14588 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14589 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14590 return Template.get(); 14591 } 14592 14593 template<typename Derived> 14594 ExprResult 14595 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14596 SourceLocation OpLoc, 14597 Expr *OrigCallee, 14598 Expr *First, 14599 Expr *Second) { 14600 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14601 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14602 14603 if (First->getObjectKind() == OK_ObjCProperty) { 14604 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14605 if (BinaryOperator::isAssignmentOp(Opc)) 14606 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14607 First, Second); 14608 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14609 if (Result.isInvalid()) 14610 return ExprError(); 14611 First = Result.get(); 14612 } 14613 14614 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14615 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14616 if (Result.isInvalid()) 14617 return ExprError(); 14618 Second = Result.get(); 14619 } 14620 14621 // Determine whether this should be a builtin operation. 14622 if (Op == OO_Subscript) { 14623 if (!First->getType()->isOverloadableType() && 14624 !Second->getType()->isOverloadableType()) 14625 return getSema().CreateBuiltinArraySubscriptExpr( 14626 First, Callee->getBeginLoc(), Second, OpLoc); 14627 } else if (Op == OO_Arrow) { 14628 // -> is never a builtin operation. 14629 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14630 } else if (Second == nullptr || isPostIncDec) { 14631 if (!First->getType()->isOverloadableType() || 14632 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14633 // The argument is not of overloadable type, or this is an expression 14634 // of the form &Class::member, so try to create a built-in unary 14635 // operation. 14636 UnaryOperatorKind Opc 14637 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14638 14639 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14640 } 14641 } else { 14642 if (!First->getType()->isOverloadableType() && 14643 !Second->getType()->isOverloadableType()) { 14644 // Neither of the arguments is an overloadable type, so try to 14645 // create a built-in binary operation. 14646 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14647 ExprResult Result 14648 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14649 if (Result.isInvalid()) 14650 return ExprError(); 14651 14652 return Result; 14653 } 14654 } 14655 14656 // Compute the transformed set of functions (and function templates) to be 14657 // used during overload resolution. 14658 UnresolvedSet<16> Functions; 14659 bool RequiresADL; 14660 14661 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14662 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14663 // If the overload could not be resolved in the template definition 14664 // (because we had a dependent argument), ADL is performed as part of 14665 // template instantiation. 14666 RequiresADL = ULE->requiresADL(); 14667 } else { 14668 // If we've resolved this to a particular non-member function, just call 14669 // that function. If we resolved it to a member function, 14670 // CreateOverloaded* will find that function for us. 14671 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14672 if (!isa<CXXMethodDecl>(ND)) 14673 Functions.addDecl(ND); 14674 RequiresADL = false; 14675 } 14676 14677 // Add any functions found via argument-dependent lookup. 14678 Expr *Args[2] = { First, Second }; 14679 unsigned NumArgs = 1 + (Second != nullptr); 14680 14681 // Create the overloaded operator invocation for unary operators. 14682 if (NumArgs == 1 || isPostIncDec) { 14683 UnaryOperatorKind Opc 14684 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14685 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14686 RequiresADL); 14687 } 14688 14689 if (Op == OO_Subscript) { 14690 SourceLocation LBrace; 14691 SourceLocation RBrace; 14692 14693 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14694 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14695 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14696 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14697 } else { 14698 LBrace = Callee->getBeginLoc(); 14699 RBrace = OpLoc; 14700 } 14701 14702 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14703 First, Second); 14704 } 14705 14706 // Create the overloaded operator invocation for binary operators. 14707 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14708 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14709 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14710 if (Result.isInvalid()) 14711 return ExprError(); 14712 14713 return Result; 14714 } 14715 14716 template<typename Derived> 14717 ExprResult 14718 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14719 SourceLocation OperatorLoc, 14720 bool isArrow, 14721 CXXScopeSpec &SS, 14722 TypeSourceInfo *ScopeType, 14723 SourceLocation CCLoc, 14724 SourceLocation TildeLoc, 14725 PseudoDestructorTypeStorage Destroyed) { 14726 QualType BaseType = Base->getType(); 14727 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14728 (!isArrow && !BaseType->getAs<RecordType>()) || 14729 (isArrow && BaseType->getAs<PointerType>() && 14730 !BaseType->castAs<PointerType>()->getPointeeType() 14731 ->template getAs<RecordType>())){ 14732 // This pseudo-destructor expression is still a pseudo-destructor. 14733 return SemaRef.BuildPseudoDestructorExpr( 14734 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14735 CCLoc, TildeLoc, Destroyed); 14736 } 14737 14738 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14739 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14740 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14741 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14742 NameInfo.setNamedTypeInfo(DestroyedType); 14743 14744 // The scope type is now known to be a valid nested name specifier 14745 // component. Tack it on to the end of the nested name specifier. 14746 if (ScopeType) { 14747 if (!ScopeType->getType()->getAs<TagType>()) { 14748 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14749 diag::err_expected_class_or_namespace) 14750 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14751 return ExprError(); 14752 } 14753 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14754 CCLoc); 14755 } 14756 14757 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14758 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14759 OperatorLoc, isArrow, 14760 SS, TemplateKWLoc, 14761 /*FIXME: FirstQualifier*/ nullptr, 14762 NameInfo, 14763 /*TemplateArgs*/ nullptr, 14764 /*S*/nullptr); 14765 } 14766 14767 template<typename Derived> 14768 StmtResult 14769 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14770 SourceLocation Loc = S->getBeginLoc(); 14771 CapturedDecl *CD = S->getCapturedDecl(); 14772 unsigned NumParams = CD->getNumParams(); 14773 unsigned ContextParamPos = CD->getContextParamPosition(); 14774 SmallVector<Sema::CapturedParamNameType, 4> Params; 14775 for (unsigned I = 0; I < NumParams; ++I) { 14776 if (I != ContextParamPos) { 14777 Params.push_back( 14778 std::make_pair( 14779 CD->getParam(I)->getName(), 14780 getDerived().TransformType(CD->getParam(I)->getType()))); 14781 } else { 14782 Params.push_back(std::make_pair(StringRef(), QualType())); 14783 } 14784 } 14785 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14786 S->getCapturedRegionKind(), Params); 14787 StmtResult Body; 14788 { 14789 Sema::CompoundScopeRAII CompoundScope(getSema()); 14790 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14791 } 14792 14793 if (Body.isInvalid()) { 14794 getSema().ActOnCapturedRegionError(); 14795 return StmtError(); 14796 } 14797 14798 return getSema().ActOnCapturedRegionEnd(Body.get()); 14799 } 14800 14801 } // end namespace clang 14802 14803 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14804