1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprCXX.h" 23 #include "clang/AST/ExprObjC.h" 24 #include "clang/AST/ExprOpenMP.h" 25 #include "clang/AST/Stmt.h" 26 #include "clang/AST/StmtCXX.h" 27 #include "clang/AST/StmtObjC.h" 28 #include "clang/AST/StmtOpenMP.h" 29 #include "clang/Sema/Designator.h" 30 #include "clang/Sema/Lookup.h" 31 #include "clang/Sema/Ownership.h" 32 #include "clang/Sema/ParsedTemplate.h" 33 #include "clang/Sema/ScopeInfo.h" 34 #include "clang/Sema/SemaDiagnostic.h" 35 #include "clang/Sema/SemaInternal.h" 36 #include "llvm/ADT/ArrayRef.h" 37 #include "llvm/Support/ErrorHandling.h" 38 #include <algorithm> 39 40 namespace clang { 41 using namespace sema; 42 43 /// A semantic tree transformation that allows one to transform one 44 /// abstract syntax tree into another. 45 /// 46 /// A new tree transformation is defined by creating a new subclass \c X of 47 /// \c TreeTransform<X> and then overriding certain operations to provide 48 /// behavior specific to that transformation. For example, template 49 /// instantiation is implemented as a tree transformation where the 50 /// transformation of TemplateTypeParmType nodes involves substituting the 51 /// template arguments for their corresponding template parameters; a similar 52 /// transformation is performed for non-type template parameters and 53 /// template template parameters. 54 /// 55 /// This tree-transformation template uses static polymorphism to allow 56 /// subclasses to customize any of its operations. Thus, a subclass can 57 /// override any of the transformation or rebuild operators by providing an 58 /// operation with the same signature as the default implementation. The 59 /// overriding function should not be virtual. 60 /// 61 /// Semantic tree transformations are split into two stages, either of which 62 /// can be replaced by a subclass. The "transform" step transforms an AST node 63 /// or the parts of an AST node using the various transformation functions, 64 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 65 /// node of the appropriate kind from the pieces. The default transformation 66 /// routines recursively transform the operands to composite AST nodes (e.g., 67 /// the pointee type of a PointerType node) and, if any of those operand nodes 68 /// were changed by the transformation, invokes the rebuild operation to create 69 /// a new AST node. 70 /// 71 /// Subclasses can customize the transformation at various levels. The 72 /// most coarse-grained transformations involve replacing TransformType(), 73 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 74 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 75 /// new implementations. 76 /// 77 /// For more fine-grained transformations, subclasses can replace any of the 78 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 79 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 80 /// replacing TransformTemplateTypeParmType() allows template instantiation 81 /// to substitute template arguments for their corresponding template 82 /// parameters. Additionally, subclasses can override the \c RebuildXXX 83 /// functions to control how AST nodes are rebuilt when their operands change. 84 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 85 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 86 /// be able to use more efficient rebuild steps. 87 /// 88 /// There are a handful of other functions that can be overridden, allowing one 89 /// to avoid traversing nodes that don't need any transformation 90 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 91 /// operands have not changed (\c AlwaysRebuild()), and customize the 92 /// default locations and entity names used for type-checking 93 /// (\c getBaseLocation(), \c getBaseEntity()). 94 template<typename Derived> 95 class TreeTransform { 96 /// Private RAII object that helps us forget and then re-remember 97 /// the template argument corresponding to a partially-substituted parameter 98 /// pack. 99 class ForgetPartiallySubstitutedPackRAII { 100 Derived &Self; 101 TemplateArgument Old; 102 103 public: 104 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 105 Old = Self.ForgetPartiallySubstitutedPack(); 106 } 107 108 ~ForgetPartiallySubstitutedPackRAII() { 109 Self.RememberPartiallySubstitutedPack(Old); 110 } 111 }; 112 113 protected: 114 Sema &SemaRef; 115 116 /// The set of local declarations that have been transformed, for 117 /// cases where we are forced to build new declarations within the transformer 118 /// rather than in the subclass (e.g., lambda closure types). 119 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 120 121 public: 122 /// Initializes a new tree transformer. 123 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 124 125 /// Retrieves a reference to the derived class. 126 Derived &getDerived() { return static_cast<Derived&>(*this); } 127 128 /// Retrieves a reference to the derived class. 129 const Derived &getDerived() const { 130 return static_cast<const Derived&>(*this); 131 } 132 133 static inline ExprResult Owned(Expr *E) { return E; } 134 static inline StmtResult Owned(Stmt *S) { return S; } 135 136 /// Retrieves a reference to the semantic analysis object used for 137 /// this tree transform. 138 Sema &getSema() const { return SemaRef; } 139 140 /// Whether the transformation should always rebuild AST nodes, even 141 /// if none of the children have changed. 142 /// 143 /// Subclasses may override this function to specify when the transformation 144 /// should rebuild all AST nodes. 145 /// 146 /// We must always rebuild all AST nodes when performing variadic template 147 /// pack expansion, in order to avoid violating the AST invariant that each 148 /// statement node appears at most once in its containing declaration. 149 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 150 151 /// Returns the location of the entity being transformed, if that 152 /// information was not available elsewhere in the AST. 153 /// 154 /// By default, returns no source-location information. Subclasses can 155 /// provide an alternative implementation that provides better location 156 /// information. 157 SourceLocation getBaseLocation() { return SourceLocation(); } 158 159 /// Returns the name of the entity being transformed, if that 160 /// information was not available elsewhere in the AST. 161 /// 162 /// By default, returns an empty name. Subclasses can provide an alternative 163 /// implementation with a more precise name. 164 DeclarationName getBaseEntity() { return DeclarationName(); } 165 166 /// Sets the "base" location and entity when that 167 /// information is known based on another transformation. 168 /// 169 /// By default, the source location and entity are ignored. Subclasses can 170 /// override this function to provide a customized implementation. 171 void setBase(SourceLocation Loc, DeclarationName Entity) { } 172 173 /// RAII object that temporarily sets the base location and entity 174 /// used for reporting diagnostics in types. 175 class TemporaryBase { 176 TreeTransform &Self; 177 SourceLocation OldLocation; 178 DeclarationName OldEntity; 179 180 public: 181 TemporaryBase(TreeTransform &Self, SourceLocation Location, 182 DeclarationName Entity) : Self(Self) { 183 OldLocation = Self.getDerived().getBaseLocation(); 184 OldEntity = Self.getDerived().getBaseEntity(); 185 186 if (Location.isValid()) 187 Self.getDerived().setBase(Location, Entity); 188 } 189 190 ~TemporaryBase() { 191 Self.getDerived().setBase(OldLocation, OldEntity); 192 } 193 }; 194 195 /// Determine whether the given type \p T has already been 196 /// transformed. 197 /// 198 /// Subclasses can provide an alternative implementation of this routine 199 /// to short-circuit evaluation when it is known that a given type will 200 /// not change. For example, template instantiation need not traverse 201 /// non-dependent types. 202 bool AlreadyTransformed(QualType T) { 203 return T.isNull(); 204 } 205 206 /// Determine whether the given call argument should be dropped, e.g., 207 /// because it is a default argument. 208 /// 209 /// Subclasses can provide an alternative implementation of this routine to 210 /// determine which kinds of call arguments get dropped. By default, 211 /// CXXDefaultArgument nodes are dropped (prior to transformation). 212 bool DropCallArgument(Expr *E) { 213 return E->isDefaultArgument(); 214 } 215 216 /// Determine whether we should expand a pack expansion with the 217 /// given set of parameter packs into separate arguments by repeatedly 218 /// transforming the pattern. 219 /// 220 /// By default, the transformer never tries to expand pack expansions. 221 /// Subclasses can override this routine to provide different behavior. 222 /// 223 /// \param EllipsisLoc The location of the ellipsis that identifies the 224 /// pack expansion. 225 /// 226 /// \param PatternRange The source range that covers the entire pattern of 227 /// the pack expansion. 228 /// 229 /// \param Unexpanded The set of unexpanded parameter packs within the 230 /// pattern. 231 /// 232 /// \param ShouldExpand Will be set to \c true if the transformer should 233 /// expand the corresponding pack expansions into separate arguments. When 234 /// set, \c NumExpansions must also be set. 235 /// 236 /// \param RetainExpansion Whether the caller should add an unexpanded 237 /// pack expansion after all of the expanded arguments. This is used 238 /// when extending explicitly-specified template argument packs per 239 /// C++0x [temp.arg.explicit]p9. 240 /// 241 /// \param NumExpansions The number of separate arguments that will be in 242 /// the expanded form of the corresponding pack expansion. This is both an 243 /// input and an output parameter, which can be set by the caller if the 244 /// number of expansions is known a priori (e.g., due to a prior substitution) 245 /// and will be set by the callee when the number of expansions is known. 246 /// The callee must set this value when \c ShouldExpand is \c true; it may 247 /// set this value in other cases. 248 /// 249 /// \returns true if an error occurred (e.g., because the parameter packs 250 /// are to be instantiated with arguments of different lengths), false 251 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 252 /// must be set. 253 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 254 SourceRange PatternRange, 255 ArrayRef<UnexpandedParameterPack> Unexpanded, 256 bool &ShouldExpand, 257 bool &RetainExpansion, 258 Optional<unsigned> &NumExpansions) { 259 ShouldExpand = false; 260 return false; 261 } 262 263 /// "Forget" about the partially-substituted pack template argument, 264 /// when performing an instantiation that must preserve the parameter pack 265 /// use. 266 /// 267 /// This routine is meant to be overridden by the template instantiator. 268 TemplateArgument ForgetPartiallySubstitutedPack() { 269 return TemplateArgument(); 270 } 271 272 /// "Remember" the partially-substituted pack template argument 273 /// after performing an instantiation that must preserve the parameter pack 274 /// use. 275 /// 276 /// This routine is meant to be overridden by the template instantiator. 277 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 278 279 /// Note to the derived class when a function parameter pack is 280 /// being expanded. 281 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 282 283 /// Transforms the given type into another type. 284 /// 285 /// By default, this routine transforms a type by creating a 286 /// TypeSourceInfo for it and delegating to the appropriate 287 /// function. This is expensive, but we don't mind, because 288 /// this method is deprecated anyway; all users should be 289 /// switched to storing TypeSourceInfos. 290 /// 291 /// \returns the transformed type. 292 QualType TransformType(QualType T); 293 294 /// Transforms the given type-with-location into a new 295 /// type-with-location. 296 /// 297 /// By default, this routine transforms a type by delegating to the 298 /// appropriate TransformXXXType to build a new type. Subclasses 299 /// may override this function (to take over all type 300 /// transformations) or some set of the TransformXXXType functions 301 /// to alter the transformation. 302 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 303 304 /// Transform the given type-with-location into a new 305 /// type, collecting location information in the given builder 306 /// as necessary. 307 /// 308 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 309 310 /// Transform a type that is permitted to produce a 311 /// DeducedTemplateSpecializationType. 312 /// 313 /// This is used in the (relatively rare) contexts where it is acceptable 314 /// for transformation to produce a class template type with deduced 315 /// template arguments. 316 /// @{ 317 QualType TransformTypeWithDeducedTST(QualType T); 318 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 319 /// @} 320 321 /// The reason why the value of a statement is not discarded, if any. 322 enum StmtDiscardKind { 323 SDK_Discarded, 324 SDK_NotDiscarded, 325 SDK_StmtExprResult, 326 }; 327 328 /// Transform the given statement. 329 /// 330 /// By default, this routine transforms a statement by delegating to the 331 /// appropriate TransformXXXStmt function to transform a specific kind of 332 /// statement or the TransformExpr() function to transform an expression. 333 /// Subclasses may override this function to transform statements using some 334 /// other mechanism. 335 /// 336 /// \returns the transformed statement. 337 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 338 339 /// Transform the given statement. 340 /// 341 /// By default, this routine transforms a statement by delegating to the 342 /// appropriate TransformOMPXXXClause function to transform a specific kind 343 /// of clause. Subclasses may override this function to transform statements 344 /// using some other mechanism. 345 /// 346 /// \returns the transformed OpenMP clause. 347 OMPClause *TransformOMPClause(OMPClause *S); 348 349 /// Transform the given attribute. 350 /// 351 /// By default, this routine transforms a statement by delegating to the 352 /// appropriate TransformXXXAttr function to transform a specific kind 353 /// of attribute. Subclasses may override this function to transform 354 /// attributed statements using some other mechanism. 355 /// 356 /// \returns the transformed attribute 357 const Attr *TransformAttr(const Attr *S); 358 359 /// Transform the specified attribute. 360 /// 361 /// Subclasses should override the transformation of attributes with a pragma 362 /// spelling to transform expressions stored within the attribute. 363 /// 364 /// \returns the transformed attribute. 365 #define ATTR(X) 366 #define PRAGMA_SPELLING_ATTR(X) \ 367 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 368 #include "clang/Basic/AttrList.inc" 369 370 /// Transform the given expression. 371 /// 372 /// By default, this routine transforms an expression by delegating to the 373 /// appropriate TransformXXXExpr function to build a new expression. 374 /// Subclasses may override this function to transform expressions using some 375 /// other mechanism. 376 /// 377 /// \returns the transformed expression. 378 ExprResult TransformExpr(Expr *E); 379 380 /// Transform the given initializer. 381 /// 382 /// By default, this routine transforms an initializer by stripping off the 383 /// semantic nodes added by initialization, then passing the result to 384 /// TransformExpr or TransformExprs. 385 /// 386 /// \returns the transformed initializer. 387 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 388 389 /// Transform the given list of expressions. 390 /// 391 /// This routine transforms a list of expressions by invoking 392 /// \c TransformExpr() for each subexpression. However, it also provides 393 /// support for variadic templates by expanding any pack expansions (if the 394 /// derived class permits such expansion) along the way. When pack expansions 395 /// are present, the number of outputs may not equal the number of inputs. 396 /// 397 /// \param Inputs The set of expressions to be transformed. 398 /// 399 /// \param NumInputs The number of expressions in \c Inputs. 400 /// 401 /// \param IsCall If \c true, then this transform is being performed on 402 /// function-call arguments, and any arguments that should be dropped, will 403 /// be. 404 /// 405 /// \param Outputs The transformed input expressions will be added to this 406 /// vector. 407 /// 408 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 409 /// due to transformation. 410 /// 411 /// \returns true if an error occurred, false otherwise. 412 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 413 SmallVectorImpl<Expr *> &Outputs, 414 bool *ArgChanged = nullptr); 415 416 /// Transform the given declaration, which is referenced from a type 417 /// or expression. 418 /// 419 /// By default, acts as the identity function on declarations, unless the 420 /// transformer has had to transform the declaration itself. Subclasses 421 /// may override this function to provide alternate behavior. 422 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 423 llvm::DenseMap<Decl *, Decl *>::iterator Known 424 = TransformedLocalDecls.find(D); 425 if (Known != TransformedLocalDecls.end()) 426 return Known->second; 427 428 return D; 429 } 430 431 /// Transform the specified condition. 432 /// 433 /// By default, this transforms the variable and expression and rebuilds 434 /// the condition. 435 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 436 Expr *Expr, 437 Sema::ConditionKind Kind); 438 439 /// Transform the attributes associated with the given declaration and 440 /// place them on the new declaration. 441 /// 442 /// By default, this operation does nothing. Subclasses may override this 443 /// behavior to transform attributes. 444 void transformAttrs(Decl *Old, Decl *New) { } 445 446 /// Note that a local declaration has been transformed by this 447 /// transformer. 448 /// 449 /// Local declarations are typically transformed via a call to 450 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 451 /// the transformer itself has to transform the declarations. This routine 452 /// can be overridden by a subclass that keeps track of such mappings. 453 void transformedLocalDecl(Decl *Old, Decl *New) { 454 TransformedLocalDecls[Old] = New; 455 } 456 457 /// Transform the definition of the given declaration. 458 /// 459 /// By default, invokes TransformDecl() to transform the declaration. 460 /// Subclasses may override this function to provide alternate behavior. 461 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 462 return getDerived().TransformDecl(Loc, D); 463 } 464 465 /// Transform the given declaration, which was the first part of a 466 /// nested-name-specifier in a member access expression. 467 /// 468 /// This specific declaration transformation only applies to the first 469 /// identifier in a nested-name-specifier of a member access expression, e.g., 470 /// the \c T in \c x->T::member 471 /// 472 /// By default, invokes TransformDecl() to transform the declaration. 473 /// Subclasses may override this function to provide alternate behavior. 474 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 475 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 476 } 477 478 /// Transform the set of declarations in an OverloadExpr. 479 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 480 LookupResult &R); 481 482 /// Transform the given nested-name-specifier with source-location 483 /// information. 484 /// 485 /// By default, transforms all of the types and declarations within the 486 /// nested-name-specifier. Subclasses may override this function to provide 487 /// alternate behavior. 488 NestedNameSpecifierLoc 489 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 490 QualType ObjectType = QualType(), 491 NamedDecl *FirstQualifierInScope = nullptr); 492 493 /// Transform the given declaration name. 494 /// 495 /// By default, transforms the types of conversion function, constructor, 496 /// and destructor names and then (if needed) rebuilds the declaration name. 497 /// Identifiers and selectors are returned unmodified. Sublcasses may 498 /// override this function to provide alternate behavior. 499 DeclarationNameInfo 500 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 501 502 /// Transform the given template name. 503 /// 504 /// \param SS The nested-name-specifier that qualifies the template 505 /// name. This nested-name-specifier must already have been transformed. 506 /// 507 /// \param Name The template name to transform. 508 /// 509 /// \param NameLoc The source location of the template name. 510 /// 511 /// \param ObjectType If we're translating a template name within a member 512 /// access expression, this is the type of the object whose member template 513 /// is being referenced. 514 /// 515 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 516 /// also refers to a name within the current (lexical) scope, this is the 517 /// declaration it refers to. 518 /// 519 /// By default, transforms the template name by transforming the declarations 520 /// and nested-name-specifiers that occur within the template name. 521 /// Subclasses may override this function to provide alternate behavior. 522 TemplateName 523 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 524 SourceLocation NameLoc, 525 QualType ObjectType = QualType(), 526 NamedDecl *FirstQualifierInScope = nullptr, 527 bool AllowInjectedClassName = false); 528 529 /// Transform the given template argument. 530 /// 531 /// By default, this operation transforms the type, expression, or 532 /// declaration stored within the template argument and constructs a 533 /// new template argument from the transformed result. Subclasses may 534 /// override this function to provide alternate behavior. 535 /// 536 /// Returns true if there was an error. 537 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 538 TemplateArgumentLoc &Output, 539 bool Uneval = false); 540 541 /// Transform the given set of template arguments. 542 /// 543 /// By default, this operation transforms all of the template arguments 544 /// in the input set using \c TransformTemplateArgument(), and appends 545 /// the transformed arguments to the output list. 546 /// 547 /// Note that this overload of \c TransformTemplateArguments() is merely 548 /// a convenience function. Subclasses that wish to override this behavior 549 /// should override the iterator-based member template version. 550 /// 551 /// \param Inputs The set of template arguments to be transformed. 552 /// 553 /// \param NumInputs The number of template arguments in \p Inputs. 554 /// 555 /// \param Outputs The set of transformed template arguments output by this 556 /// routine. 557 /// 558 /// Returns true if an error occurred. 559 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 560 unsigned NumInputs, 561 TemplateArgumentListInfo &Outputs, 562 bool Uneval = false) { 563 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 564 Uneval); 565 } 566 567 /// Transform the given set of template arguments. 568 /// 569 /// By default, this operation transforms all of the template arguments 570 /// in the input set using \c TransformTemplateArgument(), and appends 571 /// the transformed arguments to the output list. 572 /// 573 /// \param First An iterator to the first template argument. 574 /// 575 /// \param Last An iterator one step past the last template argument. 576 /// 577 /// \param Outputs The set of transformed template arguments output by this 578 /// routine. 579 /// 580 /// Returns true if an error occurred. 581 template<typename InputIterator> 582 bool TransformTemplateArguments(InputIterator First, 583 InputIterator Last, 584 TemplateArgumentListInfo &Outputs, 585 bool Uneval = false); 586 587 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 588 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 589 TemplateArgumentLoc &ArgLoc); 590 591 /// Fakes up a TypeSourceInfo for a type. 592 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 593 return SemaRef.Context.getTrivialTypeSourceInfo(T, 594 getDerived().getBaseLocation()); 595 } 596 597 #define ABSTRACT_TYPELOC(CLASS, PARENT) 598 #define TYPELOC(CLASS, PARENT) \ 599 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 600 #include "clang/AST/TypeLocNodes.def" 601 602 template<typename Fn> 603 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 604 FunctionProtoTypeLoc TL, 605 CXXRecordDecl *ThisContext, 606 Qualifiers ThisTypeQuals, 607 Fn TransformExceptionSpec); 608 609 bool TransformExceptionSpec(SourceLocation Loc, 610 FunctionProtoType::ExceptionSpecInfo &ESI, 611 SmallVectorImpl<QualType> &Exceptions, 612 bool &Changed); 613 614 StmtResult TransformSEHHandler(Stmt *Handler); 615 616 QualType 617 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 618 TemplateSpecializationTypeLoc TL, 619 TemplateName Template); 620 621 QualType 622 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 623 DependentTemplateSpecializationTypeLoc TL, 624 TemplateName Template, 625 CXXScopeSpec &SS); 626 627 QualType TransformDependentTemplateSpecializationType( 628 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 629 NestedNameSpecifierLoc QualifierLoc); 630 631 /// Transforms the parameters of a function type into the 632 /// given vectors. 633 /// 634 /// The result vectors should be kept in sync; null entries in the 635 /// variables vector are acceptable. 636 /// 637 /// Return true on error. 638 bool TransformFunctionTypeParams( 639 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 640 const QualType *ParamTypes, 641 const FunctionProtoType::ExtParameterInfo *ParamInfos, 642 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 643 Sema::ExtParameterInfoBuilder &PInfos); 644 645 /// Transforms a single function-type parameter. Return null 646 /// on error. 647 /// 648 /// \param indexAdjustment - A number to add to the parameter's 649 /// scope index; can be negative 650 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 651 int indexAdjustment, 652 Optional<unsigned> NumExpansions, 653 bool ExpectParameterPack); 654 655 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 656 657 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 658 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 659 660 TemplateParameterList *TransformTemplateParameterList( 661 TemplateParameterList *TPL) { 662 return TPL; 663 } 664 665 ExprResult TransformAddressOfOperand(Expr *E); 666 667 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 668 bool IsAddressOfOperand, 669 TypeSourceInfo **RecoveryTSI); 670 671 ExprResult TransformParenDependentScopeDeclRefExpr( 672 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 673 TypeSourceInfo **RecoveryTSI); 674 675 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 676 677 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 678 // amount of stack usage with clang. 679 #define STMT(Node, Parent) \ 680 LLVM_ATTRIBUTE_NOINLINE \ 681 StmtResult Transform##Node(Node *S); 682 #define VALUESTMT(Node, Parent) \ 683 LLVM_ATTRIBUTE_NOINLINE \ 684 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 685 #define EXPR(Node, Parent) \ 686 LLVM_ATTRIBUTE_NOINLINE \ 687 ExprResult Transform##Node(Node *E); 688 #define ABSTRACT_STMT(Stmt) 689 #include "clang/AST/StmtNodes.inc" 690 691 #define OPENMP_CLAUSE(Name, Class) \ 692 LLVM_ATTRIBUTE_NOINLINE \ 693 OMPClause *Transform ## Class(Class *S); 694 #include "clang/Basic/OpenMPKinds.def" 695 696 /// Build a new qualified type given its unqualified type and type location. 697 /// 698 /// By default, this routine adds type qualifiers only to types that can 699 /// have qualifiers, and silently suppresses those qualifiers that are not 700 /// permitted. Subclasses may override this routine to provide different 701 /// behavior. 702 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 703 704 /// Build a new pointer type given its pointee type. 705 /// 706 /// By default, performs semantic analysis when building the pointer type. 707 /// Subclasses may override this routine to provide different behavior. 708 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 709 710 /// Build a new block pointer type given its pointee type. 711 /// 712 /// By default, performs semantic analysis when building the block pointer 713 /// type. Subclasses may override this routine to provide different behavior. 714 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 715 716 /// Build a new reference type given the type it references. 717 /// 718 /// By default, performs semantic analysis when building the 719 /// reference type. Subclasses may override this routine to provide 720 /// different behavior. 721 /// 722 /// \param LValue whether the type was written with an lvalue sigil 723 /// or an rvalue sigil. 724 QualType RebuildReferenceType(QualType ReferentType, 725 bool LValue, 726 SourceLocation Sigil); 727 728 /// Build a new member pointer type given the pointee type and the 729 /// class type it refers into. 730 /// 731 /// By default, performs semantic analysis when building the member pointer 732 /// type. Subclasses may override this routine to provide different behavior. 733 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 734 SourceLocation Sigil); 735 736 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 737 SourceLocation ProtocolLAngleLoc, 738 ArrayRef<ObjCProtocolDecl *> Protocols, 739 ArrayRef<SourceLocation> ProtocolLocs, 740 SourceLocation ProtocolRAngleLoc); 741 742 /// Build an Objective-C object type. 743 /// 744 /// By default, performs semantic analysis when building the object type. 745 /// Subclasses may override this routine to provide different behavior. 746 QualType RebuildObjCObjectType(QualType BaseType, 747 SourceLocation Loc, 748 SourceLocation TypeArgsLAngleLoc, 749 ArrayRef<TypeSourceInfo *> TypeArgs, 750 SourceLocation TypeArgsRAngleLoc, 751 SourceLocation ProtocolLAngleLoc, 752 ArrayRef<ObjCProtocolDecl *> Protocols, 753 ArrayRef<SourceLocation> ProtocolLocs, 754 SourceLocation ProtocolRAngleLoc); 755 756 /// Build a new Objective-C object pointer type given the pointee type. 757 /// 758 /// By default, directly builds the pointer type, with no additional semantic 759 /// analysis. 760 QualType RebuildObjCObjectPointerType(QualType PointeeType, 761 SourceLocation Star); 762 763 /// Build a new array type given the element type, size 764 /// modifier, size of the array (if known), size expression, and index type 765 /// qualifiers. 766 /// 767 /// By default, performs semantic analysis when building the array type. 768 /// Subclasses may override this routine to provide different behavior. 769 /// Also by default, all of the other Rebuild*Array 770 QualType RebuildArrayType(QualType ElementType, 771 ArrayType::ArraySizeModifier SizeMod, 772 const llvm::APInt *Size, 773 Expr *SizeExpr, 774 unsigned IndexTypeQuals, 775 SourceRange BracketsRange); 776 777 /// Build a new constant array type given the element type, size 778 /// modifier, (known) size of the array, and index type qualifiers. 779 /// 780 /// By default, performs semantic analysis when building the array type. 781 /// Subclasses may override this routine to provide different behavior. 782 QualType RebuildConstantArrayType(QualType ElementType, 783 ArrayType::ArraySizeModifier SizeMod, 784 const llvm::APInt &Size, 785 unsigned IndexTypeQuals, 786 SourceRange BracketsRange); 787 788 /// Build a new incomplete array type given the element type, size 789 /// modifier, and index type qualifiers. 790 /// 791 /// By default, performs semantic analysis when building the array type. 792 /// Subclasses may override this routine to provide different behavior. 793 QualType RebuildIncompleteArrayType(QualType ElementType, 794 ArrayType::ArraySizeModifier SizeMod, 795 unsigned IndexTypeQuals, 796 SourceRange BracketsRange); 797 798 /// Build a new variable-length array type given the element type, 799 /// size modifier, size expression, and index type qualifiers. 800 /// 801 /// By default, performs semantic analysis when building the array type. 802 /// Subclasses may override this routine to provide different behavior. 803 QualType RebuildVariableArrayType(QualType ElementType, 804 ArrayType::ArraySizeModifier SizeMod, 805 Expr *SizeExpr, 806 unsigned IndexTypeQuals, 807 SourceRange BracketsRange); 808 809 /// Build a new dependent-sized array type given the element type, 810 /// size modifier, size expression, and index type qualifiers. 811 /// 812 /// By default, performs semantic analysis when building the array type. 813 /// Subclasses may override this routine to provide different behavior. 814 QualType RebuildDependentSizedArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 Expr *SizeExpr, 817 unsigned IndexTypeQuals, 818 SourceRange BracketsRange); 819 820 /// Build a new vector type given the element type and 821 /// number of elements. 822 /// 823 /// By default, performs semantic analysis when building the vector type. 824 /// Subclasses may override this routine to provide different behavior. 825 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 826 VectorType::VectorKind VecKind); 827 828 /// Build a new potentially dependently-sized extended vector type 829 /// given the element type and number of elements. 830 /// 831 /// By default, performs semantic analysis when building the vector type. 832 /// Subclasses may override this routine to provide different behavior. 833 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 834 SourceLocation AttributeLoc, 835 VectorType::VectorKind); 836 837 /// Build a new extended vector type given the element type and 838 /// number of elements. 839 /// 840 /// By default, performs semantic analysis when building the vector type. 841 /// Subclasses may override this routine to provide different behavior. 842 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 843 SourceLocation AttributeLoc); 844 845 /// Build a new potentially dependently-sized extended vector type 846 /// given the element type and number of elements. 847 /// 848 /// By default, performs semantic analysis when building the vector type. 849 /// Subclasses may override this routine to provide different behavior. 850 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 851 Expr *SizeExpr, 852 SourceLocation AttributeLoc); 853 854 /// Build a new DependentAddressSpaceType or return the pointee 855 /// type variable with the correct address space (retrieved from 856 /// AddrSpaceExpr) applied to it. The former will be returned in cases 857 /// where the address space remains dependent. 858 /// 859 /// By default, performs semantic analysis when building the type with address 860 /// space applied. Subclasses may override this routine to provide different 861 /// behavior. 862 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 863 Expr *AddrSpaceExpr, 864 SourceLocation AttributeLoc); 865 866 /// Build a new function type. 867 /// 868 /// By default, performs semantic analysis when building the function type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildFunctionProtoType(QualType T, 871 MutableArrayRef<QualType> ParamTypes, 872 const FunctionProtoType::ExtProtoInfo &EPI); 873 874 /// Build a new unprototyped function type. 875 QualType RebuildFunctionNoProtoType(QualType ResultType); 876 877 /// Rebuild an unresolved typename type, given the decl that 878 /// the UnresolvedUsingTypenameDecl was transformed to. 879 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 880 881 /// Build a new typedef type. 882 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 883 return SemaRef.Context.getTypeDeclType(Typedef); 884 } 885 886 /// Build a new class/struct/union type. 887 QualType RebuildRecordType(RecordDecl *Record) { 888 return SemaRef.Context.getTypeDeclType(Record); 889 } 890 891 /// Build a new Enum type. 892 QualType RebuildEnumType(EnumDecl *Enum) { 893 return SemaRef.Context.getTypeDeclType(Enum); 894 } 895 896 /// Build a new typeof(expr) type. 897 /// 898 /// By default, performs semantic analysis when building the typeof type. 899 /// Subclasses may override this routine to provide different behavior. 900 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 901 902 /// Build a new typeof(type) type. 903 /// 904 /// By default, builds a new TypeOfType with the given underlying type. 905 QualType RebuildTypeOfType(QualType Underlying); 906 907 /// Build a new unary transform type. 908 QualType RebuildUnaryTransformType(QualType BaseType, 909 UnaryTransformType::UTTKind UKind, 910 SourceLocation Loc); 911 912 /// Build a new C++11 decltype type. 913 /// 914 /// By default, performs semantic analysis when building the decltype type. 915 /// Subclasses may override this routine to provide different behavior. 916 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 917 918 /// Build a new C++11 auto type. 919 /// 920 /// By default, builds a new AutoType with the given deduced type. 921 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 922 // Note, IsDependent is always false here: we implicitly convert an 'auto' 923 // which has been deduced to a dependent type into an undeduced 'auto', so 924 // that we'll retry deduction after the transformation. 925 return SemaRef.Context.getAutoType(Deduced, Keyword, 926 /*IsDependent*/ false); 927 } 928 929 /// By default, builds a new DeducedTemplateSpecializationType with the given 930 /// deduced type. 931 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 932 QualType Deduced) { 933 return SemaRef.Context.getDeducedTemplateSpecializationType( 934 Template, Deduced, /*IsDependent*/ false); 935 } 936 937 /// Build a new template specialization type. 938 /// 939 /// By default, performs semantic analysis when building the template 940 /// specialization type. Subclasses may override this routine to provide 941 /// different behavior. 942 QualType RebuildTemplateSpecializationType(TemplateName Template, 943 SourceLocation TemplateLoc, 944 TemplateArgumentListInfo &Args); 945 946 /// Build a new parenthesized type. 947 /// 948 /// By default, builds a new ParenType type from the inner type. 949 /// Subclasses may override this routine to provide different behavior. 950 QualType RebuildParenType(QualType InnerType) { 951 return SemaRef.BuildParenType(InnerType); 952 } 953 954 /// Build a new qualified name type. 955 /// 956 /// By default, builds a new ElaboratedType type from the keyword, 957 /// the nested-name-specifier and the named type. 958 /// Subclasses may override this routine to provide different behavior. 959 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 960 ElaboratedTypeKeyword Keyword, 961 NestedNameSpecifierLoc QualifierLoc, 962 QualType Named) { 963 return SemaRef.Context.getElaboratedType(Keyword, 964 QualifierLoc.getNestedNameSpecifier(), 965 Named); 966 } 967 968 /// Build a new typename type that refers to a template-id. 969 /// 970 /// By default, builds a new DependentNameType type from the 971 /// nested-name-specifier and the given type. Subclasses may override 972 /// this routine to provide different behavior. 973 QualType RebuildDependentTemplateSpecializationType( 974 ElaboratedTypeKeyword Keyword, 975 NestedNameSpecifierLoc QualifierLoc, 976 SourceLocation TemplateKWLoc, 977 const IdentifierInfo *Name, 978 SourceLocation NameLoc, 979 TemplateArgumentListInfo &Args, 980 bool AllowInjectedClassName) { 981 // Rebuild the template name. 982 // TODO: avoid TemplateName abstraction 983 CXXScopeSpec SS; 984 SS.Adopt(QualifierLoc); 985 TemplateName InstName = getDerived().RebuildTemplateName( 986 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 987 AllowInjectedClassName); 988 989 if (InstName.isNull()) 990 return QualType(); 991 992 // If it's still dependent, make a dependent specialization. 993 if (InstName.getAsDependentTemplateName()) 994 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 995 QualifierLoc.getNestedNameSpecifier(), 996 Name, 997 Args); 998 999 // Otherwise, make an elaborated type wrapping a non-dependent 1000 // specialization. 1001 QualType T = 1002 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1003 if (T.isNull()) return QualType(); 1004 1005 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1006 return T; 1007 1008 return SemaRef.Context.getElaboratedType(Keyword, 1009 QualifierLoc.getNestedNameSpecifier(), 1010 T); 1011 } 1012 1013 /// Build a new typename type that refers to an identifier. 1014 /// 1015 /// By default, performs semantic analysis when building the typename type 1016 /// (or elaborated type). Subclasses may override this routine to provide 1017 /// different behavior. 1018 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1019 SourceLocation KeywordLoc, 1020 NestedNameSpecifierLoc QualifierLoc, 1021 const IdentifierInfo *Id, 1022 SourceLocation IdLoc, 1023 bool DeducedTSTContext) { 1024 CXXScopeSpec SS; 1025 SS.Adopt(QualifierLoc); 1026 1027 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1028 // If the name is still dependent, just build a new dependent name type. 1029 if (!SemaRef.computeDeclContext(SS)) 1030 return SemaRef.Context.getDependentNameType(Keyword, 1031 QualifierLoc.getNestedNameSpecifier(), 1032 Id); 1033 } 1034 1035 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1036 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1037 *Id, IdLoc); 1038 // If a dependent name resolves to a deduced template specialization type, 1039 // check that we're in one of the syntactic contexts permitting it. 1040 if (!DeducedTSTContext) { 1041 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1042 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1043 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1044 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1045 Deduced->getTemplateName()) 1046 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1047 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1048 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1049 return QualType(); 1050 } 1051 } 1052 return T; 1053 } 1054 1055 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1056 1057 // We had a dependent elaborated-type-specifier that has been transformed 1058 // into a non-dependent elaborated-type-specifier. Find the tag we're 1059 // referring to. 1060 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1061 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1062 if (!DC) 1063 return QualType(); 1064 1065 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1066 return QualType(); 1067 1068 TagDecl *Tag = nullptr; 1069 SemaRef.LookupQualifiedName(Result, DC); 1070 switch (Result.getResultKind()) { 1071 case LookupResult::NotFound: 1072 case LookupResult::NotFoundInCurrentInstantiation: 1073 break; 1074 1075 case LookupResult::Found: 1076 Tag = Result.getAsSingle<TagDecl>(); 1077 break; 1078 1079 case LookupResult::FoundOverloaded: 1080 case LookupResult::FoundUnresolvedValue: 1081 llvm_unreachable("Tag lookup cannot find non-tags"); 1082 1083 case LookupResult::Ambiguous: 1084 // Let the LookupResult structure handle ambiguities. 1085 return QualType(); 1086 } 1087 1088 if (!Tag) { 1089 // Check where the name exists but isn't a tag type and use that to emit 1090 // better diagnostics. 1091 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1092 SemaRef.LookupQualifiedName(Result, DC); 1093 switch (Result.getResultKind()) { 1094 case LookupResult::Found: 1095 case LookupResult::FoundOverloaded: 1096 case LookupResult::FoundUnresolvedValue: { 1097 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1098 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1099 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1100 << NTK << Kind; 1101 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1102 break; 1103 } 1104 default: 1105 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1106 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1107 break; 1108 } 1109 return QualType(); 1110 } 1111 1112 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1113 IdLoc, Id)) { 1114 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1115 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1116 return QualType(); 1117 } 1118 1119 // Build the elaborated-type-specifier type. 1120 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1121 return SemaRef.Context.getElaboratedType(Keyword, 1122 QualifierLoc.getNestedNameSpecifier(), 1123 T); 1124 } 1125 1126 /// Build a new pack expansion type. 1127 /// 1128 /// By default, builds a new PackExpansionType type from the given pattern. 1129 /// Subclasses may override this routine to provide different behavior. 1130 QualType RebuildPackExpansionType(QualType Pattern, 1131 SourceRange PatternRange, 1132 SourceLocation EllipsisLoc, 1133 Optional<unsigned> NumExpansions) { 1134 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1135 NumExpansions); 1136 } 1137 1138 /// Build a new atomic type given its value type. 1139 /// 1140 /// By default, performs semantic analysis when building the atomic type. 1141 /// Subclasses may override this routine to provide different behavior. 1142 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1143 1144 /// Build a new pipe type given its value type. 1145 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1146 bool isReadPipe); 1147 1148 /// Build a new template name given a nested name specifier, a flag 1149 /// indicating whether the "template" keyword was provided, and the template 1150 /// that the template name refers to. 1151 /// 1152 /// By default, builds the new template name directly. Subclasses may override 1153 /// this routine to provide different behavior. 1154 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1155 bool TemplateKW, 1156 TemplateDecl *Template); 1157 1158 /// Build a new template name given a nested name specifier and the 1159 /// name that is referred to as a template. 1160 /// 1161 /// By default, performs semantic analysis to determine whether the name can 1162 /// be resolved to a specific template, then builds the appropriate kind of 1163 /// template name. Subclasses may override this routine to provide different 1164 /// behavior. 1165 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1166 SourceLocation TemplateKWLoc, 1167 const IdentifierInfo &Name, 1168 SourceLocation NameLoc, QualType ObjectType, 1169 NamedDecl *FirstQualifierInScope, 1170 bool AllowInjectedClassName); 1171 1172 /// Build a new template name given a nested name specifier and the 1173 /// overloaded operator name that is referred to as a template. 1174 /// 1175 /// By default, performs semantic analysis to determine whether the name can 1176 /// be resolved to a specific template, then builds the appropriate kind of 1177 /// template name. Subclasses may override this routine to provide different 1178 /// behavior. 1179 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1180 SourceLocation TemplateKWLoc, 1181 OverloadedOperatorKind Operator, 1182 SourceLocation NameLoc, QualType ObjectType, 1183 bool AllowInjectedClassName); 1184 1185 /// Build a new template name given a template template parameter pack 1186 /// and the 1187 /// 1188 /// By default, performs semantic analysis to determine whether the name can 1189 /// be resolved to a specific template, then builds the appropriate kind of 1190 /// template name. Subclasses may override this routine to provide different 1191 /// behavior. 1192 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1193 const TemplateArgument &ArgPack) { 1194 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1195 } 1196 1197 /// Build a new compound statement. 1198 /// 1199 /// By default, performs semantic analysis to build the new statement. 1200 /// Subclasses may override this routine to provide different behavior. 1201 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1202 MultiStmtArg Statements, 1203 SourceLocation RBraceLoc, 1204 bool IsStmtExpr) { 1205 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1206 IsStmtExpr); 1207 } 1208 1209 /// Build a new case statement. 1210 /// 1211 /// By default, performs semantic analysis to build the new statement. 1212 /// Subclasses may override this routine to provide different behavior. 1213 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1214 Expr *LHS, 1215 SourceLocation EllipsisLoc, 1216 Expr *RHS, 1217 SourceLocation ColonLoc) { 1218 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1219 ColonLoc); 1220 } 1221 1222 /// Attach the body to a new case statement. 1223 /// 1224 /// By default, performs semantic analysis to build the new statement. 1225 /// Subclasses may override this routine to provide different behavior. 1226 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1227 getSema().ActOnCaseStmtBody(S, Body); 1228 return S; 1229 } 1230 1231 /// Build a new default statement. 1232 /// 1233 /// By default, performs semantic analysis to build the new statement. 1234 /// Subclasses may override this routine to provide different behavior. 1235 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1236 SourceLocation ColonLoc, 1237 Stmt *SubStmt) { 1238 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1239 /*CurScope=*/nullptr); 1240 } 1241 1242 /// Build a new label statement. 1243 /// 1244 /// By default, performs semantic analysis to build the new statement. 1245 /// Subclasses may override this routine to provide different behavior. 1246 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1247 SourceLocation ColonLoc, Stmt *SubStmt) { 1248 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1249 } 1250 1251 /// Build a new label statement. 1252 /// 1253 /// By default, performs semantic analysis to build the new statement. 1254 /// Subclasses may override this routine to provide different behavior. 1255 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1256 ArrayRef<const Attr*> Attrs, 1257 Stmt *SubStmt) { 1258 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1259 } 1260 1261 /// Build a new "if" statement. 1262 /// 1263 /// By default, performs semantic analysis to build the new statement. 1264 /// Subclasses may override this routine to provide different behavior. 1265 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1266 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1267 SourceLocation ElseLoc, Stmt *Else) { 1268 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1269 ElseLoc, Else); 1270 } 1271 1272 /// Start building a new switch statement. 1273 /// 1274 /// By default, performs semantic analysis to build the new statement. 1275 /// Subclasses may override this routine to provide different behavior. 1276 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1277 Sema::ConditionResult Cond) { 1278 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1279 } 1280 1281 /// Attach the body to the switch statement. 1282 /// 1283 /// By default, performs semantic analysis to build the new statement. 1284 /// Subclasses may override this routine to provide different behavior. 1285 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1286 Stmt *Switch, Stmt *Body) { 1287 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1288 } 1289 1290 /// Build a new while statement. 1291 /// 1292 /// By default, performs semantic analysis to build the new statement. 1293 /// Subclasses may override this routine to provide different behavior. 1294 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1295 Sema::ConditionResult Cond, Stmt *Body) { 1296 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1297 } 1298 1299 /// Build a new do-while statement. 1300 /// 1301 /// By default, performs semantic analysis to build the new statement. 1302 /// Subclasses may override this routine to provide different behavior. 1303 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1304 SourceLocation WhileLoc, SourceLocation LParenLoc, 1305 Expr *Cond, SourceLocation RParenLoc) { 1306 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1307 Cond, RParenLoc); 1308 } 1309 1310 /// Build a new for statement. 1311 /// 1312 /// By default, performs semantic analysis to build the new statement. 1313 /// Subclasses may override this routine to provide different behavior. 1314 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1315 Stmt *Init, Sema::ConditionResult Cond, 1316 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1317 Stmt *Body) { 1318 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1319 Inc, RParenLoc, Body); 1320 } 1321 1322 /// Build a new goto statement. 1323 /// 1324 /// By default, performs semantic analysis to build the new statement. 1325 /// Subclasses may override this routine to provide different behavior. 1326 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1327 LabelDecl *Label) { 1328 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1329 } 1330 1331 /// Build a new indirect goto statement. 1332 /// 1333 /// By default, performs semantic analysis to build the new statement. 1334 /// Subclasses may override this routine to provide different behavior. 1335 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1336 SourceLocation StarLoc, 1337 Expr *Target) { 1338 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1339 } 1340 1341 /// Build a new return statement. 1342 /// 1343 /// By default, performs semantic analysis to build the new statement. 1344 /// Subclasses may override this routine to provide different behavior. 1345 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1346 return getSema().BuildReturnStmt(ReturnLoc, Result); 1347 } 1348 1349 /// Build a new declaration statement. 1350 /// 1351 /// By default, performs semantic analysis to build the new statement. 1352 /// Subclasses may override this routine to provide different behavior. 1353 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1354 SourceLocation StartLoc, SourceLocation EndLoc) { 1355 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1356 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1357 } 1358 1359 /// Build a new inline asm statement. 1360 /// 1361 /// By default, performs semantic analysis to build the new statement. 1362 /// Subclasses may override this routine to provide different behavior. 1363 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1364 bool IsVolatile, unsigned NumOutputs, 1365 unsigned NumInputs, IdentifierInfo **Names, 1366 MultiExprArg Constraints, MultiExprArg Exprs, 1367 Expr *AsmString, MultiExprArg Clobbers, 1368 SourceLocation RParenLoc) { 1369 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1370 NumInputs, Names, Constraints, Exprs, 1371 AsmString, Clobbers, RParenLoc); 1372 } 1373 1374 /// Build a new MS style inline asm statement. 1375 /// 1376 /// By default, performs semantic analysis to build the new statement. 1377 /// Subclasses may override this routine to provide different behavior. 1378 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1379 ArrayRef<Token> AsmToks, 1380 StringRef AsmString, 1381 unsigned NumOutputs, unsigned NumInputs, 1382 ArrayRef<StringRef> Constraints, 1383 ArrayRef<StringRef> Clobbers, 1384 ArrayRef<Expr*> Exprs, 1385 SourceLocation EndLoc) { 1386 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1387 NumOutputs, NumInputs, 1388 Constraints, Clobbers, Exprs, EndLoc); 1389 } 1390 1391 /// Build a new co_return statement. 1392 /// 1393 /// By default, performs semantic analysis to build the new statement. 1394 /// Subclasses may override this routine to provide different behavior. 1395 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1396 bool IsImplicit) { 1397 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1398 } 1399 1400 /// Build a new co_await expression. 1401 /// 1402 /// By default, performs semantic analysis to build the new expression. 1403 /// Subclasses may override this routine to provide different behavior. 1404 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1405 bool IsImplicit) { 1406 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1407 } 1408 1409 /// Build a new co_await expression. 1410 /// 1411 /// By default, performs semantic analysis to build the new expression. 1412 /// Subclasses may override this routine to provide different behavior. 1413 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1414 Expr *Result, 1415 UnresolvedLookupExpr *Lookup) { 1416 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1417 } 1418 1419 /// Build a new co_yield expression. 1420 /// 1421 /// By default, performs semantic analysis to build the new expression. 1422 /// Subclasses may override this routine to provide different behavior. 1423 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1424 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1425 } 1426 1427 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1428 return getSema().BuildCoroutineBodyStmt(Args); 1429 } 1430 1431 /// Build a new Objective-C \@try statement. 1432 /// 1433 /// By default, performs semantic analysis to build the new statement. 1434 /// Subclasses may override this routine to provide different behavior. 1435 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1436 Stmt *TryBody, 1437 MultiStmtArg CatchStmts, 1438 Stmt *Finally) { 1439 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1440 Finally); 1441 } 1442 1443 /// Rebuild an Objective-C exception declaration. 1444 /// 1445 /// By default, performs semantic analysis to build the new declaration. 1446 /// Subclasses may override this routine to provide different behavior. 1447 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1448 TypeSourceInfo *TInfo, QualType T) { 1449 return getSema().BuildObjCExceptionDecl(TInfo, T, 1450 ExceptionDecl->getInnerLocStart(), 1451 ExceptionDecl->getLocation(), 1452 ExceptionDecl->getIdentifier()); 1453 } 1454 1455 /// Build a new Objective-C \@catch statement. 1456 /// 1457 /// By default, performs semantic analysis to build the new statement. 1458 /// Subclasses may override this routine to provide different behavior. 1459 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1460 SourceLocation RParenLoc, 1461 VarDecl *Var, 1462 Stmt *Body) { 1463 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1464 Var, Body); 1465 } 1466 1467 /// Build a new Objective-C \@finally statement. 1468 /// 1469 /// By default, performs semantic analysis to build the new statement. 1470 /// Subclasses may override this routine to provide different behavior. 1471 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1472 Stmt *Body) { 1473 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1474 } 1475 1476 /// Build a new Objective-C \@throw statement. 1477 /// 1478 /// By default, performs semantic analysis to build the new statement. 1479 /// Subclasses may override this routine to provide different behavior. 1480 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1481 Expr *Operand) { 1482 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1483 } 1484 1485 /// Build a new OpenMP executable directive. 1486 /// 1487 /// By default, performs semantic analysis to build the new statement. 1488 /// Subclasses may override this routine to provide different behavior. 1489 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1490 DeclarationNameInfo DirName, 1491 OpenMPDirectiveKind CancelRegion, 1492 ArrayRef<OMPClause *> Clauses, 1493 Stmt *AStmt, SourceLocation StartLoc, 1494 SourceLocation EndLoc) { 1495 return getSema().ActOnOpenMPExecutableDirective( 1496 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1497 } 1498 1499 /// Build a new OpenMP 'if' clause. 1500 /// 1501 /// By default, performs semantic analysis to build the new OpenMP clause. 1502 /// Subclasses may override this routine to provide different behavior. 1503 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1504 Expr *Condition, SourceLocation StartLoc, 1505 SourceLocation LParenLoc, 1506 SourceLocation NameModifierLoc, 1507 SourceLocation ColonLoc, 1508 SourceLocation EndLoc) { 1509 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1510 LParenLoc, NameModifierLoc, ColonLoc, 1511 EndLoc); 1512 } 1513 1514 /// Build a new OpenMP 'final' clause. 1515 /// 1516 /// By default, performs semantic analysis to build the new OpenMP clause. 1517 /// Subclasses may override this routine to provide different behavior. 1518 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1519 SourceLocation LParenLoc, 1520 SourceLocation EndLoc) { 1521 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1522 EndLoc); 1523 } 1524 1525 /// Build a new OpenMP 'num_threads' clause. 1526 /// 1527 /// By default, performs semantic analysis to build the new OpenMP clause. 1528 /// Subclasses may override this routine to provide different behavior. 1529 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1530 SourceLocation StartLoc, 1531 SourceLocation LParenLoc, 1532 SourceLocation EndLoc) { 1533 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1534 LParenLoc, EndLoc); 1535 } 1536 1537 /// Build a new OpenMP 'safelen' clause. 1538 /// 1539 /// By default, performs semantic analysis to build the new OpenMP clause. 1540 /// Subclasses may override this routine to provide different behavior. 1541 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1542 SourceLocation LParenLoc, 1543 SourceLocation EndLoc) { 1544 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1545 } 1546 1547 /// Build a new OpenMP 'simdlen' clause. 1548 /// 1549 /// By default, performs semantic analysis to build the new OpenMP clause. 1550 /// Subclasses may override this routine to provide different behavior. 1551 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1552 SourceLocation LParenLoc, 1553 SourceLocation EndLoc) { 1554 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1555 } 1556 1557 /// Build a new OpenMP 'allocator' clause. 1558 /// 1559 /// By default, performs semantic analysis to build the new OpenMP clause. 1560 /// Subclasses may override this routine to provide different behavior. 1561 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1562 SourceLocation LParenLoc, 1563 SourceLocation EndLoc) { 1564 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1565 } 1566 1567 /// Build a new OpenMP 'collapse' clause. 1568 /// 1569 /// By default, performs semantic analysis to build the new OpenMP clause. 1570 /// Subclasses may override this routine to provide different behavior. 1571 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1572 SourceLocation LParenLoc, 1573 SourceLocation EndLoc) { 1574 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1575 EndLoc); 1576 } 1577 1578 /// Build a new OpenMP 'default' clause. 1579 /// 1580 /// By default, performs semantic analysis to build the new OpenMP clause. 1581 /// Subclasses may override this routine to provide different behavior. 1582 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1583 SourceLocation KindKwLoc, 1584 SourceLocation StartLoc, 1585 SourceLocation LParenLoc, 1586 SourceLocation EndLoc) { 1587 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1588 StartLoc, LParenLoc, EndLoc); 1589 } 1590 1591 /// Build a new OpenMP 'proc_bind' clause. 1592 /// 1593 /// By default, performs semantic analysis to build the new OpenMP clause. 1594 /// Subclasses may override this routine to provide different behavior. 1595 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1596 SourceLocation KindKwLoc, 1597 SourceLocation StartLoc, 1598 SourceLocation LParenLoc, 1599 SourceLocation EndLoc) { 1600 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1601 StartLoc, LParenLoc, EndLoc); 1602 } 1603 1604 /// Build a new OpenMP 'schedule' clause. 1605 /// 1606 /// By default, performs semantic analysis to build the new OpenMP clause. 1607 /// Subclasses may override this routine to provide different behavior. 1608 OMPClause *RebuildOMPScheduleClause( 1609 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1610 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1611 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1612 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1613 return getSema().ActOnOpenMPScheduleClause( 1614 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1615 CommaLoc, EndLoc); 1616 } 1617 1618 /// Build a new OpenMP 'ordered' clause. 1619 /// 1620 /// By default, performs semantic analysis to build the new OpenMP clause. 1621 /// Subclasses may override this routine to provide different behavior. 1622 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1623 SourceLocation EndLoc, 1624 SourceLocation LParenLoc, Expr *Num) { 1625 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1626 } 1627 1628 /// Build a new OpenMP 'private' clause. 1629 /// 1630 /// By default, performs semantic analysis to build the new OpenMP clause. 1631 /// Subclasses may override this routine to provide different behavior. 1632 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1633 SourceLocation StartLoc, 1634 SourceLocation LParenLoc, 1635 SourceLocation EndLoc) { 1636 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1637 EndLoc); 1638 } 1639 1640 /// Build a new OpenMP 'firstprivate' clause. 1641 /// 1642 /// By default, performs semantic analysis to build the new OpenMP clause. 1643 /// Subclasses may override this routine to provide different behavior. 1644 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1645 SourceLocation StartLoc, 1646 SourceLocation LParenLoc, 1647 SourceLocation EndLoc) { 1648 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1649 EndLoc); 1650 } 1651 1652 /// Build a new OpenMP 'lastprivate' clause. 1653 /// 1654 /// By default, performs semantic analysis to build the new OpenMP clause. 1655 /// Subclasses may override this routine to provide different behavior. 1656 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1657 SourceLocation StartLoc, 1658 SourceLocation LParenLoc, 1659 SourceLocation EndLoc) { 1660 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1661 EndLoc); 1662 } 1663 1664 /// Build a new OpenMP 'shared' clause. 1665 /// 1666 /// By default, performs semantic analysis to build the new OpenMP clause. 1667 /// Subclasses may override this routine to provide different behavior. 1668 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1669 SourceLocation StartLoc, 1670 SourceLocation LParenLoc, 1671 SourceLocation EndLoc) { 1672 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1673 EndLoc); 1674 } 1675 1676 /// Build a new OpenMP 'reduction' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new statement. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1681 SourceLocation StartLoc, 1682 SourceLocation LParenLoc, 1683 SourceLocation ColonLoc, 1684 SourceLocation EndLoc, 1685 CXXScopeSpec &ReductionIdScopeSpec, 1686 const DeclarationNameInfo &ReductionId, 1687 ArrayRef<Expr *> UnresolvedReductions) { 1688 return getSema().ActOnOpenMPReductionClause( 1689 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1690 ReductionId, UnresolvedReductions); 1691 } 1692 1693 /// Build a new OpenMP 'task_reduction' clause. 1694 /// 1695 /// By default, performs semantic analysis to build the new statement. 1696 /// Subclasses may override this routine to provide different behavior. 1697 OMPClause *RebuildOMPTaskReductionClause( 1698 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1699 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1700 CXXScopeSpec &ReductionIdScopeSpec, 1701 const DeclarationNameInfo &ReductionId, 1702 ArrayRef<Expr *> UnresolvedReductions) { 1703 return getSema().ActOnOpenMPTaskReductionClause( 1704 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1705 ReductionId, UnresolvedReductions); 1706 } 1707 1708 /// Build a new OpenMP 'in_reduction' clause. 1709 /// 1710 /// By default, performs semantic analysis to build the new statement. 1711 /// Subclasses may override this routine to provide different behavior. 1712 OMPClause * 1713 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1714 SourceLocation LParenLoc, SourceLocation ColonLoc, 1715 SourceLocation EndLoc, 1716 CXXScopeSpec &ReductionIdScopeSpec, 1717 const DeclarationNameInfo &ReductionId, 1718 ArrayRef<Expr *> UnresolvedReductions) { 1719 return getSema().ActOnOpenMPInReductionClause( 1720 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1721 ReductionId, UnresolvedReductions); 1722 } 1723 1724 /// Build a new OpenMP 'linear' clause. 1725 /// 1726 /// By default, performs semantic analysis to build the new OpenMP clause. 1727 /// Subclasses may override this routine to provide different behavior. 1728 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1729 SourceLocation StartLoc, 1730 SourceLocation LParenLoc, 1731 OpenMPLinearClauseKind Modifier, 1732 SourceLocation ModifierLoc, 1733 SourceLocation ColonLoc, 1734 SourceLocation EndLoc) { 1735 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1736 Modifier, ModifierLoc, ColonLoc, 1737 EndLoc); 1738 } 1739 1740 /// Build a new OpenMP 'aligned' clause. 1741 /// 1742 /// By default, performs semantic analysis to build the new OpenMP clause. 1743 /// Subclasses may override this routine to provide different behavior. 1744 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1745 SourceLocation StartLoc, 1746 SourceLocation LParenLoc, 1747 SourceLocation ColonLoc, 1748 SourceLocation EndLoc) { 1749 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1750 LParenLoc, ColonLoc, EndLoc); 1751 } 1752 1753 /// Build a new OpenMP 'copyin' clause. 1754 /// 1755 /// By default, performs semantic analysis to build the new OpenMP clause. 1756 /// Subclasses may override this routine to provide different behavior. 1757 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1758 SourceLocation StartLoc, 1759 SourceLocation LParenLoc, 1760 SourceLocation EndLoc) { 1761 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1762 EndLoc); 1763 } 1764 1765 /// Build a new OpenMP 'copyprivate' clause. 1766 /// 1767 /// By default, performs semantic analysis to build the new OpenMP clause. 1768 /// Subclasses may override this routine to provide different behavior. 1769 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1770 SourceLocation StartLoc, 1771 SourceLocation LParenLoc, 1772 SourceLocation EndLoc) { 1773 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1774 EndLoc); 1775 } 1776 1777 /// Build a new OpenMP 'flush' pseudo clause. 1778 /// 1779 /// By default, performs semantic analysis to build the new OpenMP clause. 1780 /// Subclasses may override this routine to provide different behavior. 1781 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1782 SourceLocation StartLoc, 1783 SourceLocation LParenLoc, 1784 SourceLocation EndLoc) { 1785 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1786 EndLoc); 1787 } 1788 1789 /// Build a new OpenMP 'depend' pseudo clause. 1790 /// 1791 /// By default, performs semantic analysis to build the new OpenMP clause. 1792 /// Subclasses may override this routine to provide different behavior. 1793 OMPClause * 1794 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1795 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1796 SourceLocation StartLoc, SourceLocation LParenLoc, 1797 SourceLocation EndLoc) { 1798 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1799 StartLoc, LParenLoc, EndLoc); 1800 } 1801 1802 /// Build a new OpenMP 'device' 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 *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1807 SourceLocation LParenLoc, 1808 SourceLocation EndLoc) { 1809 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1810 EndLoc); 1811 } 1812 1813 /// Build a new OpenMP 'map' clause. 1814 /// 1815 /// By default, performs semantic analysis to build the new OpenMP clause. 1816 /// Subclasses may override this routine to provide different behavior. 1817 OMPClause *RebuildOMPMapClause( 1818 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1819 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1820 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1821 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1822 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1823 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1824 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1825 MapperIdScopeSpec, MapperId, MapType, 1826 IsMapTypeImplicit, MapLoc, ColonLoc, 1827 VarList, Locs, UnresolvedMappers); 1828 } 1829 1830 /// Build a new OpenMP 'allocate' clause. 1831 /// 1832 /// By default, performs semantic analysis to build the new OpenMP clause. 1833 /// Subclasses may override this routine to provide different behavior. 1834 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1835 SourceLocation StartLoc, 1836 SourceLocation LParenLoc, 1837 SourceLocation ColonLoc, 1838 SourceLocation EndLoc) { 1839 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1840 LParenLoc, ColonLoc, EndLoc); 1841 } 1842 1843 /// Build a new OpenMP 'num_teams' clause. 1844 /// 1845 /// By default, performs semantic analysis to build the new statement. 1846 /// Subclasses may override this routine to provide different behavior. 1847 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1848 SourceLocation LParenLoc, 1849 SourceLocation EndLoc) { 1850 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1851 EndLoc); 1852 } 1853 1854 /// Build a new OpenMP 'thread_limit' clause. 1855 /// 1856 /// By default, performs semantic analysis to build the new statement. 1857 /// Subclasses may override this routine to provide different behavior. 1858 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1859 SourceLocation StartLoc, 1860 SourceLocation LParenLoc, 1861 SourceLocation EndLoc) { 1862 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1863 LParenLoc, EndLoc); 1864 } 1865 1866 /// Build a new OpenMP 'priority' clause. 1867 /// 1868 /// By default, performs semantic analysis to build the new statement. 1869 /// Subclasses may override this routine to provide different behavior. 1870 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1871 SourceLocation LParenLoc, 1872 SourceLocation EndLoc) { 1873 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1874 EndLoc); 1875 } 1876 1877 /// Build a new OpenMP 'grainsize' clause. 1878 /// 1879 /// By default, performs semantic analysis to build the new statement. 1880 /// Subclasses may override this routine to provide different behavior. 1881 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1882 SourceLocation LParenLoc, 1883 SourceLocation EndLoc) { 1884 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1885 EndLoc); 1886 } 1887 1888 /// Build a new OpenMP 'num_tasks' clause. 1889 /// 1890 /// By default, performs semantic analysis to build the new statement. 1891 /// Subclasses may override this routine to provide different behavior. 1892 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1893 SourceLocation LParenLoc, 1894 SourceLocation EndLoc) { 1895 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1896 EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'hint' clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new statement. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1904 SourceLocation LParenLoc, 1905 SourceLocation EndLoc) { 1906 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1907 } 1908 1909 /// Build a new OpenMP 'dist_schedule' clause. 1910 /// 1911 /// By default, performs semantic analysis to build the new OpenMP clause. 1912 /// Subclasses may override this routine to provide different behavior. 1913 OMPClause * 1914 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1915 Expr *ChunkSize, SourceLocation StartLoc, 1916 SourceLocation LParenLoc, SourceLocation KindLoc, 1917 SourceLocation CommaLoc, SourceLocation EndLoc) { 1918 return getSema().ActOnOpenMPDistScheduleClause( 1919 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1920 } 1921 1922 /// Build a new OpenMP 'to' clause. 1923 /// 1924 /// By default, performs semantic analysis to build the new statement. 1925 /// Subclasses may override this routine to provide different behavior. 1926 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1927 CXXScopeSpec &MapperIdScopeSpec, 1928 DeclarationNameInfo &MapperId, 1929 const OMPVarListLocTy &Locs, 1930 ArrayRef<Expr *> UnresolvedMappers) { 1931 return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, 1932 Locs, UnresolvedMappers); 1933 } 1934 1935 /// Build a new OpenMP 'from' clause. 1936 /// 1937 /// By default, performs semantic analysis to build the new statement. 1938 /// Subclasses may override this routine to provide different behavior. 1939 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1940 CXXScopeSpec &MapperIdScopeSpec, 1941 DeclarationNameInfo &MapperId, 1942 const OMPVarListLocTy &Locs, 1943 ArrayRef<Expr *> UnresolvedMappers) { 1944 return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, 1945 Locs, UnresolvedMappers); 1946 } 1947 1948 /// Build a new OpenMP 'use_device_ptr' clause. 1949 /// 1950 /// By default, performs semantic analysis to build the new OpenMP clause. 1951 /// Subclasses may override this routine to provide different behavior. 1952 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1953 const OMPVarListLocTy &Locs) { 1954 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 1955 } 1956 1957 /// Build a new OpenMP 'is_device_ptr' clause. 1958 /// 1959 /// By default, performs semantic analysis to build the new OpenMP clause. 1960 /// Subclasses may override this routine to provide different behavior. 1961 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1962 const OMPVarListLocTy &Locs) { 1963 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 1964 } 1965 1966 /// Rebuild the operand to an Objective-C \@synchronized statement. 1967 /// 1968 /// By default, performs semantic analysis to build the new statement. 1969 /// Subclasses may override this routine to provide different behavior. 1970 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1971 Expr *object) { 1972 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1973 } 1974 1975 /// Build a new Objective-C \@synchronized statement. 1976 /// 1977 /// By default, performs semantic analysis to build the new statement. 1978 /// Subclasses may override this routine to provide different behavior. 1979 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1980 Expr *Object, Stmt *Body) { 1981 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1982 } 1983 1984 /// Build a new Objective-C \@autoreleasepool statement. 1985 /// 1986 /// By default, performs semantic analysis to build the new statement. 1987 /// Subclasses may override this routine to provide different behavior. 1988 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1989 Stmt *Body) { 1990 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1991 } 1992 1993 /// Build a new Objective-C fast enumeration statement. 1994 /// 1995 /// By default, performs semantic analysis to build the new statement. 1996 /// Subclasses may override this routine to provide different behavior. 1997 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1998 Stmt *Element, 1999 Expr *Collection, 2000 SourceLocation RParenLoc, 2001 Stmt *Body) { 2002 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2003 Element, 2004 Collection, 2005 RParenLoc); 2006 if (ForEachStmt.isInvalid()) 2007 return StmtError(); 2008 2009 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2010 } 2011 2012 /// Build a new C++ exception declaration. 2013 /// 2014 /// By default, performs semantic analysis to build the new decaration. 2015 /// Subclasses may override this routine to provide different behavior. 2016 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2017 TypeSourceInfo *Declarator, 2018 SourceLocation StartLoc, 2019 SourceLocation IdLoc, 2020 IdentifierInfo *Id) { 2021 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2022 StartLoc, IdLoc, Id); 2023 if (Var) 2024 getSema().CurContext->addDecl(Var); 2025 return Var; 2026 } 2027 2028 /// Build a new C++ catch statement. 2029 /// 2030 /// By default, performs semantic analysis to build the new statement. 2031 /// Subclasses may override this routine to provide different behavior. 2032 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2033 VarDecl *ExceptionDecl, 2034 Stmt *Handler) { 2035 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2036 Handler)); 2037 } 2038 2039 /// Build a new C++ try statement. 2040 /// 2041 /// By default, performs semantic analysis to build the new statement. 2042 /// Subclasses may override this routine to provide different behavior. 2043 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2044 ArrayRef<Stmt *> Handlers) { 2045 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2046 } 2047 2048 /// Build a new C++0x range-based for statement. 2049 /// 2050 /// By default, performs semantic analysis to build the new statement. 2051 /// Subclasses may override this routine to provide different behavior. 2052 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2053 SourceLocation CoawaitLoc, Stmt *Init, 2054 SourceLocation ColonLoc, Stmt *Range, 2055 Stmt *Begin, Stmt *End, Expr *Cond, 2056 Expr *Inc, Stmt *LoopVar, 2057 SourceLocation RParenLoc) { 2058 // If we've just learned that the range is actually an Objective-C 2059 // collection, treat this as an Objective-C fast enumeration loop. 2060 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2061 if (RangeStmt->isSingleDecl()) { 2062 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2063 if (RangeVar->isInvalidDecl()) 2064 return StmtError(); 2065 2066 Expr *RangeExpr = RangeVar->getInit(); 2067 if (!RangeExpr->isTypeDependent() && 2068 RangeExpr->getType()->isObjCObjectPointerType()) { 2069 // FIXME: Support init-statements in Objective-C++20 ranged for 2070 // statement. 2071 if (Init) { 2072 return SemaRef.Diag(Init->getBeginLoc(), 2073 diag::err_objc_for_range_init_stmt) 2074 << Init->getSourceRange(); 2075 } 2076 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2077 RangeExpr, RParenLoc); 2078 } 2079 } 2080 } 2081 } 2082 2083 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2084 Range, Begin, End, Cond, Inc, LoopVar, 2085 RParenLoc, Sema::BFRK_Rebuild); 2086 } 2087 2088 /// Build a new C++0x range-based for statement. 2089 /// 2090 /// By default, performs semantic analysis to build the new statement. 2091 /// Subclasses may override this routine to provide different behavior. 2092 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2093 bool IsIfExists, 2094 NestedNameSpecifierLoc QualifierLoc, 2095 DeclarationNameInfo NameInfo, 2096 Stmt *Nested) { 2097 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2098 QualifierLoc, NameInfo, Nested); 2099 } 2100 2101 /// Attach body to a C++0x range-based for statement. 2102 /// 2103 /// By default, performs semantic analysis to finish the new statement. 2104 /// Subclasses may override this routine to provide different behavior. 2105 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2106 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2107 } 2108 2109 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2110 Stmt *TryBlock, Stmt *Handler) { 2111 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2112 } 2113 2114 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2115 Stmt *Block) { 2116 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2117 } 2118 2119 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2120 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2121 } 2122 2123 /// Build a new predefined expression. 2124 /// 2125 /// By default, performs semantic analysis to build the new expression. 2126 /// Subclasses may override this routine to provide different behavior. 2127 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2128 PredefinedExpr::IdentKind IK) { 2129 return getSema().BuildPredefinedExpr(Loc, IK); 2130 } 2131 2132 /// Build a new expression that references a declaration. 2133 /// 2134 /// By default, performs semantic analysis to build the new expression. 2135 /// Subclasses may override this routine to provide different behavior. 2136 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2137 LookupResult &R, 2138 bool RequiresADL) { 2139 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2140 } 2141 2142 2143 /// Build a new expression that references a declaration. 2144 /// 2145 /// By default, performs semantic analysis to build the new expression. 2146 /// Subclasses may override this routine to provide different behavior. 2147 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2148 ValueDecl *VD, 2149 const DeclarationNameInfo &NameInfo, 2150 TemplateArgumentListInfo *TemplateArgs) { 2151 CXXScopeSpec SS; 2152 SS.Adopt(QualifierLoc); 2153 2154 // FIXME: loses template args. 2155 2156 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2157 } 2158 2159 /// Build a new expression in parentheses. 2160 /// 2161 /// By default, performs semantic analysis to build the new expression. 2162 /// Subclasses may override this routine to provide different behavior. 2163 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2164 SourceLocation RParen) { 2165 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2166 } 2167 2168 /// Build a new pseudo-destructor expression. 2169 /// 2170 /// By default, performs semantic analysis to build the new expression. 2171 /// Subclasses may override this routine to provide different behavior. 2172 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2173 SourceLocation OperatorLoc, 2174 bool isArrow, 2175 CXXScopeSpec &SS, 2176 TypeSourceInfo *ScopeType, 2177 SourceLocation CCLoc, 2178 SourceLocation TildeLoc, 2179 PseudoDestructorTypeStorage Destroyed); 2180 2181 /// Build a new unary operator expression. 2182 /// 2183 /// By default, performs semantic analysis to build the new expression. 2184 /// Subclasses may override this routine to provide different behavior. 2185 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2186 UnaryOperatorKind Opc, 2187 Expr *SubExpr) { 2188 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2189 } 2190 2191 /// Build a new builtin offsetof expression. 2192 /// 2193 /// By default, performs semantic analysis to build the new expression. 2194 /// Subclasses may override this routine to provide different behavior. 2195 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2196 TypeSourceInfo *Type, 2197 ArrayRef<Sema::OffsetOfComponent> Components, 2198 SourceLocation RParenLoc) { 2199 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2200 RParenLoc); 2201 } 2202 2203 /// Build a new sizeof, alignof or vec_step expression with a 2204 /// type argument. 2205 /// 2206 /// By default, performs semantic analysis to build the new expression. 2207 /// Subclasses may override this routine to provide different behavior. 2208 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2209 SourceLocation OpLoc, 2210 UnaryExprOrTypeTrait ExprKind, 2211 SourceRange R) { 2212 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2213 } 2214 2215 /// Build a new sizeof, alignof or vec step expression with an 2216 /// expression argument. 2217 /// 2218 /// By default, performs semantic analysis to build the new expression. 2219 /// Subclasses may override this routine to provide different behavior. 2220 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2221 UnaryExprOrTypeTrait ExprKind, 2222 SourceRange R) { 2223 ExprResult Result 2224 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2225 if (Result.isInvalid()) 2226 return ExprError(); 2227 2228 return Result; 2229 } 2230 2231 /// Build a new array subscript expression. 2232 /// 2233 /// By default, performs semantic analysis to build the new expression. 2234 /// Subclasses may override this routine to provide different behavior. 2235 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2236 SourceLocation LBracketLoc, 2237 Expr *RHS, 2238 SourceLocation RBracketLoc) { 2239 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2240 LBracketLoc, RHS, 2241 RBracketLoc); 2242 } 2243 2244 /// Build a new array section expression. 2245 /// 2246 /// By default, performs semantic analysis to build the new expression. 2247 /// Subclasses may override this routine to provide different behavior. 2248 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2249 Expr *LowerBound, 2250 SourceLocation ColonLoc, Expr *Length, 2251 SourceLocation RBracketLoc) { 2252 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2253 ColonLoc, Length, RBracketLoc); 2254 } 2255 2256 /// Build a new call expression. 2257 /// 2258 /// By default, performs semantic analysis to build the new expression. 2259 /// Subclasses may override this routine to provide different behavior. 2260 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2261 MultiExprArg Args, 2262 SourceLocation RParenLoc, 2263 Expr *ExecConfig = nullptr) { 2264 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2265 Args, RParenLoc, ExecConfig); 2266 } 2267 2268 /// Build a new member access expression. 2269 /// 2270 /// By default, performs semantic analysis to build the new expression. 2271 /// Subclasses may override this routine to provide different behavior. 2272 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2273 bool isArrow, 2274 NestedNameSpecifierLoc QualifierLoc, 2275 SourceLocation TemplateKWLoc, 2276 const DeclarationNameInfo &MemberNameInfo, 2277 ValueDecl *Member, 2278 NamedDecl *FoundDecl, 2279 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2280 NamedDecl *FirstQualifierInScope) { 2281 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2282 isArrow); 2283 if (!Member->getDeclName()) { 2284 // We have a reference to an unnamed field. This is always the 2285 // base of an anonymous struct/union member access, i.e. the 2286 // field is always of record type. 2287 assert(Member->getType()->isRecordType() && 2288 "unnamed member not of record type?"); 2289 2290 BaseResult = 2291 getSema().PerformObjectMemberConversion(BaseResult.get(), 2292 QualifierLoc.getNestedNameSpecifier(), 2293 FoundDecl, Member); 2294 if (BaseResult.isInvalid()) 2295 return ExprError(); 2296 Base = BaseResult.get(); 2297 2298 CXXScopeSpec EmptySS; 2299 return getSema().BuildFieldReferenceExpr( 2300 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2301 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2302 } 2303 2304 CXXScopeSpec SS; 2305 SS.Adopt(QualifierLoc); 2306 2307 Base = BaseResult.get(); 2308 QualType BaseType = Base->getType(); 2309 2310 if (isArrow && !BaseType->isPointerType()) 2311 return ExprError(); 2312 2313 // FIXME: this involves duplicating earlier analysis in a lot of 2314 // cases; we should avoid this when possible. 2315 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2316 R.addDecl(FoundDecl); 2317 R.resolveKind(); 2318 2319 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2320 SS, TemplateKWLoc, 2321 FirstQualifierInScope, 2322 R, ExplicitTemplateArgs, 2323 /*S*/nullptr); 2324 } 2325 2326 /// Build a new binary operator expression. 2327 /// 2328 /// By default, performs semantic analysis to build the new expression. 2329 /// Subclasses may override this routine to provide different behavior. 2330 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2331 BinaryOperatorKind Opc, 2332 Expr *LHS, Expr *RHS) { 2333 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2334 } 2335 2336 /// Build a new conditional operator expression. 2337 /// 2338 /// By default, performs semantic analysis to build the new expression. 2339 /// Subclasses may override this routine to provide different behavior. 2340 ExprResult RebuildConditionalOperator(Expr *Cond, 2341 SourceLocation QuestionLoc, 2342 Expr *LHS, 2343 SourceLocation ColonLoc, 2344 Expr *RHS) { 2345 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2346 LHS, RHS); 2347 } 2348 2349 /// Build a new C-style cast expression. 2350 /// 2351 /// By default, performs semantic analysis to build the new expression. 2352 /// Subclasses may override this routine to provide different behavior. 2353 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2354 TypeSourceInfo *TInfo, 2355 SourceLocation RParenLoc, 2356 Expr *SubExpr) { 2357 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2358 SubExpr); 2359 } 2360 2361 /// Build a new compound literal expression. 2362 /// 2363 /// By default, performs semantic analysis to build the new expression. 2364 /// Subclasses may override this routine to provide different behavior. 2365 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2366 TypeSourceInfo *TInfo, 2367 SourceLocation RParenLoc, 2368 Expr *Init) { 2369 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2370 Init); 2371 } 2372 2373 /// Build a new extended vector element access expression. 2374 /// 2375 /// By default, performs semantic analysis to build the new expression. 2376 /// Subclasses may override this routine to provide different behavior. 2377 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2378 SourceLocation OpLoc, 2379 SourceLocation AccessorLoc, 2380 IdentifierInfo &Accessor) { 2381 2382 CXXScopeSpec SS; 2383 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2384 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2385 OpLoc, /*IsArrow*/ false, 2386 SS, SourceLocation(), 2387 /*FirstQualifierInScope*/ nullptr, 2388 NameInfo, 2389 /* TemplateArgs */ nullptr, 2390 /*S*/ nullptr); 2391 } 2392 2393 /// Build a new initializer list expression. 2394 /// 2395 /// By default, performs semantic analysis to build the new expression. 2396 /// Subclasses may override this routine to provide different behavior. 2397 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2398 MultiExprArg Inits, 2399 SourceLocation RBraceLoc) { 2400 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2401 } 2402 2403 /// Build a new designated initializer expression. 2404 /// 2405 /// By default, performs semantic analysis to build the new expression. 2406 /// Subclasses may override this routine to provide different behavior. 2407 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2408 MultiExprArg ArrayExprs, 2409 SourceLocation EqualOrColonLoc, 2410 bool GNUSyntax, 2411 Expr *Init) { 2412 ExprResult Result 2413 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2414 Init); 2415 if (Result.isInvalid()) 2416 return ExprError(); 2417 2418 return Result; 2419 } 2420 2421 /// Build a new value-initialized expression. 2422 /// 2423 /// By default, builds the implicit value initialization without performing 2424 /// any semantic analysis. Subclasses may override this routine to provide 2425 /// different behavior. 2426 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2427 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2428 } 2429 2430 /// Build a new \c va_arg expression. 2431 /// 2432 /// By default, performs semantic analysis to build the new expression. 2433 /// Subclasses may override this routine to provide different behavior. 2434 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2435 Expr *SubExpr, TypeSourceInfo *TInfo, 2436 SourceLocation RParenLoc) { 2437 return getSema().BuildVAArgExpr(BuiltinLoc, 2438 SubExpr, TInfo, 2439 RParenLoc); 2440 } 2441 2442 /// Build a new expression list in parentheses. 2443 /// 2444 /// By default, performs semantic analysis to build the new expression. 2445 /// Subclasses may override this routine to provide different behavior. 2446 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2447 MultiExprArg SubExprs, 2448 SourceLocation RParenLoc) { 2449 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2450 } 2451 2452 /// Build a new address-of-label expression. 2453 /// 2454 /// By default, performs semantic analysis, using the name of the label 2455 /// rather than attempting to map the label statement itself. 2456 /// Subclasses may override this routine to provide different behavior. 2457 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2458 SourceLocation LabelLoc, LabelDecl *Label) { 2459 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2460 } 2461 2462 /// Build a new GNU statement expression. 2463 /// 2464 /// By default, performs semantic analysis to build the new expression. 2465 /// Subclasses may override this routine to provide different behavior. 2466 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2467 Stmt *SubStmt, 2468 SourceLocation RParenLoc) { 2469 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2470 } 2471 2472 /// Build a new __builtin_choose_expr expression. 2473 /// 2474 /// By default, performs semantic analysis to build the new expression. 2475 /// Subclasses may override this routine to provide different behavior. 2476 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2477 Expr *Cond, Expr *LHS, Expr *RHS, 2478 SourceLocation RParenLoc) { 2479 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2480 Cond, LHS, RHS, 2481 RParenLoc); 2482 } 2483 2484 /// Build a new generic selection expression. 2485 /// 2486 /// By default, performs semantic analysis to build the new expression. 2487 /// Subclasses may override this routine to provide different behavior. 2488 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2489 SourceLocation DefaultLoc, 2490 SourceLocation RParenLoc, 2491 Expr *ControllingExpr, 2492 ArrayRef<TypeSourceInfo *> Types, 2493 ArrayRef<Expr *> Exprs) { 2494 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2495 ControllingExpr, Types, Exprs); 2496 } 2497 2498 /// Build a new overloaded operator call expression. 2499 /// 2500 /// By default, performs semantic analysis to build the new expression. 2501 /// The semantic analysis provides the behavior of template instantiation, 2502 /// copying with transformations that turn what looks like an overloaded 2503 /// operator call into a use of a builtin operator, performing 2504 /// argument-dependent lookup, etc. Subclasses may override this routine to 2505 /// provide different behavior. 2506 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2507 SourceLocation OpLoc, 2508 Expr *Callee, 2509 Expr *First, 2510 Expr *Second); 2511 2512 /// Build a new C++ "named" cast expression, such as static_cast or 2513 /// reinterpret_cast. 2514 /// 2515 /// By default, this routine dispatches to one of the more-specific routines 2516 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2517 /// Subclasses may override this routine to provide different behavior. 2518 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2519 Stmt::StmtClass Class, 2520 SourceLocation LAngleLoc, 2521 TypeSourceInfo *TInfo, 2522 SourceLocation RAngleLoc, 2523 SourceLocation LParenLoc, 2524 Expr *SubExpr, 2525 SourceLocation RParenLoc) { 2526 switch (Class) { 2527 case Stmt::CXXStaticCastExprClass: 2528 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2529 RAngleLoc, LParenLoc, 2530 SubExpr, RParenLoc); 2531 2532 case Stmt::CXXDynamicCastExprClass: 2533 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2534 RAngleLoc, LParenLoc, 2535 SubExpr, RParenLoc); 2536 2537 case Stmt::CXXReinterpretCastExprClass: 2538 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2539 RAngleLoc, LParenLoc, 2540 SubExpr, 2541 RParenLoc); 2542 2543 case Stmt::CXXConstCastExprClass: 2544 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2545 RAngleLoc, LParenLoc, 2546 SubExpr, RParenLoc); 2547 2548 default: 2549 llvm_unreachable("Invalid C++ named cast"); 2550 } 2551 } 2552 2553 /// Build a new C++ static_cast expression. 2554 /// 2555 /// By default, performs semantic analysis to build the new expression. 2556 /// Subclasses may override this routine to provide different behavior. 2557 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2558 SourceLocation LAngleLoc, 2559 TypeSourceInfo *TInfo, 2560 SourceLocation RAngleLoc, 2561 SourceLocation LParenLoc, 2562 Expr *SubExpr, 2563 SourceLocation RParenLoc) { 2564 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2565 TInfo, SubExpr, 2566 SourceRange(LAngleLoc, RAngleLoc), 2567 SourceRange(LParenLoc, RParenLoc)); 2568 } 2569 2570 /// Build a new C++ dynamic_cast expression. 2571 /// 2572 /// By default, performs semantic analysis to build the new expression. 2573 /// Subclasses may override this routine to provide different behavior. 2574 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2575 SourceLocation LAngleLoc, 2576 TypeSourceInfo *TInfo, 2577 SourceLocation RAngleLoc, 2578 SourceLocation LParenLoc, 2579 Expr *SubExpr, 2580 SourceLocation RParenLoc) { 2581 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2582 TInfo, SubExpr, 2583 SourceRange(LAngleLoc, RAngleLoc), 2584 SourceRange(LParenLoc, RParenLoc)); 2585 } 2586 2587 /// Build a new C++ reinterpret_cast expression. 2588 /// 2589 /// By default, performs semantic analysis to build the new expression. 2590 /// Subclasses may override this routine to provide different behavior. 2591 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2592 SourceLocation LAngleLoc, 2593 TypeSourceInfo *TInfo, 2594 SourceLocation RAngleLoc, 2595 SourceLocation LParenLoc, 2596 Expr *SubExpr, 2597 SourceLocation RParenLoc) { 2598 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2599 TInfo, SubExpr, 2600 SourceRange(LAngleLoc, RAngleLoc), 2601 SourceRange(LParenLoc, RParenLoc)); 2602 } 2603 2604 /// Build a new C++ const_cast expression. 2605 /// 2606 /// By default, performs semantic analysis to build the new expression. 2607 /// Subclasses may override this routine to provide different behavior. 2608 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2609 SourceLocation LAngleLoc, 2610 TypeSourceInfo *TInfo, 2611 SourceLocation RAngleLoc, 2612 SourceLocation LParenLoc, 2613 Expr *SubExpr, 2614 SourceLocation RParenLoc) { 2615 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2616 TInfo, SubExpr, 2617 SourceRange(LAngleLoc, RAngleLoc), 2618 SourceRange(LParenLoc, RParenLoc)); 2619 } 2620 2621 /// Build a new C++ functional-style cast expression. 2622 /// 2623 /// By default, performs semantic analysis to build the new expression. 2624 /// Subclasses may override this routine to provide different behavior. 2625 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2626 SourceLocation LParenLoc, 2627 Expr *Sub, 2628 SourceLocation RParenLoc, 2629 bool ListInitialization) { 2630 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2631 MultiExprArg(&Sub, 1), RParenLoc, 2632 ListInitialization); 2633 } 2634 2635 /// Build a new C++ typeid(type) expression. 2636 /// 2637 /// By default, performs semantic analysis to build the new expression. 2638 /// Subclasses may override this routine to provide different behavior. 2639 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2640 SourceLocation TypeidLoc, 2641 TypeSourceInfo *Operand, 2642 SourceLocation RParenLoc) { 2643 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2644 RParenLoc); 2645 } 2646 2647 2648 /// Build a new C++ typeid(expr) expression. 2649 /// 2650 /// By default, performs semantic analysis to build the new expression. 2651 /// Subclasses may override this routine to provide different behavior. 2652 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2653 SourceLocation TypeidLoc, 2654 Expr *Operand, 2655 SourceLocation RParenLoc) { 2656 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2657 RParenLoc); 2658 } 2659 2660 /// Build a new C++ __uuidof(type) expression. 2661 /// 2662 /// By default, performs semantic analysis to build the new expression. 2663 /// Subclasses may override this routine to provide different behavior. 2664 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2665 SourceLocation TypeidLoc, 2666 TypeSourceInfo *Operand, 2667 SourceLocation RParenLoc) { 2668 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2669 RParenLoc); 2670 } 2671 2672 /// Build a new C++ __uuidof(expr) expression. 2673 /// 2674 /// By default, performs semantic analysis to build the new expression. 2675 /// Subclasses may override this routine to provide different behavior. 2676 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2677 SourceLocation TypeidLoc, 2678 Expr *Operand, 2679 SourceLocation RParenLoc) { 2680 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2681 RParenLoc); 2682 } 2683 2684 /// Build a new C++ "this" expression. 2685 /// 2686 /// By default, builds a new "this" expression without performing any 2687 /// semantic analysis. Subclasses may override this routine to provide 2688 /// different behavior. 2689 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2690 QualType ThisType, 2691 bool isImplicit) { 2692 getSema().CheckCXXThisCapture(ThisLoc); 2693 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2694 } 2695 2696 /// Build a new C++ throw 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 RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2701 bool IsThrownVariableInScope) { 2702 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2703 } 2704 2705 /// Build a new C++ default-argument expression. 2706 /// 2707 /// By default, builds a new default-argument expression, which does not 2708 /// require any semantic analysis. Subclasses may override this routine to 2709 /// provide different behavior. 2710 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2711 ParmVarDecl *Param) { 2712 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2713 } 2714 2715 /// Build a new C++11 default-initialization expression. 2716 /// 2717 /// By default, builds a new default field initialization expression, which 2718 /// does not require any semantic analysis. Subclasses may override this 2719 /// routine to provide different behavior. 2720 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2721 FieldDecl *Field) { 2722 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2723 } 2724 2725 /// Build a new C++ zero-initialization expression. 2726 /// 2727 /// By default, performs semantic analysis to build the new expression. 2728 /// Subclasses may override this routine to provide different behavior. 2729 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2730 SourceLocation LParenLoc, 2731 SourceLocation RParenLoc) { 2732 return getSema().BuildCXXTypeConstructExpr( 2733 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2734 } 2735 2736 /// Build a new C++ "new" expression. 2737 /// 2738 /// By default, performs semantic analysis to build the new expression. 2739 /// Subclasses may override this routine to provide different behavior. 2740 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2741 bool UseGlobal, 2742 SourceLocation PlacementLParen, 2743 MultiExprArg PlacementArgs, 2744 SourceLocation PlacementRParen, 2745 SourceRange TypeIdParens, 2746 QualType AllocatedType, 2747 TypeSourceInfo *AllocatedTypeInfo, 2748 Expr *ArraySize, 2749 SourceRange DirectInitRange, 2750 Expr *Initializer) { 2751 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2752 PlacementLParen, 2753 PlacementArgs, 2754 PlacementRParen, 2755 TypeIdParens, 2756 AllocatedType, 2757 AllocatedTypeInfo, 2758 ArraySize, 2759 DirectInitRange, 2760 Initializer); 2761 } 2762 2763 /// Build a new C++ "delete" 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 RebuildCXXDeleteExpr(SourceLocation StartLoc, 2768 bool IsGlobalDelete, 2769 bool IsArrayForm, 2770 Expr *Operand) { 2771 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2772 Operand); 2773 } 2774 2775 /// Build a new type trait expression. 2776 /// 2777 /// By default, performs semantic analysis to build the new expression. 2778 /// Subclasses may override this routine to provide different behavior. 2779 ExprResult RebuildTypeTrait(TypeTrait Trait, 2780 SourceLocation StartLoc, 2781 ArrayRef<TypeSourceInfo *> Args, 2782 SourceLocation RParenLoc) { 2783 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2784 } 2785 2786 /// Build a new array type trait expression. 2787 /// 2788 /// By default, performs semantic analysis to build the new expression. 2789 /// Subclasses may override this routine to provide different behavior. 2790 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2791 SourceLocation StartLoc, 2792 TypeSourceInfo *TSInfo, 2793 Expr *DimExpr, 2794 SourceLocation RParenLoc) { 2795 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2796 } 2797 2798 /// Build a new expression trait expression. 2799 /// 2800 /// By default, performs semantic analysis to build the new expression. 2801 /// Subclasses may override this routine to provide different behavior. 2802 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2803 SourceLocation StartLoc, 2804 Expr *Queried, 2805 SourceLocation RParenLoc) { 2806 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2807 } 2808 2809 /// Build a new (previously unresolved) declaration reference 2810 /// expression. 2811 /// 2812 /// By default, performs semantic analysis to build the new expression. 2813 /// Subclasses may override this routine to provide different behavior. 2814 ExprResult RebuildDependentScopeDeclRefExpr( 2815 NestedNameSpecifierLoc QualifierLoc, 2816 SourceLocation TemplateKWLoc, 2817 const DeclarationNameInfo &NameInfo, 2818 const TemplateArgumentListInfo *TemplateArgs, 2819 bool IsAddressOfOperand, 2820 TypeSourceInfo **RecoveryTSI) { 2821 CXXScopeSpec SS; 2822 SS.Adopt(QualifierLoc); 2823 2824 if (TemplateArgs || TemplateKWLoc.isValid()) 2825 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2826 TemplateArgs); 2827 2828 return getSema().BuildQualifiedDeclarationNameExpr( 2829 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2830 } 2831 2832 /// Build a new template-id 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 RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2837 SourceLocation TemplateKWLoc, 2838 LookupResult &R, 2839 bool RequiresADL, 2840 const TemplateArgumentListInfo *TemplateArgs) { 2841 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2842 TemplateArgs); 2843 } 2844 2845 /// Build a new object-construction expression. 2846 /// 2847 /// By default, performs semantic analysis to build the new expression. 2848 /// Subclasses may override this routine to provide different behavior. 2849 ExprResult RebuildCXXConstructExpr(QualType T, 2850 SourceLocation Loc, 2851 CXXConstructorDecl *Constructor, 2852 bool IsElidable, 2853 MultiExprArg Args, 2854 bool HadMultipleCandidates, 2855 bool ListInitialization, 2856 bool StdInitListInitialization, 2857 bool RequiresZeroInit, 2858 CXXConstructExpr::ConstructionKind ConstructKind, 2859 SourceRange ParenRange) { 2860 SmallVector<Expr*, 8> ConvertedArgs; 2861 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2862 ConvertedArgs)) 2863 return ExprError(); 2864 2865 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2866 IsElidable, 2867 ConvertedArgs, 2868 HadMultipleCandidates, 2869 ListInitialization, 2870 StdInitListInitialization, 2871 RequiresZeroInit, ConstructKind, 2872 ParenRange); 2873 } 2874 2875 /// Build a new implicit construction via inherited constructor 2876 /// expression. 2877 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2878 CXXConstructorDecl *Constructor, 2879 bool ConstructsVBase, 2880 bool InheritedFromVBase) { 2881 return new (getSema().Context) CXXInheritedCtorInitExpr( 2882 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2883 } 2884 2885 /// Build a new object-construction expression. 2886 /// 2887 /// By default, performs semantic analysis to build the new expression. 2888 /// Subclasses may override this routine to provide different behavior. 2889 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2890 SourceLocation LParenOrBraceLoc, 2891 MultiExprArg Args, 2892 SourceLocation RParenOrBraceLoc, 2893 bool ListInitialization) { 2894 return getSema().BuildCXXTypeConstructExpr( 2895 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2896 } 2897 2898 /// Build a new object-construction expression. 2899 /// 2900 /// By default, performs semantic analysis to build the new expression. 2901 /// Subclasses may override this routine to provide different behavior. 2902 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2903 SourceLocation LParenLoc, 2904 MultiExprArg Args, 2905 SourceLocation RParenLoc, 2906 bool ListInitialization) { 2907 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2908 RParenLoc, ListInitialization); 2909 } 2910 2911 /// Build a new member reference expression. 2912 /// 2913 /// By default, performs semantic analysis to build the new expression. 2914 /// Subclasses may override this routine to provide different behavior. 2915 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2916 QualType BaseType, 2917 bool IsArrow, 2918 SourceLocation OperatorLoc, 2919 NestedNameSpecifierLoc QualifierLoc, 2920 SourceLocation TemplateKWLoc, 2921 NamedDecl *FirstQualifierInScope, 2922 const DeclarationNameInfo &MemberNameInfo, 2923 const TemplateArgumentListInfo *TemplateArgs) { 2924 CXXScopeSpec SS; 2925 SS.Adopt(QualifierLoc); 2926 2927 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2928 OperatorLoc, IsArrow, 2929 SS, TemplateKWLoc, 2930 FirstQualifierInScope, 2931 MemberNameInfo, 2932 TemplateArgs, /*S*/nullptr); 2933 } 2934 2935 /// Build a new member reference expression. 2936 /// 2937 /// By default, performs semantic analysis to build the new expression. 2938 /// Subclasses may override this routine to provide different behavior. 2939 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2940 SourceLocation OperatorLoc, 2941 bool IsArrow, 2942 NestedNameSpecifierLoc QualifierLoc, 2943 SourceLocation TemplateKWLoc, 2944 NamedDecl *FirstQualifierInScope, 2945 LookupResult &R, 2946 const TemplateArgumentListInfo *TemplateArgs) { 2947 CXXScopeSpec SS; 2948 SS.Adopt(QualifierLoc); 2949 2950 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2951 OperatorLoc, IsArrow, 2952 SS, TemplateKWLoc, 2953 FirstQualifierInScope, 2954 R, TemplateArgs, /*S*/nullptr); 2955 } 2956 2957 /// Build a new noexcept expression. 2958 /// 2959 /// By default, performs semantic analysis to build the new expression. 2960 /// Subclasses may override this routine to provide different behavior. 2961 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2962 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2963 } 2964 2965 /// Build a new expression to compute the length of a parameter pack. 2966 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2967 NamedDecl *Pack, 2968 SourceLocation PackLoc, 2969 SourceLocation RParenLoc, 2970 Optional<unsigned> Length, 2971 ArrayRef<TemplateArgument> PartialArgs) { 2972 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2973 RParenLoc, Length, PartialArgs); 2974 } 2975 2976 /// Build a new Objective-C boxed expression. 2977 /// 2978 /// By default, performs semantic analysis to build the new expression. 2979 /// Subclasses may override this routine to provide different behavior. 2980 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2981 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2982 } 2983 2984 /// Build a new Objective-C array literal. 2985 /// 2986 /// By default, performs semantic analysis to build the new expression. 2987 /// Subclasses may override this routine to provide different behavior. 2988 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2989 Expr **Elements, unsigned NumElements) { 2990 return getSema().BuildObjCArrayLiteral(Range, 2991 MultiExprArg(Elements, NumElements)); 2992 } 2993 2994 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2995 Expr *Base, Expr *Key, 2996 ObjCMethodDecl *getterMethod, 2997 ObjCMethodDecl *setterMethod) { 2998 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2999 getterMethod, setterMethod); 3000 } 3001 3002 /// Build a new Objective-C dictionary literal. 3003 /// 3004 /// By default, performs semantic analysis to build the new expression. 3005 /// Subclasses may override this routine to provide different behavior. 3006 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3007 MutableArrayRef<ObjCDictionaryElement> Elements) { 3008 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3009 } 3010 3011 /// Build a new Objective-C \@encode expression. 3012 /// 3013 /// By default, performs semantic analysis to build the new expression. 3014 /// Subclasses may override this routine to provide different behavior. 3015 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3016 TypeSourceInfo *EncodeTypeInfo, 3017 SourceLocation RParenLoc) { 3018 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3019 } 3020 3021 /// Build a new Objective-C class message. 3022 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3023 Selector Sel, 3024 ArrayRef<SourceLocation> SelectorLocs, 3025 ObjCMethodDecl *Method, 3026 SourceLocation LBracLoc, 3027 MultiExprArg Args, 3028 SourceLocation RBracLoc) { 3029 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3030 ReceiverTypeInfo->getType(), 3031 /*SuperLoc=*/SourceLocation(), 3032 Sel, Method, LBracLoc, SelectorLocs, 3033 RBracLoc, Args); 3034 } 3035 3036 /// Build a new Objective-C instance message. 3037 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3038 Selector Sel, 3039 ArrayRef<SourceLocation> SelectorLocs, 3040 ObjCMethodDecl *Method, 3041 SourceLocation LBracLoc, 3042 MultiExprArg Args, 3043 SourceLocation RBracLoc) { 3044 return SemaRef.BuildInstanceMessage(Receiver, 3045 Receiver->getType(), 3046 /*SuperLoc=*/SourceLocation(), 3047 Sel, Method, LBracLoc, SelectorLocs, 3048 RBracLoc, Args); 3049 } 3050 3051 /// Build a new Objective-C instance/class message to 'super'. 3052 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3053 Selector Sel, 3054 ArrayRef<SourceLocation> SelectorLocs, 3055 QualType SuperType, 3056 ObjCMethodDecl *Method, 3057 SourceLocation LBracLoc, 3058 MultiExprArg Args, 3059 SourceLocation RBracLoc) { 3060 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3061 SuperType, 3062 SuperLoc, 3063 Sel, Method, LBracLoc, SelectorLocs, 3064 RBracLoc, Args) 3065 : SemaRef.BuildClassMessage(nullptr, 3066 SuperType, 3067 SuperLoc, 3068 Sel, Method, LBracLoc, SelectorLocs, 3069 RBracLoc, Args); 3070 3071 3072 } 3073 3074 /// Build a new Objective-C ivar reference 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 RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3079 SourceLocation IvarLoc, 3080 bool IsArrow, bool IsFreeIvar) { 3081 CXXScopeSpec SS; 3082 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3083 ExprResult Result = getSema().BuildMemberReferenceExpr( 3084 BaseArg, BaseArg->getType(), 3085 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3086 /*FirstQualifierInScope=*/nullptr, NameInfo, 3087 /*TemplateArgs=*/nullptr, 3088 /*S=*/nullptr); 3089 if (IsFreeIvar && Result.isUsable()) 3090 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3091 return Result; 3092 } 3093 3094 /// Build a new Objective-C property reference expression. 3095 /// 3096 /// By default, performs semantic analysis to build the new expression. 3097 /// Subclasses may override this routine to provide different behavior. 3098 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3099 ObjCPropertyDecl *Property, 3100 SourceLocation PropertyLoc) { 3101 CXXScopeSpec SS; 3102 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3103 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3104 /*FIXME:*/PropertyLoc, 3105 /*IsArrow=*/false, 3106 SS, SourceLocation(), 3107 /*FirstQualifierInScope=*/nullptr, 3108 NameInfo, 3109 /*TemplateArgs=*/nullptr, 3110 /*S=*/nullptr); 3111 } 3112 3113 /// Build a new Objective-C property reference expression. 3114 /// 3115 /// By default, performs semantic analysis to build the new expression. 3116 /// Subclasses may override this routine to provide different behavior. 3117 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3118 ObjCMethodDecl *Getter, 3119 ObjCMethodDecl *Setter, 3120 SourceLocation PropertyLoc) { 3121 // Since these expressions can only be value-dependent, we do not 3122 // need to perform semantic analysis again. 3123 return Owned( 3124 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3125 VK_LValue, OK_ObjCProperty, 3126 PropertyLoc, Base)); 3127 } 3128 3129 /// Build a new Objective-C "isa" expression. 3130 /// 3131 /// By default, performs semantic analysis to build the new expression. 3132 /// Subclasses may override this routine to provide different behavior. 3133 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3134 SourceLocation OpLoc, bool IsArrow) { 3135 CXXScopeSpec SS; 3136 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3137 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3138 OpLoc, IsArrow, 3139 SS, SourceLocation(), 3140 /*FirstQualifierInScope=*/nullptr, 3141 NameInfo, 3142 /*TemplateArgs=*/nullptr, 3143 /*S=*/nullptr); 3144 } 3145 3146 /// Build a new shuffle vector expression. 3147 /// 3148 /// By default, performs semantic analysis to build the new expression. 3149 /// Subclasses may override this routine to provide different behavior. 3150 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3151 MultiExprArg SubExprs, 3152 SourceLocation RParenLoc) { 3153 // Find the declaration for __builtin_shufflevector 3154 const IdentifierInfo &Name 3155 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3156 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3157 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3158 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3159 3160 // Build a reference to the __builtin_shufflevector builtin 3161 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3162 Expr *Callee = new (SemaRef.Context) 3163 DeclRefExpr(SemaRef.Context, Builtin, false, 3164 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3165 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3166 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3167 CK_BuiltinFnToFnPtr).get(); 3168 3169 // Build the CallExpr 3170 ExprResult TheCall = CallExpr::Create( 3171 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3172 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3173 3174 // Type-check the __builtin_shufflevector expression. 3175 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3176 } 3177 3178 /// Build a new convert vector expression. 3179 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3180 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3181 SourceLocation RParenLoc) { 3182 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3183 BuiltinLoc, RParenLoc); 3184 } 3185 3186 /// Build a new template argument pack expansion. 3187 /// 3188 /// By default, performs semantic analysis to build a new pack expansion 3189 /// for a template argument. Subclasses may override this routine to provide 3190 /// different behavior. 3191 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3192 SourceLocation EllipsisLoc, 3193 Optional<unsigned> NumExpansions) { 3194 switch (Pattern.getArgument().getKind()) { 3195 case TemplateArgument::Expression: { 3196 ExprResult Result 3197 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3198 EllipsisLoc, NumExpansions); 3199 if (Result.isInvalid()) 3200 return TemplateArgumentLoc(); 3201 3202 return TemplateArgumentLoc(Result.get(), Result.get()); 3203 } 3204 3205 case TemplateArgument::Template: 3206 return TemplateArgumentLoc(TemplateArgument( 3207 Pattern.getArgument().getAsTemplate(), 3208 NumExpansions), 3209 Pattern.getTemplateQualifierLoc(), 3210 Pattern.getTemplateNameLoc(), 3211 EllipsisLoc); 3212 3213 case TemplateArgument::Null: 3214 case TemplateArgument::Integral: 3215 case TemplateArgument::Declaration: 3216 case TemplateArgument::Pack: 3217 case TemplateArgument::TemplateExpansion: 3218 case TemplateArgument::NullPtr: 3219 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3220 3221 case TemplateArgument::Type: 3222 if (TypeSourceInfo *Expansion 3223 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3224 EllipsisLoc, 3225 NumExpansions)) 3226 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3227 Expansion); 3228 break; 3229 } 3230 3231 return TemplateArgumentLoc(); 3232 } 3233 3234 /// Build a new expression pack expansion. 3235 /// 3236 /// By default, performs semantic analysis to build a new pack expansion 3237 /// for an expression. Subclasses may override this routine to provide 3238 /// different behavior. 3239 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3240 Optional<unsigned> NumExpansions) { 3241 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3242 } 3243 3244 /// Build a new C++1z fold-expression. 3245 /// 3246 /// By default, performs semantic analysis in order to build a new fold 3247 /// expression. 3248 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3249 BinaryOperatorKind Operator, 3250 SourceLocation EllipsisLoc, Expr *RHS, 3251 SourceLocation RParenLoc) { 3252 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3253 RHS, RParenLoc); 3254 } 3255 3256 /// Build an empty C++1z fold-expression with the given operator. 3257 /// 3258 /// By default, produces the fallback value for the fold-expression, or 3259 /// produce an error if there is no fallback value. 3260 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3261 BinaryOperatorKind Operator) { 3262 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3263 } 3264 3265 /// Build a new atomic operation expression. 3266 /// 3267 /// By default, performs semantic analysis to build the new expression. 3268 /// Subclasses may override this routine to provide different behavior. 3269 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3270 MultiExprArg SubExprs, 3271 QualType RetTy, 3272 AtomicExpr::AtomicOp Op, 3273 SourceLocation RParenLoc) { 3274 // Just create the expression; there is not any interesting semantic 3275 // analysis here because we can't actually build an AtomicExpr until 3276 // we are sure it is semantically sound. 3277 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3278 RParenLoc); 3279 } 3280 3281 private: 3282 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3283 QualType ObjectType, 3284 NamedDecl *FirstQualifierInScope, 3285 CXXScopeSpec &SS); 3286 3287 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3288 QualType ObjectType, 3289 NamedDecl *FirstQualifierInScope, 3290 CXXScopeSpec &SS); 3291 3292 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3293 NamedDecl *FirstQualifierInScope, 3294 CXXScopeSpec &SS); 3295 3296 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3297 DependentNameTypeLoc TL, 3298 bool DeducibleTSTContext); 3299 }; 3300 3301 template <typename Derived> 3302 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3303 if (!S) 3304 return S; 3305 3306 switch (S->getStmtClass()) { 3307 case Stmt::NoStmtClass: break; 3308 3309 // Transform individual statement nodes 3310 // Pass SDK into statements that can produce a value 3311 #define STMT(Node, Parent) \ 3312 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3313 #define VALUESTMT(Node, Parent) \ 3314 case Stmt::Node##Class: \ 3315 return getDerived().Transform##Node(cast<Node>(S), SDK); 3316 #define ABSTRACT_STMT(Node) 3317 #define EXPR(Node, Parent) 3318 #include "clang/AST/StmtNodes.inc" 3319 3320 // Transform expressions by calling TransformExpr. 3321 #define STMT(Node, Parent) 3322 #define ABSTRACT_STMT(Stmt) 3323 #define EXPR(Node, Parent) case Stmt::Node##Class: 3324 #include "clang/AST/StmtNodes.inc" 3325 { 3326 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3327 3328 if (SDK == SDK_StmtExprResult) 3329 E = getSema().ActOnStmtExprResult(E); 3330 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3331 } 3332 } 3333 3334 return S; 3335 } 3336 3337 template<typename Derived> 3338 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3339 if (!S) 3340 return S; 3341 3342 switch (S->getClauseKind()) { 3343 default: break; 3344 // Transform individual clause nodes 3345 #define OPENMP_CLAUSE(Name, Class) \ 3346 case OMPC_ ## Name : \ 3347 return getDerived().Transform ## Class(cast<Class>(S)); 3348 #include "clang/Basic/OpenMPKinds.def" 3349 } 3350 3351 return S; 3352 } 3353 3354 3355 template<typename Derived> 3356 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3357 if (!E) 3358 return E; 3359 3360 switch (E->getStmtClass()) { 3361 case Stmt::NoStmtClass: break; 3362 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3363 #define ABSTRACT_STMT(Stmt) 3364 #define EXPR(Node, Parent) \ 3365 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3366 #include "clang/AST/StmtNodes.inc" 3367 } 3368 3369 return E; 3370 } 3371 3372 template<typename Derived> 3373 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3374 bool NotCopyInit) { 3375 // Initializers are instantiated like expressions, except that various outer 3376 // layers are stripped. 3377 if (!Init) 3378 return Init; 3379 3380 if (auto *FE = dyn_cast<FullExpr>(Init)) 3381 Init = FE->getSubExpr(); 3382 3383 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3384 Init = AIL->getCommonExpr(); 3385 3386 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3387 Init = MTE->GetTemporaryExpr(); 3388 3389 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3390 Init = Binder->getSubExpr(); 3391 3392 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3393 Init = ICE->getSubExprAsWritten(); 3394 3395 if (CXXStdInitializerListExpr *ILE = 3396 dyn_cast<CXXStdInitializerListExpr>(Init)) 3397 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3398 3399 // If this is copy-initialization, we only need to reconstruct 3400 // InitListExprs. Other forms of copy-initialization will be a no-op if 3401 // the initializer is already the right type. 3402 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3403 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3404 return getDerived().TransformExpr(Init); 3405 3406 // Revert value-initialization back to empty parens. 3407 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3408 SourceRange Parens = VIE->getSourceRange(); 3409 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3410 Parens.getEnd()); 3411 } 3412 3413 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3414 if (isa<ImplicitValueInitExpr>(Init)) 3415 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3416 SourceLocation()); 3417 3418 // Revert initialization by constructor back to a parenthesized or braced list 3419 // of expressions. Any other form of initializer can just be reused directly. 3420 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3421 return getDerived().TransformExpr(Init); 3422 3423 // If the initialization implicitly converted an initializer list to a 3424 // std::initializer_list object, unwrap the std::initializer_list too. 3425 if (Construct && Construct->isStdInitListInitialization()) 3426 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3427 3428 // Enter a list-init context if this was list initialization. 3429 EnterExpressionEvaluationContext Context( 3430 getSema(), EnterExpressionEvaluationContext::InitList, 3431 Construct->isListInitialization()); 3432 3433 SmallVector<Expr*, 8> NewArgs; 3434 bool ArgChanged = false; 3435 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3436 /*IsCall*/true, NewArgs, &ArgChanged)) 3437 return ExprError(); 3438 3439 // If this was list initialization, revert to syntactic list form. 3440 if (Construct->isListInitialization()) 3441 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3442 Construct->getEndLoc()); 3443 3444 // Build a ParenListExpr to represent anything else. 3445 SourceRange Parens = Construct->getParenOrBraceRange(); 3446 if (Parens.isInvalid()) { 3447 // This was a variable declaration's initialization for which no initializer 3448 // was specified. 3449 assert(NewArgs.empty() && 3450 "no parens or braces but have direct init with arguments?"); 3451 return ExprEmpty(); 3452 } 3453 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3454 Parens.getEnd()); 3455 } 3456 3457 template<typename Derived> 3458 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3459 unsigned NumInputs, 3460 bool IsCall, 3461 SmallVectorImpl<Expr *> &Outputs, 3462 bool *ArgChanged) { 3463 for (unsigned I = 0; I != NumInputs; ++I) { 3464 // If requested, drop call arguments that need to be dropped. 3465 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3466 if (ArgChanged) 3467 *ArgChanged = true; 3468 3469 break; 3470 } 3471 3472 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3473 Expr *Pattern = Expansion->getPattern(); 3474 3475 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3476 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3477 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3478 3479 // Determine whether the set of unexpanded parameter packs can and should 3480 // be expanded. 3481 bool Expand = true; 3482 bool RetainExpansion = false; 3483 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3484 Optional<unsigned> NumExpansions = OrigNumExpansions; 3485 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3486 Pattern->getSourceRange(), 3487 Unexpanded, 3488 Expand, RetainExpansion, 3489 NumExpansions)) 3490 return true; 3491 3492 if (!Expand) { 3493 // The transform has determined that we should perform a simple 3494 // transformation on the pack expansion, producing another pack 3495 // expansion. 3496 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3497 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3498 if (OutPattern.isInvalid()) 3499 return true; 3500 3501 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3502 Expansion->getEllipsisLoc(), 3503 NumExpansions); 3504 if (Out.isInvalid()) 3505 return true; 3506 3507 if (ArgChanged) 3508 *ArgChanged = true; 3509 Outputs.push_back(Out.get()); 3510 continue; 3511 } 3512 3513 // Record right away that the argument was changed. This needs 3514 // to happen even if the array expands to nothing. 3515 if (ArgChanged) *ArgChanged = true; 3516 3517 // The transform has determined that we should perform an elementwise 3518 // expansion of the pattern. Do so. 3519 for (unsigned I = 0; I != *NumExpansions; ++I) { 3520 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3521 ExprResult Out = getDerived().TransformExpr(Pattern); 3522 if (Out.isInvalid()) 3523 return true; 3524 3525 if (Out.get()->containsUnexpandedParameterPack()) { 3526 Out = getDerived().RebuildPackExpansion( 3527 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3528 if (Out.isInvalid()) 3529 return true; 3530 } 3531 3532 Outputs.push_back(Out.get()); 3533 } 3534 3535 // If we're supposed to retain a pack expansion, do so by temporarily 3536 // forgetting the partially-substituted parameter pack. 3537 if (RetainExpansion) { 3538 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3539 3540 ExprResult Out = getDerived().TransformExpr(Pattern); 3541 if (Out.isInvalid()) 3542 return true; 3543 3544 Out = getDerived().RebuildPackExpansion( 3545 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3546 if (Out.isInvalid()) 3547 return true; 3548 3549 Outputs.push_back(Out.get()); 3550 } 3551 3552 continue; 3553 } 3554 3555 ExprResult Result = 3556 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3557 : getDerived().TransformExpr(Inputs[I]); 3558 if (Result.isInvalid()) 3559 return true; 3560 3561 if (Result.get() != Inputs[I] && ArgChanged) 3562 *ArgChanged = true; 3563 3564 Outputs.push_back(Result.get()); 3565 } 3566 3567 return false; 3568 } 3569 3570 template <typename Derived> 3571 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3572 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3573 if (Var) { 3574 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3575 getDerived().TransformDefinition(Var->getLocation(), Var)); 3576 3577 if (!ConditionVar) 3578 return Sema::ConditionError(); 3579 3580 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3581 } 3582 3583 if (Expr) { 3584 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3585 3586 if (CondExpr.isInvalid()) 3587 return Sema::ConditionError(); 3588 3589 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3590 } 3591 3592 return Sema::ConditionResult(); 3593 } 3594 3595 template<typename Derived> 3596 NestedNameSpecifierLoc 3597 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3598 NestedNameSpecifierLoc NNS, 3599 QualType ObjectType, 3600 NamedDecl *FirstQualifierInScope) { 3601 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3602 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3603 Qualifier = Qualifier.getPrefix()) 3604 Qualifiers.push_back(Qualifier); 3605 3606 CXXScopeSpec SS; 3607 while (!Qualifiers.empty()) { 3608 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3609 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3610 3611 switch (QNNS->getKind()) { 3612 case NestedNameSpecifier::Identifier: { 3613 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3614 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3615 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3616 SS, FirstQualifierInScope, false)) 3617 return NestedNameSpecifierLoc(); 3618 } 3619 break; 3620 3621 case NestedNameSpecifier::Namespace: { 3622 NamespaceDecl *NS 3623 = cast_or_null<NamespaceDecl>( 3624 getDerived().TransformDecl( 3625 Q.getLocalBeginLoc(), 3626 QNNS->getAsNamespace())); 3627 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3628 break; 3629 } 3630 3631 case NestedNameSpecifier::NamespaceAlias: { 3632 NamespaceAliasDecl *Alias 3633 = cast_or_null<NamespaceAliasDecl>( 3634 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3635 QNNS->getAsNamespaceAlias())); 3636 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3637 Q.getLocalEndLoc()); 3638 break; 3639 } 3640 3641 case NestedNameSpecifier::Global: 3642 // There is no meaningful transformation that one could perform on the 3643 // global scope. 3644 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3645 break; 3646 3647 case NestedNameSpecifier::Super: { 3648 CXXRecordDecl *RD = 3649 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3650 SourceLocation(), QNNS->getAsRecordDecl())); 3651 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3652 break; 3653 } 3654 3655 case NestedNameSpecifier::TypeSpecWithTemplate: 3656 case NestedNameSpecifier::TypeSpec: { 3657 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3658 FirstQualifierInScope, SS); 3659 3660 if (!TL) 3661 return NestedNameSpecifierLoc(); 3662 3663 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3664 (SemaRef.getLangOpts().CPlusPlus11 && 3665 TL.getType()->isEnumeralType())) { 3666 assert(!TL.getType().hasLocalQualifiers() && 3667 "Can't get cv-qualifiers here"); 3668 if (TL.getType()->isEnumeralType()) 3669 SemaRef.Diag(TL.getBeginLoc(), 3670 diag::warn_cxx98_compat_enum_nested_name_spec); 3671 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3672 Q.getLocalEndLoc()); 3673 break; 3674 } 3675 // If the nested-name-specifier is an invalid type def, don't emit an 3676 // error because a previous error should have already been emitted. 3677 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3678 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3679 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3680 << TL.getType() << SS.getRange(); 3681 } 3682 return NestedNameSpecifierLoc(); 3683 } 3684 } 3685 3686 // The qualifier-in-scope and object type only apply to the leftmost entity. 3687 FirstQualifierInScope = nullptr; 3688 ObjectType = QualType(); 3689 } 3690 3691 // Don't rebuild the nested-name-specifier if we don't have to. 3692 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3693 !getDerived().AlwaysRebuild()) 3694 return NNS; 3695 3696 // If we can re-use the source-location data from the original 3697 // nested-name-specifier, do so. 3698 if (SS.location_size() == NNS.getDataLength() && 3699 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3700 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3701 3702 // Allocate new nested-name-specifier location information. 3703 return SS.getWithLocInContext(SemaRef.Context); 3704 } 3705 3706 template<typename Derived> 3707 DeclarationNameInfo 3708 TreeTransform<Derived> 3709 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3710 DeclarationName Name = NameInfo.getName(); 3711 if (!Name) 3712 return DeclarationNameInfo(); 3713 3714 switch (Name.getNameKind()) { 3715 case DeclarationName::Identifier: 3716 case DeclarationName::ObjCZeroArgSelector: 3717 case DeclarationName::ObjCOneArgSelector: 3718 case DeclarationName::ObjCMultiArgSelector: 3719 case DeclarationName::CXXOperatorName: 3720 case DeclarationName::CXXLiteralOperatorName: 3721 case DeclarationName::CXXUsingDirective: 3722 return NameInfo; 3723 3724 case DeclarationName::CXXDeductionGuideName: { 3725 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3726 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3727 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3728 if (!NewTemplate) 3729 return DeclarationNameInfo(); 3730 3731 DeclarationNameInfo NewNameInfo(NameInfo); 3732 NewNameInfo.setName( 3733 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3734 return NewNameInfo; 3735 } 3736 3737 case DeclarationName::CXXConstructorName: 3738 case DeclarationName::CXXDestructorName: 3739 case DeclarationName::CXXConversionFunctionName: { 3740 TypeSourceInfo *NewTInfo; 3741 CanQualType NewCanTy; 3742 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3743 NewTInfo = getDerived().TransformType(OldTInfo); 3744 if (!NewTInfo) 3745 return DeclarationNameInfo(); 3746 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3747 } 3748 else { 3749 NewTInfo = nullptr; 3750 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3751 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3752 if (NewT.isNull()) 3753 return DeclarationNameInfo(); 3754 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3755 } 3756 3757 DeclarationName NewName 3758 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3759 NewCanTy); 3760 DeclarationNameInfo NewNameInfo(NameInfo); 3761 NewNameInfo.setName(NewName); 3762 NewNameInfo.setNamedTypeInfo(NewTInfo); 3763 return NewNameInfo; 3764 } 3765 } 3766 3767 llvm_unreachable("Unknown name kind."); 3768 } 3769 3770 template<typename Derived> 3771 TemplateName 3772 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3773 TemplateName Name, 3774 SourceLocation NameLoc, 3775 QualType ObjectType, 3776 NamedDecl *FirstQualifierInScope, 3777 bool AllowInjectedClassName) { 3778 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3779 TemplateDecl *Template = QTN->getTemplateDecl(); 3780 assert(Template && "qualified template name must refer to a template"); 3781 3782 TemplateDecl *TransTemplate 3783 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3784 Template)); 3785 if (!TransTemplate) 3786 return TemplateName(); 3787 3788 if (!getDerived().AlwaysRebuild() && 3789 SS.getScopeRep() == QTN->getQualifier() && 3790 TransTemplate == Template) 3791 return Name; 3792 3793 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3794 TransTemplate); 3795 } 3796 3797 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3798 if (SS.getScopeRep()) { 3799 // These apply to the scope specifier, not the template. 3800 ObjectType = QualType(); 3801 FirstQualifierInScope = nullptr; 3802 } 3803 3804 if (!getDerived().AlwaysRebuild() && 3805 SS.getScopeRep() == DTN->getQualifier() && 3806 ObjectType.isNull()) 3807 return Name; 3808 3809 // FIXME: Preserve the location of the "template" keyword. 3810 SourceLocation TemplateKWLoc = NameLoc; 3811 3812 if (DTN->isIdentifier()) { 3813 return getDerived().RebuildTemplateName(SS, 3814 TemplateKWLoc, 3815 *DTN->getIdentifier(), 3816 NameLoc, 3817 ObjectType, 3818 FirstQualifierInScope, 3819 AllowInjectedClassName); 3820 } 3821 3822 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3823 DTN->getOperator(), NameLoc, 3824 ObjectType, AllowInjectedClassName); 3825 } 3826 3827 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3828 TemplateDecl *TransTemplate 3829 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3830 Template)); 3831 if (!TransTemplate) 3832 return TemplateName(); 3833 3834 if (!getDerived().AlwaysRebuild() && 3835 TransTemplate == Template) 3836 return Name; 3837 3838 return TemplateName(TransTemplate); 3839 } 3840 3841 if (SubstTemplateTemplateParmPackStorage *SubstPack 3842 = Name.getAsSubstTemplateTemplateParmPack()) { 3843 TemplateTemplateParmDecl *TransParam 3844 = cast_or_null<TemplateTemplateParmDecl>( 3845 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3846 if (!TransParam) 3847 return TemplateName(); 3848 3849 if (!getDerived().AlwaysRebuild() && 3850 TransParam == SubstPack->getParameterPack()) 3851 return Name; 3852 3853 return getDerived().RebuildTemplateName(TransParam, 3854 SubstPack->getArgumentPack()); 3855 } 3856 3857 // These should be getting filtered out before they reach the AST. 3858 llvm_unreachable("overloaded function decl survived to here"); 3859 } 3860 3861 template<typename Derived> 3862 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3863 const TemplateArgument &Arg, 3864 TemplateArgumentLoc &Output) { 3865 SourceLocation Loc = getDerived().getBaseLocation(); 3866 switch (Arg.getKind()) { 3867 case TemplateArgument::Null: 3868 llvm_unreachable("null template argument in TreeTransform"); 3869 break; 3870 3871 case TemplateArgument::Type: 3872 Output = TemplateArgumentLoc(Arg, 3873 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3874 3875 break; 3876 3877 case TemplateArgument::Template: 3878 case TemplateArgument::TemplateExpansion: { 3879 NestedNameSpecifierLocBuilder Builder; 3880 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3881 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3882 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3883 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3884 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3885 3886 if (Arg.getKind() == TemplateArgument::Template) 3887 Output = TemplateArgumentLoc(Arg, 3888 Builder.getWithLocInContext(SemaRef.Context), 3889 Loc); 3890 else 3891 Output = TemplateArgumentLoc(Arg, 3892 Builder.getWithLocInContext(SemaRef.Context), 3893 Loc, Loc); 3894 3895 break; 3896 } 3897 3898 case TemplateArgument::Expression: 3899 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3900 break; 3901 3902 case TemplateArgument::Declaration: 3903 case TemplateArgument::Integral: 3904 case TemplateArgument::Pack: 3905 case TemplateArgument::NullPtr: 3906 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3907 break; 3908 } 3909 } 3910 3911 template<typename Derived> 3912 bool TreeTransform<Derived>::TransformTemplateArgument( 3913 const TemplateArgumentLoc &Input, 3914 TemplateArgumentLoc &Output, bool Uneval) { 3915 EnterExpressionEvaluationContext EEEC( 3916 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated, 3917 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 3918 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 3919 const TemplateArgument &Arg = Input.getArgument(); 3920 switch (Arg.getKind()) { 3921 case TemplateArgument::Null: 3922 case TemplateArgument::Integral: 3923 case TemplateArgument::Pack: 3924 case TemplateArgument::Declaration: 3925 case TemplateArgument::NullPtr: 3926 llvm_unreachable("Unexpected TemplateArgument"); 3927 3928 case TemplateArgument::Type: { 3929 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3930 if (!DI) 3931 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3932 3933 DI = getDerived().TransformType(DI); 3934 if (!DI) return true; 3935 3936 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3937 return false; 3938 } 3939 3940 case TemplateArgument::Template: { 3941 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3942 if (QualifierLoc) { 3943 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3944 if (!QualifierLoc) 3945 return true; 3946 } 3947 3948 CXXScopeSpec SS; 3949 SS.Adopt(QualifierLoc); 3950 TemplateName Template 3951 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3952 Input.getTemplateNameLoc()); 3953 if (Template.isNull()) 3954 return true; 3955 3956 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3957 Input.getTemplateNameLoc()); 3958 return false; 3959 } 3960 3961 case TemplateArgument::TemplateExpansion: 3962 llvm_unreachable("Caller should expand pack expansions"); 3963 3964 case TemplateArgument::Expression: { 3965 // Template argument expressions are constant expressions. 3966 EnterExpressionEvaluationContext Unevaluated( 3967 getSema(), Uneval 3968 ? Sema::ExpressionEvaluationContext::Unevaluated 3969 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3970 3971 Expr *InputExpr = Input.getSourceExpression(); 3972 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3973 3974 ExprResult E = getDerived().TransformExpr(InputExpr); 3975 E = SemaRef.ActOnConstantExpression(E); 3976 if (E.isInvalid()) return true; 3977 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3978 return false; 3979 } 3980 } 3981 3982 // Work around bogus GCC warning 3983 return true; 3984 } 3985 3986 /// Iterator adaptor that invents template argument location information 3987 /// for each of the template arguments in its underlying iterator. 3988 template<typename Derived, typename InputIterator> 3989 class TemplateArgumentLocInventIterator { 3990 TreeTransform<Derived> &Self; 3991 InputIterator Iter; 3992 3993 public: 3994 typedef TemplateArgumentLoc value_type; 3995 typedef TemplateArgumentLoc reference; 3996 typedef typename std::iterator_traits<InputIterator>::difference_type 3997 difference_type; 3998 typedef std::input_iterator_tag iterator_category; 3999 4000 class pointer { 4001 TemplateArgumentLoc Arg; 4002 4003 public: 4004 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4005 4006 const TemplateArgumentLoc *operator->() const { return &Arg; } 4007 }; 4008 4009 TemplateArgumentLocInventIterator() { } 4010 4011 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4012 InputIterator Iter) 4013 : Self(Self), Iter(Iter) { } 4014 4015 TemplateArgumentLocInventIterator &operator++() { 4016 ++Iter; 4017 return *this; 4018 } 4019 4020 TemplateArgumentLocInventIterator operator++(int) { 4021 TemplateArgumentLocInventIterator Old(*this); 4022 ++(*this); 4023 return Old; 4024 } 4025 4026 reference operator*() const { 4027 TemplateArgumentLoc Result; 4028 Self.InventTemplateArgumentLoc(*Iter, Result); 4029 return Result; 4030 } 4031 4032 pointer operator->() const { return pointer(**this); } 4033 4034 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4035 const TemplateArgumentLocInventIterator &Y) { 4036 return X.Iter == Y.Iter; 4037 } 4038 4039 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4040 const TemplateArgumentLocInventIterator &Y) { 4041 return X.Iter != Y.Iter; 4042 } 4043 }; 4044 4045 template<typename Derived> 4046 template<typename InputIterator> 4047 bool TreeTransform<Derived>::TransformTemplateArguments( 4048 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4049 bool Uneval) { 4050 for (; First != Last; ++First) { 4051 TemplateArgumentLoc Out; 4052 TemplateArgumentLoc In = *First; 4053 4054 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4055 // Unpack argument packs, which we translate them into separate 4056 // arguments. 4057 // FIXME: We could do much better if we could guarantee that the 4058 // TemplateArgumentLocInfo for the pack expansion would be usable for 4059 // all of the template arguments in the argument pack. 4060 typedef TemplateArgumentLocInventIterator<Derived, 4061 TemplateArgument::pack_iterator> 4062 PackLocIterator; 4063 if (TransformTemplateArguments(PackLocIterator(*this, 4064 In.getArgument().pack_begin()), 4065 PackLocIterator(*this, 4066 In.getArgument().pack_end()), 4067 Outputs, Uneval)) 4068 return true; 4069 4070 continue; 4071 } 4072 4073 if (In.getArgument().isPackExpansion()) { 4074 // We have a pack expansion, for which we will be substituting into 4075 // the pattern. 4076 SourceLocation Ellipsis; 4077 Optional<unsigned> OrigNumExpansions; 4078 TemplateArgumentLoc Pattern 4079 = getSema().getTemplateArgumentPackExpansionPattern( 4080 In, Ellipsis, OrigNumExpansions); 4081 4082 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4083 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4084 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4085 4086 // Determine whether the set of unexpanded parameter packs can and should 4087 // be expanded. 4088 bool Expand = true; 4089 bool RetainExpansion = false; 4090 Optional<unsigned> NumExpansions = OrigNumExpansions; 4091 if (getDerived().TryExpandParameterPacks(Ellipsis, 4092 Pattern.getSourceRange(), 4093 Unexpanded, 4094 Expand, 4095 RetainExpansion, 4096 NumExpansions)) 4097 return true; 4098 4099 if (!Expand) { 4100 // The transform has determined that we should perform a simple 4101 // transformation on the pack expansion, producing another pack 4102 // expansion. 4103 TemplateArgumentLoc OutPattern; 4104 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4105 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4106 return true; 4107 4108 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4109 NumExpansions); 4110 if (Out.getArgument().isNull()) 4111 return true; 4112 4113 Outputs.addArgument(Out); 4114 continue; 4115 } 4116 4117 // The transform has determined that we should perform an elementwise 4118 // expansion of the pattern. Do so. 4119 for (unsigned I = 0; I != *NumExpansions; ++I) { 4120 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4121 4122 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4123 return true; 4124 4125 if (Out.getArgument().containsUnexpandedParameterPack()) { 4126 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4127 OrigNumExpansions); 4128 if (Out.getArgument().isNull()) 4129 return true; 4130 } 4131 4132 Outputs.addArgument(Out); 4133 } 4134 4135 // If we're supposed to retain a pack expansion, do so by temporarily 4136 // forgetting the partially-substituted parameter pack. 4137 if (RetainExpansion) { 4138 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4139 4140 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4141 return true; 4142 4143 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4144 OrigNumExpansions); 4145 if (Out.getArgument().isNull()) 4146 return true; 4147 4148 Outputs.addArgument(Out); 4149 } 4150 4151 continue; 4152 } 4153 4154 // The simple case: 4155 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4156 return true; 4157 4158 Outputs.addArgument(Out); 4159 } 4160 4161 return false; 4162 4163 } 4164 4165 //===----------------------------------------------------------------------===// 4166 // Type transformation 4167 //===----------------------------------------------------------------------===// 4168 4169 template<typename Derived> 4170 QualType TreeTransform<Derived>::TransformType(QualType T) { 4171 if (getDerived().AlreadyTransformed(T)) 4172 return T; 4173 4174 // Temporary workaround. All of these transformations should 4175 // eventually turn into transformations on TypeLocs. 4176 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4177 getDerived().getBaseLocation()); 4178 4179 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4180 4181 if (!NewDI) 4182 return QualType(); 4183 4184 return NewDI->getType(); 4185 } 4186 4187 template<typename Derived> 4188 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4189 // Refine the base location to the type's location. 4190 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4191 getDerived().getBaseEntity()); 4192 if (getDerived().AlreadyTransformed(DI->getType())) 4193 return DI; 4194 4195 TypeLocBuilder TLB; 4196 4197 TypeLoc TL = DI->getTypeLoc(); 4198 TLB.reserve(TL.getFullDataSize()); 4199 4200 QualType Result = getDerived().TransformType(TLB, TL); 4201 if (Result.isNull()) 4202 return nullptr; 4203 4204 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4205 } 4206 4207 template<typename Derived> 4208 QualType 4209 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4210 switch (T.getTypeLocClass()) { 4211 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4212 #define TYPELOC(CLASS, PARENT) \ 4213 case TypeLoc::CLASS: \ 4214 return getDerived().Transform##CLASS##Type(TLB, \ 4215 T.castAs<CLASS##TypeLoc>()); 4216 #include "clang/AST/TypeLocNodes.def" 4217 } 4218 4219 llvm_unreachable("unhandled type loc!"); 4220 } 4221 4222 template<typename Derived> 4223 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4224 if (!isa<DependentNameType>(T)) 4225 return TransformType(T); 4226 4227 if (getDerived().AlreadyTransformed(T)) 4228 return T; 4229 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4230 getDerived().getBaseLocation()); 4231 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4232 return NewDI ? NewDI->getType() : QualType(); 4233 } 4234 4235 template<typename Derived> 4236 TypeSourceInfo * 4237 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4238 if (!isa<DependentNameType>(DI->getType())) 4239 return TransformType(DI); 4240 4241 // Refine the base location to the type's location. 4242 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4243 getDerived().getBaseEntity()); 4244 if (getDerived().AlreadyTransformed(DI->getType())) 4245 return DI; 4246 4247 TypeLocBuilder TLB; 4248 4249 TypeLoc TL = DI->getTypeLoc(); 4250 TLB.reserve(TL.getFullDataSize()); 4251 4252 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4253 if (QTL) 4254 TL = QTL.getUnqualifiedLoc(); 4255 4256 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4257 4258 QualType Result = getDerived().TransformDependentNameType( 4259 TLB, DNTL, /*DeducedTSTContext*/true); 4260 if (Result.isNull()) 4261 return nullptr; 4262 4263 if (QTL) { 4264 Result = getDerived().RebuildQualifiedType(Result, QTL); 4265 if (Result.isNull()) 4266 return nullptr; 4267 TLB.TypeWasModifiedSafely(Result); 4268 } 4269 4270 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4271 } 4272 4273 template<typename Derived> 4274 QualType 4275 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4276 QualifiedTypeLoc T) { 4277 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4278 if (Result.isNull()) 4279 return QualType(); 4280 4281 Result = getDerived().RebuildQualifiedType(Result, T); 4282 4283 if (Result.isNull()) 4284 return QualType(); 4285 4286 // RebuildQualifiedType might have updated the type, but not in a way 4287 // that invalidates the TypeLoc. (There's no location information for 4288 // qualifiers.) 4289 TLB.TypeWasModifiedSafely(Result); 4290 4291 return Result; 4292 } 4293 4294 template <typename Derived> 4295 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4296 QualifiedTypeLoc TL) { 4297 4298 SourceLocation Loc = TL.getBeginLoc(); 4299 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4300 4301 if (((T.getAddressSpace() != LangAS::Default && 4302 Quals.getAddressSpace() != LangAS::Default)) && 4303 T.getAddressSpace() != Quals.getAddressSpace()) { 4304 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4305 << TL.getType() << T; 4306 return QualType(); 4307 } 4308 4309 // C++ [dcl.fct]p7: 4310 // [When] adding cv-qualifications on top of the function type [...] the 4311 // cv-qualifiers are ignored. 4312 if (T->isFunctionType()) { 4313 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4314 Quals.getAddressSpace()); 4315 return T; 4316 } 4317 4318 // C++ [dcl.ref]p1: 4319 // when the cv-qualifiers are introduced through the use of a typedef-name 4320 // or decltype-specifier [...] the cv-qualifiers are ignored. 4321 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4322 // applied to a reference type. 4323 if (T->isReferenceType()) { 4324 // The only qualifier that applies to a reference type is restrict. 4325 if (!Quals.hasRestrict()) 4326 return T; 4327 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4328 } 4329 4330 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4331 // resulting type. 4332 if (Quals.hasObjCLifetime()) { 4333 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4334 Quals.removeObjCLifetime(); 4335 else if (T.getObjCLifetime()) { 4336 // Objective-C ARC: 4337 // A lifetime qualifier applied to a substituted template parameter 4338 // overrides the lifetime qualifier from the template argument. 4339 const AutoType *AutoTy; 4340 if (const SubstTemplateTypeParmType *SubstTypeParam 4341 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4342 QualType Replacement = SubstTypeParam->getReplacementType(); 4343 Qualifiers Qs = Replacement.getQualifiers(); 4344 Qs.removeObjCLifetime(); 4345 Replacement = SemaRef.Context.getQualifiedType( 4346 Replacement.getUnqualifiedType(), Qs); 4347 T = SemaRef.Context.getSubstTemplateTypeParmType( 4348 SubstTypeParam->getReplacedParameter(), Replacement); 4349 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4350 // 'auto' types behave the same way as template parameters. 4351 QualType Deduced = AutoTy->getDeducedType(); 4352 Qualifiers Qs = Deduced.getQualifiers(); 4353 Qs.removeObjCLifetime(); 4354 Deduced = 4355 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4356 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4357 AutoTy->isDependentType()); 4358 } else { 4359 // Otherwise, complain about the addition of a qualifier to an 4360 // already-qualified type. 4361 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4362 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4363 Quals.removeObjCLifetime(); 4364 } 4365 } 4366 } 4367 4368 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4369 } 4370 4371 template<typename Derived> 4372 TypeLoc 4373 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4374 QualType ObjectType, 4375 NamedDecl *UnqualLookup, 4376 CXXScopeSpec &SS) { 4377 if (getDerived().AlreadyTransformed(TL.getType())) 4378 return TL; 4379 4380 TypeSourceInfo *TSI = 4381 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4382 if (TSI) 4383 return TSI->getTypeLoc(); 4384 return TypeLoc(); 4385 } 4386 4387 template<typename Derived> 4388 TypeSourceInfo * 4389 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4390 QualType ObjectType, 4391 NamedDecl *UnqualLookup, 4392 CXXScopeSpec &SS) { 4393 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4394 return TSInfo; 4395 4396 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4397 UnqualLookup, SS); 4398 } 4399 4400 template <typename Derived> 4401 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4402 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4403 CXXScopeSpec &SS) { 4404 QualType T = TL.getType(); 4405 assert(!getDerived().AlreadyTransformed(T)); 4406 4407 TypeLocBuilder TLB; 4408 QualType Result; 4409 4410 if (isa<TemplateSpecializationType>(T)) { 4411 TemplateSpecializationTypeLoc SpecTL = 4412 TL.castAs<TemplateSpecializationTypeLoc>(); 4413 4414 TemplateName Template = getDerived().TransformTemplateName( 4415 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4416 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4417 if (Template.isNull()) 4418 return nullptr; 4419 4420 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4421 Template); 4422 } else if (isa<DependentTemplateSpecializationType>(T)) { 4423 DependentTemplateSpecializationTypeLoc SpecTL = 4424 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4425 4426 TemplateName Template 4427 = getDerived().RebuildTemplateName(SS, 4428 SpecTL.getTemplateKeywordLoc(), 4429 *SpecTL.getTypePtr()->getIdentifier(), 4430 SpecTL.getTemplateNameLoc(), 4431 ObjectType, UnqualLookup, 4432 /*AllowInjectedClassName*/true); 4433 if (Template.isNull()) 4434 return nullptr; 4435 4436 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4437 SpecTL, 4438 Template, 4439 SS); 4440 } else { 4441 // Nothing special needs to be done for these. 4442 Result = getDerived().TransformType(TLB, TL); 4443 } 4444 4445 if (Result.isNull()) 4446 return nullptr; 4447 4448 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4449 } 4450 4451 template <class TyLoc> static inline 4452 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4453 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4454 NewT.setNameLoc(T.getNameLoc()); 4455 return T.getType(); 4456 } 4457 4458 template<typename Derived> 4459 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4460 BuiltinTypeLoc T) { 4461 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4462 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4463 if (T.needsExtraLocalData()) 4464 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4465 return T.getType(); 4466 } 4467 4468 template<typename Derived> 4469 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4470 ComplexTypeLoc T) { 4471 // FIXME: recurse? 4472 return TransformTypeSpecType(TLB, T); 4473 } 4474 4475 template <typename Derived> 4476 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4477 AdjustedTypeLoc TL) { 4478 // Adjustments applied during transformation are handled elsewhere. 4479 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4480 } 4481 4482 template<typename Derived> 4483 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4484 DecayedTypeLoc TL) { 4485 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4486 if (OriginalType.isNull()) 4487 return QualType(); 4488 4489 QualType Result = TL.getType(); 4490 if (getDerived().AlwaysRebuild() || 4491 OriginalType != TL.getOriginalLoc().getType()) 4492 Result = SemaRef.Context.getDecayedType(OriginalType); 4493 TLB.push<DecayedTypeLoc>(Result); 4494 // Nothing to set for DecayedTypeLoc. 4495 return Result; 4496 } 4497 4498 template<typename Derived> 4499 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4500 PointerTypeLoc TL) { 4501 QualType PointeeType 4502 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4503 if (PointeeType.isNull()) 4504 return QualType(); 4505 4506 QualType Result = TL.getType(); 4507 if (PointeeType->getAs<ObjCObjectType>()) { 4508 // A dependent pointer type 'T *' has is being transformed such 4509 // that an Objective-C class type is being replaced for 'T'. The 4510 // resulting pointer type is an ObjCObjectPointerType, not a 4511 // PointerType. 4512 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4513 4514 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4515 NewT.setStarLoc(TL.getStarLoc()); 4516 return Result; 4517 } 4518 4519 if (getDerived().AlwaysRebuild() || 4520 PointeeType != TL.getPointeeLoc().getType()) { 4521 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4522 if (Result.isNull()) 4523 return QualType(); 4524 } 4525 4526 // Objective-C ARC can add lifetime qualifiers to the type that we're 4527 // pointing to. 4528 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4529 4530 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4531 NewT.setSigilLoc(TL.getSigilLoc()); 4532 return Result; 4533 } 4534 4535 template<typename Derived> 4536 QualType 4537 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4538 BlockPointerTypeLoc TL) { 4539 QualType PointeeType 4540 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4541 if (PointeeType.isNull()) 4542 return QualType(); 4543 4544 QualType Result = TL.getType(); 4545 if (getDerived().AlwaysRebuild() || 4546 PointeeType != TL.getPointeeLoc().getType()) { 4547 Result = getDerived().RebuildBlockPointerType(PointeeType, 4548 TL.getSigilLoc()); 4549 if (Result.isNull()) 4550 return QualType(); 4551 } 4552 4553 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4554 NewT.setSigilLoc(TL.getSigilLoc()); 4555 return Result; 4556 } 4557 4558 /// Transforms a reference type. Note that somewhat paradoxically we 4559 /// don't care whether the type itself is an l-value type or an r-value 4560 /// type; we only care if the type was *written* as an l-value type 4561 /// or an r-value type. 4562 template<typename Derived> 4563 QualType 4564 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4565 ReferenceTypeLoc TL) { 4566 const ReferenceType *T = TL.getTypePtr(); 4567 4568 // Note that this works with the pointee-as-written. 4569 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4570 if (PointeeType.isNull()) 4571 return QualType(); 4572 4573 QualType Result = TL.getType(); 4574 if (getDerived().AlwaysRebuild() || 4575 PointeeType != T->getPointeeTypeAsWritten()) { 4576 Result = getDerived().RebuildReferenceType(PointeeType, 4577 T->isSpelledAsLValue(), 4578 TL.getSigilLoc()); 4579 if (Result.isNull()) 4580 return QualType(); 4581 } 4582 4583 // Objective-C ARC can add lifetime qualifiers to the type that we're 4584 // referring to. 4585 TLB.TypeWasModifiedSafely( 4586 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4587 4588 // r-value references can be rebuilt as l-value references. 4589 ReferenceTypeLoc NewTL; 4590 if (isa<LValueReferenceType>(Result)) 4591 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4592 else 4593 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4594 NewTL.setSigilLoc(TL.getSigilLoc()); 4595 4596 return Result; 4597 } 4598 4599 template<typename Derived> 4600 QualType 4601 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4602 LValueReferenceTypeLoc TL) { 4603 return TransformReferenceType(TLB, TL); 4604 } 4605 4606 template<typename Derived> 4607 QualType 4608 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4609 RValueReferenceTypeLoc TL) { 4610 return TransformReferenceType(TLB, TL); 4611 } 4612 4613 template<typename Derived> 4614 QualType 4615 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4616 MemberPointerTypeLoc TL) { 4617 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4618 if (PointeeType.isNull()) 4619 return QualType(); 4620 4621 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4622 TypeSourceInfo *NewClsTInfo = nullptr; 4623 if (OldClsTInfo) { 4624 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4625 if (!NewClsTInfo) 4626 return QualType(); 4627 } 4628 4629 const MemberPointerType *T = TL.getTypePtr(); 4630 QualType OldClsType = QualType(T->getClass(), 0); 4631 QualType NewClsType; 4632 if (NewClsTInfo) 4633 NewClsType = NewClsTInfo->getType(); 4634 else { 4635 NewClsType = getDerived().TransformType(OldClsType); 4636 if (NewClsType.isNull()) 4637 return QualType(); 4638 } 4639 4640 QualType Result = TL.getType(); 4641 if (getDerived().AlwaysRebuild() || 4642 PointeeType != T->getPointeeType() || 4643 NewClsType != OldClsType) { 4644 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4645 TL.getStarLoc()); 4646 if (Result.isNull()) 4647 return QualType(); 4648 } 4649 4650 // If we had to adjust the pointee type when building a member pointer, make 4651 // sure to push TypeLoc info for it. 4652 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4653 if (MPT && PointeeType != MPT->getPointeeType()) { 4654 assert(isa<AdjustedType>(MPT->getPointeeType())); 4655 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4656 } 4657 4658 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4659 NewTL.setSigilLoc(TL.getSigilLoc()); 4660 NewTL.setClassTInfo(NewClsTInfo); 4661 4662 return Result; 4663 } 4664 4665 template<typename Derived> 4666 QualType 4667 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4668 ConstantArrayTypeLoc TL) { 4669 const ConstantArrayType *T = TL.getTypePtr(); 4670 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4671 if (ElementType.isNull()) 4672 return QualType(); 4673 4674 QualType Result = TL.getType(); 4675 if (getDerived().AlwaysRebuild() || 4676 ElementType != T->getElementType()) { 4677 Result = getDerived().RebuildConstantArrayType(ElementType, 4678 T->getSizeModifier(), 4679 T->getSize(), 4680 T->getIndexTypeCVRQualifiers(), 4681 TL.getBracketsRange()); 4682 if (Result.isNull()) 4683 return QualType(); 4684 } 4685 4686 // We might have either a ConstantArrayType or a VariableArrayType now: 4687 // a ConstantArrayType is allowed to have an element type which is a 4688 // VariableArrayType if the type is dependent. Fortunately, all array 4689 // types have the same location layout. 4690 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4691 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4692 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4693 4694 Expr *Size = TL.getSizeExpr(); 4695 if (Size) { 4696 EnterExpressionEvaluationContext Unevaluated( 4697 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4698 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4699 Size = SemaRef.ActOnConstantExpression(Size).get(); 4700 } 4701 NewTL.setSizeExpr(Size); 4702 4703 return Result; 4704 } 4705 4706 template<typename Derived> 4707 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4708 TypeLocBuilder &TLB, 4709 IncompleteArrayTypeLoc TL) { 4710 const IncompleteArrayType *T = TL.getTypePtr(); 4711 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4712 if (ElementType.isNull()) 4713 return QualType(); 4714 4715 QualType Result = TL.getType(); 4716 if (getDerived().AlwaysRebuild() || 4717 ElementType != T->getElementType()) { 4718 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4719 T->getSizeModifier(), 4720 T->getIndexTypeCVRQualifiers(), 4721 TL.getBracketsRange()); 4722 if (Result.isNull()) 4723 return QualType(); 4724 } 4725 4726 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4727 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4728 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4729 NewTL.setSizeExpr(nullptr); 4730 4731 return Result; 4732 } 4733 4734 template<typename Derived> 4735 QualType 4736 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4737 VariableArrayTypeLoc TL) { 4738 const VariableArrayType *T = TL.getTypePtr(); 4739 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4740 if (ElementType.isNull()) 4741 return QualType(); 4742 4743 ExprResult SizeResult; 4744 { 4745 EnterExpressionEvaluationContext Context( 4746 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4747 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4748 } 4749 if (SizeResult.isInvalid()) 4750 return QualType(); 4751 SizeResult = 4752 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 4753 if (SizeResult.isInvalid()) 4754 return QualType(); 4755 4756 Expr *Size = SizeResult.get(); 4757 4758 QualType Result = TL.getType(); 4759 if (getDerived().AlwaysRebuild() || 4760 ElementType != T->getElementType() || 4761 Size != T->getSizeExpr()) { 4762 Result = getDerived().RebuildVariableArrayType(ElementType, 4763 T->getSizeModifier(), 4764 Size, 4765 T->getIndexTypeCVRQualifiers(), 4766 TL.getBracketsRange()); 4767 if (Result.isNull()) 4768 return QualType(); 4769 } 4770 4771 // We might have constant size array now, but fortunately it has the same 4772 // location layout. 4773 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4774 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4775 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4776 NewTL.setSizeExpr(Size); 4777 4778 return Result; 4779 } 4780 4781 template<typename Derived> 4782 QualType 4783 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4784 DependentSizedArrayTypeLoc TL) { 4785 const DependentSizedArrayType *T = TL.getTypePtr(); 4786 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4787 if (ElementType.isNull()) 4788 return QualType(); 4789 4790 // Array bounds are constant expressions. 4791 EnterExpressionEvaluationContext Unevaluated( 4792 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4793 4794 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4795 Expr *origSize = TL.getSizeExpr(); 4796 if (!origSize) origSize = T->getSizeExpr(); 4797 4798 ExprResult sizeResult 4799 = getDerived().TransformExpr(origSize); 4800 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4801 if (sizeResult.isInvalid()) 4802 return QualType(); 4803 4804 Expr *size = sizeResult.get(); 4805 4806 QualType Result = TL.getType(); 4807 if (getDerived().AlwaysRebuild() || 4808 ElementType != T->getElementType() || 4809 size != origSize) { 4810 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4811 T->getSizeModifier(), 4812 size, 4813 T->getIndexTypeCVRQualifiers(), 4814 TL.getBracketsRange()); 4815 if (Result.isNull()) 4816 return QualType(); 4817 } 4818 4819 // We might have any sort of array type now, but fortunately they 4820 // all have the same location layout. 4821 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4822 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4823 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4824 NewTL.setSizeExpr(size); 4825 4826 return Result; 4827 } 4828 4829 template <typename Derived> 4830 QualType TreeTransform<Derived>::TransformDependentVectorType( 4831 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 4832 const DependentVectorType *T = TL.getTypePtr(); 4833 QualType ElementType = getDerived().TransformType(T->getElementType()); 4834 if (ElementType.isNull()) 4835 return QualType(); 4836 4837 EnterExpressionEvaluationContext Unevaluated( 4838 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4839 4840 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4841 Size = SemaRef.ActOnConstantExpression(Size); 4842 if (Size.isInvalid()) 4843 return QualType(); 4844 4845 QualType Result = TL.getType(); 4846 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 4847 Size.get() != T->getSizeExpr()) { 4848 Result = getDerived().RebuildDependentVectorType( 4849 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 4850 if (Result.isNull()) 4851 return QualType(); 4852 } 4853 4854 // Result might be dependent or not. 4855 if (isa<DependentVectorType>(Result)) { 4856 DependentVectorTypeLoc NewTL = 4857 TLB.push<DependentVectorTypeLoc>(Result); 4858 NewTL.setNameLoc(TL.getNameLoc()); 4859 } else { 4860 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4861 NewTL.setNameLoc(TL.getNameLoc()); 4862 } 4863 4864 return Result; 4865 } 4866 4867 template<typename Derived> 4868 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4869 TypeLocBuilder &TLB, 4870 DependentSizedExtVectorTypeLoc TL) { 4871 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4872 4873 // FIXME: ext vector locs should be nested 4874 QualType ElementType = getDerived().TransformType(T->getElementType()); 4875 if (ElementType.isNull()) 4876 return QualType(); 4877 4878 // Vector sizes are constant expressions. 4879 EnterExpressionEvaluationContext Unevaluated( 4880 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4881 4882 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4883 Size = SemaRef.ActOnConstantExpression(Size); 4884 if (Size.isInvalid()) 4885 return QualType(); 4886 4887 QualType Result = TL.getType(); 4888 if (getDerived().AlwaysRebuild() || 4889 ElementType != T->getElementType() || 4890 Size.get() != T->getSizeExpr()) { 4891 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4892 Size.get(), 4893 T->getAttributeLoc()); 4894 if (Result.isNull()) 4895 return QualType(); 4896 } 4897 4898 // Result might be dependent or not. 4899 if (isa<DependentSizedExtVectorType>(Result)) { 4900 DependentSizedExtVectorTypeLoc NewTL 4901 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4902 NewTL.setNameLoc(TL.getNameLoc()); 4903 } else { 4904 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4905 NewTL.setNameLoc(TL.getNameLoc()); 4906 } 4907 4908 return Result; 4909 } 4910 4911 template <typename Derived> 4912 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4913 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4914 const DependentAddressSpaceType *T = TL.getTypePtr(); 4915 4916 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4917 4918 if (pointeeType.isNull()) 4919 return QualType(); 4920 4921 // Address spaces are constant expressions. 4922 EnterExpressionEvaluationContext Unevaluated( 4923 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4924 4925 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4926 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4927 if (AddrSpace.isInvalid()) 4928 return QualType(); 4929 4930 QualType Result = TL.getType(); 4931 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4932 AddrSpace.get() != T->getAddrSpaceExpr()) { 4933 Result = getDerived().RebuildDependentAddressSpaceType( 4934 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4935 if (Result.isNull()) 4936 return QualType(); 4937 } 4938 4939 // Result might be dependent or not. 4940 if (isa<DependentAddressSpaceType>(Result)) { 4941 DependentAddressSpaceTypeLoc NewTL = 4942 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4943 4944 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4945 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4946 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4947 4948 } else { 4949 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4950 Result, getDerived().getBaseLocation()); 4951 TransformType(TLB, DI->getTypeLoc()); 4952 } 4953 4954 return Result; 4955 } 4956 4957 template <typename Derived> 4958 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4959 VectorTypeLoc TL) { 4960 const VectorType *T = TL.getTypePtr(); 4961 QualType ElementType = getDerived().TransformType(T->getElementType()); 4962 if (ElementType.isNull()) 4963 return QualType(); 4964 4965 QualType Result = TL.getType(); 4966 if (getDerived().AlwaysRebuild() || 4967 ElementType != T->getElementType()) { 4968 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4969 T->getVectorKind()); 4970 if (Result.isNull()) 4971 return QualType(); 4972 } 4973 4974 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4975 NewTL.setNameLoc(TL.getNameLoc()); 4976 4977 return Result; 4978 } 4979 4980 template<typename Derived> 4981 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4982 ExtVectorTypeLoc TL) { 4983 const VectorType *T = TL.getTypePtr(); 4984 QualType ElementType = getDerived().TransformType(T->getElementType()); 4985 if (ElementType.isNull()) 4986 return QualType(); 4987 4988 QualType Result = TL.getType(); 4989 if (getDerived().AlwaysRebuild() || 4990 ElementType != T->getElementType()) { 4991 Result = getDerived().RebuildExtVectorType(ElementType, 4992 T->getNumElements(), 4993 /*FIXME*/ SourceLocation()); 4994 if (Result.isNull()) 4995 return QualType(); 4996 } 4997 4998 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4999 NewTL.setNameLoc(TL.getNameLoc()); 5000 5001 return Result; 5002 } 5003 5004 template <typename Derived> 5005 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5006 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5007 bool ExpectParameterPack) { 5008 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5009 TypeSourceInfo *NewDI = nullptr; 5010 5011 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5012 // If we're substituting into a pack expansion type and we know the 5013 // length we want to expand to, just substitute for the pattern. 5014 TypeLoc OldTL = OldDI->getTypeLoc(); 5015 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5016 5017 TypeLocBuilder TLB; 5018 TypeLoc NewTL = OldDI->getTypeLoc(); 5019 TLB.reserve(NewTL.getFullDataSize()); 5020 5021 QualType Result = getDerived().TransformType(TLB, 5022 OldExpansionTL.getPatternLoc()); 5023 if (Result.isNull()) 5024 return nullptr; 5025 5026 Result = RebuildPackExpansionType(Result, 5027 OldExpansionTL.getPatternLoc().getSourceRange(), 5028 OldExpansionTL.getEllipsisLoc(), 5029 NumExpansions); 5030 if (Result.isNull()) 5031 return nullptr; 5032 5033 PackExpansionTypeLoc NewExpansionTL 5034 = TLB.push<PackExpansionTypeLoc>(Result); 5035 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5036 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5037 } else 5038 NewDI = getDerived().TransformType(OldDI); 5039 if (!NewDI) 5040 return nullptr; 5041 5042 if (NewDI == OldDI && indexAdjustment == 0) 5043 return OldParm; 5044 5045 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5046 OldParm->getDeclContext(), 5047 OldParm->getInnerLocStart(), 5048 OldParm->getLocation(), 5049 OldParm->getIdentifier(), 5050 NewDI->getType(), 5051 NewDI, 5052 OldParm->getStorageClass(), 5053 /* DefArg */ nullptr); 5054 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5055 OldParm->getFunctionScopeIndex() + indexAdjustment); 5056 return newParm; 5057 } 5058 5059 template <typename Derived> 5060 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5061 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5062 const QualType *ParamTypes, 5063 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5064 SmallVectorImpl<QualType> &OutParamTypes, 5065 SmallVectorImpl<ParmVarDecl *> *PVars, 5066 Sema::ExtParameterInfoBuilder &PInfos) { 5067 int indexAdjustment = 0; 5068 5069 unsigned NumParams = Params.size(); 5070 for (unsigned i = 0; i != NumParams; ++i) { 5071 if (ParmVarDecl *OldParm = Params[i]) { 5072 assert(OldParm->getFunctionScopeIndex() == i); 5073 5074 Optional<unsigned> NumExpansions; 5075 ParmVarDecl *NewParm = nullptr; 5076 if (OldParm->isParameterPack()) { 5077 // We have a function parameter pack that may need to be expanded. 5078 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5079 5080 // Find the parameter packs that could be expanded. 5081 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5082 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5083 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5084 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5085 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 5086 5087 // Determine whether we should expand the parameter packs. 5088 bool ShouldExpand = false; 5089 bool RetainExpansion = false; 5090 Optional<unsigned> OrigNumExpansions = 5091 ExpansionTL.getTypePtr()->getNumExpansions(); 5092 NumExpansions = OrigNumExpansions; 5093 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5094 Pattern.getSourceRange(), 5095 Unexpanded, 5096 ShouldExpand, 5097 RetainExpansion, 5098 NumExpansions)) { 5099 return true; 5100 } 5101 5102 if (ShouldExpand) { 5103 // Expand the function parameter pack into multiple, separate 5104 // parameters. 5105 getDerived().ExpandingFunctionParameterPack(OldParm); 5106 for (unsigned I = 0; I != *NumExpansions; ++I) { 5107 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5108 ParmVarDecl *NewParm 5109 = getDerived().TransformFunctionTypeParam(OldParm, 5110 indexAdjustment++, 5111 OrigNumExpansions, 5112 /*ExpectParameterPack=*/false); 5113 if (!NewParm) 5114 return true; 5115 5116 if (ParamInfos) 5117 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5118 OutParamTypes.push_back(NewParm->getType()); 5119 if (PVars) 5120 PVars->push_back(NewParm); 5121 } 5122 5123 // If we're supposed to retain a pack expansion, do so by temporarily 5124 // forgetting the partially-substituted parameter pack. 5125 if (RetainExpansion) { 5126 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5127 ParmVarDecl *NewParm 5128 = getDerived().TransformFunctionTypeParam(OldParm, 5129 indexAdjustment++, 5130 OrigNumExpansions, 5131 /*ExpectParameterPack=*/false); 5132 if (!NewParm) 5133 return true; 5134 5135 if (ParamInfos) 5136 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5137 OutParamTypes.push_back(NewParm->getType()); 5138 if (PVars) 5139 PVars->push_back(NewParm); 5140 } 5141 5142 // The next parameter should have the same adjustment as the 5143 // last thing we pushed, but we post-incremented indexAdjustment 5144 // on every push. Also, if we push nothing, the adjustment should 5145 // go down by one. 5146 indexAdjustment--; 5147 5148 // We're done with the pack expansion. 5149 continue; 5150 } 5151 5152 // We'll substitute the parameter now without expanding the pack 5153 // expansion. 5154 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5155 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5156 indexAdjustment, 5157 NumExpansions, 5158 /*ExpectParameterPack=*/true); 5159 } else { 5160 NewParm = getDerived().TransformFunctionTypeParam( 5161 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5162 } 5163 5164 if (!NewParm) 5165 return true; 5166 5167 if (ParamInfos) 5168 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5169 OutParamTypes.push_back(NewParm->getType()); 5170 if (PVars) 5171 PVars->push_back(NewParm); 5172 continue; 5173 } 5174 5175 // Deal with the possibility that we don't have a parameter 5176 // declaration for this parameter. 5177 QualType OldType = ParamTypes[i]; 5178 bool IsPackExpansion = false; 5179 Optional<unsigned> NumExpansions; 5180 QualType NewType; 5181 if (const PackExpansionType *Expansion 5182 = dyn_cast<PackExpansionType>(OldType)) { 5183 // We have a function parameter pack that may need to be expanded. 5184 QualType Pattern = Expansion->getPattern(); 5185 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5186 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5187 5188 // Determine whether we should expand the parameter packs. 5189 bool ShouldExpand = false; 5190 bool RetainExpansion = false; 5191 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5192 Unexpanded, 5193 ShouldExpand, 5194 RetainExpansion, 5195 NumExpansions)) { 5196 return true; 5197 } 5198 5199 if (ShouldExpand) { 5200 // Expand the function parameter pack into multiple, separate 5201 // parameters. 5202 for (unsigned I = 0; I != *NumExpansions; ++I) { 5203 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5204 QualType NewType = getDerived().TransformType(Pattern); 5205 if (NewType.isNull()) 5206 return true; 5207 5208 if (NewType->containsUnexpandedParameterPack()) { 5209 NewType = 5210 getSema().getASTContext().getPackExpansionType(NewType, None); 5211 5212 if (NewType.isNull()) 5213 return true; 5214 } 5215 5216 if (ParamInfos) 5217 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5218 OutParamTypes.push_back(NewType); 5219 if (PVars) 5220 PVars->push_back(nullptr); 5221 } 5222 5223 // We're done with the pack expansion. 5224 continue; 5225 } 5226 5227 // If we're supposed to retain a pack expansion, do so by temporarily 5228 // forgetting the partially-substituted parameter pack. 5229 if (RetainExpansion) { 5230 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5231 QualType NewType = getDerived().TransformType(Pattern); 5232 if (NewType.isNull()) 5233 return true; 5234 5235 if (ParamInfos) 5236 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5237 OutParamTypes.push_back(NewType); 5238 if (PVars) 5239 PVars->push_back(nullptr); 5240 } 5241 5242 // We'll substitute the parameter now without expanding the pack 5243 // expansion. 5244 OldType = Expansion->getPattern(); 5245 IsPackExpansion = true; 5246 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5247 NewType = getDerived().TransformType(OldType); 5248 } else { 5249 NewType = getDerived().TransformType(OldType); 5250 } 5251 5252 if (NewType.isNull()) 5253 return true; 5254 5255 if (IsPackExpansion) 5256 NewType = getSema().Context.getPackExpansionType(NewType, 5257 NumExpansions); 5258 5259 if (ParamInfos) 5260 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5261 OutParamTypes.push_back(NewType); 5262 if (PVars) 5263 PVars->push_back(nullptr); 5264 } 5265 5266 #ifndef NDEBUG 5267 if (PVars) { 5268 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5269 if (ParmVarDecl *parm = (*PVars)[i]) 5270 assert(parm->getFunctionScopeIndex() == i); 5271 } 5272 #endif 5273 5274 return false; 5275 } 5276 5277 template<typename Derived> 5278 QualType 5279 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5280 FunctionProtoTypeLoc TL) { 5281 SmallVector<QualType, 4> ExceptionStorage; 5282 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5283 return getDerived().TransformFunctionProtoType( 5284 TLB, TL, nullptr, Qualifiers(), 5285 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5286 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5287 ExceptionStorage, Changed); 5288 }); 5289 } 5290 5291 template<typename Derived> template<typename Fn> 5292 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5293 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5294 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5295 5296 // Transform the parameters and return type. 5297 // 5298 // We are required to instantiate the params and return type in source order. 5299 // When the function has a trailing return type, we instantiate the 5300 // parameters before the return type, since the return type can then refer 5301 // to the parameters themselves (via decltype, sizeof, etc.). 5302 // 5303 SmallVector<QualType, 4> ParamTypes; 5304 SmallVector<ParmVarDecl*, 4> ParamDecls; 5305 Sema::ExtParameterInfoBuilder ExtParamInfos; 5306 const FunctionProtoType *T = TL.getTypePtr(); 5307 5308 QualType ResultType; 5309 5310 if (T->hasTrailingReturn()) { 5311 if (getDerived().TransformFunctionTypeParams( 5312 TL.getBeginLoc(), TL.getParams(), 5313 TL.getTypePtr()->param_type_begin(), 5314 T->getExtParameterInfosOrNull(), 5315 ParamTypes, &ParamDecls, ExtParamInfos)) 5316 return QualType(); 5317 5318 { 5319 // C++11 [expr.prim.general]p3: 5320 // If a declaration declares a member function or member function 5321 // template of a class X, the expression this is a prvalue of type 5322 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5323 // and the end of the function-definition, member-declarator, or 5324 // declarator. 5325 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5326 5327 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5328 if (ResultType.isNull()) 5329 return QualType(); 5330 } 5331 } 5332 else { 5333 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5334 if (ResultType.isNull()) 5335 return QualType(); 5336 5337 // Return type can not be qualified with an address space. 5338 if (ResultType.getAddressSpace() != LangAS::Default) { 5339 SemaRef.Diag(TL.getReturnLoc().getBeginLoc(), 5340 diag::err_attribute_address_function_type); 5341 return QualType(); 5342 } 5343 5344 if (getDerived().TransformFunctionTypeParams( 5345 TL.getBeginLoc(), TL.getParams(), 5346 TL.getTypePtr()->param_type_begin(), 5347 T->getExtParameterInfosOrNull(), 5348 ParamTypes, &ParamDecls, ExtParamInfos)) 5349 return QualType(); 5350 } 5351 5352 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5353 5354 bool EPIChanged = false; 5355 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5356 return QualType(); 5357 5358 // Handle extended parameter information. 5359 if (auto NewExtParamInfos = 5360 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5361 if (!EPI.ExtParameterInfos || 5362 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5363 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5364 EPIChanged = true; 5365 } 5366 EPI.ExtParameterInfos = NewExtParamInfos; 5367 } else if (EPI.ExtParameterInfos) { 5368 EPIChanged = true; 5369 EPI.ExtParameterInfos = nullptr; 5370 } 5371 5372 QualType Result = TL.getType(); 5373 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5374 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5375 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5376 if (Result.isNull()) 5377 return QualType(); 5378 } 5379 5380 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5381 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5382 NewTL.setLParenLoc(TL.getLParenLoc()); 5383 NewTL.setRParenLoc(TL.getRParenLoc()); 5384 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5385 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5386 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5387 NewTL.setParam(i, ParamDecls[i]); 5388 5389 return Result; 5390 } 5391 5392 template<typename Derived> 5393 bool TreeTransform<Derived>::TransformExceptionSpec( 5394 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5395 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5396 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5397 5398 // Instantiate a dynamic noexcept expression, if any. 5399 if (isComputedNoexcept(ESI.Type)) { 5400 EnterExpressionEvaluationContext Unevaluated( 5401 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5402 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5403 if (NoexceptExpr.isInvalid()) 5404 return true; 5405 5406 ExceptionSpecificationType EST = ESI.Type; 5407 NoexceptExpr = 5408 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5409 if (NoexceptExpr.isInvalid()) 5410 return true; 5411 5412 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5413 Changed = true; 5414 ESI.NoexceptExpr = NoexceptExpr.get(); 5415 ESI.Type = EST; 5416 } 5417 5418 if (ESI.Type != EST_Dynamic) 5419 return false; 5420 5421 // Instantiate a dynamic exception specification's type. 5422 for (QualType T : ESI.Exceptions) { 5423 if (const PackExpansionType *PackExpansion = 5424 T->getAs<PackExpansionType>()) { 5425 Changed = true; 5426 5427 // We have a pack expansion. Instantiate it. 5428 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5429 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5430 Unexpanded); 5431 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5432 5433 // Determine whether the set of unexpanded parameter packs can and 5434 // should 5435 // be expanded. 5436 bool Expand = false; 5437 bool RetainExpansion = false; 5438 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5439 // FIXME: Track the location of the ellipsis (and track source location 5440 // information for the types in the exception specification in general). 5441 if (getDerived().TryExpandParameterPacks( 5442 Loc, SourceRange(), Unexpanded, Expand, 5443 RetainExpansion, NumExpansions)) 5444 return true; 5445 5446 if (!Expand) { 5447 // We can't expand this pack expansion into separate arguments yet; 5448 // just substitute into the pattern and create a new pack expansion 5449 // type. 5450 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5451 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5452 if (U.isNull()) 5453 return true; 5454 5455 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5456 Exceptions.push_back(U); 5457 continue; 5458 } 5459 5460 // Substitute into the pack expansion pattern for each slice of the 5461 // pack. 5462 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5463 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5464 5465 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5466 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5467 return true; 5468 5469 Exceptions.push_back(U); 5470 } 5471 } else { 5472 QualType U = getDerived().TransformType(T); 5473 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5474 return true; 5475 if (T != U) 5476 Changed = true; 5477 5478 Exceptions.push_back(U); 5479 } 5480 } 5481 5482 ESI.Exceptions = Exceptions; 5483 if (ESI.Exceptions.empty()) 5484 ESI.Type = EST_DynamicNone; 5485 return false; 5486 } 5487 5488 template<typename Derived> 5489 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5490 TypeLocBuilder &TLB, 5491 FunctionNoProtoTypeLoc TL) { 5492 const FunctionNoProtoType *T = TL.getTypePtr(); 5493 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5494 if (ResultType.isNull()) 5495 return QualType(); 5496 5497 QualType Result = TL.getType(); 5498 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5499 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5500 5501 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5502 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5503 NewTL.setLParenLoc(TL.getLParenLoc()); 5504 NewTL.setRParenLoc(TL.getRParenLoc()); 5505 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5506 5507 return Result; 5508 } 5509 5510 template<typename Derived> QualType 5511 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5512 UnresolvedUsingTypeLoc TL) { 5513 const UnresolvedUsingType *T = TL.getTypePtr(); 5514 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5515 if (!D) 5516 return QualType(); 5517 5518 QualType Result = TL.getType(); 5519 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5520 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5521 if (Result.isNull()) 5522 return QualType(); 5523 } 5524 5525 // We might get an arbitrary type spec type back. We should at 5526 // least always get a type spec type, though. 5527 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5528 NewTL.setNameLoc(TL.getNameLoc()); 5529 5530 return Result; 5531 } 5532 5533 template<typename Derived> 5534 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5535 TypedefTypeLoc TL) { 5536 const TypedefType *T = TL.getTypePtr(); 5537 TypedefNameDecl *Typedef 5538 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5539 T->getDecl())); 5540 if (!Typedef) 5541 return QualType(); 5542 5543 QualType Result = TL.getType(); 5544 if (getDerived().AlwaysRebuild() || 5545 Typedef != T->getDecl()) { 5546 Result = getDerived().RebuildTypedefType(Typedef); 5547 if (Result.isNull()) 5548 return QualType(); 5549 } 5550 5551 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5552 NewTL.setNameLoc(TL.getNameLoc()); 5553 5554 return Result; 5555 } 5556 5557 template<typename Derived> 5558 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5559 TypeOfExprTypeLoc TL) { 5560 // typeof expressions are not potentially evaluated contexts 5561 EnterExpressionEvaluationContext Unevaluated( 5562 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5563 Sema::ReuseLambdaContextDecl); 5564 5565 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5566 if (E.isInvalid()) 5567 return QualType(); 5568 5569 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5570 if (E.isInvalid()) 5571 return QualType(); 5572 5573 QualType Result = TL.getType(); 5574 if (getDerived().AlwaysRebuild() || 5575 E.get() != TL.getUnderlyingExpr()) { 5576 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5577 if (Result.isNull()) 5578 return QualType(); 5579 } 5580 else E.get(); 5581 5582 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5583 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5584 NewTL.setLParenLoc(TL.getLParenLoc()); 5585 NewTL.setRParenLoc(TL.getRParenLoc()); 5586 5587 return Result; 5588 } 5589 5590 template<typename Derived> 5591 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5592 TypeOfTypeLoc TL) { 5593 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5594 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5595 if (!New_Under_TI) 5596 return QualType(); 5597 5598 QualType Result = TL.getType(); 5599 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5600 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5601 if (Result.isNull()) 5602 return QualType(); 5603 } 5604 5605 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5606 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5607 NewTL.setLParenLoc(TL.getLParenLoc()); 5608 NewTL.setRParenLoc(TL.getRParenLoc()); 5609 NewTL.setUnderlyingTInfo(New_Under_TI); 5610 5611 return Result; 5612 } 5613 5614 template<typename Derived> 5615 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5616 DecltypeTypeLoc TL) { 5617 const DecltypeType *T = TL.getTypePtr(); 5618 5619 // decltype expressions are not potentially evaluated contexts 5620 EnterExpressionEvaluationContext Unevaluated( 5621 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5622 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5623 5624 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5625 if (E.isInvalid()) 5626 return QualType(); 5627 5628 E = getSema().ActOnDecltypeExpression(E.get()); 5629 if (E.isInvalid()) 5630 return QualType(); 5631 5632 QualType Result = TL.getType(); 5633 if (getDerived().AlwaysRebuild() || 5634 E.get() != T->getUnderlyingExpr()) { 5635 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5636 if (Result.isNull()) 5637 return QualType(); 5638 } 5639 else E.get(); 5640 5641 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5642 NewTL.setNameLoc(TL.getNameLoc()); 5643 5644 return Result; 5645 } 5646 5647 template<typename Derived> 5648 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5649 TypeLocBuilder &TLB, 5650 UnaryTransformTypeLoc TL) { 5651 QualType Result = TL.getType(); 5652 if (Result->isDependentType()) { 5653 const UnaryTransformType *T = TL.getTypePtr(); 5654 QualType NewBase = 5655 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5656 Result = getDerived().RebuildUnaryTransformType(NewBase, 5657 T->getUTTKind(), 5658 TL.getKWLoc()); 5659 if (Result.isNull()) 5660 return QualType(); 5661 } 5662 5663 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5664 NewTL.setKWLoc(TL.getKWLoc()); 5665 NewTL.setParensRange(TL.getParensRange()); 5666 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5667 return Result; 5668 } 5669 5670 template<typename Derived> 5671 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5672 AutoTypeLoc TL) { 5673 const AutoType *T = TL.getTypePtr(); 5674 QualType OldDeduced = T->getDeducedType(); 5675 QualType NewDeduced; 5676 if (!OldDeduced.isNull()) { 5677 NewDeduced = getDerived().TransformType(OldDeduced); 5678 if (NewDeduced.isNull()) 5679 return QualType(); 5680 } 5681 5682 QualType Result = TL.getType(); 5683 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5684 T->isDependentType()) { 5685 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5686 if (Result.isNull()) 5687 return QualType(); 5688 } 5689 5690 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5691 NewTL.setNameLoc(TL.getNameLoc()); 5692 5693 return Result; 5694 } 5695 5696 template<typename Derived> 5697 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5698 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5699 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5700 5701 CXXScopeSpec SS; 5702 TemplateName TemplateName = getDerived().TransformTemplateName( 5703 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5704 if (TemplateName.isNull()) 5705 return QualType(); 5706 5707 QualType OldDeduced = T->getDeducedType(); 5708 QualType NewDeduced; 5709 if (!OldDeduced.isNull()) { 5710 NewDeduced = getDerived().TransformType(OldDeduced); 5711 if (NewDeduced.isNull()) 5712 return QualType(); 5713 } 5714 5715 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5716 TemplateName, NewDeduced); 5717 if (Result.isNull()) 5718 return QualType(); 5719 5720 DeducedTemplateSpecializationTypeLoc NewTL = 5721 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5722 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5723 5724 return Result; 5725 } 5726 5727 template<typename Derived> 5728 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5729 RecordTypeLoc TL) { 5730 const RecordType *T = TL.getTypePtr(); 5731 RecordDecl *Record 5732 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5733 T->getDecl())); 5734 if (!Record) 5735 return QualType(); 5736 5737 QualType Result = TL.getType(); 5738 if (getDerived().AlwaysRebuild() || 5739 Record != T->getDecl()) { 5740 Result = getDerived().RebuildRecordType(Record); 5741 if (Result.isNull()) 5742 return QualType(); 5743 } 5744 5745 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5746 NewTL.setNameLoc(TL.getNameLoc()); 5747 5748 return Result; 5749 } 5750 5751 template<typename Derived> 5752 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5753 EnumTypeLoc TL) { 5754 const EnumType *T = TL.getTypePtr(); 5755 EnumDecl *Enum 5756 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5757 T->getDecl())); 5758 if (!Enum) 5759 return QualType(); 5760 5761 QualType Result = TL.getType(); 5762 if (getDerived().AlwaysRebuild() || 5763 Enum != T->getDecl()) { 5764 Result = getDerived().RebuildEnumType(Enum); 5765 if (Result.isNull()) 5766 return QualType(); 5767 } 5768 5769 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5770 NewTL.setNameLoc(TL.getNameLoc()); 5771 5772 return Result; 5773 } 5774 5775 template<typename Derived> 5776 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5777 TypeLocBuilder &TLB, 5778 InjectedClassNameTypeLoc TL) { 5779 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5780 TL.getTypePtr()->getDecl()); 5781 if (!D) return QualType(); 5782 5783 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5784 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5785 return T; 5786 } 5787 5788 template<typename Derived> 5789 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5790 TypeLocBuilder &TLB, 5791 TemplateTypeParmTypeLoc TL) { 5792 return TransformTypeSpecType(TLB, TL); 5793 } 5794 5795 template<typename Derived> 5796 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5797 TypeLocBuilder &TLB, 5798 SubstTemplateTypeParmTypeLoc TL) { 5799 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5800 5801 // Substitute into the replacement type, which itself might involve something 5802 // that needs to be transformed. This only tends to occur with default 5803 // template arguments of template template parameters. 5804 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5805 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5806 if (Replacement.isNull()) 5807 return QualType(); 5808 5809 // Always canonicalize the replacement type. 5810 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5811 QualType Result 5812 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5813 Replacement); 5814 5815 // Propagate type-source information. 5816 SubstTemplateTypeParmTypeLoc NewTL 5817 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5818 NewTL.setNameLoc(TL.getNameLoc()); 5819 return Result; 5820 5821 } 5822 5823 template<typename Derived> 5824 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5825 TypeLocBuilder &TLB, 5826 SubstTemplateTypeParmPackTypeLoc TL) { 5827 return TransformTypeSpecType(TLB, TL); 5828 } 5829 5830 template<typename Derived> 5831 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5832 TypeLocBuilder &TLB, 5833 TemplateSpecializationTypeLoc TL) { 5834 const TemplateSpecializationType *T = TL.getTypePtr(); 5835 5836 // The nested-name-specifier never matters in a TemplateSpecializationType, 5837 // because we can't have a dependent nested-name-specifier anyway. 5838 CXXScopeSpec SS; 5839 TemplateName Template 5840 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5841 TL.getTemplateNameLoc()); 5842 if (Template.isNull()) 5843 return QualType(); 5844 5845 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5846 } 5847 5848 template<typename Derived> 5849 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5850 AtomicTypeLoc TL) { 5851 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5852 if (ValueType.isNull()) 5853 return QualType(); 5854 5855 QualType Result = TL.getType(); 5856 if (getDerived().AlwaysRebuild() || 5857 ValueType != TL.getValueLoc().getType()) { 5858 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5859 if (Result.isNull()) 5860 return QualType(); 5861 } 5862 5863 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5864 NewTL.setKWLoc(TL.getKWLoc()); 5865 NewTL.setLParenLoc(TL.getLParenLoc()); 5866 NewTL.setRParenLoc(TL.getRParenLoc()); 5867 5868 return Result; 5869 } 5870 5871 template <typename Derived> 5872 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5873 PipeTypeLoc TL) { 5874 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5875 if (ValueType.isNull()) 5876 return QualType(); 5877 5878 QualType Result = TL.getType(); 5879 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5880 const PipeType *PT = Result->getAs<PipeType>(); 5881 bool isReadPipe = PT->isReadOnly(); 5882 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5883 if (Result.isNull()) 5884 return QualType(); 5885 } 5886 5887 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5888 NewTL.setKWLoc(TL.getKWLoc()); 5889 5890 return Result; 5891 } 5892 5893 /// Simple iterator that traverses the template arguments in a 5894 /// container that provides a \c getArgLoc() member function. 5895 /// 5896 /// This iterator is intended to be used with the iterator form of 5897 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5898 template<typename ArgLocContainer> 5899 class TemplateArgumentLocContainerIterator { 5900 ArgLocContainer *Container; 5901 unsigned Index; 5902 5903 public: 5904 typedef TemplateArgumentLoc value_type; 5905 typedef TemplateArgumentLoc reference; 5906 typedef int difference_type; 5907 typedef std::input_iterator_tag iterator_category; 5908 5909 class pointer { 5910 TemplateArgumentLoc Arg; 5911 5912 public: 5913 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5914 5915 const TemplateArgumentLoc *operator->() const { 5916 return &Arg; 5917 } 5918 }; 5919 5920 5921 TemplateArgumentLocContainerIterator() {} 5922 5923 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5924 unsigned Index) 5925 : Container(&Container), Index(Index) { } 5926 5927 TemplateArgumentLocContainerIterator &operator++() { 5928 ++Index; 5929 return *this; 5930 } 5931 5932 TemplateArgumentLocContainerIterator operator++(int) { 5933 TemplateArgumentLocContainerIterator Old(*this); 5934 ++(*this); 5935 return Old; 5936 } 5937 5938 TemplateArgumentLoc operator*() const { 5939 return Container->getArgLoc(Index); 5940 } 5941 5942 pointer operator->() const { 5943 return pointer(Container->getArgLoc(Index)); 5944 } 5945 5946 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5947 const TemplateArgumentLocContainerIterator &Y) { 5948 return X.Container == Y.Container && X.Index == Y.Index; 5949 } 5950 5951 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5952 const TemplateArgumentLocContainerIterator &Y) { 5953 return !(X == Y); 5954 } 5955 }; 5956 5957 5958 template <typename Derived> 5959 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5960 TypeLocBuilder &TLB, 5961 TemplateSpecializationTypeLoc TL, 5962 TemplateName Template) { 5963 TemplateArgumentListInfo NewTemplateArgs; 5964 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5965 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5966 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5967 ArgIterator; 5968 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5969 ArgIterator(TL, TL.getNumArgs()), 5970 NewTemplateArgs)) 5971 return QualType(); 5972 5973 // FIXME: maybe don't rebuild if all the template arguments are the same. 5974 5975 QualType Result = 5976 getDerived().RebuildTemplateSpecializationType(Template, 5977 TL.getTemplateNameLoc(), 5978 NewTemplateArgs); 5979 5980 if (!Result.isNull()) { 5981 // Specializations of template template parameters are represented as 5982 // TemplateSpecializationTypes, and substitution of type alias templates 5983 // within a dependent context can transform them into 5984 // DependentTemplateSpecializationTypes. 5985 if (isa<DependentTemplateSpecializationType>(Result)) { 5986 DependentTemplateSpecializationTypeLoc NewTL 5987 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5988 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5989 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5990 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5991 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5992 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5993 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5994 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5995 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5996 return Result; 5997 } 5998 5999 TemplateSpecializationTypeLoc NewTL 6000 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6001 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6002 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6003 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6004 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6005 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6006 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6007 } 6008 6009 return Result; 6010 } 6011 6012 template <typename Derived> 6013 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6014 TypeLocBuilder &TLB, 6015 DependentTemplateSpecializationTypeLoc TL, 6016 TemplateName Template, 6017 CXXScopeSpec &SS) { 6018 TemplateArgumentListInfo NewTemplateArgs; 6019 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6020 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6021 typedef TemplateArgumentLocContainerIterator< 6022 DependentTemplateSpecializationTypeLoc> ArgIterator; 6023 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6024 ArgIterator(TL, TL.getNumArgs()), 6025 NewTemplateArgs)) 6026 return QualType(); 6027 6028 // FIXME: maybe don't rebuild if all the template arguments are the same. 6029 6030 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6031 QualType Result 6032 = getSema().Context.getDependentTemplateSpecializationType( 6033 TL.getTypePtr()->getKeyword(), 6034 DTN->getQualifier(), 6035 DTN->getIdentifier(), 6036 NewTemplateArgs); 6037 6038 DependentTemplateSpecializationTypeLoc NewTL 6039 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6040 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6041 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6042 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6043 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6044 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6045 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6046 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6047 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6048 return Result; 6049 } 6050 6051 QualType Result 6052 = getDerived().RebuildTemplateSpecializationType(Template, 6053 TL.getTemplateNameLoc(), 6054 NewTemplateArgs); 6055 6056 if (!Result.isNull()) { 6057 /// FIXME: Wrap this in an elaborated-type-specifier? 6058 TemplateSpecializationTypeLoc NewTL 6059 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6060 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6061 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6062 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6063 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6064 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6065 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6066 } 6067 6068 return Result; 6069 } 6070 6071 template<typename Derived> 6072 QualType 6073 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6074 ElaboratedTypeLoc TL) { 6075 const ElaboratedType *T = TL.getTypePtr(); 6076 6077 NestedNameSpecifierLoc QualifierLoc; 6078 // NOTE: the qualifier in an ElaboratedType is optional. 6079 if (TL.getQualifierLoc()) { 6080 QualifierLoc 6081 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6082 if (!QualifierLoc) 6083 return QualType(); 6084 } 6085 6086 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6087 if (NamedT.isNull()) 6088 return QualType(); 6089 6090 // C++0x [dcl.type.elab]p2: 6091 // If the identifier resolves to a typedef-name or the simple-template-id 6092 // resolves to an alias template specialization, the 6093 // elaborated-type-specifier is ill-formed. 6094 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6095 if (const TemplateSpecializationType *TST = 6096 NamedT->getAs<TemplateSpecializationType>()) { 6097 TemplateName Template = TST->getTemplateName(); 6098 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6099 Template.getAsTemplateDecl())) { 6100 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6101 diag::err_tag_reference_non_tag) 6102 << TAT << Sema::NTK_TypeAliasTemplate 6103 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6104 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6105 } 6106 } 6107 } 6108 6109 QualType Result = TL.getType(); 6110 if (getDerived().AlwaysRebuild() || 6111 QualifierLoc != TL.getQualifierLoc() || 6112 NamedT != T->getNamedType()) { 6113 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6114 T->getKeyword(), 6115 QualifierLoc, NamedT); 6116 if (Result.isNull()) 6117 return QualType(); 6118 } 6119 6120 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6121 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6122 NewTL.setQualifierLoc(QualifierLoc); 6123 return Result; 6124 } 6125 6126 template<typename Derived> 6127 QualType TreeTransform<Derived>::TransformAttributedType( 6128 TypeLocBuilder &TLB, 6129 AttributedTypeLoc TL) { 6130 const AttributedType *oldType = TL.getTypePtr(); 6131 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6132 if (modifiedType.isNull()) 6133 return QualType(); 6134 6135 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6136 const Attr *oldAttr = TL.getAttr(); 6137 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6138 if (oldAttr && !newAttr) 6139 return QualType(); 6140 6141 QualType result = TL.getType(); 6142 6143 // FIXME: dependent operand expressions? 6144 if (getDerived().AlwaysRebuild() || 6145 modifiedType != oldType->getModifiedType()) { 6146 // TODO: this is really lame; we should really be rebuilding the 6147 // equivalent type from first principles. 6148 QualType equivalentType 6149 = getDerived().TransformType(oldType->getEquivalentType()); 6150 if (equivalentType.isNull()) 6151 return QualType(); 6152 6153 // Check whether we can add nullability; it is only represented as 6154 // type sugar, and therefore cannot be diagnosed in any other way. 6155 if (auto nullability = oldType->getImmediateNullability()) { 6156 if (!modifiedType->canHaveNullability()) { 6157 SemaRef.Diag(TL.getAttr()->getLocation(), 6158 diag::err_nullability_nonpointer) 6159 << DiagNullabilityKind(*nullability, false) << modifiedType; 6160 return QualType(); 6161 } 6162 } 6163 6164 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6165 modifiedType, 6166 equivalentType); 6167 } 6168 6169 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6170 newTL.setAttr(newAttr); 6171 return result; 6172 } 6173 6174 template<typename Derived> 6175 QualType 6176 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6177 ParenTypeLoc TL) { 6178 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6179 if (Inner.isNull()) 6180 return QualType(); 6181 6182 QualType Result = TL.getType(); 6183 if (getDerived().AlwaysRebuild() || 6184 Inner != TL.getInnerLoc().getType()) { 6185 Result = getDerived().RebuildParenType(Inner); 6186 if (Result.isNull()) 6187 return QualType(); 6188 } 6189 6190 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6191 NewTL.setLParenLoc(TL.getLParenLoc()); 6192 NewTL.setRParenLoc(TL.getRParenLoc()); 6193 return Result; 6194 } 6195 6196 template<typename Derived> 6197 QualType TreeTransform<Derived>::TransformDependentNameType( 6198 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6199 return TransformDependentNameType(TLB, TL, false); 6200 } 6201 6202 template<typename Derived> 6203 QualType TreeTransform<Derived>::TransformDependentNameType( 6204 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6205 const DependentNameType *T = TL.getTypePtr(); 6206 6207 NestedNameSpecifierLoc QualifierLoc 6208 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6209 if (!QualifierLoc) 6210 return QualType(); 6211 6212 QualType Result 6213 = getDerived().RebuildDependentNameType(T->getKeyword(), 6214 TL.getElaboratedKeywordLoc(), 6215 QualifierLoc, 6216 T->getIdentifier(), 6217 TL.getNameLoc(), 6218 DeducedTSTContext); 6219 if (Result.isNull()) 6220 return QualType(); 6221 6222 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6223 QualType NamedT = ElabT->getNamedType(); 6224 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6225 6226 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6227 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6228 NewTL.setQualifierLoc(QualifierLoc); 6229 } else { 6230 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6231 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6232 NewTL.setQualifierLoc(QualifierLoc); 6233 NewTL.setNameLoc(TL.getNameLoc()); 6234 } 6235 return Result; 6236 } 6237 6238 template<typename Derived> 6239 QualType TreeTransform<Derived>:: 6240 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6241 DependentTemplateSpecializationTypeLoc TL) { 6242 NestedNameSpecifierLoc QualifierLoc; 6243 if (TL.getQualifierLoc()) { 6244 QualifierLoc 6245 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6246 if (!QualifierLoc) 6247 return QualType(); 6248 } 6249 6250 return getDerived() 6251 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6252 } 6253 6254 template<typename Derived> 6255 QualType TreeTransform<Derived>:: 6256 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6257 DependentTemplateSpecializationTypeLoc TL, 6258 NestedNameSpecifierLoc QualifierLoc) { 6259 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6260 6261 TemplateArgumentListInfo NewTemplateArgs; 6262 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6263 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6264 6265 typedef TemplateArgumentLocContainerIterator< 6266 DependentTemplateSpecializationTypeLoc> ArgIterator; 6267 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6268 ArgIterator(TL, TL.getNumArgs()), 6269 NewTemplateArgs)) 6270 return QualType(); 6271 6272 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6273 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6274 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6275 /*AllowInjectedClassName*/ false); 6276 if (Result.isNull()) 6277 return QualType(); 6278 6279 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6280 QualType NamedT = ElabT->getNamedType(); 6281 6282 // Copy information relevant to the template specialization. 6283 TemplateSpecializationTypeLoc NamedTL 6284 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6285 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6286 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6287 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6288 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6289 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6290 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6291 6292 // Copy information relevant to the elaborated type. 6293 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6294 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6295 NewTL.setQualifierLoc(QualifierLoc); 6296 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6297 DependentTemplateSpecializationTypeLoc SpecTL 6298 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6299 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6300 SpecTL.setQualifierLoc(QualifierLoc); 6301 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6302 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6303 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6304 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6305 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6306 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6307 } else { 6308 TemplateSpecializationTypeLoc SpecTL 6309 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6310 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6311 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6312 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6313 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6314 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6315 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6316 } 6317 return Result; 6318 } 6319 6320 template<typename Derived> 6321 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6322 PackExpansionTypeLoc TL) { 6323 QualType Pattern 6324 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6325 if (Pattern.isNull()) 6326 return QualType(); 6327 6328 QualType Result = TL.getType(); 6329 if (getDerived().AlwaysRebuild() || 6330 Pattern != TL.getPatternLoc().getType()) { 6331 Result = getDerived().RebuildPackExpansionType(Pattern, 6332 TL.getPatternLoc().getSourceRange(), 6333 TL.getEllipsisLoc(), 6334 TL.getTypePtr()->getNumExpansions()); 6335 if (Result.isNull()) 6336 return QualType(); 6337 } 6338 6339 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6340 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6341 return Result; 6342 } 6343 6344 template<typename Derived> 6345 QualType 6346 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6347 ObjCInterfaceTypeLoc TL) { 6348 // ObjCInterfaceType is never dependent. 6349 TLB.pushFullCopy(TL); 6350 return TL.getType(); 6351 } 6352 6353 template<typename Derived> 6354 QualType 6355 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6356 ObjCTypeParamTypeLoc TL) { 6357 const ObjCTypeParamType *T = TL.getTypePtr(); 6358 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6359 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6360 if (!OTP) 6361 return QualType(); 6362 6363 QualType Result = TL.getType(); 6364 if (getDerived().AlwaysRebuild() || 6365 OTP != T->getDecl()) { 6366 Result = getDerived().RebuildObjCTypeParamType(OTP, 6367 TL.getProtocolLAngleLoc(), 6368 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6369 TL.getNumProtocols()), 6370 TL.getProtocolLocs(), 6371 TL.getProtocolRAngleLoc()); 6372 if (Result.isNull()) 6373 return QualType(); 6374 } 6375 6376 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6377 if (TL.getNumProtocols()) { 6378 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6379 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6380 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6381 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6382 } 6383 return Result; 6384 } 6385 6386 template<typename Derived> 6387 QualType 6388 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6389 ObjCObjectTypeLoc TL) { 6390 // Transform base type. 6391 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6392 if (BaseType.isNull()) 6393 return QualType(); 6394 6395 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6396 6397 // Transform type arguments. 6398 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6399 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6400 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6401 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6402 QualType TypeArg = TypeArgInfo->getType(); 6403 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6404 AnyChanged = true; 6405 6406 // We have a pack expansion. Instantiate it. 6407 const auto *PackExpansion = PackExpansionLoc.getType() 6408 ->castAs<PackExpansionType>(); 6409 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6410 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6411 Unexpanded); 6412 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6413 6414 // Determine whether the set of unexpanded parameter packs can 6415 // and should be expanded. 6416 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6417 bool Expand = false; 6418 bool RetainExpansion = false; 6419 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6420 if (getDerived().TryExpandParameterPacks( 6421 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6422 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6423 return QualType(); 6424 6425 if (!Expand) { 6426 // We can't expand this pack expansion into separate arguments yet; 6427 // just substitute into the pattern and create a new pack expansion 6428 // type. 6429 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6430 6431 TypeLocBuilder TypeArgBuilder; 6432 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6433 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6434 PatternLoc); 6435 if (NewPatternType.isNull()) 6436 return QualType(); 6437 6438 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6439 NewPatternType, NumExpansions); 6440 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6441 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6442 NewTypeArgInfos.push_back( 6443 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6444 continue; 6445 } 6446 6447 // Substitute into the pack expansion pattern for each slice of the 6448 // pack. 6449 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6450 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6451 6452 TypeLocBuilder TypeArgBuilder; 6453 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6454 6455 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6456 PatternLoc); 6457 if (NewTypeArg.isNull()) 6458 return QualType(); 6459 6460 NewTypeArgInfos.push_back( 6461 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6462 } 6463 6464 continue; 6465 } 6466 6467 TypeLocBuilder TypeArgBuilder; 6468 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6469 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6470 if (NewTypeArg.isNull()) 6471 return QualType(); 6472 6473 // If nothing changed, just keep the old TypeSourceInfo. 6474 if (NewTypeArg == TypeArg) { 6475 NewTypeArgInfos.push_back(TypeArgInfo); 6476 continue; 6477 } 6478 6479 NewTypeArgInfos.push_back( 6480 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6481 AnyChanged = true; 6482 } 6483 6484 QualType Result = TL.getType(); 6485 if (getDerived().AlwaysRebuild() || AnyChanged) { 6486 // Rebuild the type. 6487 Result = getDerived().RebuildObjCObjectType( 6488 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6489 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6490 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6491 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6492 6493 if (Result.isNull()) 6494 return QualType(); 6495 } 6496 6497 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6498 NewT.setHasBaseTypeAsWritten(true); 6499 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6500 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6501 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6502 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6503 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6504 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6505 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6506 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6507 return Result; 6508 } 6509 6510 template<typename Derived> 6511 QualType 6512 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6513 ObjCObjectPointerTypeLoc TL) { 6514 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6515 if (PointeeType.isNull()) 6516 return QualType(); 6517 6518 QualType Result = TL.getType(); 6519 if (getDerived().AlwaysRebuild() || 6520 PointeeType != TL.getPointeeLoc().getType()) { 6521 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6522 TL.getStarLoc()); 6523 if (Result.isNull()) 6524 return QualType(); 6525 } 6526 6527 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6528 NewT.setStarLoc(TL.getStarLoc()); 6529 return Result; 6530 } 6531 6532 //===----------------------------------------------------------------------===// 6533 // Statement transformation 6534 //===----------------------------------------------------------------------===// 6535 template<typename Derived> 6536 StmtResult 6537 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6538 return S; 6539 } 6540 6541 template<typename Derived> 6542 StmtResult 6543 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6544 return getDerived().TransformCompoundStmt(S, false); 6545 } 6546 6547 template<typename Derived> 6548 StmtResult 6549 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6550 bool IsStmtExpr) { 6551 Sema::CompoundScopeRAII CompoundScope(getSema()); 6552 6553 bool SubStmtInvalid = false; 6554 bool SubStmtChanged = false; 6555 SmallVector<Stmt*, 8> Statements; 6556 for (auto *B : S->body()) { 6557 StmtResult Result = getDerived().TransformStmt( 6558 B, 6559 IsStmtExpr && B == S->body_back() ? SDK_StmtExprResult : SDK_Discarded); 6560 6561 if (Result.isInvalid()) { 6562 // Immediately fail if this was a DeclStmt, since it's very 6563 // likely that this will cause problems for future statements. 6564 if (isa<DeclStmt>(B)) 6565 return StmtError(); 6566 6567 // Otherwise, just keep processing substatements and fail later. 6568 SubStmtInvalid = true; 6569 continue; 6570 } 6571 6572 SubStmtChanged = SubStmtChanged || Result.get() != B; 6573 Statements.push_back(Result.getAs<Stmt>()); 6574 } 6575 6576 if (SubStmtInvalid) 6577 return StmtError(); 6578 6579 if (!getDerived().AlwaysRebuild() && 6580 !SubStmtChanged) 6581 return S; 6582 6583 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6584 Statements, 6585 S->getRBracLoc(), 6586 IsStmtExpr); 6587 } 6588 6589 template<typename Derived> 6590 StmtResult 6591 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6592 ExprResult LHS, RHS; 6593 { 6594 EnterExpressionEvaluationContext Unevaluated( 6595 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6596 6597 // Transform the left-hand case value. 6598 LHS = getDerived().TransformExpr(S->getLHS()); 6599 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6600 if (LHS.isInvalid()) 6601 return StmtError(); 6602 6603 // Transform the right-hand case value (for the GNU case-range extension). 6604 RHS = getDerived().TransformExpr(S->getRHS()); 6605 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6606 if (RHS.isInvalid()) 6607 return StmtError(); 6608 } 6609 6610 // Build the case statement. 6611 // Case statements are always rebuilt so that they will attached to their 6612 // transformed switch statement. 6613 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6614 LHS.get(), 6615 S->getEllipsisLoc(), 6616 RHS.get(), 6617 S->getColonLoc()); 6618 if (Case.isInvalid()) 6619 return StmtError(); 6620 6621 // Transform the statement following the case 6622 StmtResult SubStmt = 6623 getDerived().TransformStmt(S->getSubStmt()); 6624 if (SubStmt.isInvalid()) 6625 return StmtError(); 6626 6627 // Attach the body to the case statement 6628 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6629 } 6630 6631 template <typename Derived> 6632 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6633 // Transform the statement following the default case 6634 StmtResult SubStmt = 6635 getDerived().TransformStmt(S->getSubStmt()); 6636 if (SubStmt.isInvalid()) 6637 return StmtError(); 6638 6639 // Default statements are always rebuilt 6640 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6641 SubStmt.get()); 6642 } 6643 6644 template<typename Derived> 6645 StmtResult 6646 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 6647 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6648 if (SubStmt.isInvalid()) 6649 return StmtError(); 6650 6651 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6652 S->getDecl()); 6653 if (!LD) 6654 return StmtError(); 6655 6656 // If we're transforming "in-place" (we're not creating new local 6657 // declarations), assume we're replacing the old label statement 6658 // and clear out the reference to it. 6659 if (LD == S->getDecl()) 6660 S->getDecl()->setStmt(nullptr); 6661 6662 // FIXME: Pass the real colon location in. 6663 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6664 cast<LabelDecl>(LD), SourceLocation(), 6665 SubStmt.get()); 6666 } 6667 6668 template <typename Derived> 6669 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6670 if (!R) 6671 return R; 6672 6673 switch (R->getKind()) { 6674 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6675 #define ATTR(X) 6676 #define PRAGMA_SPELLING_ATTR(X) \ 6677 case attr::X: \ 6678 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6679 #include "clang/Basic/AttrList.inc" 6680 default: 6681 return R; 6682 } 6683 } 6684 6685 template <typename Derived> 6686 StmtResult 6687 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 6688 StmtDiscardKind SDK) { 6689 bool AttrsChanged = false; 6690 SmallVector<const Attr *, 1> Attrs; 6691 6692 // Visit attributes and keep track if any are transformed. 6693 for (const auto *I : S->getAttrs()) { 6694 const Attr *R = getDerived().TransformAttr(I); 6695 AttrsChanged |= (I != R); 6696 Attrs.push_back(R); 6697 } 6698 6699 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6700 if (SubStmt.isInvalid()) 6701 return StmtError(); 6702 6703 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6704 return S; 6705 6706 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6707 SubStmt.get()); 6708 } 6709 6710 template<typename Derived> 6711 StmtResult 6712 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6713 // Transform the initialization statement 6714 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6715 if (Init.isInvalid()) 6716 return StmtError(); 6717 6718 // Transform the condition 6719 Sema::ConditionResult Cond = getDerived().TransformCondition( 6720 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6721 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6722 : Sema::ConditionKind::Boolean); 6723 if (Cond.isInvalid()) 6724 return StmtError(); 6725 6726 // If this is a constexpr if, determine which arm we should instantiate. 6727 llvm::Optional<bool> ConstexprConditionValue; 6728 if (S->isConstexpr()) 6729 ConstexprConditionValue = Cond.getKnownValue(); 6730 6731 // Transform the "then" branch. 6732 StmtResult Then; 6733 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6734 Then = getDerived().TransformStmt(S->getThen()); 6735 if (Then.isInvalid()) 6736 return StmtError(); 6737 } else { 6738 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 6739 } 6740 6741 // Transform the "else" branch. 6742 StmtResult Else; 6743 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6744 Else = getDerived().TransformStmt(S->getElse()); 6745 if (Else.isInvalid()) 6746 return StmtError(); 6747 } 6748 6749 if (!getDerived().AlwaysRebuild() && 6750 Init.get() == S->getInit() && 6751 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6752 Then.get() == S->getThen() && 6753 Else.get() == S->getElse()) 6754 return S; 6755 6756 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6757 Init.get(), Then.get(), S->getElseLoc(), 6758 Else.get()); 6759 } 6760 6761 template<typename Derived> 6762 StmtResult 6763 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6764 // Transform the initialization statement 6765 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6766 if (Init.isInvalid()) 6767 return StmtError(); 6768 6769 // Transform the condition. 6770 Sema::ConditionResult Cond = getDerived().TransformCondition( 6771 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6772 Sema::ConditionKind::Switch); 6773 if (Cond.isInvalid()) 6774 return StmtError(); 6775 6776 // Rebuild the switch statement. 6777 StmtResult Switch 6778 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 6779 if (Switch.isInvalid()) 6780 return StmtError(); 6781 6782 // Transform the body of the switch statement. 6783 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6784 if (Body.isInvalid()) 6785 return StmtError(); 6786 6787 // Complete the switch statement. 6788 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6789 Body.get()); 6790 } 6791 6792 template<typename Derived> 6793 StmtResult 6794 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6795 // Transform the condition 6796 Sema::ConditionResult Cond = getDerived().TransformCondition( 6797 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6798 Sema::ConditionKind::Boolean); 6799 if (Cond.isInvalid()) 6800 return StmtError(); 6801 6802 // Transform the body 6803 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6804 if (Body.isInvalid()) 6805 return StmtError(); 6806 6807 if (!getDerived().AlwaysRebuild() && 6808 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6809 Body.get() == S->getBody()) 6810 return Owned(S); 6811 6812 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6813 } 6814 6815 template<typename Derived> 6816 StmtResult 6817 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6818 // Transform the body 6819 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6820 if (Body.isInvalid()) 6821 return StmtError(); 6822 6823 // Transform the condition 6824 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6825 if (Cond.isInvalid()) 6826 return StmtError(); 6827 6828 if (!getDerived().AlwaysRebuild() && 6829 Cond.get() == S->getCond() && 6830 Body.get() == S->getBody()) 6831 return S; 6832 6833 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6834 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6835 S->getRParenLoc()); 6836 } 6837 6838 template<typename Derived> 6839 StmtResult 6840 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6841 if (getSema().getLangOpts().OpenMP) 6842 getSema().startOpenMPLoop(); 6843 6844 // Transform the initialization statement 6845 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6846 if (Init.isInvalid()) 6847 return StmtError(); 6848 6849 // In OpenMP loop region loop control variable must be captured and be 6850 // private. Perform analysis of first part (if any). 6851 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6852 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6853 6854 // Transform the condition 6855 Sema::ConditionResult Cond = getDerived().TransformCondition( 6856 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6857 Sema::ConditionKind::Boolean); 6858 if (Cond.isInvalid()) 6859 return StmtError(); 6860 6861 // Transform the increment 6862 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6863 if (Inc.isInvalid()) 6864 return StmtError(); 6865 6866 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6867 if (S->getInc() && !FullInc.get()) 6868 return StmtError(); 6869 6870 // Transform the body 6871 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6872 if (Body.isInvalid()) 6873 return StmtError(); 6874 6875 if (!getDerived().AlwaysRebuild() && 6876 Init.get() == S->getInit() && 6877 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6878 Inc.get() == S->getInc() && 6879 Body.get() == S->getBody()) 6880 return S; 6881 6882 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6883 Init.get(), Cond, FullInc, 6884 S->getRParenLoc(), Body.get()); 6885 } 6886 6887 template<typename Derived> 6888 StmtResult 6889 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6890 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6891 S->getLabel()); 6892 if (!LD) 6893 return StmtError(); 6894 6895 // Goto statements must always be rebuilt, to resolve the label. 6896 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6897 cast<LabelDecl>(LD)); 6898 } 6899 6900 template<typename Derived> 6901 StmtResult 6902 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6903 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6904 if (Target.isInvalid()) 6905 return StmtError(); 6906 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6907 6908 if (!getDerived().AlwaysRebuild() && 6909 Target.get() == S->getTarget()) 6910 return S; 6911 6912 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6913 Target.get()); 6914 } 6915 6916 template<typename Derived> 6917 StmtResult 6918 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6919 return S; 6920 } 6921 6922 template<typename Derived> 6923 StmtResult 6924 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6925 return S; 6926 } 6927 6928 template<typename Derived> 6929 StmtResult 6930 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6931 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6932 /*NotCopyInit*/false); 6933 if (Result.isInvalid()) 6934 return StmtError(); 6935 6936 // FIXME: We always rebuild the return statement because there is no way 6937 // to tell whether the return type of the function has changed. 6938 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6939 } 6940 6941 template<typename Derived> 6942 StmtResult 6943 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6944 bool DeclChanged = false; 6945 SmallVector<Decl *, 4> Decls; 6946 for (auto *D : S->decls()) { 6947 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6948 if (!Transformed) 6949 return StmtError(); 6950 6951 if (Transformed != D) 6952 DeclChanged = true; 6953 6954 Decls.push_back(Transformed); 6955 } 6956 6957 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6958 return S; 6959 6960 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 6961 } 6962 6963 template<typename Derived> 6964 StmtResult 6965 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6966 6967 SmallVector<Expr*, 8> Constraints; 6968 SmallVector<Expr*, 8> Exprs; 6969 SmallVector<IdentifierInfo *, 4> Names; 6970 6971 ExprResult AsmString; 6972 SmallVector<Expr*, 8> Clobbers; 6973 6974 bool ExprsChanged = false; 6975 6976 // Go through the outputs. 6977 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6978 Names.push_back(S->getOutputIdentifier(I)); 6979 6980 // No need to transform the constraint literal. 6981 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6982 6983 // Transform the output expr. 6984 Expr *OutputExpr = S->getOutputExpr(I); 6985 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6986 if (Result.isInvalid()) 6987 return StmtError(); 6988 6989 ExprsChanged |= Result.get() != OutputExpr; 6990 6991 Exprs.push_back(Result.get()); 6992 } 6993 6994 // Go through the inputs. 6995 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6996 Names.push_back(S->getInputIdentifier(I)); 6997 6998 // No need to transform the constraint literal. 6999 Constraints.push_back(S->getInputConstraintLiteral(I)); 7000 7001 // Transform the input expr. 7002 Expr *InputExpr = S->getInputExpr(I); 7003 ExprResult Result = getDerived().TransformExpr(InputExpr); 7004 if (Result.isInvalid()) 7005 return StmtError(); 7006 7007 ExprsChanged |= Result.get() != InputExpr; 7008 7009 Exprs.push_back(Result.get()); 7010 } 7011 7012 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7013 return S; 7014 7015 // Go through the clobbers. 7016 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7017 Clobbers.push_back(S->getClobberStringLiteral(I)); 7018 7019 // No need to transform the asm string literal. 7020 AsmString = S->getAsmString(); 7021 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7022 S->isVolatile(), S->getNumOutputs(), 7023 S->getNumInputs(), Names.data(), 7024 Constraints, Exprs, AsmString.get(), 7025 Clobbers, S->getRParenLoc()); 7026 } 7027 7028 template<typename Derived> 7029 StmtResult 7030 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7031 ArrayRef<Token> AsmToks = 7032 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7033 7034 bool HadError = false, HadChange = false; 7035 7036 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7037 SmallVector<Expr*, 8> TransformedExprs; 7038 TransformedExprs.reserve(SrcExprs.size()); 7039 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7040 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7041 if (!Result.isUsable()) { 7042 HadError = true; 7043 } else { 7044 HadChange |= (Result.get() != SrcExprs[i]); 7045 TransformedExprs.push_back(Result.get()); 7046 } 7047 } 7048 7049 if (HadError) return StmtError(); 7050 if (!HadChange && !getDerived().AlwaysRebuild()) 7051 return Owned(S); 7052 7053 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7054 AsmToks, S->getAsmString(), 7055 S->getNumOutputs(), S->getNumInputs(), 7056 S->getAllConstraints(), S->getClobbers(), 7057 TransformedExprs, S->getEndLoc()); 7058 } 7059 7060 // C++ Coroutines TS 7061 7062 template<typename Derived> 7063 StmtResult 7064 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7065 auto *ScopeInfo = SemaRef.getCurFunction(); 7066 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7067 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7068 ScopeInfo->NeedsCoroutineSuspends && 7069 ScopeInfo->CoroutineSuspends.first == nullptr && 7070 ScopeInfo->CoroutineSuspends.second == nullptr && 7071 "expected clean scope info"); 7072 7073 // Set that we have (possibly-invalid) suspend points before we do anything 7074 // that may fail. 7075 ScopeInfo->setNeedsCoroutineSuspends(false); 7076 7077 // The new CoroutinePromise object needs to be built and put into the current 7078 // FunctionScopeInfo before any transformations or rebuilding occurs. 7079 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7080 return StmtError(); 7081 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7082 if (!Promise) 7083 return StmtError(); 7084 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 7085 ScopeInfo->CoroutinePromise = Promise; 7086 7087 // Transform the implicit coroutine statements we built during the initial 7088 // parse. 7089 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7090 if (InitSuspend.isInvalid()) 7091 return StmtError(); 7092 StmtResult FinalSuspend = 7093 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7094 if (FinalSuspend.isInvalid()) 7095 return StmtError(); 7096 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7097 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7098 7099 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7100 if (BodyRes.isInvalid()) 7101 return StmtError(); 7102 7103 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7104 if (Builder.isInvalid()) 7105 return StmtError(); 7106 7107 Expr *ReturnObject = S->getReturnValueInit(); 7108 assert(ReturnObject && "the return object is expected to be valid"); 7109 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7110 /*NoCopyInit*/ false); 7111 if (Res.isInvalid()) 7112 return StmtError(); 7113 Builder.ReturnValue = Res.get(); 7114 7115 if (S->hasDependentPromiseType()) { 7116 assert(!Promise->getType()->isDependentType() && 7117 "the promise type must no longer be dependent"); 7118 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7119 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7120 "these nodes should not have been built yet"); 7121 if (!Builder.buildDependentStatements()) 7122 return StmtError(); 7123 } else { 7124 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7125 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7126 if (Res.isInvalid()) 7127 return StmtError(); 7128 Builder.OnFallthrough = Res.get(); 7129 } 7130 7131 if (auto *OnException = S->getExceptionHandler()) { 7132 StmtResult Res = getDerived().TransformStmt(OnException); 7133 if (Res.isInvalid()) 7134 return StmtError(); 7135 Builder.OnException = Res.get(); 7136 } 7137 7138 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7139 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7140 if (Res.isInvalid()) 7141 return StmtError(); 7142 Builder.ReturnStmtOnAllocFailure = Res.get(); 7143 } 7144 7145 // Transform any additional statements we may have already built 7146 assert(S->getAllocate() && S->getDeallocate() && 7147 "allocation and deallocation calls must already be built"); 7148 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7149 if (AllocRes.isInvalid()) 7150 return StmtError(); 7151 Builder.Allocate = AllocRes.get(); 7152 7153 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7154 if (DeallocRes.isInvalid()) 7155 return StmtError(); 7156 Builder.Deallocate = DeallocRes.get(); 7157 7158 assert(S->getResultDecl() && "ResultDecl must already be built"); 7159 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7160 if (ResultDecl.isInvalid()) 7161 return StmtError(); 7162 Builder.ResultDecl = ResultDecl.get(); 7163 7164 if (auto *ReturnStmt = S->getReturnStmt()) { 7165 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7166 if (Res.isInvalid()) 7167 return StmtError(); 7168 Builder.ReturnStmt = Res.get(); 7169 } 7170 } 7171 7172 return getDerived().RebuildCoroutineBodyStmt(Builder); 7173 } 7174 7175 template<typename Derived> 7176 StmtResult 7177 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7178 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7179 /*NotCopyInit*/false); 7180 if (Result.isInvalid()) 7181 return StmtError(); 7182 7183 // Always rebuild; we don't know if this needs to be injected into a new 7184 // context or if the promise type has changed. 7185 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7186 S->isImplicit()); 7187 } 7188 7189 template<typename Derived> 7190 ExprResult 7191 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7192 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7193 /*NotCopyInit*/false); 7194 if (Result.isInvalid()) 7195 return ExprError(); 7196 7197 // Always rebuild; we don't know if this needs to be injected into a new 7198 // context or if the promise type has changed. 7199 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7200 E->isImplicit()); 7201 } 7202 7203 template <typename Derived> 7204 ExprResult 7205 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7206 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7207 /*NotCopyInit*/ false); 7208 if (OperandResult.isInvalid()) 7209 return ExprError(); 7210 7211 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7212 E->getOperatorCoawaitLookup()); 7213 7214 if (LookupResult.isInvalid()) 7215 return ExprError(); 7216 7217 // Always rebuild; we don't know if this needs to be injected into a new 7218 // context or if the promise type has changed. 7219 return getDerived().RebuildDependentCoawaitExpr( 7220 E->getKeywordLoc(), OperandResult.get(), 7221 cast<UnresolvedLookupExpr>(LookupResult.get())); 7222 } 7223 7224 template<typename Derived> 7225 ExprResult 7226 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7227 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7228 /*NotCopyInit*/false); 7229 if (Result.isInvalid()) 7230 return ExprError(); 7231 7232 // Always rebuild; we don't know if this needs to be injected into a new 7233 // context or if the promise type has changed. 7234 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7235 } 7236 7237 // Objective-C Statements. 7238 7239 template<typename Derived> 7240 StmtResult 7241 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7242 // Transform the body of the @try. 7243 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7244 if (TryBody.isInvalid()) 7245 return StmtError(); 7246 7247 // Transform the @catch statements (if present). 7248 bool AnyCatchChanged = false; 7249 SmallVector<Stmt*, 8> CatchStmts; 7250 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7251 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7252 if (Catch.isInvalid()) 7253 return StmtError(); 7254 if (Catch.get() != S->getCatchStmt(I)) 7255 AnyCatchChanged = true; 7256 CatchStmts.push_back(Catch.get()); 7257 } 7258 7259 // Transform the @finally statement (if present). 7260 StmtResult Finally; 7261 if (S->getFinallyStmt()) { 7262 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7263 if (Finally.isInvalid()) 7264 return StmtError(); 7265 } 7266 7267 // If nothing changed, just retain this statement. 7268 if (!getDerived().AlwaysRebuild() && 7269 TryBody.get() == S->getTryBody() && 7270 !AnyCatchChanged && 7271 Finally.get() == S->getFinallyStmt()) 7272 return S; 7273 7274 // Build a new statement. 7275 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7276 CatchStmts, Finally.get()); 7277 } 7278 7279 template<typename Derived> 7280 StmtResult 7281 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7282 // Transform the @catch parameter, if there is one. 7283 VarDecl *Var = nullptr; 7284 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7285 TypeSourceInfo *TSInfo = nullptr; 7286 if (FromVar->getTypeSourceInfo()) { 7287 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7288 if (!TSInfo) 7289 return StmtError(); 7290 } 7291 7292 QualType T; 7293 if (TSInfo) 7294 T = TSInfo->getType(); 7295 else { 7296 T = getDerived().TransformType(FromVar->getType()); 7297 if (T.isNull()) 7298 return StmtError(); 7299 } 7300 7301 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7302 if (!Var) 7303 return StmtError(); 7304 } 7305 7306 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7307 if (Body.isInvalid()) 7308 return StmtError(); 7309 7310 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7311 S->getRParenLoc(), 7312 Var, Body.get()); 7313 } 7314 7315 template<typename Derived> 7316 StmtResult 7317 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7318 // Transform the body. 7319 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7320 if (Body.isInvalid()) 7321 return StmtError(); 7322 7323 // If nothing changed, just retain this statement. 7324 if (!getDerived().AlwaysRebuild() && 7325 Body.get() == S->getFinallyBody()) 7326 return S; 7327 7328 // Build a new statement. 7329 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7330 Body.get()); 7331 } 7332 7333 template<typename Derived> 7334 StmtResult 7335 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7336 ExprResult Operand; 7337 if (S->getThrowExpr()) { 7338 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7339 if (Operand.isInvalid()) 7340 return StmtError(); 7341 } 7342 7343 if (!getDerived().AlwaysRebuild() && 7344 Operand.get() == S->getThrowExpr()) 7345 return S; 7346 7347 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7348 } 7349 7350 template<typename Derived> 7351 StmtResult 7352 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7353 ObjCAtSynchronizedStmt *S) { 7354 // Transform the object we are locking. 7355 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7356 if (Object.isInvalid()) 7357 return StmtError(); 7358 Object = 7359 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7360 Object.get()); 7361 if (Object.isInvalid()) 7362 return StmtError(); 7363 7364 // Transform the body. 7365 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7366 if (Body.isInvalid()) 7367 return StmtError(); 7368 7369 // If nothing change, just retain the current statement. 7370 if (!getDerived().AlwaysRebuild() && 7371 Object.get() == S->getSynchExpr() && 7372 Body.get() == S->getSynchBody()) 7373 return S; 7374 7375 // Build a new statement. 7376 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7377 Object.get(), Body.get()); 7378 } 7379 7380 template<typename Derived> 7381 StmtResult 7382 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7383 ObjCAutoreleasePoolStmt *S) { 7384 // Transform the body. 7385 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7386 if (Body.isInvalid()) 7387 return StmtError(); 7388 7389 // If nothing changed, just retain this statement. 7390 if (!getDerived().AlwaysRebuild() && 7391 Body.get() == S->getSubStmt()) 7392 return S; 7393 7394 // Build a new statement. 7395 return getDerived().RebuildObjCAutoreleasePoolStmt( 7396 S->getAtLoc(), Body.get()); 7397 } 7398 7399 template<typename Derived> 7400 StmtResult 7401 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7402 ObjCForCollectionStmt *S) { 7403 // Transform the element statement. 7404 StmtResult Element = 7405 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7406 if (Element.isInvalid()) 7407 return StmtError(); 7408 7409 // Transform the collection expression. 7410 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7411 if (Collection.isInvalid()) 7412 return StmtError(); 7413 7414 // Transform the body. 7415 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7416 if (Body.isInvalid()) 7417 return StmtError(); 7418 7419 // If nothing changed, just retain this statement. 7420 if (!getDerived().AlwaysRebuild() && 7421 Element.get() == S->getElement() && 7422 Collection.get() == S->getCollection() && 7423 Body.get() == S->getBody()) 7424 return S; 7425 7426 // Build a new statement. 7427 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7428 Element.get(), 7429 Collection.get(), 7430 S->getRParenLoc(), 7431 Body.get()); 7432 } 7433 7434 template <typename Derived> 7435 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7436 // Transform the exception declaration, if any. 7437 VarDecl *Var = nullptr; 7438 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7439 TypeSourceInfo *T = 7440 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7441 if (!T) 7442 return StmtError(); 7443 7444 Var = getDerived().RebuildExceptionDecl( 7445 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7446 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7447 if (!Var || Var->isInvalidDecl()) 7448 return StmtError(); 7449 } 7450 7451 // Transform the actual exception handler. 7452 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7453 if (Handler.isInvalid()) 7454 return StmtError(); 7455 7456 if (!getDerived().AlwaysRebuild() && !Var && 7457 Handler.get() == S->getHandlerBlock()) 7458 return S; 7459 7460 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7461 } 7462 7463 template <typename Derived> 7464 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7465 // Transform the try block itself. 7466 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7467 if (TryBlock.isInvalid()) 7468 return StmtError(); 7469 7470 // Transform the handlers. 7471 bool HandlerChanged = false; 7472 SmallVector<Stmt *, 8> Handlers; 7473 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7474 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7475 if (Handler.isInvalid()) 7476 return StmtError(); 7477 7478 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7479 Handlers.push_back(Handler.getAs<Stmt>()); 7480 } 7481 7482 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7483 !HandlerChanged) 7484 return S; 7485 7486 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7487 Handlers); 7488 } 7489 7490 template<typename Derived> 7491 StmtResult 7492 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7493 StmtResult Init = 7494 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7495 if (Init.isInvalid()) 7496 return StmtError(); 7497 7498 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7499 if (Range.isInvalid()) 7500 return StmtError(); 7501 7502 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7503 if (Begin.isInvalid()) 7504 return StmtError(); 7505 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7506 if (End.isInvalid()) 7507 return StmtError(); 7508 7509 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7510 if (Cond.isInvalid()) 7511 return StmtError(); 7512 if (Cond.get()) 7513 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7514 if (Cond.isInvalid()) 7515 return StmtError(); 7516 if (Cond.get()) 7517 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7518 7519 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7520 if (Inc.isInvalid()) 7521 return StmtError(); 7522 if (Inc.get()) 7523 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7524 7525 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7526 if (LoopVar.isInvalid()) 7527 return StmtError(); 7528 7529 StmtResult NewStmt = S; 7530 if (getDerived().AlwaysRebuild() || 7531 Init.get() != S->getInit() || 7532 Range.get() != S->getRangeStmt() || 7533 Begin.get() != S->getBeginStmt() || 7534 End.get() != S->getEndStmt() || 7535 Cond.get() != S->getCond() || 7536 Inc.get() != S->getInc() || 7537 LoopVar.get() != S->getLoopVarStmt()) { 7538 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7539 S->getCoawaitLoc(), Init.get(), 7540 S->getColonLoc(), Range.get(), 7541 Begin.get(), End.get(), 7542 Cond.get(), 7543 Inc.get(), LoopVar.get(), 7544 S->getRParenLoc()); 7545 if (NewStmt.isInvalid()) 7546 return StmtError(); 7547 } 7548 7549 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7550 if (Body.isInvalid()) 7551 return StmtError(); 7552 7553 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7554 // it now so we have a new statement to attach the body to. 7555 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7556 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7557 S->getCoawaitLoc(), Init.get(), 7558 S->getColonLoc(), Range.get(), 7559 Begin.get(), End.get(), 7560 Cond.get(), 7561 Inc.get(), LoopVar.get(), 7562 S->getRParenLoc()); 7563 if (NewStmt.isInvalid()) 7564 return StmtError(); 7565 } 7566 7567 if (NewStmt.get() == S) 7568 return S; 7569 7570 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7571 } 7572 7573 template<typename Derived> 7574 StmtResult 7575 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7576 MSDependentExistsStmt *S) { 7577 // Transform the nested-name-specifier, if any. 7578 NestedNameSpecifierLoc QualifierLoc; 7579 if (S->getQualifierLoc()) { 7580 QualifierLoc 7581 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7582 if (!QualifierLoc) 7583 return StmtError(); 7584 } 7585 7586 // Transform the declaration name. 7587 DeclarationNameInfo NameInfo = S->getNameInfo(); 7588 if (NameInfo.getName()) { 7589 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7590 if (!NameInfo.getName()) 7591 return StmtError(); 7592 } 7593 7594 // Check whether anything changed. 7595 if (!getDerived().AlwaysRebuild() && 7596 QualifierLoc == S->getQualifierLoc() && 7597 NameInfo.getName() == S->getNameInfo().getName()) 7598 return S; 7599 7600 // Determine whether this name exists, if we can. 7601 CXXScopeSpec SS; 7602 SS.Adopt(QualifierLoc); 7603 bool Dependent = false; 7604 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7605 case Sema::IER_Exists: 7606 if (S->isIfExists()) 7607 break; 7608 7609 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7610 7611 case Sema::IER_DoesNotExist: 7612 if (S->isIfNotExists()) 7613 break; 7614 7615 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7616 7617 case Sema::IER_Dependent: 7618 Dependent = true; 7619 break; 7620 7621 case Sema::IER_Error: 7622 return StmtError(); 7623 } 7624 7625 // We need to continue with the instantiation, so do so now. 7626 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7627 if (SubStmt.isInvalid()) 7628 return StmtError(); 7629 7630 // If we have resolved the name, just transform to the substatement. 7631 if (!Dependent) 7632 return SubStmt; 7633 7634 // The name is still dependent, so build a dependent expression again. 7635 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7636 S->isIfExists(), 7637 QualifierLoc, 7638 NameInfo, 7639 SubStmt.get()); 7640 } 7641 7642 template<typename Derived> 7643 ExprResult 7644 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7645 NestedNameSpecifierLoc QualifierLoc; 7646 if (E->getQualifierLoc()) { 7647 QualifierLoc 7648 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7649 if (!QualifierLoc) 7650 return ExprError(); 7651 } 7652 7653 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7654 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7655 if (!PD) 7656 return ExprError(); 7657 7658 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7659 if (Base.isInvalid()) 7660 return ExprError(); 7661 7662 return new (SemaRef.getASTContext()) 7663 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7664 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7665 QualifierLoc, E->getMemberLoc()); 7666 } 7667 7668 template <typename Derived> 7669 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7670 MSPropertySubscriptExpr *E) { 7671 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7672 if (BaseRes.isInvalid()) 7673 return ExprError(); 7674 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7675 if (IdxRes.isInvalid()) 7676 return ExprError(); 7677 7678 if (!getDerived().AlwaysRebuild() && 7679 BaseRes.get() == E->getBase() && 7680 IdxRes.get() == E->getIdx()) 7681 return E; 7682 7683 return getDerived().RebuildArraySubscriptExpr( 7684 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7685 } 7686 7687 template <typename Derived> 7688 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7689 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7690 if (TryBlock.isInvalid()) 7691 return StmtError(); 7692 7693 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7694 if (Handler.isInvalid()) 7695 return StmtError(); 7696 7697 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7698 Handler.get() == S->getHandler()) 7699 return S; 7700 7701 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7702 TryBlock.get(), Handler.get()); 7703 } 7704 7705 template <typename Derived> 7706 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7707 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7708 if (Block.isInvalid()) 7709 return StmtError(); 7710 7711 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7712 } 7713 7714 template <typename Derived> 7715 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7716 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7717 if (FilterExpr.isInvalid()) 7718 return StmtError(); 7719 7720 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7721 if (Block.isInvalid()) 7722 return StmtError(); 7723 7724 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7725 Block.get()); 7726 } 7727 7728 template <typename Derived> 7729 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7730 if (isa<SEHFinallyStmt>(Handler)) 7731 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7732 else 7733 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7734 } 7735 7736 template<typename Derived> 7737 StmtResult 7738 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7739 return S; 7740 } 7741 7742 //===----------------------------------------------------------------------===// 7743 // OpenMP directive transformation 7744 //===----------------------------------------------------------------------===// 7745 template <typename Derived> 7746 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7747 OMPExecutableDirective *D) { 7748 7749 // Transform the clauses 7750 llvm::SmallVector<OMPClause *, 16> TClauses; 7751 ArrayRef<OMPClause *> Clauses = D->clauses(); 7752 TClauses.reserve(Clauses.size()); 7753 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7754 I != E; ++I) { 7755 if (*I) { 7756 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7757 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7758 getDerived().getSema().EndOpenMPClause(); 7759 if (Clause) 7760 TClauses.push_back(Clause); 7761 } else { 7762 TClauses.push_back(nullptr); 7763 } 7764 } 7765 StmtResult AssociatedStmt; 7766 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7767 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7768 /*CurScope=*/nullptr); 7769 StmtResult Body; 7770 { 7771 Sema::CompoundScopeRAII CompoundScope(getSema()); 7772 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 7773 Body = getDerived().TransformStmt(CS); 7774 } 7775 AssociatedStmt = 7776 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7777 if (AssociatedStmt.isInvalid()) { 7778 return StmtError(); 7779 } 7780 } 7781 if (TClauses.size() != Clauses.size()) { 7782 return StmtError(); 7783 } 7784 7785 // Transform directive name for 'omp critical' directive. 7786 DeclarationNameInfo DirName; 7787 if (D->getDirectiveKind() == OMPD_critical) { 7788 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7789 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7790 } 7791 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7792 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7793 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7794 } else if (D->getDirectiveKind() == OMPD_cancel) { 7795 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7796 } 7797 7798 return getDerived().RebuildOMPExecutableDirective( 7799 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7800 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 7801 } 7802 7803 template <typename Derived> 7804 StmtResult 7805 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7806 DeclarationNameInfo DirName; 7807 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7808 D->getBeginLoc()); 7809 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7810 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7811 return Res; 7812 } 7813 7814 template <typename Derived> 7815 StmtResult 7816 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7817 DeclarationNameInfo DirName; 7818 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7819 D->getBeginLoc()); 7820 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7821 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7822 return Res; 7823 } 7824 7825 template <typename Derived> 7826 StmtResult 7827 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7828 DeclarationNameInfo DirName; 7829 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7830 D->getBeginLoc()); 7831 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7832 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7833 return Res; 7834 } 7835 7836 template <typename Derived> 7837 StmtResult 7838 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7839 DeclarationNameInfo DirName; 7840 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7841 D->getBeginLoc()); 7842 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7843 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7844 return Res; 7845 } 7846 7847 template <typename Derived> 7848 StmtResult 7849 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7850 DeclarationNameInfo DirName; 7851 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7852 D->getBeginLoc()); 7853 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7854 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7855 return Res; 7856 } 7857 7858 template <typename Derived> 7859 StmtResult 7860 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7861 DeclarationNameInfo DirName; 7862 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7863 D->getBeginLoc()); 7864 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7865 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7866 return Res; 7867 } 7868 7869 template <typename Derived> 7870 StmtResult 7871 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7872 DeclarationNameInfo DirName; 7873 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7874 D->getBeginLoc()); 7875 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7876 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7877 return Res; 7878 } 7879 7880 template <typename Derived> 7881 StmtResult 7882 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7883 DeclarationNameInfo DirName; 7884 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7885 D->getBeginLoc()); 7886 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7887 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7888 return Res; 7889 } 7890 7891 template <typename Derived> 7892 StmtResult 7893 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7894 getDerived().getSema().StartOpenMPDSABlock( 7895 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 7896 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7897 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7898 return Res; 7899 } 7900 7901 template <typename Derived> 7902 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7903 OMPParallelForDirective *D) { 7904 DeclarationNameInfo DirName; 7905 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7906 nullptr, D->getBeginLoc()); 7907 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7908 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7909 return Res; 7910 } 7911 7912 template <typename Derived> 7913 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7914 OMPParallelForSimdDirective *D) { 7915 DeclarationNameInfo DirName; 7916 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7917 nullptr, D->getBeginLoc()); 7918 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7919 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7920 return Res; 7921 } 7922 7923 template <typename Derived> 7924 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7925 OMPParallelSectionsDirective *D) { 7926 DeclarationNameInfo DirName; 7927 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7928 nullptr, D->getBeginLoc()); 7929 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7930 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7931 return Res; 7932 } 7933 7934 template <typename Derived> 7935 StmtResult 7936 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7937 DeclarationNameInfo DirName; 7938 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7939 D->getBeginLoc()); 7940 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7941 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7942 return Res; 7943 } 7944 7945 template <typename Derived> 7946 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7947 OMPTaskyieldDirective *D) { 7948 DeclarationNameInfo DirName; 7949 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7950 D->getBeginLoc()); 7951 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7952 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7953 return Res; 7954 } 7955 7956 template <typename Derived> 7957 StmtResult 7958 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7959 DeclarationNameInfo DirName; 7960 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7961 D->getBeginLoc()); 7962 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7963 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7964 return Res; 7965 } 7966 7967 template <typename Derived> 7968 StmtResult 7969 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7970 DeclarationNameInfo DirName; 7971 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7972 D->getBeginLoc()); 7973 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7974 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7975 return Res; 7976 } 7977 7978 template <typename Derived> 7979 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7980 OMPTaskgroupDirective *D) { 7981 DeclarationNameInfo DirName; 7982 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7983 D->getBeginLoc()); 7984 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7985 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7986 return Res; 7987 } 7988 7989 template <typename Derived> 7990 StmtResult 7991 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7992 DeclarationNameInfo DirName; 7993 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7994 D->getBeginLoc()); 7995 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7996 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7997 return Res; 7998 } 7999 8000 template <typename Derived> 8001 StmtResult 8002 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8003 DeclarationNameInfo DirName; 8004 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8005 D->getBeginLoc()); 8006 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8007 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8008 return Res; 8009 } 8010 8011 template <typename Derived> 8012 StmtResult 8013 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8014 DeclarationNameInfo DirName; 8015 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8016 D->getBeginLoc()); 8017 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8018 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8019 return Res; 8020 } 8021 8022 template <typename Derived> 8023 StmtResult 8024 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8025 DeclarationNameInfo DirName; 8026 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8027 D->getBeginLoc()); 8028 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8029 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8030 return Res; 8031 } 8032 8033 template <typename Derived> 8034 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8035 OMPTargetDataDirective *D) { 8036 DeclarationNameInfo DirName; 8037 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8038 D->getBeginLoc()); 8039 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8040 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8041 return Res; 8042 } 8043 8044 template <typename Derived> 8045 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8046 OMPTargetEnterDataDirective *D) { 8047 DeclarationNameInfo DirName; 8048 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8049 nullptr, D->getBeginLoc()); 8050 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8051 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8052 return Res; 8053 } 8054 8055 template <typename Derived> 8056 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8057 OMPTargetExitDataDirective *D) { 8058 DeclarationNameInfo DirName; 8059 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8060 nullptr, D->getBeginLoc()); 8061 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8062 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8063 return Res; 8064 } 8065 8066 template <typename Derived> 8067 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8068 OMPTargetParallelDirective *D) { 8069 DeclarationNameInfo DirName; 8070 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8071 nullptr, D->getBeginLoc()); 8072 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8073 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8074 return Res; 8075 } 8076 8077 template <typename Derived> 8078 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8079 OMPTargetParallelForDirective *D) { 8080 DeclarationNameInfo DirName; 8081 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8082 nullptr, D->getBeginLoc()); 8083 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8084 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8085 return Res; 8086 } 8087 8088 template <typename Derived> 8089 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8090 OMPTargetUpdateDirective *D) { 8091 DeclarationNameInfo DirName; 8092 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8093 nullptr, D->getBeginLoc()); 8094 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8095 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8096 return Res; 8097 } 8098 8099 template <typename Derived> 8100 StmtResult 8101 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8102 DeclarationNameInfo DirName; 8103 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8104 D->getBeginLoc()); 8105 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8106 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8107 return Res; 8108 } 8109 8110 template <typename Derived> 8111 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8112 OMPCancellationPointDirective *D) { 8113 DeclarationNameInfo DirName; 8114 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8115 nullptr, D->getBeginLoc()); 8116 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8117 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8118 return Res; 8119 } 8120 8121 template <typename Derived> 8122 StmtResult 8123 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8124 DeclarationNameInfo DirName; 8125 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8126 D->getBeginLoc()); 8127 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8128 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8129 return Res; 8130 } 8131 8132 template <typename Derived> 8133 StmtResult 8134 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8135 DeclarationNameInfo DirName; 8136 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8137 D->getBeginLoc()); 8138 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8139 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8140 return Res; 8141 } 8142 8143 template <typename Derived> 8144 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8145 OMPTaskLoopSimdDirective *D) { 8146 DeclarationNameInfo DirName; 8147 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8148 nullptr, D->getBeginLoc()); 8149 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8150 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8151 return Res; 8152 } 8153 8154 template <typename Derived> 8155 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8156 OMPDistributeDirective *D) { 8157 DeclarationNameInfo DirName; 8158 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8159 D->getBeginLoc()); 8160 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8161 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8162 return Res; 8163 } 8164 8165 template <typename Derived> 8166 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8167 OMPDistributeParallelForDirective *D) { 8168 DeclarationNameInfo DirName; 8169 getDerived().getSema().StartOpenMPDSABlock( 8170 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8171 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8172 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8173 return Res; 8174 } 8175 8176 template <typename Derived> 8177 StmtResult 8178 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8179 OMPDistributeParallelForSimdDirective *D) { 8180 DeclarationNameInfo DirName; 8181 getDerived().getSema().StartOpenMPDSABlock( 8182 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8183 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8184 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8185 return Res; 8186 } 8187 8188 template <typename Derived> 8189 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8190 OMPDistributeSimdDirective *D) { 8191 DeclarationNameInfo DirName; 8192 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8193 nullptr, D->getBeginLoc()); 8194 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8195 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8196 return Res; 8197 } 8198 8199 template <typename Derived> 8200 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8201 OMPTargetParallelForSimdDirective *D) { 8202 DeclarationNameInfo DirName; 8203 getDerived().getSema().StartOpenMPDSABlock( 8204 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8205 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8206 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8207 return Res; 8208 } 8209 8210 template <typename Derived> 8211 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8212 OMPTargetSimdDirective *D) { 8213 DeclarationNameInfo DirName; 8214 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8215 D->getBeginLoc()); 8216 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8217 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8218 return Res; 8219 } 8220 8221 template <typename Derived> 8222 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8223 OMPTeamsDistributeDirective *D) { 8224 DeclarationNameInfo DirName; 8225 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8226 nullptr, D->getBeginLoc()); 8227 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8228 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8229 return Res; 8230 } 8231 8232 template <typename Derived> 8233 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8234 OMPTeamsDistributeSimdDirective *D) { 8235 DeclarationNameInfo DirName; 8236 getDerived().getSema().StartOpenMPDSABlock( 8237 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8238 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8239 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8240 return Res; 8241 } 8242 8243 template <typename Derived> 8244 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8245 OMPTeamsDistributeParallelForSimdDirective *D) { 8246 DeclarationNameInfo DirName; 8247 getDerived().getSema().StartOpenMPDSABlock( 8248 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8249 D->getBeginLoc()); 8250 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8251 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8252 return Res; 8253 } 8254 8255 template <typename Derived> 8256 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8257 OMPTeamsDistributeParallelForDirective *D) { 8258 DeclarationNameInfo DirName; 8259 getDerived().getSema().StartOpenMPDSABlock( 8260 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8261 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8262 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8263 return Res; 8264 } 8265 8266 template <typename Derived> 8267 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8268 OMPTargetTeamsDirective *D) { 8269 DeclarationNameInfo DirName; 8270 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8271 nullptr, D->getBeginLoc()); 8272 auto Res = getDerived().TransformOMPExecutableDirective(D); 8273 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8274 return Res; 8275 } 8276 8277 template <typename Derived> 8278 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8279 OMPTargetTeamsDistributeDirective *D) { 8280 DeclarationNameInfo DirName; 8281 getDerived().getSema().StartOpenMPDSABlock( 8282 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8283 auto Res = getDerived().TransformOMPExecutableDirective(D); 8284 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8285 return Res; 8286 } 8287 8288 template <typename Derived> 8289 StmtResult 8290 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8291 OMPTargetTeamsDistributeParallelForDirective *D) { 8292 DeclarationNameInfo DirName; 8293 getDerived().getSema().StartOpenMPDSABlock( 8294 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8295 D->getBeginLoc()); 8296 auto Res = getDerived().TransformOMPExecutableDirective(D); 8297 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8298 return Res; 8299 } 8300 8301 template <typename Derived> 8302 StmtResult TreeTransform<Derived>:: 8303 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8304 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8305 DeclarationNameInfo DirName; 8306 getDerived().getSema().StartOpenMPDSABlock( 8307 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8308 D->getBeginLoc()); 8309 auto Res = getDerived().TransformOMPExecutableDirective(D); 8310 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8311 return Res; 8312 } 8313 8314 template <typename Derived> 8315 StmtResult 8316 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8317 OMPTargetTeamsDistributeSimdDirective *D) { 8318 DeclarationNameInfo DirName; 8319 getDerived().getSema().StartOpenMPDSABlock( 8320 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8321 auto Res = getDerived().TransformOMPExecutableDirective(D); 8322 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8323 return Res; 8324 } 8325 8326 8327 //===----------------------------------------------------------------------===// 8328 // OpenMP clause transformation 8329 //===----------------------------------------------------------------------===// 8330 template <typename Derived> 8331 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8332 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8333 if (Cond.isInvalid()) 8334 return nullptr; 8335 return getDerived().RebuildOMPIfClause( 8336 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8337 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8338 } 8339 8340 template <typename Derived> 8341 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8342 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8343 if (Cond.isInvalid()) 8344 return nullptr; 8345 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8346 C->getLParenLoc(), C->getEndLoc()); 8347 } 8348 8349 template <typename Derived> 8350 OMPClause * 8351 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8352 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8353 if (NumThreads.isInvalid()) 8354 return nullptr; 8355 return getDerived().RebuildOMPNumThreadsClause( 8356 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8357 } 8358 8359 template <typename Derived> 8360 OMPClause * 8361 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8362 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8363 if (E.isInvalid()) 8364 return nullptr; 8365 return getDerived().RebuildOMPSafelenClause( 8366 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8367 } 8368 8369 template <typename Derived> 8370 OMPClause * 8371 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 8372 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 8373 if (E.isInvalid()) 8374 return nullptr; 8375 return getDerived().RebuildOMPAllocatorClause( 8376 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8377 } 8378 8379 template <typename Derived> 8380 OMPClause * 8381 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8382 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8383 if (E.isInvalid()) 8384 return nullptr; 8385 return getDerived().RebuildOMPSimdlenClause( 8386 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8387 } 8388 8389 template <typename Derived> 8390 OMPClause * 8391 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8392 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8393 if (E.isInvalid()) 8394 return nullptr; 8395 return getDerived().RebuildOMPCollapseClause( 8396 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8397 } 8398 8399 template <typename Derived> 8400 OMPClause * 8401 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8402 return getDerived().RebuildOMPDefaultClause( 8403 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8404 C->getLParenLoc(), C->getEndLoc()); 8405 } 8406 8407 template <typename Derived> 8408 OMPClause * 8409 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8410 return getDerived().RebuildOMPProcBindClause( 8411 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8412 C->getLParenLoc(), C->getEndLoc()); 8413 } 8414 8415 template <typename Derived> 8416 OMPClause * 8417 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8418 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8419 if (E.isInvalid()) 8420 return nullptr; 8421 return getDerived().RebuildOMPScheduleClause( 8422 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8423 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8424 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8425 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8426 } 8427 8428 template <typename Derived> 8429 OMPClause * 8430 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8431 ExprResult E; 8432 if (auto *Num = C->getNumForLoops()) { 8433 E = getDerived().TransformExpr(Num); 8434 if (E.isInvalid()) 8435 return nullptr; 8436 } 8437 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8438 C->getLParenLoc(), E.get()); 8439 } 8440 8441 template <typename Derived> 8442 OMPClause * 8443 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8444 // No need to rebuild this clause, no template-dependent parameters. 8445 return C; 8446 } 8447 8448 template <typename Derived> 8449 OMPClause * 8450 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8451 // No need to rebuild this clause, no template-dependent parameters. 8452 return C; 8453 } 8454 8455 template <typename Derived> 8456 OMPClause * 8457 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8458 // No need to rebuild this clause, no template-dependent parameters. 8459 return C; 8460 } 8461 8462 template <typename Derived> 8463 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8464 // No need to rebuild this clause, no template-dependent parameters. 8465 return C; 8466 } 8467 8468 template <typename Derived> 8469 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8470 // No need to rebuild this clause, no template-dependent parameters. 8471 return C; 8472 } 8473 8474 template <typename Derived> 8475 OMPClause * 8476 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8477 // No need to rebuild this clause, no template-dependent parameters. 8478 return C; 8479 } 8480 8481 template <typename Derived> 8482 OMPClause * 8483 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8484 // No need to rebuild this clause, no template-dependent parameters. 8485 return C; 8486 } 8487 8488 template <typename Derived> 8489 OMPClause * 8490 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8491 // No need to rebuild this clause, no template-dependent parameters. 8492 return C; 8493 } 8494 8495 template <typename Derived> 8496 OMPClause * 8497 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8498 // No need to rebuild this clause, no template-dependent parameters. 8499 return C; 8500 } 8501 8502 template <typename Derived> 8503 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8504 // No need to rebuild this clause, no template-dependent parameters. 8505 return C; 8506 } 8507 8508 template <typename Derived> 8509 OMPClause * 8510 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8511 // No need to rebuild this clause, no template-dependent parameters. 8512 return C; 8513 } 8514 8515 template <typename Derived> 8516 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8517 OMPUnifiedAddressClause *C) { 8518 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8519 } 8520 8521 template <typename Derived> 8522 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8523 OMPUnifiedSharedMemoryClause *C) { 8524 llvm_unreachable( 8525 "unified_shared_memory clause cannot appear in dependent context"); 8526 } 8527 8528 template <typename Derived> 8529 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8530 OMPReverseOffloadClause *C) { 8531 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8532 } 8533 8534 template <typename Derived> 8535 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8536 OMPDynamicAllocatorsClause *C) { 8537 llvm_unreachable( 8538 "dynamic_allocators clause cannot appear in dependent context"); 8539 } 8540 8541 template <typename Derived> 8542 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 8543 OMPAtomicDefaultMemOrderClause *C) { 8544 llvm_unreachable( 8545 "atomic_default_mem_order clause cannot appear in dependent context"); 8546 } 8547 8548 template <typename Derived> 8549 OMPClause * 8550 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8551 llvm::SmallVector<Expr *, 16> Vars; 8552 Vars.reserve(C->varlist_size()); 8553 for (auto *VE : C->varlists()) { 8554 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8555 if (EVar.isInvalid()) 8556 return nullptr; 8557 Vars.push_back(EVar.get()); 8558 } 8559 return getDerived().RebuildOMPPrivateClause( 8560 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8561 } 8562 8563 template <typename Derived> 8564 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8565 OMPFirstprivateClause *C) { 8566 llvm::SmallVector<Expr *, 16> Vars; 8567 Vars.reserve(C->varlist_size()); 8568 for (auto *VE : C->varlists()) { 8569 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8570 if (EVar.isInvalid()) 8571 return nullptr; 8572 Vars.push_back(EVar.get()); 8573 } 8574 return getDerived().RebuildOMPFirstprivateClause( 8575 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8576 } 8577 8578 template <typename Derived> 8579 OMPClause * 8580 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8581 llvm::SmallVector<Expr *, 16> Vars; 8582 Vars.reserve(C->varlist_size()); 8583 for (auto *VE : C->varlists()) { 8584 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8585 if (EVar.isInvalid()) 8586 return nullptr; 8587 Vars.push_back(EVar.get()); 8588 } 8589 return getDerived().RebuildOMPLastprivateClause( 8590 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8591 } 8592 8593 template <typename Derived> 8594 OMPClause * 8595 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8596 llvm::SmallVector<Expr *, 16> Vars; 8597 Vars.reserve(C->varlist_size()); 8598 for (auto *VE : C->varlists()) { 8599 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8600 if (EVar.isInvalid()) 8601 return nullptr; 8602 Vars.push_back(EVar.get()); 8603 } 8604 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8605 C->getLParenLoc(), C->getEndLoc()); 8606 } 8607 8608 template <typename Derived> 8609 OMPClause * 8610 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8611 llvm::SmallVector<Expr *, 16> Vars; 8612 Vars.reserve(C->varlist_size()); 8613 for (auto *VE : C->varlists()) { 8614 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8615 if (EVar.isInvalid()) 8616 return nullptr; 8617 Vars.push_back(EVar.get()); 8618 } 8619 CXXScopeSpec ReductionIdScopeSpec; 8620 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8621 8622 DeclarationNameInfo NameInfo = C->getNameInfo(); 8623 if (NameInfo.getName()) { 8624 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8625 if (!NameInfo.getName()) 8626 return nullptr; 8627 } 8628 // Build a list of all UDR decls with the same names ranged by the Scopes. 8629 // The Scope boundary is a duplication of the previous decl. 8630 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8631 for (auto *E : C->reduction_ops()) { 8632 // Transform all the decls. 8633 if (E) { 8634 auto *ULE = cast<UnresolvedLookupExpr>(E); 8635 UnresolvedSet<8> Decls; 8636 for (auto *D : ULE->decls()) { 8637 NamedDecl *InstD = 8638 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8639 Decls.addDecl(InstD, InstD->getAccess()); 8640 } 8641 UnresolvedReductions.push_back( 8642 UnresolvedLookupExpr::Create( 8643 SemaRef.Context, /*NamingClass=*/nullptr, 8644 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8645 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8646 Decls.begin(), Decls.end())); 8647 } else 8648 UnresolvedReductions.push_back(nullptr); 8649 } 8650 return getDerived().RebuildOMPReductionClause( 8651 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8652 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8653 } 8654 8655 template <typename Derived> 8656 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8657 OMPTaskReductionClause *C) { 8658 llvm::SmallVector<Expr *, 16> Vars; 8659 Vars.reserve(C->varlist_size()); 8660 for (auto *VE : C->varlists()) { 8661 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8662 if (EVar.isInvalid()) 8663 return nullptr; 8664 Vars.push_back(EVar.get()); 8665 } 8666 CXXScopeSpec ReductionIdScopeSpec; 8667 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8668 8669 DeclarationNameInfo NameInfo = C->getNameInfo(); 8670 if (NameInfo.getName()) { 8671 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8672 if (!NameInfo.getName()) 8673 return nullptr; 8674 } 8675 // Build a list of all UDR decls with the same names ranged by the Scopes. 8676 // The Scope boundary is a duplication of the previous decl. 8677 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8678 for (auto *E : C->reduction_ops()) { 8679 // Transform all the decls. 8680 if (E) { 8681 auto *ULE = cast<UnresolvedLookupExpr>(E); 8682 UnresolvedSet<8> Decls; 8683 for (auto *D : ULE->decls()) { 8684 NamedDecl *InstD = 8685 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8686 Decls.addDecl(InstD, InstD->getAccess()); 8687 } 8688 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8689 SemaRef.Context, /*NamingClass=*/nullptr, 8690 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8691 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8692 } else 8693 UnresolvedReductions.push_back(nullptr); 8694 } 8695 return getDerived().RebuildOMPTaskReductionClause( 8696 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8697 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8698 } 8699 8700 template <typename Derived> 8701 OMPClause * 8702 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 8703 llvm::SmallVector<Expr *, 16> Vars; 8704 Vars.reserve(C->varlist_size()); 8705 for (auto *VE : C->varlists()) { 8706 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8707 if (EVar.isInvalid()) 8708 return nullptr; 8709 Vars.push_back(EVar.get()); 8710 } 8711 CXXScopeSpec ReductionIdScopeSpec; 8712 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8713 8714 DeclarationNameInfo NameInfo = C->getNameInfo(); 8715 if (NameInfo.getName()) { 8716 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8717 if (!NameInfo.getName()) 8718 return nullptr; 8719 } 8720 // Build a list of all UDR decls with the same names ranged by the Scopes. 8721 // The Scope boundary is a duplication of the previous decl. 8722 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8723 for (auto *E : C->reduction_ops()) { 8724 // Transform all the decls. 8725 if (E) { 8726 auto *ULE = cast<UnresolvedLookupExpr>(E); 8727 UnresolvedSet<8> Decls; 8728 for (auto *D : ULE->decls()) { 8729 NamedDecl *InstD = 8730 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8731 Decls.addDecl(InstD, InstD->getAccess()); 8732 } 8733 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8734 SemaRef.Context, /*NamingClass=*/nullptr, 8735 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8736 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8737 } else 8738 UnresolvedReductions.push_back(nullptr); 8739 } 8740 return getDerived().RebuildOMPInReductionClause( 8741 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8742 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8743 } 8744 8745 template <typename Derived> 8746 OMPClause * 8747 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8748 llvm::SmallVector<Expr *, 16> Vars; 8749 Vars.reserve(C->varlist_size()); 8750 for (auto *VE : C->varlists()) { 8751 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8752 if (EVar.isInvalid()) 8753 return nullptr; 8754 Vars.push_back(EVar.get()); 8755 } 8756 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8757 if (Step.isInvalid()) 8758 return nullptr; 8759 return getDerived().RebuildOMPLinearClause( 8760 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 8761 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8762 } 8763 8764 template <typename Derived> 8765 OMPClause * 8766 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8767 llvm::SmallVector<Expr *, 16> Vars; 8768 Vars.reserve(C->varlist_size()); 8769 for (auto *VE : C->varlists()) { 8770 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8771 if (EVar.isInvalid()) 8772 return nullptr; 8773 Vars.push_back(EVar.get()); 8774 } 8775 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8776 if (Alignment.isInvalid()) 8777 return nullptr; 8778 return getDerived().RebuildOMPAlignedClause( 8779 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 8780 C->getColonLoc(), C->getEndLoc()); 8781 } 8782 8783 template <typename Derived> 8784 OMPClause * 8785 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8786 llvm::SmallVector<Expr *, 16> Vars; 8787 Vars.reserve(C->varlist_size()); 8788 for (auto *VE : C->varlists()) { 8789 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8790 if (EVar.isInvalid()) 8791 return nullptr; 8792 Vars.push_back(EVar.get()); 8793 } 8794 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 8795 C->getLParenLoc(), C->getEndLoc()); 8796 } 8797 8798 template <typename Derived> 8799 OMPClause * 8800 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8801 llvm::SmallVector<Expr *, 16> Vars; 8802 Vars.reserve(C->varlist_size()); 8803 for (auto *VE : C->varlists()) { 8804 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8805 if (EVar.isInvalid()) 8806 return nullptr; 8807 Vars.push_back(EVar.get()); 8808 } 8809 return getDerived().RebuildOMPCopyprivateClause( 8810 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8811 } 8812 8813 template <typename Derived> 8814 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8815 llvm::SmallVector<Expr *, 16> Vars; 8816 Vars.reserve(C->varlist_size()); 8817 for (auto *VE : C->varlists()) { 8818 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8819 if (EVar.isInvalid()) 8820 return nullptr; 8821 Vars.push_back(EVar.get()); 8822 } 8823 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 8824 C->getLParenLoc(), C->getEndLoc()); 8825 } 8826 8827 template <typename Derived> 8828 OMPClause * 8829 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8830 llvm::SmallVector<Expr *, 16> Vars; 8831 Vars.reserve(C->varlist_size()); 8832 for (auto *VE : C->varlists()) { 8833 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8834 if (EVar.isInvalid()) 8835 return nullptr; 8836 Vars.push_back(EVar.get()); 8837 } 8838 return getDerived().RebuildOMPDependClause( 8839 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8840 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8841 } 8842 8843 template <typename Derived> 8844 OMPClause * 8845 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8846 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8847 if (E.isInvalid()) 8848 return nullptr; 8849 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 8850 C->getLParenLoc(), C->getEndLoc()); 8851 } 8852 8853 template <typename Derived, class T> 8854 bool transformOMPMappableExprListClause( 8855 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 8856 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 8857 DeclarationNameInfo &MapperIdInfo, 8858 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 8859 // Transform expressions in the list. 8860 Vars.reserve(C->varlist_size()); 8861 for (auto *VE : C->varlists()) { 8862 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 8863 if (EVar.isInvalid()) 8864 return true; 8865 Vars.push_back(EVar.get()); 8866 } 8867 // Transform mapper scope specifier and identifier. 8868 NestedNameSpecifierLoc QualifierLoc; 8869 if (C->getMapperQualifierLoc()) { 8870 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 8871 C->getMapperQualifierLoc()); 8872 if (!QualifierLoc) 8873 return true; 8874 } 8875 MapperIdScopeSpec.Adopt(QualifierLoc); 8876 MapperIdInfo = C->getMapperIdInfo(); 8877 if (MapperIdInfo.getName()) { 8878 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 8879 if (!MapperIdInfo.getName()) 8880 return true; 8881 } 8882 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 8883 // the previous user-defined mapper lookup in dependent environment. 8884 for (auto *E : C->mapperlists()) { 8885 // Transform all the decls. 8886 if (E) { 8887 auto *ULE = cast<UnresolvedLookupExpr>(E); 8888 UnresolvedSet<8> Decls; 8889 for (auto *D : ULE->decls()) { 8890 NamedDecl *InstD = 8891 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 8892 Decls.addDecl(InstD, InstD->getAccess()); 8893 } 8894 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 8895 TT.getSema().Context, /*NamingClass=*/nullptr, 8896 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 8897 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 8898 Decls.end())); 8899 } else { 8900 UnresolvedMappers.push_back(nullptr); 8901 } 8902 } 8903 return false; 8904 } 8905 8906 template <typename Derived> 8907 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8908 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8909 llvm::SmallVector<Expr *, 16> Vars; 8910 CXXScopeSpec MapperIdScopeSpec; 8911 DeclarationNameInfo MapperIdInfo; 8912 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 8913 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 8914 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 8915 return nullptr; 8916 return getDerived().RebuildOMPMapClause( 8917 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 8918 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 8919 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 8920 } 8921 8922 template <typename Derived> 8923 OMPClause * 8924 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 8925 Expr *Allocator = C->getAllocator(); 8926 if (Allocator) { 8927 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 8928 if (AllocatorRes.isInvalid()) 8929 return nullptr; 8930 Allocator = AllocatorRes.get(); 8931 } 8932 llvm::SmallVector<Expr *, 16> Vars; 8933 Vars.reserve(C->varlist_size()); 8934 for (auto *VE : C->varlists()) { 8935 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8936 if (EVar.isInvalid()) 8937 return nullptr; 8938 Vars.push_back(EVar.get()); 8939 } 8940 return getDerived().RebuildOMPAllocateClause( 8941 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8942 C->getEndLoc()); 8943 } 8944 8945 template <typename Derived> 8946 OMPClause * 8947 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8948 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8949 if (E.isInvalid()) 8950 return nullptr; 8951 return getDerived().RebuildOMPNumTeamsClause( 8952 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8953 } 8954 8955 template <typename Derived> 8956 OMPClause * 8957 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8958 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8959 if (E.isInvalid()) 8960 return nullptr; 8961 return getDerived().RebuildOMPThreadLimitClause( 8962 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8963 } 8964 8965 template <typename Derived> 8966 OMPClause * 8967 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8968 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8969 if (E.isInvalid()) 8970 return nullptr; 8971 return getDerived().RebuildOMPPriorityClause( 8972 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8973 } 8974 8975 template <typename Derived> 8976 OMPClause * 8977 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8978 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8979 if (E.isInvalid()) 8980 return nullptr; 8981 return getDerived().RebuildOMPGrainsizeClause( 8982 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8983 } 8984 8985 template <typename Derived> 8986 OMPClause * 8987 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8988 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8989 if (E.isInvalid()) 8990 return nullptr; 8991 return getDerived().RebuildOMPNumTasksClause( 8992 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8993 } 8994 8995 template <typename Derived> 8996 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8997 ExprResult E = getDerived().TransformExpr(C->getHint()); 8998 if (E.isInvalid()) 8999 return nullptr; 9000 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9001 C->getLParenLoc(), C->getEndLoc()); 9002 } 9003 9004 template <typename Derived> 9005 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9006 OMPDistScheduleClause *C) { 9007 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9008 if (E.isInvalid()) 9009 return nullptr; 9010 return getDerived().RebuildOMPDistScheduleClause( 9011 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9012 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9013 } 9014 9015 template <typename Derived> 9016 OMPClause * 9017 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9018 return C; 9019 } 9020 9021 template <typename Derived> 9022 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9023 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9024 llvm::SmallVector<Expr *, 16> Vars; 9025 CXXScopeSpec MapperIdScopeSpec; 9026 DeclarationNameInfo MapperIdInfo; 9027 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9028 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9029 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9030 return nullptr; 9031 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 9032 Locs, UnresolvedMappers); 9033 } 9034 9035 template <typename Derived> 9036 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9037 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9038 llvm::SmallVector<Expr *, 16> Vars; 9039 CXXScopeSpec MapperIdScopeSpec; 9040 DeclarationNameInfo MapperIdInfo; 9041 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9042 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9043 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9044 return nullptr; 9045 return getDerived().RebuildOMPFromClause( 9046 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9047 } 9048 9049 template <typename Derived> 9050 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9051 OMPUseDevicePtrClause *C) { 9052 llvm::SmallVector<Expr *, 16> Vars; 9053 Vars.reserve(C->varlist_size()); 9054 for (auto *VE : C->varlists()) { 9055 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9056 if (EVar.isInvalid()) 9057 return nullptr; 9058 Vars.push_back(EVar.get()); 9059 } 9060 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9061 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9062 } 9063 9064 template <typename Derived> 9065 OMPClause * 9066 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9067 llvm::SmallVector<Expr *, 16> Vars; 9068 Vars.reserve(C->varlist_size()); 9069 for (auto *VE : C->varlists()) { 9070 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9071 if (EVar.isInvalid()) 9072 return nullptr; 9073 Vars.push_back(EVar.get()); 9074 } 9075 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9076 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9077 } 9078 9079 //===----------------------------------------------------------------------===// 9080 // Expression transformation 9081 //===----------------------------------------------------------------------===// 9082 template<typename Derived> 9083 ExprResult 9084 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9085 return TransformExpr(E->getSubExpr()); 9086 } 9087 9088 template<typename Derived> 9089 ExprResult 9090 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9091 if (!E->isTypeDependent()) 9092 return E; 9093 9094 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9095 E->getIdentKind()); 9096 } 9097 9098 template<typename Derived> 9099 ExprResult 9100 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9101 NestedNameSpecifierLoc QualifierLoc; 9102 if (E->getQualifierLoc()) { 9103 QualifierLoc 9104 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9105 if (!QualifierLoc) 9106 return ExprError(); 9107 } 9108 9109 ValueDecl *ND 9110 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9111 E->getDecl())); 9112 if (!ND) 9113 return ExprError(); 9114 9115 DeclarationNameInfo NameInfo = E->getNameInfo(); 9116 if (NameInfo.getName()) { 9117 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9118 if (!NameInfo.getName()) 9119 return ExprError(); 9120 } 9121 9122 if (!getDerived().AlwaysRebuild() && 9123 QualifierLoc == E->getQualifierLoc() && 9124 ND == E->getDecl() && 9125 NameInfo.getName() == E->getDecl()->getDeclName() && 9126 !E->hasExplicitTemplateArgs()) { 9127 9128 // Mark it referenced in the new context regardless. 9129 // FIXME: this is a bit instantiation-specific. 9130 SemaRef.MarkDeclRefReferenced(E); 9131 9132 return E; 9133 } 9134 9135 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9136 if (E->hasExplicitTemplateArgs()) { 9137 TemplateArgs = &TransArgs; 9138 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9139 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9140 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9141 E->getNumTemplateArgs(), 9142 TransArgs)) 9143 return ExprError(); 9144 } 9145 9146 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9147 TemplateArgs); 9148 } 9149 9150 template<typename Derived> 9151 ExprResult 9152 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9153 return E; 9154 } 9155 9156 template <typename Derived> 9157 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9158 FixedPointLiteral *E) { 9159 return E; 9160 } 9161 9162 template<typename Derived> 9163 ExprResult 9164 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9165 return E; 9166 } 9167 9168 template<typename Derived> 9169 ExprResult 9170 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9171 return E; 9172 } 9173 9174 template<typename Derived> 9175 ExprResult 9176 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9177 return E; 9178 } 9179 9180 template<typename Derived> 9181 ExprResult 9182 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9183 return E; 9184 } 9185 9186 template<typename Derived> 9187 ExprResult 9188 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9189 if (FunctionDecl *FD = E->getDirectCallee()) 9190 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9191 return SemaRef.MaybeBindToTemporary(E); 9192 } 9193 9194 template<typename Derived> 9195 ExprResult 9196 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9197 ExprResult ControllingExpr = 9198 getDerived().TransformExpr(E->getControllingExpr()); 9199 if (ControllingExpr.isInvalid()) 9200 return ExprError(); 9201 9202 SmallVector<Expr *, 4> AssocExprs; 9203 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9204 for (const GenericSelectionExpr::Association &Assoc : E->associations()) { 9205 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9206 if (TSI) { 9207 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9208 if (!AssocType) 9209 return ExprError(); 9210 AssocTypes.push_back(AssocType); 9211 } else { 9212 AssocTypes.push_back(nullptr); 9213 } 9214 9215 ExprResult AssocExpr = 9216 getDerived().TransformExpr(Assoc.getAssociationExpr()); 9217 if (AssocExpr.isInvalid()) 9218 return ExprError(); 9219 AssocExprs.push_back(AssocExpr.get()); 9220 } 9221 9222 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9223 E->getDefaultLoc(), 9224 E->getRParenLoc(), 9225 ControllingExpr.get(), 9226 AssocTypes, 9227 AssocExprs); 9228 } 9229 9230 template<typename Derived> 9231 ExprResult 9232 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9233 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9234 if (SubExpr.isInvalid()) 9235 return ExprError(); 9236 9237 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9238 return E; 9239 9240 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9241 E->getRParen()); 9242 } 9243 9244 /// The operand of a unary address-of operator has special rules: it's 9245 /// allowed to refer to a non-static member of a class even if there's no 'this' 9246 /// object available. 9247 template<typename Derived> 9248 ExprResult 9249 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9250 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9251 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9252 else 9253 return getDerived().TransformExpr(E); 9254 } 9255 9256 template<typename Derived> 9257 ExprResult 9258 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9259 ExprResult SubExpr; 9260 if (E->getOpcode() == UO_AddrOf) 9261 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9262 else 9263 SubExpr = TransformExpr(E->getSubExpr()); 9264 if (SubExpr.isInvalid()) 9265 return ExprError(); 9266 9267 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9268 return E; 9269 9270 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9271 E->getOpcode(), 9272 SubExpr.get()); 9273 } 9274 9275 template<typename Derived> 9276 ExprResult 9277 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9278 // Transform the type. 9279 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9280 if (!Type) 9281 return ExprError(); 9282 9283 // Transform all of the components into components similar to what the 9284 // parser uses. 9285 // FIXME: It would be slightly more efficient in the non-dependent case to 9286 // just map FieldDecls, rather than requiring the rebuilder to look for 9287 // the fields again. However, __builtin_offsetof is rare enough in 9288 // template code that we don't care. 9289 bool ExprChanged = false; 9290 typedef Sema::OffsetOfComponent Component; 9291 SmallVector<Component, 4> Components; 9292 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9293 const OffsetOfNode &ON = E->getComponent(I); 9294 Component Comp; 9295 Comp.isBrackets = true; 9296 Comp.LocStart = ON.getSourceRange().getBegin(); 9297 Comp.LocEnd = ON.getSourceRange().getEnd(); 9298 switch (ON.getKind()) { 9299 case OffsetOfNode::Array: { 9300 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9301 ExprResult Index = getDerived().TransformExpr(FromIndex); 9302 if (Index.isInvalid()) 9303 return ExprError(); 9304 9305 ExprChanged = ExprChanged || Index.get() != FromIndex; 9306 Comp.isBrackets = true; 9307 Comp.U.E = Index.get(); 9308 break; 9309 } 9310 9311 case OffsetOfNode::Field: 9312 case OffsetOfNode::Identifier: 9313 Comp.isBrackets = false; 9314 Comp.U.IdentInfo = ON.getFieldName(); 9315 if (!Comp.U.IdentInfo) 9316 continue; 9317 9318 break; 9319 9320 case OffsetOfNode::Base: 9321 // Will be recomputed during the rebuild. 9322 continue; 9323 } 9324 9325 Components.push_back(Comp); 9326 } 9327 9328 // If nothing changed, retain the existing expression. 9329 if (!getDerived().AlwaysRebuild() && 9330 Type == E->getTypeSourceInfo() && 9331 !ExprChanged) 9332 return E; 9333 9334 // Build a new offsetof expression. 9335 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9336 Components, E->getRParenLoc()); 9337 } 9338 9339 template<typename Derived> 9340 ExprResult 9341 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9342 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9343 "opaque value expression requires transformation"); 9344 return E; 9345 } 9346 9347 template<typename Derived> 9348 ExprResult 9349 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9350 return E; 9351 } 9352 9353 template<typename Derived> 9354 ExprResult 9355 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9356 // Rebuild the syntactic form. The original syntactic form has 9357 // opaque-value expressions in it, so strip those away and rebuild 9358 // the result. This is a really awful way of doing this, but the 9359 // better solution (rebuilding the semantic expressions and 9360 // rebinding OVEs as necessary) doesn't work; we'd need 9361 // TreeTransform to not strip away implicit conversions. 9362 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9363 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9364 if (result.isInvalid()) return ExprError(); 9365 9366 // If that gives us a pseudo-object result back, the pseudo-object 9367 // expression must have been an lvalue-to-rvalue conversion which we 9368 // should reapply. 9369 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9370 result = SemaRef.checkPseudoObjectRValue(result.get()); 9371 9372 return result; 9373 } 9374 9375 template<typename Derived> 9376 ExprResult 9377 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9378 UnaryExprOrTypeTraitExpr *E) { 9379 if (E->isArgumentType()) { 9380 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9381 9382 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9383 if (!NewT) 9384 return ExprError(); 9385 9386 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9387 return E; 9388 9389 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9390 E->getKind(), 9391 E->getSourceRange()); 9392 } 9393 9394 // C++0x [expr.sizeof]p1: 9395 // The operand is either an expression, which is an unevaluated operand 9396 // [...] 9397 EnterExpressionEvaluationContext Unevaluated( 9398 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9399 Sema::ReuseLambdaContextDecl); 9400 9401 // Try to recover if we have something like sizeof(T::X) where X is a type. 9402 // Notably, there must be *exactly* one set of parens if X is a type. 9403 TypeSourceInfo *RecoveryTSI = nullptr; 9404 ExprResult SubExpr; 9405 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9406 if (auto *DRE = 9407 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9408 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9409 PE, DRE, false, &RecoveryTSI); 9410 else 9411 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9412 9413 if (RecoveryTSI) { 9414 return getDerived().RebuildUnaryExprOrTypeTrait( 9415 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9416 } else if (SubExpr.isInvalid()) 9417 return ExprError(); 9418 9419 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9420 return E; 9421 9422 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9423 E->getOperatorLoc(), 9424 E->getKind(), 9425 E->getSourceRange()); 9426 } 9427 9428 template<typename Derived> 9429 ExprResult 9430 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9431 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9432 if (LHS.isInvalid()) 9433 return ExprError(); 9434 9435 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9436 if (RHS.isInvalid()) 9437 return ExprError(); 9438 9439 9440 if (!getDerived().AlwaysRebuild() && 9441 LHS.get() == E->getLHS() && 9442 RHS.get() == E->getRHS()) 9443 return E; 9444 9445 return getDerived().RebuildArraySubscriptExpr( 9446 LHS.get(), 9447 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9448 } 9449 9450 template <typename Derived> 9451 ExprResult 9452 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9453 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9454 if (Base.isInvalid()) 9455 return ExprError(); 9456 9457 ExprResult LowerBound; 9458 if (E->getLowerBound()) { 9459 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9460 if (LowerBound.isInvalid()) 9461 return ExprError(); 9462 } 9463 9464 ExprResult Length; 9465 if (E->getLength()) { 9466 Length = getDerived().TransformExpr(E->getLength()); 9467 if (Length.isInvalid()) 9468 return ExprError(); 9469 } 9470 9471 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9472 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9473 return E; 9474 9475 return getDerived().RebuildOMPArraySectionExpr( 9476 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9477 Length.get(), E->getRBracketLoc()); 9478 } 9479 9480 template<typename Derived> 9481 ExprResult 9482 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9483 // Transform the callee. 9484 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9485 if (Callee.isInvalid()) 9486 return ExprError(); 9487 9488 // Transform arguments. 9489 bool ArgChanged = false; 9490 SmallVector<Expr*, 8> Args; 9491 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9492 &ArgChanged)) 9493 return ExprError(); 9494 9495 if (!getDerived().AlwaysRebuild() && 9496 Callee.get() == E->getCallee() && 9497 !ArgChanged) 9498 return SemaRef.MaybeBindToTemporary(E); 9499 9500 // FIXME: Wrong source location information for the '('. 9501 SourceLocation FakeLParenLoc 9502 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9503 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9504 Args, 9505 E->getRParenLoc()); 9506 } 9507 9508 template<typename Derived> 9509 ExprResult 9510 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9511 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9512 if (Base.isInvalid()) 9513 return ExprError(); 9514 9515 NestedNameSpecifierLoc QualifierLoc; 9516 if (E->hasQualifier()) { 9517 QualifierLoc 9518 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9519 9520 if (!QualifierLoc) 9521 return ExprError(); 9522 } 9523 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9524 9525 ValueDecl *Member 9526 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9527 E->getMemberDecl())); 9528 if (!Member) 9529 return ExprError(); 9530 9531 NamedDecl *FoundDecl = E->getFoundDecl(); 9532 if (FoundDecl == E->getMemberDecl()) { 9533 FoundDecl = Member; 9534 } else { 9535 FoundDecl = cast_or_null<NamedDecl>( 9536 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9537 if (!FoundDecl) 9538 return ExprError(); 9539 } 9540 9541 if (!getDerived().AlwaysRebuild() && 9542 Base.get() == E->getBase() && 9543 QualifierLoc == E->getQualifierLoc() && 9544 Member == E->getMemberDecl() && 9545 FoundDecl == E->getFoundDecl() && 9546 !E->hasExplicitTemplateArgs()) { 9547 9548 // Mark it referenced in the new context regardless. 9549 // FIXME: this is a bit instantiation-specific. 9550 SemaRef.MarkMemberReferenced(E); 9551 9552 return E; 9553 } 9554 9555 TemplateArgumentListInfo TransArgs; 9556 if (E->hasExplicitTemplateArgs()) { 9557 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9558 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9559 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9560 E->getNumTemplateArgs(), 9561 TransArgs)) 9562 return ExprError(); 9563 } 9564 9565 // FIXME: Bogus source location for the operator 9566 SourceLocation FakeOperatorLoc = 9567 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9568 9569 // FIXME: to do this check properly, we will need to preserve the 9570 // first-qualifier-in-scope here, just in case we had a dependent 9571 // base (and therefore couldn't do the check) and a 9572 // nested-name-qualifier (and therefore could do the lookup). 9573 NamedDecl *FirstQualifierInScope = nullptr; 9574 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9575 if (MemberNameInfo.getName()) { 9576 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9577 if (!MemberNameInfo.getName()) 9578 return ExprError(); 9579 } 9580 9581 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9582 E->isArrow(), 9583 QualifierLoc, 9584 TemplateKWLoc, 9585 MemberNameInfo, 9586 Member, 9587 FoundDecl, 9588 (E->hasExplicitTemplateArgs() 9589 ? &TransArgs : nullptr), 9590 FirstQualifierInScope); 9591 } 9592 9593 template<typename Derived> 9594 ExprResult 9595 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9596 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9597 if (LHS.isInvalid()) 9598 return ExprError(); 9599 9600 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9601 if (RHS.isInvalid()) 9602 return ExprError(); 9603 9604 if (!getDerived().AlwaysRebuild() && 9605 LHS.get() == E->getLHS() && 9606 RHS.get() == E->getRHS()) 9607 return E; 9608 9609 Sema::FPContractStateRAII FPContractState(getSema()); 9610 getSema().FPFeatures = E->getFPFeatures(); 9611 9612 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9613 LHS.get(), RHS.get()); 9614 } 9615 9616 template<typename Derived> 9617 ExprResult 9618 TreeTransform<Derived>::TransformCompoundAssignOperator( 9619 CompoundAssignOperator *E) { 9620 return getDerived().TransformBinaryOperator(E); 9621 } 9622 9623 template<typename Derived> 9624 ExprResult TreeTransform<Derived>:: 9625 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9626 // Just rebuild the common and RHS expressions and see whether we 9627 // get any changes. 9628 9629 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9630 if (commonExpr.isInvalid()) 9631 return ExprError(); 9632 9633 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9634 if (rhs.isInvalid()) 9635 return ExprError(); 9636 9637 if (!getDerived().AlwaysRebuild() && 9638 commonExpr.get() == e->getCommon() && 9639 rhs.get() == e->getFalseExpr()) 9640 return e; 9641 9642 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9643 e->getQuestionLoc(), 9644 nullptr, 9645 e->getColonLoc(), 9646 rhs.get()); 9647 } 9648 9649 template<typename Derived> 9650 ExprResult 9651 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9652 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9653 if (Cond.isInvalid()) 9654 return ExprError(); 9655 9656 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9657 if (LHS.isInvalid()) 9658 return ExprError(); 9659 9660 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9661 if (RHS.isInvalid()) 9662 return ExprError(); 9663 9664 if (!getDerived().AlwaysRebuild() && 9665 Cond.get() == E->getCond() && 9666 LHS.get() == E->getLHS() && 9667 RHS.get() == E->getRHS()) 9668 return E; 9669 9670 return getDerived().RebuildConditionalOperator(Cond.get(), 9671 E->getQuestionLoc(), 9672 LHS.get(), 9673 E->getColonLoc(), 9674 RHS.get()); 9675 } 9676 9677 template<typename Derived> 9678 ExprResult 9679 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9680 // Implicit casts are eliminated during transformation, since they 9681 // will be recomputed by semantic analysis after transformation. 9682 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9683 } 9684 9685 template<typename Derived> 9686 ExprResult 9687 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9688 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9689 if (!Type) 9690 return ExprError(); 9691 9692 ExprResult SubExpr 9693 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9694 if (SubExpr.isInvalid()) 9695 return ExprError(); 9696 9697 if (!getDerived().AlwaysRebuild() && 9698 Type == E->getTypeInfoAsWritten() && 9699 SubExpr.get() == E->getSubExpr()) 9700 return E; 9701 9702 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9703 Type, 9704 E->getRParenLoc(), 9705 SubExpr.get()); 9706 } 9707 9708 template<typename Derived> 9709 ExprResult 9710 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9711 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9712 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9713 if (!NewT) 9714 return ExprError(); 9715 9716 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9717 if (Init.isInvalid()) 9718 return ExprError(); 9719 9720 if (!getDerived().AlwaysRebuild() && 9721 OldT == NewT && 9722 Init.get() == E->getInitializer()) 9723 return SemaRef.MaybeBindToTemporary(E); 9724 9725 // Note: the expression type doesn't necessarily match the 9726 // type-as-written, but that's okay, because it should always be 9727 // derivable from the initializer. 9728 9729 return getDerived().RebuildCompoundLiteralExpr( 9730 E->getLParenLoc(), NewT, 9731 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 9732 } 9733 9734 template<typename Derived> 9735 ExprResult 9736 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9737 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9738 if (Base.isInvalid()) 9739 return ExprError(); 9740 9741 if (!getDerived().AlwaysRebuild() && 9742 Base.get() == E->getBase()) 9743 return E; 9744 9745 // FIXME: Bad source location 9746 SourceLocation FakeOperatorLoc = 9747 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 9748 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9749 E->getAccessorLoc(), 9750 E->getAccessor()); 9751 } 9752 9753 template<typename Derived> 9754 ExprResult 9755 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9756 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9757 E = Syntactic; 9758 9759 bool InitChanged = false; 9760 9761 EnterExpressionEvaluationContext Context( 9762 getSema(), EnterExpressionEvaluationContext::InitList); 9763 9764 SmallVector<Expr*, 4> Inits; 9765 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9766 Inits, &InitChanged)) 9767 return ExprError(); 9768 9769 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9770 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9771 // in some cases. We can't reuse it in general, because the syntactic and 9772 // semantic forms are linked, and we can't know that semantic form will 9773 // match even if the syntactic form does. 9774 } 9775 9776 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9777 E->getRBraceLoc()); 9778 } 9779 9780 template<typename Derived> 9781 ExprResult 9782 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9783 Designation Desig; 9784 9785 // transform the initializer value 9786 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9787 if (Init.isInvalid()) 9788 return ExprError(); 9789 9790 // transform the designators. 9791 SmallVector<Expr*, 4> ArrayExprs; 9792 bool ExprChanged = false; 9793 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9794 if (D.isFieldDesignator()) { 9795 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9796 D.getDotLoc(), 9797 D.getFieldLoc())); 9798 if (D.getField()) { 9799 FieldDecl *Field = cast_or_null<FieldDecl>( 9800 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9801 if (Field != D.getField()) 9802 // Rebuild the expression when the transformed FieldDecl is 9803 // different to the already assigned FieldDecl. 9804 ExprChanged = true; 9805 } else { 9806 // Ensure that the designator expression is rebuilt when there isn't 9807 // a resolved FieldDecl in the designator as we don't want to assign 9808 // a FieldDecl to a pattern designator that will be instantiated again. 9809 ExprChanged = true; 9810 } 9811 continue; 9812 } 9813 9814 if (D.isArrayDesignator()) { 9815 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9816 if (Index.isInvalid()) 9817 return ExprError(); 9818 9819 Desig.AddDesignator( 9820 Designator::getArray(Index.get(), D.getLBracketLoc())); 9821 9822 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9823 ArrayExprs.push_back(Index.get()); 9824 continue; 9825 } 9826 9827 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9828 ExprResult Start 9829 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9830 if (Start.isInvalid()) 9831 return ExprError(); 9832 9833 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9834 if (End.isInvalid()) 9835 return ExprError(); 9836 9837 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9838 End.get(), 9839 D.getLBracketLoc(), 9840 D.getEllipsisLoc())); 9841 9842 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9843 End.get() != E->getArrayRangeEnd(D); 9844 9845 ArrayExprs.push_back(Start.get()); 9846 ArrayExprs.push_back(End.get()); 9847 } 9848 9849 if (!getDerived().AlwaysRebuild() && 9850 Init.get() == E->getInit() && 9851 !ExprChanged) 9852 return E; 9853 9854 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9855 E->getEqualOrColonLoc(), 9856 E->usesGNUSyntax(), Init.get()); 9857 } 9858 9859 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9860 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9861 template<typename Derived> 9862 ExprResult 9863 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9864 DesignatedInitUpdateExpr *E) { 9865 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9866 "initializer"); 9867 return ExprError(); 9868 } 9869 9870 template<typename Derived> 9871 ExprResult 9872 TreeTransform<Derived>::TransformNoInitExpr( 9873 NoInitExpr *E) { 9874 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9875 return ExprError(); 9876 } 9877 9878 template<typename Derived> 9879 ExprResult 9880 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9881 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9882 return ExprError(); 9883 } 9884 9885 template<typename Derived> 9886 ExprResult 9887 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9888 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9889 return ExprError(); 9890 } 9891 9892 template<typename Derived> 9893 ExprResult 9894 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9895 ImplicitValueInitExpr *E) { 9896 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 9897 9898 // FIXME: Will we ever have proper type location here? Will we actually 9899 // need to transform the type? 9900 QualType T = getDerived().TransformType(E->getType()); 9901 if (T.isNull()) 9902 return ExprError(); 9903 9904 if (!getDerived().AlwaysRebuild() && 9905 T == E->getType()) 9906 return E; 9907 9908 return getDerived().RebuildImplicitValueInitExpr(T); 9909 } 9910 9911 template<typename Derived> 9912 ExprResult 9913 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9914 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9915 if (!TInfo) 9916 return ExprError(); 9917 9918 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9919 if (SubExpr.isInvalid()) 9920 return ExprError(); 9921 9922 if (!getDerived().AlwaysRebuild() && 9923 TInfo == E->getWrittenTypeInfo() && 9924 SubExpr.get() == E->getSubExpr()) 9925 return E; 9926 9927 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9928 TInfo, E->getRParenLoc()); 9929 } 9930 9931 template<typename Derived> 9932 ExprResult 9933 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9934 bool ArgumentChanged = false; 9935 SmallVector<Expr*, 4> Inits; 9936 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9937 &ArgumentChanged)) 9938 return ExprError(); 9939 9940 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9941 Inits, 9942 E->getRParenLoc()); 9943 } 9944 9945 /// Transform an address-of-label expression. 9946 /// 9947 /// By default, the transformation of an address-of-label expression always 9948 /// rebuilds the expression, so that the label identifier can be resolved to 9949 /// the corresponding label statement by semantic analysis. 9950 template<typename Derived> 9951 ExprResult 9952 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9953 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9954 E->getLabel()); 9955 if (!LD) 9956 return ExprError(); 9957 9958 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9959 cast<LabelDecl>(LD)); 9960 } 9961 9962 template<typename Derived> 9963 ExprResult 9964 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9965 SemaRef.ActOnStartStmtExpr(); 9966 StmtResult SubStmt 9967 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9968 if (SubStmt.isInvalid()) { 9969 SemaRef.ActOnStmtExprError(); 9970 return ExprError(); 9971 } 9972 9973 if (!getDerived().AlwaysRebuild() && 9974 SubStmt.get() == E->getSubStmt()) { 9975 // Calling this an 'error' is unintuitive, but it does the right thing. 9976 SemaRef.ActOnStmtExprError(); 9977 return SemaRef.MaybeBindToTemporary(E); 9978 } 9979 9980 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9981 SubStmt.get(), 9982 E->getRParenLoc()); 9983 } 9984 9985 template<typename Derived> 9986 ExprResult 9987 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9988 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9989 if (Cond.isInvalid()) 9990 return ExprError(); 9991 9992 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9993 if (LHS.isInvalid()) 9994 return ExprError(); 9995 9996 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9997 if (RHS.isInvalid()) 9998 return ExprError(); 9999 10000 if (!getDerived().AlwaysRebuild() && 10001 Cond.get() == E->getCond() && 10002 LHS.get() == E->getLHS() && 10003 RHS.get() == E->getRHS()) 10004 return E; 10005 10006 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 10007 Cond.get(), LHS.get(), RHS.get(), 10008 E->getRParenLoc()); 10009 } 10010 10011 template<typename Derived> 10012 ExprResult 10013 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 10014 return E; 10015 } 10016 10017 template<typename Derived> 10018 ExprResult 10019 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 10020 switch (E->getOperator()) { 10021 case OO_New: 10022 case OO_Delete: 10023 case OO_Array_New: 10024 case OO_Array_Delete: 10025 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 10026 10027 case OO_Call: { 10028 // This is a call to an object's operator(). 10029 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 10030 10031 // Transform the object itself. 10032 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 10033 if (Object.isInvalid()) 10034 return ExprError(); 10035 10036 // FIXME: Poor location information 10037 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 10038 static_cast<Expr *>(Object.get())->getEndLoc()); 10039 10040 // Transform the call arguments. 10041 SmallVector<Expr*, 8> Args; 10042 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 10043 Args)) 10044 return ExprError(); 10045 10046 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 10047 E->getEndLoc()); 10048 } 10049 10050 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 10051 case OO_##Name: 10052 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 10053 #include "clang/Basic/OperatorKinds.def" 10054 case OO_Subscript: 10055 // Handled below. 10056 break; 10057 10058 case OO_Conditional: 10059 llvm_unreachable("conditional operator is not actually overloadable"); 10060 10061 case OO_None: 10062 case NUM_OVERLOADED_OPERATORS: 10063 llvm_unreachable("not an overloaded operator?"); 10064 } 10065 10066 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10067 if (Callee.isInvalid()) 10068 return ExprError(); 10069 10070 ExprResult First; 10071 if (E->getOperator() == OO_Amp) 10072 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 10073 else 10074 First = getDerived().TransformExpr(E->getArg(0)); 10075 if (First.isInvalid()) 10076 return ExprError(); 10077 10078 ExprResult Second; 10079 if (E->getNumArgs() == 2) { 10080 Second = getDerived().TransformExpr(E->getArg(1)); 10081 if (Second.isInvalid()) 10082 return ExprError(); 10083 } 10084 10085 if (!getDerived().AlwaysRebuild() && 10086 Callee.get() == E->getCallee() && 10087 First.get() == E->getArg(0) && 10088 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 10089 return SemaRef.MaybeBindToTemporary(E); 10090 10091 Sema::FPContractStateRAII FPContractState(getSema()); 10092 getSema().FPFeatures = E->getFPFeatures(); 10093 10094 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 10095 E->getOperatorLoc(), 10096 Callee.get(), 10097 First.get(), 10098 Second.get()); 10099 } 10100 10101 template<typename Derived> 10102 ExprResult 10103 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 10104 return getDerived().TransformCallExpr(E); 10105 } 10106 10107 template<typename Derived> 10108 ExprResult 10109 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 10110 // Transform the callee. 10111 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10112 if (Callee.isInvalid()) 10113 return ExprError(); 10114 10115 // Transform exec config. 10116 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 10117 if (EC.isInvalid()) 10118 return ExprError(); 10119 10120 // Transform arguments. 10121 bool ArgChanged = false; 10122 SmallVector<Expr*, 8> Args; 10123 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10124 &ArgChanged)) 10125 return ExprError(); 10126 10127 if (!getDerived().AlwaysRebuild() && 10128 Callee.get() == E->getCallee() && 10129 !ArgChanged) 10130 return SemaRef.MaybeBindToTemporary(E); 10131 10132 // FIXME: Wrong source location information for the '('. 10133 SourceLocation FakeLParenLoc 10134 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10135 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10136 Args, 10137 E->getRParenLoc(), EC.get()); 10138 } 10139 10140 template<typename Derived> 10141 ExprResult 10142 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 10143 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10144 if (!Type) 10145 return ExprError(); 10146 10147 ExprResult SubExpr 10148 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10149 if (SubExpr.isInvalid()) 10150 return ExprError(); 10151 10152 if (!getDerived().AlwaysRebuild() && 10153 Type == E->getTypeInfoAsWritten() && 10154 SubExpr.get() == E->getSubExpr()) 10155 return E; 10156 return getDerived().RebuildCXXNamedCastExpr( 10157 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 10158 Type, E->getAngleBrackets().getEnd(), 10159 // FIXME. this should be '(' location 10160 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10161 } 10162 10163 template<typename Derived> 10164 ExprResult 10165 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10166 return getDerived().TransformCXXNamedCastExpr(E); 10167 } 10168 10169 template<typename Derived> 10170 ExprResult 10171 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10172 return getDerived().TransformCXXNamedCastExpr(E); 10173 } 10174 10175 template<typename Derived> 10176 ExprResult 10177 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10178 CXXReinterpretCastExpr *E) { 10179 return getDerived().TransformCXXNamedCastExpr(E); 10180 } 10181 10182 template<typename Derived> 10183 ExprResult 10184 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10185 return getDerived().TransformCXXNamedCastExpr(E); 10186 } 10187 10188 template<typename Derived> 10189 ExprResult 10190 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10191 CXXFunctionalCastExpr *E) { 10192 TypeSourceInfo *Type = 10193 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10194 if (!Type) 10195 return ExprError(); 10196 10197 ExprResult SubExpr 10198 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10199 if (SubExpr.isInvalid()) 10200 return ExprError(); 10201 10202 if (!getDerived().AlwaysRebuild() && 10203 Type == E->getTypeInfoAsWritten() && 10204 SubExpr.get() == E->getSubExpr()) 10205 return E; 10206 10207 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10208 E->getLParenLoc(), 10209 SubExpr.get(), 10210 E->getRParenLoc(), 10211 E->isListInitialization()); 10212 } 10213 10214 template<typename Derived> 10215 ExprResult 10216 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10217 if (E->isTypeOperand()) { 10218 TypeSourceInfo *TInfo 10219 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10220 if (!TInfo) 10221 return ExprError(); 10222 10223 if (!getDerived().AlwaysRebuild() && 10224 TInfo == E->getTypeOperandSourceInfo()) 10225 return E; 10226 10227 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10228 TInfo, E->getEndLoc()); 10229 } 10230 10231 // We don't know whether the subexpression is potentially evaluated until 10232 // after we perform semantic analysis. We speculatively assume it is 10233 // unevaluated; it will get fixed later if the subexpression is in fact 10234 // potentially evaluated. 10235 EnterExpressionEvaluationContext Unevaluated( 10236 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10237 Sema::ReuseLambdaContextDecl); 10238 10239 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10240 if (SubExpr.isInvalid()) 10241 return ExprError(); 10242 10243 if (!getDerived().AlwaysRebuild() && 10244 SubExpr.get() == E->getExprOperand()) 10245 return E; 10246 10247 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10248 SubExpr.get(), E->getEndLoc()); 10249 } 10250 10251 template<typename Derived> 10252 ExprResult 10253 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10254 if (E->isTypeOperand()) { 10255 TypeSourceInfo *TInfo 10256 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10257 if (!TInfo) 10258 return ExprError(); 10259 10260 if (!getDerived().AlwaysRebuild() && 10261 TInfo == E->getTypeOperandSourceInfo()) 10262 return E; 10263 10264 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10265 TInfo, E->getEndLoc()); 10266 } 10267 10268 EnterExpressionEvaluationContext Unevaluated( 10269 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10270 10271 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10272 if (SubExpr.isInvalid()) 10273 return ExprError(); 10274 10275 if (!getDerived().AlwaysRebuild() && 10276 SubExpr.get() == E->getExprOperand()) 10277 return E; 10278 10279 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10280 SubExpr.get(), E->getEndLoc()); 10281 } 10282 10283 template<typename Derived> 10284 ExprResult 10285 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10286 return E; 10287 } 10288 10289 template<typename Derived> 10290 ExprResult 10291 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10292 CXXNullPtrLiteralExpr *E) { 10293 return E; 10294 } 10295 10296 template<typename Derived> 10297 ExprResult 10298 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10299 QualType T = getSema().getCurrentThisType(); 10300 10301 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10302 // Make sure that we capture 'this'. 10303 getSema().CheckCXXThisCapture(E->getBeginLoc()); 10304 return E; 10305 } 10306 10307 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10308 } 10309 10310 template<typename Derived> 10311 ExprResult 10312 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10313 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10314 if (SubExpr.isInvalid()) 10315 return ExprError(); 10316 10317 if (!getDerived().AlwaysRebuild() && 10318 SubExpr.get() == E->getSubExpr()) 10319 return E; 10320 10321 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10322 E->isThrownVariableInScope()); 10323 } 10324 10325 template<typename Derived> 10326 ExprResult 10327 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10328 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10329 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10330 if (!Param) 10331 return ExprError(); 10332 10333 if (!getDerived().AlwaysRebuild() && 10334 Param == E->getParam()) 10335 return E; 10336 10337 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10338 } 10339 10340 template<typename Derived> 10341 ExprResult 10342 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10343 FieldDecl *Field = cast_or_null<FieldDecl>( 10344 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10345 if (!Field) 10346 return ExprError(); 10347 10348 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10349 return E; 10350 10351 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10352 } 10353 10354 template<typename Derived> 10355 ExprResult 10356 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10357 CXXScalarValueInitExpr *E) { 10358 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10359 if (!T) 10360 return ExprError(); 10361 10362 if (!getDerived().AlwaysRebuild() && 10363 T == E->getTypeSourceInfo()) 10364 return E; 10365 10366 return getDerived().RebuildCXXScalarValueInitExpr(T, 10367 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10368 E->getRParenLoc()); 10369 } 10370 10371 template<typename Derived> 10372 ExprResult 10373 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10374 // Transform the type that we're allocating 10375 TypeSourceInfo *AllocTypeInfo = 10376 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10377 if (!AllocTypeInfo) 10378 return ExprError(); 10379 10380 // Transform the size of the array we're allocating (if any). 10381 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10382 if (ArraySize.isInvalid()) 10383 return ExprError(); 10384 10385 // Transform the placement arguments (if any). 10386 bool ArgumentChanged = false; 10387 SmallVector<Expr*, 8> PlacementArgs; 10388 if (getDerived().TransformExprs(E->getPlacementArgs(), 10389 E->getNumPlacementArgs(), true, 10390 PlacementArgs, &ArgumentChanged)) 10391 return ExprError(); 10392 10393 // Transform the initializer (if any). 10394 Expr *OldInit = E->getInitializer(); 10395 ExprResult NewInit; 10396 if (OldInit) 10397 NewInit = getDerived().TransformInitializer(OldInit, true); 10398 if (NewInit.isInvalid()) 10399 return ExprError(); 10400 10401 // Transform new operator and delete operator. 10402 FunctionDecl *OperatorNew = nullptr; 10403 if (E->getOperatorNew()) { 10404 OperatorNew = cast_or_null<FunctionDecl>( 10405 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10406 if (!OperatorNew) 10407 return ExprError(); 10408 } 10409 10410 FunctionDecl *OperatorDelete = nullptr; 10411 if (E->getOperatorDelete()) { 10412 OperatorDelete = cast_or_null<FunctionDecl>( 10413 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10414 if (!OperatorDelete) 10415 return ExprError(); 10416 } 10417 10418 if (!getDerived().AlwaysRebuild() && 10419 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10420 ArraySize.get() == E->getArraySize() && 10421 NewInit.get() == OldInit && 10422 OperatorNew == E->getOperatorNew() && 10423 OperatorDelete == E->getOperatorDelete() && 10424 !ArgumentChanged) { 10425 // Mark any declarations we need as referenced. 10426 // FIXME: instantiation-specific. 10427 if (OperatorNew) 10428 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10429 if (OperatorDelete) 10430 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10431 10432 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10433 QualType ElementType 10434 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10435 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10436 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10437 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10438 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10439 } 10440 } 10441 } 10442 10443 return E; 10444 } 10445 10446 QualType AllocType = AllocTypeInfo->getType(); 10447 if (!ArraySize.get()) { 10448 // If no array size was specified, but the new expression was 10449 // instantiated with an array type (e.g., "new T" where T is 10450 // instantiated with "int[4]"), extract the outer bound from the 10451 // array type as our array size. We do this with constant and 10452 // dependently-sized array types. 10453 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10454 if (!ArrayT) { 10455 // Do nothing 10456 } else if (const ConstantArrayType *ConsArrayT 10457 = dyn_cast<ConstantArrayType>(ArrayT)) { 10458 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10459 SemaRef.Context.getSizeType(), 10460 /*FIXME:*/ E->getBeginLoc()); 10461 AllocType = ConsArrayT->getElementType(); 10462 } else if (const DependentSizedArrayType *DepArrayT 10463 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10464 if (DepArrayT->getSizeExpr()) { 10465 ArraySize = DepArrayT->getSizeExpr(); 10466 AllocType = DepArrayT->getElementType(); 10467 } 10468 } 10469 } 10470 10471 return getDerived().RebuildCXXNewExpr( 10472 E->getBeginLoc(), E->isGlobalNew(), 10473 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10474 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10475 AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get()); 10476 } 10477 10478 template<typename Derived> 10479 ExprResult 10480 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10481 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10482 if (Operand.isInvalid()) 10483 return ExprError(); 10484 10485 // Transform the delete operator, if known. 10486 FunctionDecl *OperatorDelete = nullptr; 10487 if (E->getOperatorDelete()) { 10488 OperatorDelete = cast_or_null<FunctionDecl>( 10489 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10490 if (!OperatorDelete) 10491 return ExprError(); 10492 } 10493 10494 if (!getDerived().AlwaysRebuild() && 10495 Operand.get() == E->getArgument() && 10496 OperatorDelete == E->getOperatorDelete()) { 10497 // Mark any declarations we need as referenced. 10498 // FIXME: instantiation-specific. 10499 if (OperatorDelete) 10500 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10501 10502 if (!E->getArgument()->isTypeDependent()) { 10503 QualType Destroyed = SemaRef.Context.getBaseElementType( 10504 E->getDestroyedType()); 10505 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10506 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10507 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10508 SemaRef.LookupDestructor(Record)); 10509 } 10510 } 10511 10512 return E; 10513 } 10514 10515 return getDerived().RebuildCXXDeleteExpr( 10516 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10517 } 10518 10519 template<typename Derived> 10520 ExprResult 10521 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10522 CXXPseudoDestructorExpr *E) { 10523 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10524 if (Base.isInvalid()) 10525 return ExprError(); 10526 10527 ParsedType ObjectTypePtr; 10528 bool MayBePseudoDestructor = false; 10529 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10530 E->getOperatorLoc(), 10531 E->isArrow()? tok::arrow : tok::period, 10532 ObjectTypePtr, 10533 MayBePseudoDestructor); 10534 if (Base.isInvalid()) 10535 return ExprError(); 10536 10537 QualType ObjectType = ObjectTypePtr.get(); 10538 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10539 if (QualifierLoc) { 10540 QualifierLoc 10541 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10542 if (!QualifierLoc) 10543 return ExprError(); 10544 } 10545 CXXScopeSpec SS; 10546 SS.Adopt(QualifierLoc); 10547 10548 PseudoDestructorTypeStorage Destroyed; 10549 if (E->getDestroyedTypeInfo()) { 10550 TypeSourceInfo *DestroyedTypeInfo 10551 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10552 ObjectType, nullptr, SS); 10553 if (!DestroyedTypeInfo) 10554 return ExprError(); 10555 Destroyed = DestroyedTypeInfo; 10556 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10557 // We aren't likely to be able to resolve the identifier down to a type 10558 // now anyway, so just retain the identifier. 10559 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10560 E->getDestroyedTypeLoc()); 10561 } else { 10562 // Look for a destructor known with the given name. 10563 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10564 *E->getDestroyedTypeIdentifier(), 10565 E->getDestroyedTypeLoc(), 10566 /*Scope=*/nullptr, 10567 SS, ObjectTypePtr, 10568 false); 10569 if (!T) 10570 return ExprError(); 10571 10572 Destroyed 10573 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10574 E->getDestroyedTypeLoc()); 10575 } 10576 10577 TypeSourceInfo *ScopeTypeInfo = nullptr; 10578 if (E->getScopeTypeInfo()) { 10579 CXXScopeSpec EmptySS; 10580 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10581 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10582 if (!ScopeTypeInfo) 10583 return ExprError(); 10584 } 10585 10586 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10587 E->getOperatorLoc(), 10588 E->isArrow(), 10589 SS, 10590 ScopeTypeInfo, 10591 E->getColonColonLoc(), 10592 E->getTildeLoc(), 10593 Destroyed); 10594 } 10595 10596 template <typename Derived> 10597 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10598 bool RequiresADL, 10599 LookupResult &R) { 10600 // Transform all the decls. 10601 bool AllEmptyPacks = true; 10602 for (auto *OldD : Old->decls()) { 10603 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10604 if (!InstD) { 10605 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10606 // This can happen because of dependent hiding. 10607 if (isa<UsingShadowDecl>(OldD)) 10608 continue; 10609 else { 10610 R.clear(); 10611 return true; 10612 } 10613 } 10614 10615 // Expand using pack declarations. 10616 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10617 ArrayRef<NamedDecl*> Decls = SingleDecl; 10618 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10619 Decls = UPD->expansions(); 10620 10621 // Expand using declarations. 10622 for (auto *D : Decls) { 10623 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10624 for (auto *SD : UD->shadows()) 10625 R.addDecl(SD); 10626 } else { 10627 R.addDecl(D); 10628 } 10629 } 10630 10631 AllEmptyPacks &= Decls.empty(); 10632 }; 10633 10634 // C++ [temp.res]/8.4.2: 10635 // The program is ill-formed, no diagnostic required, if [...] lookup for 10636 // a name in the template definition found a using-declaration, but the 10637 // lookup in the corresponding scope in the instantiation odoes not find 10638 // any declarations because the using-declaration was a pack expansion and 10639 // the corresponding pack is empty 10640 if (AllEmptyPacks && !RequiresADL) { 10641 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10642 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10643 return true; 10644 } 10645 10646 // Resolve a kind, but don't do any further analysis. If it's 10647 // ambiguous, the callee needs to deal with it. 10648 R.resolveKind(); 10649 return false; 10650 } 10651 10652 template<typename Derived> 10653 ExprResult 10654 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10655 UnresolvedLookupExpr *Old) { 10656 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10657 Sema::LookupOrdinaryName); 10658 10659 // Transform the declaration set. 10660 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10661 return ExprError(); 10662 10663 // Rebuild the nested-name qualifier, if present. 10664 CXXScopeSpec SS; 10665 if (Old->getQualifierLoc()) { 10666 NestedNameSpecifierLoc QualifierLoc 10667 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10668 if (!QualifierLoc) 10669 return ExprError(); 10670 10671 SS.Adopt(QualifierLoc); 10672 } 10673 10674 if (Old->getNamingClass()) { 10675 CXXRecordDecl *NamingClass 10676 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10677 Old->getNameLoc(), 10678 Old->getNamingClass())); 10679 if (!NamingClass) { 10680 R.clear(); 10681 return ExprError(); 10682 } 10683 10684 R.setNamingClass(NamingClass); 10685 } 10686 10687 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10688 10689 // If we have neither explicit template arguments, nor the template keyword, 10690 // it's a normal declaration name or member reference. 10691 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10692 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10693 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10694 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10695 // give a good diagnostic. 10696 if (D && D->isCXXInstanceMember()) { 10697 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10698 /*TemplateArgs=*/nullptr, 10699 /*Scope=*/nullptr); 10700 } 10701 10702 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10703 } 10704 10705 // If we have template arguments, rebuild them, then rebuild the 10706 // templateid expression. 10707 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10708 if (Old->hasExplicitTemplateArgs() && 10709 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10710 Old->getNumTemplateArgs(), 10711 TransArgs)) { 10712 R.clear(); 10713 return ExprError(); 10714 } 10715 10716 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10717 Old->requiresADL(), &TransArgs); 10718 } 10719 10720 template<typename Derived> 10721 ExprResult 10722 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10723 bool ArgChanged = false; 10724 SmallVector<TypeSourceInfo *, 4> Args; 10725 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10726 TypeSourceInfo *From = E->getArg(I); 10727 TypeLoc FromTL = From->getTypeLoc(); 10728 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10729 TypeLocBuilder TLB; 10730 TLB.reserve(FromTL.getFullDataSize()); 10731 QualType To = getDerived().TransformType(TLB, FromTL); 10732 if (To.isNull()) 10733 return ExprError(); 10734 10735 if (To == From->getType()) 10736 Args.push_back(From); 10737 else { 10738 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10739 ArgChanged = true; 10740 } 10741 continue; 10742 } 10743 10744 ArgChanged = true; 10745 10746 // We have a pack expansion. Instantiate it. 10747 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10748 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10749 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10750 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10751 10752 // Determine whether the set of unexpanded parameter packs can and should 10753 // be expanded. 10754 bool Expand = true; 10755 bool RetainExpansion = false; 10756 Optional<unsigned> OrigNumExpansions = 10757 ExpansionTL.getTypePtr()->getNumExpansions(); 10758 Optional<unsigned> NumExpansions = OrigNumExpansions; 10759 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10760 PatternTL.getSourceRange(), 10761 Unexpanded, 10762 Expand, RetainExpansion, 10763 NumExpansions)) 10764 return ExprError(); 10765 10766 if (!Expand) { 10767 // The transform has determined that we should perform a simple 10768 // transformation on the pack expansion, producing another pack 10769 // expansion. 10770 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10771 10772 TypeLocBuilder TLB; 10773 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10774 10775 QualType To = getDerived().TransformType(TLB, PatternTL); 10776 if (To.isNull()) 10777 return ExprError(); 10778 10779 To = getDerived().RebuildPackExpansionType(To, 10780 PatternTL.getSourceRange(), 10781 ExpansionTL.getEllipsisLoc(), 10782 NumExpansions); 10783 if (To.isNull()) 10784 return ExprError(); 10785 10786 PackExpansionTypeLoc ToExpansionTL 10787 = TLB.push<PackExpansionTypeLoc>(To); 10788 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10789 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10790 continue; 10791 } 10792 10793 // Expand the pack expansion by substituting for each argument in the 10794 // pack(s). 10795 for (unsigned I = 0; I != *NumExpansions; ++I) { 10796 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10797 TypeLocBuilder TLB; 10798 TLB.reserve(PatternTL.getFullDataSize()); 10799 QualType To = getDerived().TransformType(TLB, PatternTL); 10800 if (To.isNull()) 10801 return ExprError(); 10802 10803 if (To->containsUnexpandedParameterPack()) { 10804 To = getDerived().RebuildPackExpansionType(To, 10805 PatternTL.getSourceRange(), 10806 ExpansionTL.getEllipsisLoc(), 10807 NumExpansions); 10808 if (To.isNull()) 10809 return ExprError(); 10810 10811 PackExpansionTypeLoc ToExpansionTL 10812 = TLB.push<PackExpansionTypeLoc>(To); 10813 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10814 } 10815 10816 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10817 } 10818 10819 if (!RetainExpansion) 10820 continue; 10821 10822 // If we're supposed to retain a pack expansion, do so by temporarily 10823 // forgetting the partially-substituted parameter pack. 10824 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10825 10826 TypeLocBuilder TLB; 10827 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10828 10829 QualType To = getDerived().TransformType(TLB, PatternTL); 10830 if (To.isNull()) 10831 return ExprError(); 10832 10833 To = getDerived().RebuildPackExpansionType(To, 10834 PatternTL.getSourceRange(), 10835 ExpansionTL.getEllipsisLoc(), 10836 NumExpansions); 10837 if (To.isNull()) 10838 return ExprError(); 10839 10840 PackExpansionTypeLoc ToExpansionTL 10841 = TLB.push<PackExpansionTypeLoc>(To); 10842 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10843 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10844 } 10845 10846 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10847 return E; 10848 10849 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 10850 E->getEndLoc()); 10851 } 10852 10853 template<typename Derived> 10854 ExprResult 10855 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10856 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10857 if (!T) 10858 return ExprError(); 10859 10860 if (!getDerived().AlwaysRebuild() && 10861 T == E->getQueriedTypeSourceInfo()) 10862 return E; 10863 10864 ExprResult SubExpr; 10865 { 10866 EnterExpressionEvaluationContext Unevaluated( 10867 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10868 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10869 if (SubExpr.isInvalid()) 10870 return ExprError(); 10871 10872 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10873 return E; 10874 } 10875 10876 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 10877 SubExpr.get(), E->getEndLoc()); 10878 } 10879 10880 template<typename Derived> 10881 ExprResult 10882 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10883 ExprResult SubExpr; 10884 { 10885 EnterExpressionEvaluationContext Unevaluated( 10886 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10887 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10888 if (SubExpr.isInvalid()) 10889 return ExprError(); 10890 10891 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10892 return E; 10893 } 10894 10895 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 10896 SubExpr.get(), E->getEndLoc()); 10897 } 10898 10899 template <typename Derived> 10900 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10901 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10902 TypeSourceInfo **RecoveryTSI) { 10903 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10904 DRE, AddrTaken, RecoveryTSI); 10905 10906 // Propagate both errors and recovered types, which return ExprEmpty. 10907 if (!NewDRE.isUsable()) 10908 return NewDRE; 10909 10910 // We got an expr, wrap it up in parens. 10911 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10912 return PE; 10913 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10914 PE->getRParen()); 10915 } 10916 10917 template <typename Derived> 10918 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10919 DependentScopeDeclRefExpr *E) { 10920 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10921 nullptr); 10922 } 10923 10924 template<typename Derived> 10925 ExprResult 10926 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10927 DependentScopeDeclRefExpr *E, 10928 bool IsAddressOfOperand, 10929 TypeSourceInfo **RecoveryTSI) { 10930 assert(E->getQualifierLoc()); 10931 NestedNameSpecifierLoc QualifierLoc 10932 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10933 if (!QualifierLoc) 10934 return ExprError(); 10935 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10936 10937 // TODO: If this is a conversion-function-id, verify that the 10938 // destination type name (if present) resolves the same way after 10939 // instantiation as it did in the local scope. 10940 10941 DeclarationNameInfo NameInfo 10942 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10943 if (!NameInfo.getName()) 10944 return ExprError(); 10945 10946 if (!E->hasExplicitTemplateArgs()) { 10947 if (!getDerived().AlwaysRebuild() && 10948 QualifierLoc == E->getQualifierLoc() && 10949 // Note: it is sufficient to compare the Name component of NameInfo: 10950 // if name has not changed, DNLoc has not changed either. 10951 NameInfo.getName() == E->getDeclName()) 10952 return E; 10953 10954 return getDerived().RebuildDependentScopeDeclRefExpr( 10955 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10956 IsAddressOfOperand, RecoveryTSI); 10957 } 10958 10959 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10960 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10961 E->getNumTemplateArgs(), 10962 TransArgs)) 10963 return ExprError(); 10964 10965 return getDerived().RebuildDependentScopeDeclRefExpr( 10966 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10967 RecoveryTSI); 10968 } 10969 10970 template<typename Derived> 10971 ExprResult 10972 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10973 // CXXConstructExprs other than for list-initialization and 10974 // CXXTemporaryObjectExpr are always implicit, so when we have 10975 // a 1-argument construction we just transform that argument. 10976 if ((E->getNumArgs() == 1 || 10977 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10978 (!getDerived().DropCallArgument(E->getArg(0))) && 10979 !E->isListInitialization()) 10980 return getDerived().TransformExpr(E->getArg(0)); 10981 10982 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 10983 10984 QualType T = getDerived().TransformType(E->getType()); 10985 if (T.isNull()) 10986 return ExprError(); 10987 10988 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10989 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10990 if (!Constructor) 10991 return ExprError(); 10992 10993 bool ArgumentChanged = false; 10994 SmallVector<Expr*, 8> Args; 10995 { 10996 EnterExpressionEvaluationContext Context( 10997 getSema(), EnterExpressionEvaluationContext::InitList, 10998 E->isListInitialization()); 10999 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11000 &ArgumentChanged)) 11001 return ExprError(); 11002 } 11003 11004 if (!getDerived().AlwaysRebuild() && 11005 T == E->getType() && 11006 Constructor == E->getConstructor() && 11007 !ArgumentChanged) { 11008 // Mark the constructor as referenced. 11009 // FIXME: Instantiation-specific 11010 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11011 return E; 11012 } 11013 11014 return getDerived().RebuildCXXConstructExpr( 11015 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 11016 E->hadMultipleCandidates(), E->isListInitialization(), 11017 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 11018 E->getConstructionKind(), E->getParenOrBraceRange()); 11019 } 11020 11021 template<typename Derived> 11022 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 11023 CXXInheritedCtorInitExpr *E) { 11024 QualType T = getDerived().TransformType(E->getType()); 11025 if (T.isNull()) 11026 return ExprError(); 11027 11028 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11029 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11030 if (!Constructor) 11031 return ExprError(); 11032 11033 if (!getDerived().AlwaysRebuild() && 11034 T == E->getType() && 11035 Constructor == E->getConstructor()) { 11036 // Mark the constructor as referenced. 11037 // FIXME: Instantiation-specific 11038 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11039 return E; 11040 } 11041 11042 return getDerived().RebuildCXXInheritedCtorInitExpr( 11043 T, E->getLocation(), Constructor, 11044 E->constructsVBase(), E->inheritedFromVBase()); 11045 } 11046 11047 /// Transform a C++ temporary-binding expression. 11048 /// 11049 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 11050 /// transform the subexpression and return that. 11051 template<typename Derived> 11052 ExprResult 11053 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 11054 return getDerived().TransformExpr(E->getSubExpr()); 11055 } 11056 11057 /// Transform a C++ expression that contains cleanups that should 11058 /// be run after the expression is evaluated. 11059 /// 11060 /// Since ExprWithCleanups nodes are implicitly generated, we 11061 /// just transform the subexpression and return that. 11062 template<typename Derived> 11063 ExprResult 11064 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 11065 return getDerived().TransformExpr(E->getSubExpr()); 11066 } 11067 11068 template<typename Derived> 11069 ExprResult 11070 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 11071 CXXTemporaryObjectExpr *E) { 11072 TypeSourceInfo *T = 11073 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11074 if (!T) 11075 return ExprError(); 11076 11077 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11078 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11079 if (!Constructor) 11080 return ExprError(); 11081 11082 bool ArgumentChanged = false; 11083 SmallVector<Expr*, 8> Args; 11084 Args.reserve(E->getNumArgs()); 11085 { 11086 EnterExpressionEvaluationContext Context( 11087 getSema(), EnterExpressionEvaluationContext::InitList, 11088 E->isListInitialization()); 11089 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11090 &ArgumentChanged)) 11091 return ExprError(); 11092 } 11093 11094 if (!getDerived().AlwaysRebuild() && 11095 T == E->getTypeSourceInfo() && 11096 Constructor == E->getConstructor() && 11097 !ArgumentChanged) { 11098 // FIXME: Instantiation-specific 11099 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11100 return SemaRef.MaybeBindToTemporary(E); 11101 } 11102 11103 // FIXME: We should just pass E->isListInitialization(), but we're not 11104 // prepared to handle list-initialization without a child InitListExpr. 11105 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 11106 return getDerived().RebuildCXXTemporaryObjectExpr( 11107 T, LParenLoc, Args, E->getEndLoc(), 11108 /*ListInitialization=*/LParenLoc.isInvalid()); 11109 } 11110 11111 template<typename Derived> 11112 ExprResult 11113 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 11114 // Transform any init-capture expressions before entering the scope of the 11115 // lambda body, because they are not semantically within that scope. 11116 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 11117 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 11118 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 11119 E->explicit_capture_begin()); 11120 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11121 CEnd = E->capture_end(); 11122 C != CEnd; ++C) { 11123 if (!E->isInitCapture(C)) 11124 continue; 11125 EnterExpressionEvaluationContext EEEC( 11126 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11127 ExprResult NewExprInitResult = getDerived().TransformInitializer( 11128 C->getCapturedVar()->getInit(), 11129 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 11130 11131 if (NewExprInitResult.isInvalid()) 11132 return ExprError(); 11133 Expr *NewExprInit = NewExprInitResult.get(); 11134 11135 VarDecl *OldVD = C->getCapturedVar(); 11136 QualType NewInitCaptureType = 11137 getSema().buildLambdaInitCaptureInitialization( 11138 C->getLocation(), OldVD->getType()->isReferenceType(), 11139 OldVD->getIdentifier(), 11140 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 11141 NewExprInitResult = NewExprInit; 11142 InitCaptureExprsAndTypes[C - E->capture_begin()] = 11143 std::make_pair(NewExprInitResult, NewInitCaptureType); 11144 } 11145 11146 // Transform the template parameters, and add them to the current 11147 // instantiation scope. The null case is handled correctly. 11148 auto TPL = getDerived().TransformTemplateParameterList( 11149 E->getTemplateParameterList()); 11150 11151 // Transform the type of the original lambda's call operator. 11152 // The transformation MUST be done in the CurrentInstantiationScope since 11153 // it introduces a mapping of the original to the newly created 11154 // transformed parameters. 11155 TypeSourceInfo *NewCallOpTSI = nullptr; 11156 { 11157 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 11158 FunctionProtoTypeLoc OldCallOpFPTL = 11159 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 11160 11161 TypeLocBuilder NewCallOpTLBuilder; 11162 SmallVector<QualType, 4> ExceptionStorage; 11163 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 11164 QualType NewCallOpType = TransformFunctionProtoType( 11165 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 11166 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 11167 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 11168 ExceptionStorage, Changed); 11169 }); 11170 if (NewCallOpType.isNull()) 11171 return ExprError(); 11172 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 11173 NewCallOpType); 11174 } 11175 11176 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 11177 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 11178 LSI->GLTemplateParameterList = TPL; 11179 11180 // Create the local class that will describe the lambda. 11181 CXXRecordDecl *Class 11182 = getSema().createLambdaClosureType(E->getIntroducerRange(), 11183 NewCallOpTSI, 11184 /*KnownDependent=*/false, 11185 E->getCaptureDefault()); 11186 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 11187 11188 // Build the call operator. 11189 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 11190 Class, E->getIntroducerRange(), NewCallOpTSI, 11191 E->getCallOperator()->getEndLoc(), 11192 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 11193 E->getCallOperator()->isConstexpr()); 11194 11195 LSI->CallOperator = NewCallOperator; 11196 11197 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 11198 I != NumParams; ++I) { 11199 auto *P = NewCallOperator->getParamDecl(I); 11200 if (P->hasUninstantiatedDefaultArg()) { 11201 EnterExpressionEvaluationContext Eval( 11202 getSema(), 11203 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 11204 ExprResult R = getDerived().TransformExpr( 11205 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 11206 P->setDefaultArg(R.get()); 11207 } 11208 } 11209 11210 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 11211 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 11212 11213 // Introduce the context of the call operator. 11214 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 11215 /*NewThisContext*/false); 11216 11217 // Enter the scope of the lambda. 11218 getSema().buildLambdaScope(LSI, NewCallOperator, 11219 E->getIntroducerRange(), 11220 E->getCaptureDefault(), 11221 E->getCaptureDefaultLoc(), 11222 E->hasExplicitParameters(), 11223 E->hasExplicitResultType(), 11224 E->isMutable()); 11225 11226 bool Invalid = false; 11227 11228 // Transform captures. 11229 bool FinishedExplicitCaptures = false; 11230 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11231 CEnd = E->capture_end(); 11232 C != CEnd; ++C) { 11233 // When we hit the first implicit capture, tell Sema that we've finished 11234 // the list of explicit captures. 11235 if (!FinishedExplicitCaptures && C->isImplicit()) { 11236 getSema().finishLambdaExplicitCaptures(LSI); 11237 FinishedExplicitCaptures = true; 11238 } 11239 11240 // Capturing 'this' is trivial. 11241 if (C->capturesThis()) { 11242 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11243 /*BuildAndDiagnose*/ true, nullptr, 11244 C->getCaptureKind() == LCK_StarThis); 11245 continue; 11246 } 11247 // Captured expression will be recaptured during captured variables 11248 // rebuilding. 11249 if (C->capturesVLAType()) 11250 continue; 11251 11252 // Rebuild init-captures, including the implied field declaration. 11253 if (E->isInitCapture(C)) { 11254 InitCaptureInfoTy InitExprTypePair = 11255 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11256 ExprResult Init = InitExprTypePair.first; 11257 QualType InitQualType = InitExprTypePair.second; 11258 if (Init.isInvalid() || InitQualType.isNull()) { 11259 Invalid = true; 11260 continue; 11261 } 11262 VarDecl *OldVD = C->getCapturedVar(); 11263 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11264 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11265 OldVD->getInitStyle(), Init.get()); 11266 if (!NewVD) 11267 Invalid = true; 11268 else { 11269 getDerived().transformedLocalDecl(OldVD, NewVD); 11270 } 11271 getSema().buildInitCaptureField(LSI, NewVD); 11272 continue; 11273 } 11274 11275 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11276 11277 // Determine the capture kind for Sema. 11278 Sema::TryCaptureKind Kind 11279 = C->isImplicit()? Sema::TryCapture_Implicit 11280 : C->getCaptureKind() == LCK_ByCopy 11281 ? Sema::TryCapture_ExplicitByVal 11282 : Sema::TryCapture_ExplicitByRef; 11283 SourceLocation EllipsisLoc; 11284 if (C->isPackExpansion()) { 11285 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11286 bool ShouldExpand = false; 11287 bool RetainExpansion = false; 11288 Optional<unsigned> NumExpansions; 11289 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11290 C->getLocation(), 11291 Unexpanded, 11292 ShouldExpand, RetainExpansion, 11293 NumExpansions)) { 11294 Invalid = true; 11295 continue; 11296 } 11297 11298 if (ShouldExpand) { 11299 // The transform has determined that we should perform an expansion; 11300 // transform and capture each of the arguments. 11301 // expansion of the pattern. Do so. 11302 VarDecl *Pack = C->getCapturedVar(); 11303 for (unsigned I = 0; I != *NumExpansions; ++I) { 11304 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11305 VarDecl *CapturedVar 11306 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11307 Pack)); 11308 if (!CapturedVar) { 11309 Invalid = true; 11310 continue; 11311 } 11312 11313 // Capture the transformed variable. 11314 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11315 } 11316 11317 // FIXME: Retain a pack expansion if RetainExpansion is true. 11318 11319 continue; 11320 } 11321 11322 EllipsisLoc = C->getEllipsisLoc(); 11323 } 11324 11325 // Transform the captured variable. 11326 VarDecl *CapturedVar 11327 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11328 C->getCapturedVar())); 11329 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11330 Invalid = true; 11331 continue; 11332 } 11333 11334 // Capture the transformed variable. 11335 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11336 EllipsisLoc); 11337 } 11338 if (!FinishedExplicitCaptures) 11339 getSema().finishLambdaExplicitCaptures(LSI); 11340 11341 // Enter a new evaluation context to insulate the lambda from any 11342 // cleanups from the enclosing full-expression. 11343 getSema().PushExpressionEvaluationContext( 11344 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11345 11346 // Instantiate the body of the lambda expression. 11347 StmtResult Body = 11348 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11349 11350 // ActOnLambda* will pop the function scope for us. 11351 FuncScopeCleanup.disable(); 11352 11353 if (Body.isInvalid()) { 11354 SavedContext.pop(); 11355 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 11356 /*IsInstantiation=*/true); 11357 return ExprError(); 11358 } 11359 11360 // Copy the LSI before ActOnFinishFunctionBody removes it. 11361 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11362 // the call operator. 11363 auto LSICopy = *LSI; 11364 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11365 /*IsInstantiation*/ true); 11366 SavedContext.pop(); 11367 11368 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 11369 &LSICopy); 11370 } 11371 11372 template<typename Derived> 11373 ExprResult 11374 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11375 CXXUnresolvedConstructExpr *E) { 11376 TypeSourceInfo *T = 11377 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11378 if (!T) 11379 return ExprError(); 11380 11381 bool ArgumentChanged = false; 11382 SmallVector<Expr*, 8> Args; 11383 Args.reserve(E->arg_size()); 11384 { 11385 EnterExpressionEvaluationContext Context( 11386 getSema(), EnterExpressionEvaluationContext::InitList, 11387 E->isListInitialization()); 11388 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11389 &ArgumentChanged)) 11390 return ExprError(); 11391 } 11392 11393 if (!getDerived().AlwaysRebuild() && 11394 T == E->getTypeSourceInfo() && 11395 !ArgumentChanged) 11396 return E; 11397 11398 // FIXME: we're faking the locations of the commas 11399 return getDerived().RebuildCXXUnresolvedConstructExpr( 11400 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11401 } 11402 11403 template<typename Derived> 11404 ExprResult 11405 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11406 CXXDependentScopeMemberExpr *E) { 11407 // Transform the base of the expression. 11408 ExprResult Base((Expr*) nullptr); 11409 Expr *OldBase; 11410 QualType BaseType; 11411 QualType ObjectType; 11412 if (!E->isImplicitAccess()) { 11413 OldBase = E->getBase(); 11414 Base = getDerived().TransformExpr(OldBase); 11415 if (Base.isInvalid()) 11416 return ExprError(); 11417 11418 // Start the member reference and compute the object's type. 11419 ParsedType ObjectTy; 11420 bool MayBePseudoDestructor = false; 11421 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11422 E->getOperatorLoc(), 11423 E->isArrow()? tok::arrow : tok::period, 11424 ObjectTy, 11425 MayBePseudoDestructor); 11426 if (Base.isInvalid()) 11427 return ExprError(); 11428 11429 ObjectType = ObjectTy.get(); 11430 BaseType = ((Expr*) Base.get())->getType(); 11431 } else { 11432 OldBase = nullptr; 11433 BaseType = getDerived().TransformType(E->getBaseType()); 11434 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11435 } 11436 11437 // Transform the first part of the nested-name-specifier that qualifies 11438 // the member name. 11439 NamedDecl *FirstQualifierInScope 11440 = getDerived().TransformFirstQualifierInScope( 11441 E->getFirstQualifierFoundInScope(), 11442 E->getQualifierLoc().getBeginLoc()); 11443 11444 NestedNameSpecifierLoc QualifierLoc; 11445 if (E->getQualifier()) { 11446 QualifierLoc 11447 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11448 ObjectType, 11449 FirstQualifierInScope); 11450 if (!QualifierLoc) 11451 return ExprError(); 11452 } 11453 11454 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11455 11456 // TODO: If this is a conversion-function-id, verify that the 11457 // destination type name (if present) resolves the same way after 11458 // instantiation as it did in the local scope. 11459 11460 DeclarationNameInfo NameInfo 11461 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11462 if (!NameInfo.getName()) 11463 return ExprError(); 11464 11465 if (!E->hasExplicitTemplateArgs()) { 11466 // This is a reference to a member without an explicitly-specified 11467 // template argument list. Optimize for this common case. 11468 if (!getDerived().AlwaysRebuild() && 11469 Base.get() == OldBase && 11470 BaseType == E->getBaseType() && 11471 QualifierLoc == E->getQualifierLoc() && 11472 NameInfo.getName() == E->getMember() && 11473 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11474 return E; 11475 11476 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11477 BaseType, 11478 E->isArrow(), 11479 E->getOperatorLoc(), 11480 QualifierLoc, 11481 TemplateKWLoc, 11482 FirstQualifierInScope, 11483 NameInfo, 11484 /*TemplateArgs*/nullptr); 11485 } 11486 11487 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11488 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11489 E->getNumTemplateArgs(), 11490 TransArgs)) 11491 return ExprError(); 11492 11493 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11494 BaseType, 11495 E->isArrow(), 11496 E->getOperatorLoc(), 11497 QualifierLoc, 11498 TemplateKWLoc, 11499 FirstQualifierInScope, 11500 NameInfo, 11501 &TransArgs); 11502 } 11503 11504 template<typename Derived> 11505 ExprResult 11506 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11507 // Transform the base of the expression. 11508 ExprResult Base((Expr*) nullptr); 11509 QualType BaseType; 11510 if (!Old->isImplicitAccess()) { 11511 Base = getDerived().TransformExpr(Old->getBase()); 11512 if (Base.isInvalid()) 11513 return ExprError(); 11514 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11515 Old->isArrow()); 11516 if (Base.isInvalid()) 11517 return ExprError(); 11518 BaseType = Base.get()->getType(); 11519 } else { 11520 BaseType = getDerived().TransformType(Old->getBaseType()); 11521 } 11522 11523 NestedNameSpecifierLoc QualifierLoc; 11524 if (Old->getQualifierLoc()) { 11525 QualifierLoc 11526 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11527 if (!QualifierLoc) 11528 return ExprError(); 11529 } 11530 11531 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11532 11533 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11534 Sema::LookupOrdinaryName); 11535 11536 // Transform the declaration set. 11537 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11538 return ExprError(); 11539 11540 // Determine the naming class. 11541 if (Old->getNamingClass()) { 11542 CXXRecordDecl *NamingClass 11543 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11544 Old->getMemberLoc(), 11545 Old->getNamingClass())); 11546 if (!NamingClass) 11547 return ExprError(); 11548 11549 R.setNamingClass(NamingClass); 11550 } 11551 11552 TemplateArgumentListInfo TransArgs; 11553 if (Old->hasExplicitTemplateArgs()) { 11554 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11555 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11556 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11557 Old->getNumTemplateArgs(), 11558 TransArgs)) 11559 return ExprError(); 11560 } 11561 11562 // FIXME: to do this check properly, we will need to preserve the 11563 // first-qualifier-in-scope here, just in case we had a dependent 11564 // base (and therefore couldn't do the check) and a 11565 // nested-name-qualifier (and therefore could do the lookup). 11566 NamedDecl *FirstQualifierInScope = nullptr; 11567 11568 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11569 BaseType, 11570 Old->getOperatorLoc(), 11571 Old->isArrow(), 11572 QualifierLoc, 11573 TemplateKWLoc, 11574 FirstQualifierInScope, 11575 R, 11576 (Old->hasExplicitTemplateArgs() 11577 ? &TransArgs : nullptr)); 11578 } 11579 11580 template<typename Derived> 11581 ExprResult 11582 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11583 EnterExpressionEvaluationContext Unevaluated( 11584 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11585 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11586 if (SubExpr.isInvalid()) 11587 return ExprError(); 11588 11589 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11590 return E; 11591 11592 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11593 } 11594 11595 template<typename Derived> 11596 ExprResult 11597 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11598 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11599 if (Pattern.isInvalid()) 11600 return ExprError(); 11601 11602 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11603 return E; 11604 11605 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11606 E->getNumExpansions()); 11607 } 11608 11609 template<typename Derived> 11610 ExprResult 11611 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11612 // If E is not value-dependent, then nothing will change when we transform it. 11613 // Note: This is an instantiation-centric view. 11614 if (!E->isValueDependent()) 11615 return E; 11616 11617 EnterExpressionEvaluationContext Unevaluated( 11618 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11619 11620 ArrayRef<TemplateArgument> PackArgs; 11621 TemplateArgument ArgStorage; 11622 11623 // Find the argument list to transform. 11624 if (E->isPartiallySubstituted()) { 11625 PackArgs = E->getPartialArguments(); 11626 } else if (E->isValueDependent()) { 11627 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11628 bool ShouldExpand = false; 11629 bool RetainExpansion = false; 11630 Optional<unsigned> NumExpansions; 11631 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11632 Unexpanded, 11633 ShouldExpand, RetainExpansion, 11634 NumExpansions)) 11635 return ExprError(); 11636 11637 // If we need to expand the pack, build a template argument from it and 11638 // expand that. 11639 if (ShouldExpand) { 11640 auto *Pack = E->getPack(); 11641 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11642 ArgStorage = getSema().Context.getPackExpansionType( 11643 getSema().Context.getTypeDeclType(TTPD), None); 11644 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11645 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11646 } else { 11647 auto *VD = cast<ValueDecl>(Pack); 11648 ExprResult DRE = getSema().BuildDeclRefExpr( 11649 VD, VD->getType().getNonLValueExprType(getSema().Context), 11650 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11651 E->getPackLoc()); 11652 if (DRE.isInvalid()) 11653 return ExprError(); 11654 ArgStorage = new (getSema().Context) PackExpansionExpr( 11655 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11656 } 11657 PackArgs = ArgStorage; 11658 } 11659 } 11660 11661 // If we're not expanding the pack, just transform the decl. 11662 if (!PackArgs.size()) { 11663 auto *Pack = cast_or_null<NamedDecl>( 11664 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11665 if (!Pack) 11666 return ExprError(); 11667 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11668 E->getPackLoc(), 11669 E->getRParenLoc(), None, None); 11670 } 11671 11672 // Try to compute the result without performing a partial substitution. 11673 Optional<unsigned> Result = 0; 11674 for (const TemplateArgument &Arg : PackArgs) { 11675 if (!Arg.isPackExpansion()) { 11676 Result = *Result + 1; 11677 continue; 11678 } 11679 11680 TemplateArgumentLoc ArgLoc; 11681 InventTemplateArgumentLoc(Arg, ArgLoc); 11682 11683 // Find the pattern of the pack expansion. 11684 SourceLocation Ellipsis; 11685 Optional<unsigned> OrigNumExpansions; 11686 TemplateArgumentLoc Pattern = 11687 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11688 OrigNumExpansions); 11689 11690 // Substitute under the pack expansion. Do not expand the pack (yet). 11691 TemplateArgumentLoc OutPattern; 11692 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11693 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11694 /*Uneval*/ true)) 11695 return true; 11696 11697 // See if we can determine the number of arguments from the result. 11698 Optional<unsigned> NumExpansions = 11699 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11700 if (!NumExpansions) { 11701 // No: we must be in an alias template expansion, and we're going to need 11702 // to actually expand the packs. 11703 Result = None; 11704 break; 11705 } 11706 11707 Result = *Result + *NumExpansions; 11708 } 11709 11710 // Common case: we could determine the number of expansions without 11711 // substituting. 11712 if (Result) 11713 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11714 E->getPackLoc(), 11715 E->getRParenLoc(), *Result, None); 11716 11717 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11718 E->getPackLoc()); 11719 { 11720 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11721 typedef TemplateArgumentLocInventIterator< 11722 Derived, const TemplateArgument*> PackLocIterator; 11723 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11724 PackLocIterator(*this, PackArgs.end()), 11725 TransformedPackArgs, /*Uneval*/true)) 11726 return ExprError(); 11727 } 11728 11729 // Check whether we managed to fully-expand the pack. 11730 // FIXME: Is it possible for us to do so and not hit the early exit path? 11731 SmallVector<TemplateArgument, 8> Args; 11732 bool PartialSubstitution = false; 11733 for (auto &Loc : TransformedPackArgs.arguments()) { 11734 Args.push_back(Loc.getArgument()); 11735 if (Loc.getArgument().isPackExpansion()) 11736 PartialSubstitution = true; 11737 } 11738 11739 if (PartialSubstitution) 11740 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11741 E->getPackLoc(), 11742 E->getRParenLoc(), None, Args); 11743 11744 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11745 E->getPackLoc(), E->getRParenLoc(), 11746 Args.size(), None); 11747 } 11748 11749 template<typename Derived> 11750 ExprResult 11751 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11752 SubstNonTypeTemplateParmPackExpr *E) { 11753 // Default behavior is to do nothing with this transformation. 11754 return E; 11755 } 11756 11757 template<typename Derived> 11758 ExprResult 11759 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11760 SubstNonTypeTemplateParmExpr *E) { 11761 // Default behavior is to do nothing with this transformation. 11762 return E; 11763 } 11764 11765 template<typename Derived> 11766 ExprResult 11767 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11768 // Default behavior is to do nothing with this transformation. 11769 return E; 11770 } 11771 11772 template<typename Derived> 11773 ExprResult 11774 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11775 MaterializeTemporaryExpr *E) { 11776 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11777 } 11778 11779 template<typename Derived> 11780 ExprResult 11781 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11782 Expr *Pattern = E->getPattern(); 11783 11784 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11785 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11786 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11787 11788 // Determine whether the set of unexpanded parameter packs can and should 11789 // be expanded. 11790 bool Expand = true; 11791 bool RetainExpansion = false; 11792 Optional<unsigned> NumExpansions; 11793 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11794 Pattern->getSourceRange(), 11795 Unexpanded, 11796 Expand, RetainExpansion, 11797 NumExpansions)) 11798 return true; 11799 11800 if (!Expand) { 11801 // Do not expand any packs here, just transform and rebuild a fold 11802 // expression. 11803 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11804 11805 ExprResult LHS = 11806 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11807 if (LHS.isInvalid()) 11808 return true; 11809 11810 ExprResult RHS = 11811 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11812 if (RHS.isInvalid()) 11813 return true; 11814 11815 if (!getDerived().AlwaysRebuild() && 11816 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11817 return E; 11818 11819 return getDerived().RebuildCXXFoldExpr( 11820 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11821 RHS.get(), E->getEndLoc()); 11822 } 11823 11824 // The transform has determined that we should perform an elementwise 11825 // expansion of the pattern. Do so. 11826 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11827 if (Result.isInvalid()) 11828 return true; 11829 bool LeftFold = E->isLeftFold(); 11830 11831 // If we're retaining an expansion for a right fold, it is the innermost 11832 // component and takes the init (if any). 11833 if (!LeftFold && RetainExpansion) { 11834 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11835 11836 ExprResult Out = getDerived().TransformExpr(Pattern); 11837 if (Out.isInvalid()) 11838 return true; 11839 11840 Result = getDerived().RebuildCXXFoldExpr( 11841 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11842 Result.get(), E->getEndLoc()); 11843 if (Result.isInvalid()) 11844 return true; 11845 } 11846 11847 for (unsigned I = 0; I != *NumExpansions; ++I) { 11848 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11849 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11850 ExprResult Out = getDerived().TransformExpr(Pattern); 11851 if (Out.isInvalid()) 11852 return true; 11853 11854 if (Out.get()->containsUnexpandedParameterPack()) { 11855 // We still have a pack; retain a pack expansion for this slice. 11856 Result = getDerived().RebuildCXXFoldExpr( 11857 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 11858 E->getOperator(), E->getEllipsisLoc(), 11859 LeftFold ? Out.get() : Result.get(), E->getEndLoc()); 11860 } else if (Result.isUsable()) { 11861 // We've got down to a single element; build a binary operator. 11862 Result = getDerived().RebuildBinaryOperator( 11863 E->getEllipsisLoc(), E->getOperator(), 11864 LeftFold ? Result.get() : Out.get(), 11865 LeftFold ? Out.get() : Result.get()); 11866 } else 11867 Result = Out; 11868 11869 if (Result.isInvalid()) 11870 return true; 11871 } 11872 11873 // If we're retaining an expansion for a left fold, it is the outermost 11874 // component and takes the complete expansion so far as its init (if any). 11875 if (LeftFold && RetainExpansion) { 11876 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11877 11878 ExprResult Out = getDerived().TransformExpr(Pattern); 11879 if (Out.isInvalid()) 11880 return true; 11881 11882 Result = getDerived().RebuildCXXFoldExpr( 11883 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 11884 Out.get(), E->getEndLoc()); 11885 if (Result.isInvalid()) 11886 return true; 11887 } 11888 11889 // If we had no init and an empty pack, and we're not retaining an expansion, 11890 // then produce a fallback value or error. 11891 if (Result.isUnset()) 11892 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11893 E->getOperator()); 11894 11895 return Result; 11896 } 11897 11898 template<typename Derived> 11899 ExprResult 11900 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11901 CXXStdInitializerListExpr *E) { 11902 return getDerived().TransformExpr(E->getSubExpr()); 11903 } 11904 11905 template<typename Derived> 11906 ExprResult 11907 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11908 return SemaRef.MaybeBindToTemporary(E); 11909 } 11910 11911 template<typename Derived> 11912 ExprResult 11913 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11914 return E; 11915 } 11916 11917 template<typename Derived> 11918 ExprResult 11919 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11920 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11921 if (SubExpr.isInvalid()) 11922 return ExprError(); 11923 11924 if (!getDerived().AlwaysRebuild() && 11925 SubExpr.get() == E->getSubExpr()) 11926 return E; 11927 11928 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11929 } 11930 11931 template<typename Derived> 11932 ExprResult 11933 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11934 // Transform each of the elements. 11935 SmallVector<Expr *, 8> Elements; 11936 bool ArgChanged = false; 11937 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11938 /*IsCall=*/false, Elements, &ArgChanged)) 11939 return ExprError(); 11940 11941 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11942 return SemaRef.MaybeBindToTemporary(E); 11943 11944 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11945 Elements.data(), 11946 Elements.size()); 11947 } 11948 11949 template<typename Derived> 11950 ExprResult 11951 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11952 ObjCDictionaryLiteral *E) { 11953 // Transform each of the elements. 11954 SmallVector<ObjCDictionaryElement, 8> Elements; 11955 bool ArgChanged = false; 11956 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11957 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11958 11959 if (OrigElement.isPackExpansion()) { 11960 // This key/value element is a pack expansion. 11961 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11962 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11963 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11964 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11965 11966 // Determine whether the set of unexpanded parameter packs can 11967 // and should be expanded. 11968 bool Expand = true; 11969 bool RetainExpansion = false; 11970 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11971 Optional<unsigned> NumExpansions = OrigNumExpansions; 11972 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 11973 OrigElement.Value->getEndLoc()); 11974 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11975 PatternRange, Unexpanded, Expand, 11976 RetainExpansion, NumExpansions)) 11977 return ExprError(); 11978 11979 if (!Expand) { 11980 // The transform has determined that we should perform a simple 11981 // transformation on the pack expansion, producing another pack 11982 // expansion. 11983 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11984 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11985 if (Key.isInvalid()) 11986 return ExprError(); 11987 11988 if (Key.get() != OrigElement.Key) 11989 ArgChanged = true; 11990 11991 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11992 if (Value.isInvalid()) 11993 return ExprError(); 11994 11995 if (Value.get() != OrigElement.Value) 11996 ArgChanged = true; 11997 11998 ObjCDictionaryElement Expansion = { 11999 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 12000 }; 12001 Elements.push_back(Expansion); 12002 continue; 12003 } 12004 12005 // Record right away that the argument was changed. This needs 12006 // to happen even if the array expands to nothing. 12007 ArgChanged = true; 12008 12009 // The transform has determined that we should perform an elementwise 12010 // expansion of the pattern. Do so. 12011 for (unsigned I = 0; I != *NumExpansions; ++I) { 12012 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12013 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12014 if (Key.isInvalid()) 12015 return ExprError(); 12016 12017 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 12018 if (Value.isInvalid()) 12019 return ExprError(); 12020 12021 ObjCDictionaryElement Element = { 12022 Key.get(), Value.get(), SourceLocation(), NumExpansions 12023 }; 12024 12025 // If any unexpanded parameter packs remain, we still have a 12026 // pack expansion. 12027 // FIXME: Can this really happen? 12028 if (Key.get()->containsUnexpandedParameterPack() || 12029 Value.get()->containsUnexpandedParameterPack()) 12030 Element.EllipsisLoc = OrigElement.EllipsisLoc; 12031 12032 Elements.push_back(Element); 12033 } 12034 12035 // FIXME: Retain a pack expansion if RetainExpansion is true. 12036 12037 // We've finished with this pack expansion. 12038 continue; 12039 } 12040 12041 // Transform and check key. 12042 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12043 if (Key.isInvalid()) 12044 return ExprError(); 12045 12046 if (Key.get() != OrigElement.Key) 12047 ArgChanged = true; 12048 12049 // Transform and check value. 12050 ExprResult Value 12051 = getDerived().TransformExpr(OrigElement.Value); 12052 if (Value.isInvalid()) 12053 return ExprError(); 12054 12055 if (Value.get() != OrigElement.Value) 12056 ArgChanged = true; 12057 12058 ObjCDictionaryElement Element = { 12059 Key.get(), Value.get(), SourceLocation(), None 12060 }; 12061 Elements.push_back(Element); 12062 } 12063 12064 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12065 return SemaRef.MaybeBindToTemporary(E); 12066 12067 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 12068 Elements); 12069 } 12070 12071 template<typename Derived> 12072 ExprResult 12073 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 12074 TypeSourceInfo *EncodedTypeInfo 12075 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 12076 if (!EncodedTypeInfo) 12077 return ExprError(); 12078 12079 if (!getDerived().AlwaysRebuild() && 12080 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 12081 return E; 12082 12083 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 12084 EncodedTypeInfo, 12085 E->getRParenLoc()); 12086 } 12087 12088 template<typename Derived> 12089 ExprResult TreeTransform<Derived>:: 12090 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 12091 // This is a kind of implicit conversion, and it needs to get dropped 12092 // and recomputed for the same general reasons that ImplicitCastExprs 12093 // do, as well a more specific one: this expression is only valid when 12094 // it appears *immediately* as an argument expression. 12095 return getDerived().TransformExpr(E->getSubExpr()); 12096 } 12097 12098 template<typename Derived> 12099 ExprResult TreeTransform<Derived>:: 12100 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 12101 TypeSourceInfo *TSInfo 12102 = getDerived().TransformType(E->getTypeInfoAsWritten()); 12103 if (!TSInfo) 12104 return ExprError(); 12105 12106 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 12107 if (Result.isInvalid()) 12108 return ExprError(); 12109 12110 if (!getDerived().AlwaysRebuild() && 12111 TSInfo == E->getTypeInfoAsWritten() && 12112 Result.get() == E->getSubExpr()) 12113 return E; 12114 12115 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 12116 E->getBridgeKeywordLoc(), TSInfo, 12117 Result.get()); 12118 } 12119 12120 template <typename Derived> 12121 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 12122 ObjCAvailabilityCheckExpr *E) { 12123 return E; 12124 } 12125 12126 template<typename Derived> 12127 ExprResult 12128 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 12129 // Transform arguments. 12130 bool ArgChanged = false; 12131 SmallVector<Expr*, 8> Args; 12132 Args.reserve(E->getNumArgs()); 12133 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 12134 &ArgChanged)) 12135 return ExprError(); 12136 12137 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 12138 // Class message: transform the receiver type. 12139 TypeSourceInfo *ReceiverTypeInfo 12140 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 12141 if (!ReceiverTypeInfo) 12142 return ExprError(); 12143 12144 // If nothing changed, just retain the existing message send. 12145 if (!getDerived().AlwaysRebuild() && 12146 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 12147 return SemaRef.MaybeBindToTemporary(E); 12148 12149 // Build a new class message send. 12150 SmallVector<SourceLocation, 16> SelLocs; 12151 E->getSelectorLocs(SelLocs); 12152 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 12153 E->getSelector(), 12154 SelLocs, 12155 E->getMethodDecl(), 12156 E->getLeftLoc(), 12157 Args, 12158 E->getRightLoc()); 12159 } 12160 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 12161 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 12162 if (!E->getMethodDecl()) 12163 return ExprError(); 12164 12165 // Build a new class message send to 'super'. 12166 SmallVector<SourceLocation, 16> SelLocs; 12167 E->getSelectorLocs(SelLocs); 12168 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 12169 E->getSelector(), 12170 SelLocs, 12171 E->getReceiverType(), 12172 E->getMethodDecl(), 12173 E->getLeftLoc(), 12174 Args, 12175 E->getRightLoc()); 12176 } 12177 12178 // Instance message: transform the receiver 12179 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 12180 "Only class and instance messages may be instantiated"); 12181 ExprResult Receiver 12182 = getDerived().TransformExpr(E->getInstanceReceiver()); 12183 if (Receiver.isInvalid()) 12184 return ExprError(); 12185 12186 // If nothing changed, just retain the existing message send. 12187 if (!getDerived().AlwaysRebuild() && 12188 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 12189 return SemaRef.MaybeBindToTemporary(E); 12190 12191 // Build a new instance message send. 12192 SmallVector<SourceLocation, 16> SelLocs; 12193 E->getSelectorLocs(SelLocs); 12194 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 12195 E->getSelector(), 12196 SelLocs, 12197 E->getMethodDecl(), 12198 E->getLeftLoc(), 12199 Args, 12200 E->getRightLoc()); 12201 } 12202 12203 template<typename Derived> 12204 ExprResult 12205 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 12206 return E; 12207 } 12208 12209 template<typename Derived> 12210 ExprResult 12211 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 12212 return E; 12213 } 12214 12215 template<typename Derived> 12216 ExprResult 12217 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 12218 // Transform the base expression. 12219 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12220 if (Base.isInvalid()) 12221 return ExprError(); 12222 12223 // We don't need to transform the ivar; it will never change. 12224 12225 // If nothing changed, just retain the existing expression. 12226 if (!getDerived().AlwaysRebuild() && 12227 Base.get() == E->getBase()) 12228 return E; 12229 12230 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 12231 E->getLocation(), 12232 E->isArrow(), E->isFreeIvar()); 12233 } 12234 12235 template<typename Derived> 12236 ExprResult 12237 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 12238 // 'super' and types never change. Property never changes. Just 12239 // retain the existing expression. 12240 if (!E->isObjectReceiver()) 12241 return E; 12242 12243 // Transform the base expression. 12244 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12245 if (Base.isInvalid()) 12246 return ExprError(); 12247 12248 // We don't need to transform the property; it will never change. 12249 12250 // If nothing changed, just retain the existing expression. 12251 if (!getDerived().AlwaysRebuild() && 12252 Base.get() == E->getBase()) 12253 return E; 12254 12255 if (E->isExplicitProperty()) 12256 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12257 E->getExplicitProperty(), 12258 E->getLocation()); 12259 12260 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12261 SemaRef.Context.PseudoObjectTy, 12262 E->getImplicitPropertyGetter(), 12263 E->getImplicitPropertySetter(), 12264 E->getLocation()); 12265 } 12266 12267 template<typename Derived> 12268 ExprResult 12269 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12270 // Transform the base expression. 12271 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12272 if (Base.isInvalid()) 12273 return ExprError(); 12274 12275 // Transform the key expression. 12276 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12277 if (Key.isInvalid()) 12278 return ExprError(); 12279 12280 // If nothing changed, just retain the existing expression. 12281 if (!getDerived().AlwaysRebuild() && 12282 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12283 return E; 12284 12285 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12286 Base.get(), Key.get(), 12287 E->getAtIndexMethodDecl(), 12288 E->setAtIndexMethodDecl()); 12289 } 12290 12291 template<typename Derived> 12292 ExprResult 12293 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12294 // Transform the base expression. 12295 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12296 if (Base.isInvalid()) 12297 return ExprError(); 12298 12299 // If nothing changed, just retain the existing expression. 12300 if (!getDerived().AlwaysRebuild() && 12301 Base.get() == E->getBase()) 12302 return E; 12303 12304 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12305 E->getOpLoc(), 12306 E->isArrow()); 12307 } 12308 12309 template<typename Derived> 12310 ExprResult 12311 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12312 bool ArgumentChanged = false; 12313 SmallVector<Expr*, 8> SubExprs; 12314 SubExprs.reserve(E->getNumSubExprs()); 12315 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12316 SubExprs, &ArgumentChanged)) 12317 return ExprError(); 12318 12319 if (!getDerived().AlwaysRebuild() && 12320 !ArgumentChanged) 12321 return E; 12322 12323 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12324 SubExprs, 12325 E->getRParenLoc()); 12326 } 12327 12328 template<typename Derived> 12329 ExprResult 12330 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12331 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12332 if (SrcExpr.isInvalid()) 12333 return ExprError(); 12334 12335 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12336 if (!Type) 12337 return ExprError(); 12338 12339 if (!getDerived().AlwaysRebuild() && 12340 Type == E->getTypeSourceInfo() && 12341 SrcExpr.get() == E->getSrcExpr()) 12342 return E; 12343 12344 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12345 SrcExpr.get(), Type, 12346 E->getRParenLoc()); 12347 } 12348 12349 template<typename Derived> 12350 ExprResult 12351 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12352 BlockDecl *oldBlock = E->getBlockDecl(); 12353 12354 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12355 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12356 12357 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12358 blockScope->TheDecl->setBlockMissingReturnType( 12359 oldBlock->blockMissingReturnType()); 12360 12361 SmallVector<ParmVarDecl*, 4> params; 12362 SmallVector<QualType, 4> paramTypes; 12363 12364 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12365 12366 // Parameter substitution. 12367 Sema::ExtParameterInfoBuilder extParamInfos; 12368 if (getDerived().TransformFunctionTypeParams( 12369 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12370 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12371 extParamInfos)) { 12372 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12373 return ExprError(); 12374 } 12375 12376 QualType exprResultType = 12377 getDerived().TransformType(exprFunctionType->getReturnType()); 12378 12379 auto epi = exprFunctionType->getExtProtoInfo(); 12380 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12381 12382 QualType functionType = 12383 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12384 blockScope->FunctionType = functionType; 12385 12386 // Set the parameters on the block decl. 12387 if (!params.empty()) 12388 blockScope->TheDecl->setParams(params); 12389 12390 if (!oldBlock->blockMissingReturnType()) { 12391 blockScope->HasImplicitReturnType = false; 12392 blockScope->ReturnType = exprResultType; 12393 } 12394 12395 // Transform the body 12396 StmtResult body = getDerived().TransformStmt(E->getBody()); 12397 if (body.isInvalid()) { 12398 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12399 return ExprError(); 12400 } 12401 12402 #ifndef NDEBUG 12403 // In builds with assertions, make sure that we captured everything we 12404 // captured before. 12405 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12406 for (const auto &I : oldBlock->captures()) { 12407 VarDecl *oldCapture = I.getVariable(); 12408 12409 // Ignore parameter packs. 12410 if (isa<ParmVarDecl>(oldCapture) && 12411 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12412 continue; 12413 12414 VarDecl *newCapture = 12415 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12416 oldCapture)); 12417 assert(blockScope->CaptureMap.count(newCapture)); 12418 } 12419 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12420 } 12421 #endif 12422 12423 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12424 /*Scope=*/nullptr); 12425 } 12426 12427 template<typename Derived> 12428 ExprResult 12429 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12430 llvm_unreachable("Cannot transform asType expressions yet"); 12431 } 12432 12433 template<typename Derived> 12434 ExprResult 12435 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12436 QualType RetTy = getDerived().TransformType(E->getType()); 12437 bool ArgumentChanged = false; 12438 SmallVector<Expr*, 8> SubExprs; 12439 SubExprs.reserve(E->getNumSubExprs()); 12440 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12441 SubExprs, &ArgumentChanged)) 12442 return ExprError(); 12443 12444 if (!getDerived().AlwaysRebuild() && 12445 !ArgumentChanged) 12446 return E; 12447 12448 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12449 RetTy, E->getOp(), E->getRParenLoc()); 12450 } 12451 12452 //===----------------------------------------------------------------------===// 12453 // Type reconstruction 12454 //===----------------------------------------------------------------------===// 12455 12456 template<typename Derived> 12457 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12458 SourceLocation Star) { 12459 return SemaRef.BuildPointerType(PointeeType, Star, 12460 getDerived().getBaseEntity()); 12461 } 12462 12463 template<typename Derived> 12464 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12465 SourceLocation Star) { 12466 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12467 getDerived().getBaseEntity()); 12468 } 12469 12470 template<typename Derived> 12471 QualType 12472 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12473 bool WrittenAsLValue, 12474 SourceLocation Sigil) { 12475 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12476 Sigil, getDerived().getBaseEntity()); 12477 } 12478 12479 template<typename Derived> 12480 QualType 12481 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12482 QualType ClassType, 12483 SourceLocation Sigil) { 12484 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12485 getDerived().getBaseEntity()); 12486 } 12487 12488 template<typename Derived> 12489 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12490 const ObjCTypeParamDecl *Decl, 12491 SourceLocation ProtocolLAngleLoc, 12492 ArrayRef<ObjCProtocolDecl *> Protocols, 12493 ArrayRef<SourceLocation> ProtocolLocs, 12494 SourceLocation ProtocolRAngleLoc) { 12495 return SemaRef.BuildObjCTypeParamType(Decl, 12496 ProtocolLAngleLoc, Protocols, 12497 ProtocolLocs, ProtocolRAngleLoc, 12498 /*FailOnError=*/true); 12499 } 12500 12501 template<typename Derived> 12502 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12503 QualType BaseType, 12504 SourceLocation Loc, 12505 SourceLocation TypeArgsLAngleLoc, 12506 ArrayRef<TypeSourceInfo *> TypeArgs, 12507 SourceLocation TypeArgsRAngleLoc, 12508 SourceLocation ProtocolLAngleLoc, 12509 ArrayRef<ObjCProtocolDecl *> Protocols, 12510 ArrayRef<SourceLocation> ProtocolLocs, 12511 SourceLocation ProtocolRAngleLoc) { 12512 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12513 TypeArgs, TypeArgsRAngleLoc, 12514 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12515 ProtocolRAngleLoc, 12516 /*FailOnError=*/true); 12517 } 12518 12519 template<typename Derived> 12520 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12521 QualType PointeeType, 12522 SourceLocation Star) { 12523 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12524 } 12525 12526 template<typename Derived> 12527 QualType 12528 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12529 ArrayType::ArraySizeModifier SizeMod, 12530 const llvm::APInt *Size, 12531 Expr *SizeExpr, 12532 unsigned IndexTypeQuals, 12533 SourceRange BracketsRange) { 12534 if (SizeExpr || !Size) 12535 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12536 IndexTypeQuals, BracketsRange, 12537 getDerived().getBaseEntity()); 12538 12539 QualType Types[] = { 12540 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12541 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12542 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12543 }; 12544 const unsigned NumTypes = llvm::array_lengthof(Types); 12545 QualType SizeType; 12546 for (unsigned I = 0; I != NumTypes; ++I) 12547 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12548 SizeType = Types[I]; 12549 break; 12550 } 12551 12552 // Note that we can return a VariableArrayType here in the case where 12553 // the element type was a dependent VariableArrayType. 12554 IntegerLiteral *ArraySize 12555 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12556 /*FIXME*/BracketsRange.getBegin()); 12557 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12558 IndexTypeQuals, BracketsRange, 12559 getDerived().getBaseEntity()); 12560 } 12561 12562 template<typename Derived> 12563 QualType 12564 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12565 ArrayType::ArraySizeModifier SizeMod, 12566 const llvm::APInt &Size, 12567 unsigned IndexTypeQuals, 12568 SourceRange BracketsRange) { 12569 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12570 IndexTypeQuals, BracketsRange); 12571 } 12572 12573 template<typename Derived> 12574 QualType 12575 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12576 ArrayType::ArraySizeModifier SizeMod, 12577 unsigned IndexTypeQuals, 12578 SourceRange BracketsRange) { 12579 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12580 IndexTypeQuals, BracketsRange); 12581 } 12582 12583 template<typename Derived> 12584 QualType 12585 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12586 ArrayType::ArraySizeModifier SizeMod, 12587 Expr *SizeExpr, 12588 unsigned IndexTypeQuals, 12589 SourceRange BracketsRange) { 12590 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12591 SizeExpr, 12592 IndexTypeQuals, BracketsRange); 12593 } 12594 12595 template<typename Derived> 12596 QualType 12597 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12598 ArrayType::ArraySizeModifier SizeMod, 12599 Expr *SizeExpr, 12600 unsigned IndexTypeQuals, 12601 SourceRange BracketsRange) { 12602 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12603 SizeExpr, 12604 IndexTypeQuals, BracketsRange); 12605 } 12606 12607 template <typename Derived> 12608 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12609 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12610 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12611 AttributeLoc); 12612 } 12613 12614 template <typename Derived> 12615 QualType 12616 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12617 unsigned NumElements, 12618 VectorType::VectorKind VecKind) { 12619 // FIXME: semantic checking! 12620 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12621 } 12622 12623 template <typename Derived> 12624 QualType TreeTransform<Derived>::RebuildDependentVectorType( 12625 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 12626 VectorType::VectorKind VecKind) { 12627 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 12628 } 12629 12630 template<typename Derived> 12631 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12632 unsigned NumElements, 12633 SourceLocation AttributeLoc) { 12634 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12635 NumElements, true); 12636 IntegerLiteral *VectorSize 12637 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12638 AttributeLoc); 12639 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12640 } 12641 12642 template<typename Derived> 12643 QualType 12644 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12645 Expr *SizeExpr, 12646 SourceLocation AttributeLoc) { 12647 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12648 } 12649 12650 template<typename Derived> 12651 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12652 QualType T, 12653 MutableArrayRef<QualType> ParamTypes, 12654 const FunctionProtoType::ExtProtoInfo &EPI) { 12655 return SemaRef.BuildFunctionType(T, ParamTypes, 12656 getDerived().getBaseLocation(), 12657 getDerived().getBaseEntity(), 12658 EPI); 12659 } 12660 12661 template<typename Derived> 12662 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12663 return SemaRef.Context.getFunctionNoProtoType(T); 12664 } 12665 12666 template<typename Derived> 12667 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12668 Decl *D) { 12669 assert(D && "no decl found"); 12670 if (D->isInvalidDecl()) return QualType(); 12671 12672 // FIXME: Doesn't account for ObjCInterfaceDecl! 12673 TypeDecl *Ty; 12674 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12675 // A valid resolved using typename pack expansion decl can have multiple 12676 // UsingDecls, but they must each have exactly one type, and it must be 12677 // the same type in every case. But we must have at least one expansion! 12678 if (UPD->expansions().empty()) { 12679 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12680 << UPD->isCXXClassMember() << UPD; 12681 return QualType(); 12682 } 12683 12684 // We might still have some unresolved types. Try to pick a resolved type 12685 // if we can. The final instantiation will check that the remaining 12686 // unresolved types instantiate to the type we pick. 12687 QualType FallbackT; 12688 QualType T; 12689 for (auto *E : UPD->expansions()) { 12690 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12691 if (ThisT.isNull()) 12692 continue; 12693 else if (ThisT->getAs<UnresolvedUsingType>()) 12694 FallbackT = ThisT; 12695 else if (T.isNull()) 12696 T = ThisT; 12697 else 12698 assert(getSema().Context.hasSameType(ThisT, T) && 12699 "mismatched resolved types in using pack expansion"); 12700 } 12701 return T.isNull() ? FallbackT : T; 12702 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12703 assert(Using->hasTypename() && 12704 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12705 12706 // A valid resolved using typename decl points to exactly one type decl. 12707 assert(++Using->shadow_begin() == Using->shadow_end()); 12708 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12709 } else { 12710 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12711 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12712 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12713 } 12714 12715 return SemaRef.Context.getTypeDeclType(Ty); 12716 } 12717 12718 template<typename Derived> 12719 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12720 SourceLocation Loc) { 12721 return SemaRef.BuildTypeofExprType(E, Loc); 12722 } 12723 12724 template<typename Derived> 12725 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12726 return SemaRef.Context.getTypeOfType(Underlying); 12727 } 12728 12729 template<typename Derived> 12730 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12731 SourceLocation Loc) { 12732 return SemaRef.BuildDecltypeType(E, Loc); 12733 } 12734 12735 template<typename Derived> 12736 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12737 UnaryTransformType::UTTKind UKind, 12738 SourceLocation Loc) { 12739 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12740 } 12741 12742 template<typename Derived> 12743 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12744 TemplateName Template, 12745 SourceLocation TemplateNameLoc, 12746 TemplateArgumentListInfo &TemplateArgs) { 12747 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12748 } 12749 12750 template<typename Derived> 12751 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12752 SourceLocation KWLoc) { 12753 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12754 } 12755 12756 template<typename Derived> 12757 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12758 SourceLocation KWLoc, 12759 bool isReadPipe) { 12760 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12761 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12762 } 12763 12764 template<typename Derived> 12765 TemplateName 12766 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12767 bool TemplateKW, 12768 TemplateDecl *Template) { 12769 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12770 Template); 12771 } 12772 12773 template<typename Derived> 12774 TemplateName 12775 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12776 SourceLocation TemplateKWLoc, 12777 const IdentifierInfo &Name, 12778 SourceLocation NameLoc, 12779 QualType ObjectType, 12780 NamedDecl *FirstQualifierInScope, 12781 bool AllowInjectedClassName) { 12782 UnqualifiedId TemplateName; 12783 TemplateName.setIdentifier(&Name, NameLoc); 12784 Sema::TemplateTy Template; 12785 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12786 SS, TemplateKWLoc, TemplateName, 12787 ParsedType::make(ObjectType), 12788 /*EnteringContext=*/false, 12789 Template, AllowInjectedClassName); 12790 return Template.get(); 12791 } 12792 12793 template<typename Derived> 12794 TemplateName 12795 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12796 SourceLocation TemplateKWLoc, 12797 OverloadedOperatorKind Operator, 12798 SourceLocation NameLoc, 12799 QualType ObjectType, 12800 bool AllowInjectedClassName) { 12801 UnqualifiedId Name; 12802 // FIXME: Bogus location information. 12803 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12804 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12805 Sema::TemplateTy Template; 12806 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12807 SS, TemplateKWLoc, Name, 12808 ParsedType::make(ObjectType), 12809 /*EnteringContext=*/false, 12810 Template, AllowInjectedClassName); 12811 return Template.get(); 12812 } 12813 12814 template<typename Derived> 12815 ExprResult 12816 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12817 SourceLocation OpLoc, 12818 Expr *OrigCallee, 12819 Expr *First, 12820 Expr *Second) { 12821 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12822 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12823 12824 if (First->getObjectKind() == OK_ObjCProperty) { 12825 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12826 if (BinaryOperator::isAssignmentOp(Opc)) 12827 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12828 First, Second); 12829 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12830 if (Result.isInvalid()) 12831 return ExprError(); 12832 First = Result.get(); 12833 } 12834 12835 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12836 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12837 if (Result.isInvalid()) 12838 return ExprError(); 12839 Second = Result.get(); 12840 } 12841 12842 // Determine whether this should be a builtin operation. 12843 if (Op == OO_Subscript) { 12844 if (!First->getType()->isOverloadableType() && 12845 !Second->getType()->isOverloadableType()) 12846 return getSema().CreateBuiltinArraySubscriptExpr( 12847 First, Callee->getBeginLoc(), Second, OpLoc); 12848 } else if (Op == OO_Arrow) { 12849 // -> is never a builtin operation. 12850 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12851 } else if (Second == nullptr || isPostIncDec) { 12852 if (!First->getType()->isOverloadableType() || 12853 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 12854 // The argument is not of overloadable type, or this is an expression 12855 // of the form &Class::member, so try to create a built-in unary 12856 // operation. 12857 UnaryOperatorKind Opc 12858 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12859 12860 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12861 } 12862 } else { 12863 if (!First->getType()->isOverloadableType() && 12864 !Second->getType()->isOverloadableType()) { 12865 // Neither of the arguments is an overloadable type, so try to 12866 // create a built-in binary operation. 12867 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12868 ExprResult Result 12869 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12870 if (Result.isInvalid()) 12871 return ExprError(); 12872 12873 return Result; 12874 } 12875 } 12876 12877 // Compute the transformed set of functions (and function templates) to be 12878 // used during overload resolution. 12879 UnresolvedSet<16> Functions; 12880 bool RequiresADL; 12881 12882 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12883 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12884 // If the overload could not be resolved in the template definition 12885 // (because we had a dependent argument), ADL is performed as part of 12886 // template instantiation. 12887 RequiresADL = ULE->requiresADL(); 12888 } else { 12889 // If we've resolved this to a particular non-member function, just call 12890 // that function. If we resolved it to a member function, 12891 // CreateOverloaded* will find that function for us. 12892 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12893 if (!isa<CXXMethodDecl>(ND)) 12894 Functions.addDecl(ND); 12895 RequiresADL = false; 12896 } 12897 12898 // Add any functions found via argument-dependent lookup. 12899 Expr *Args[2] = { First, Second }; 12900 unsigned NumArgs = 1 + (Second != nullptr); 12901 12902 // Create the overloaded operator invocation for unary operators. 12903 if (NumArgs == 1 || isPostIncDec) { 12904 UnaryOperatorKind Opc 12905 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12906 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12907 RequiresADL); 12908 } 12909 12910 if (Op == OO_Subscript) { 12911 SourceLocation LBrace; 12912 SourceLocation RBrace; 12913 12914 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12915 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12916 LBrace = SourceLocation::getFromRawEncoding( 12917 NameLoc.CXXOperatorName.BeginOpNameLoc); 12918 RBrace = SourceLocation::getFromRawEncoding( 12919 NameLoc.CXXOperatorName.EndOpNameLoc); 12920 } else { 12921 LBrace = Callee->getBeginLoc(); 12922 RBrace = OpLoc; 12923 } 12924 12925 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12926 First, Second); 12927 } 12928 12929 // Create the overloaded operator invocation for binary operators. 12930 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12931 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12932 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12933 if (Result.isInvalid()) 12934 return ExprError(); 12935 12936 return Result; 12937 } 12938 12939 template<typename Derived> 12940 ExprResult 12941 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12942 SourceLocation OperatorLoc, 12943 bool isArrow, 12944 CXXScopeSpec &SS, 12945 TypeSourceInfo *ScopeType, 12946 SourceLocation CCLoc, 12947 SourceLocation TildeLoc, 12948 PseudoDestructorTypeStorage Destroyed) { 12949 QualType BaseType = Base->getType(); 12950 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12951 (!isArrow && !BaseType->getAs<RecordType>()) || 12952 (isArrow && BaseType->getAs<PointerType>() && 12953 !BaseType->getAs<PointerType>()->getPointeeType() 12954 ->template getAs<RecordType>())){ 12955 // This pseudo-destructor expression is still a pseudo-destructor. 12956 return SemaRef.BuildPseudoDestructorExpr( 12957 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12958 CCLoc, TildeLoc, Destroyed); 12959 } 12960 12961 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12962 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12963 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12964 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12965 NameInfo.setNamedTypeInfo(DestroyedType); 12966 12967 // The scope type is now known to be a valid nested name specifier 12968 // component. Tack it on to the end of the nested name specifier. 12969 if (ScopeType) { 12970 if (!ScopeType->getType()->getAs<TagType>()) { 12971 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12972 diag::err_expected_class_or_namespace) 12973 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12974 return ExprError(); 12975 } 12976 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12977 CCLoc); 12978 } 12979 12980 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12981 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12982 OperatorLoc, isArrow, 12983 SS, TemplateKWLoc, 12984 /*FIXME: FirstQualifier*/ nullptr, 12985 NameInfo, 12986 /*TemplateArgs*/ nullptr, 12987 /*S*/nullptr); 12988 } 12989 12990 template<typename Derived> 12991 StmtResult 12992 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12993 SourceLocation Loc = S->getBeginLoc(); 12994 CapturedDecl *CD = S->getCapturedDecl(); 12995 unsigned NumParams = CD->getNumParams(); 12996 unsigned ContextParamPos = CD->getContextParamPosition(); 12997 SmallVector<Sema::CapturedParamNameType, 4> Params; 12998 for (unsigned I = 0; I < NumParams; ++I) { 12999 if (I != ContextParamPos) { 13000 Params.push_back( 13001 std::make_pair( 13002 CD->getParam(I)->getName(), 13003 getDerived().TransformType(CD->getParam(I)->getType()))); 13004 } else { 13005 Params.push_back(std::make_pair(StringRef(), QualType())); 13006 } 13007 } 13008 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 13009 S->getCapturedRegionKind(), Params); 13010 StmtResult Body; 13011 { 13012 Sema::CompoundScopeRAII CompoundScope(getSema()); 13013 Body = getDerived().TransformStmt(S->getCapturedStmt()); 13014 } 13015 13016 if (Body.isInvalid()) { 13017 getSema().ActOnCapturedRegionError(); 13018 return StmtError(); 13019 } 13020 13021 return getSema().ActOnCapturedRegionEnd(Body.get()); 13022 } 13023 13024 } // end namespace clang 13025 13026 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 13027