clang API Documentation
00001 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 //===----------------------------------------------------------------------===// 00008 // 00009 // This file implements a semantic tree transformation that takes a given 00010 // AST and rebuilds it, possibly transforming some nodes in the process. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H 00015 #define LLVM_CLANG_SEMA_TREETRANSFORM_H 00016 00017 #include "clang/Sema/SemaInternal.h" 00018 #include "clang/Sema/Lookup.h" 00019 #include "clang/Sema/ParsedTemplate.h" 00020 #include "clang/Sema/SemaDiagnostic.h" 00021 #include "clang/Sema/ScopeInfo.h" 00022 #include "clang/AST/Decl.h" 00023 #include "clang/AST/DeclObjC.h" 00024 #include "clang/AST/DeclTemplate.h" 00025 #include "clang/AST/Expr.h" 00026 #include "clang/AST/ExprCXX.h" 00027 #include "clang/AST/ExprObjC.h" 00028 #include "clang/AST/Stmt.h" 00029 #include "clang/AST/StmtCXX.h" 00030 #include "clang/AST/StmtObjC.h" 00031 #include "clang/Sema/Ownership.h" 00032 #include "clang/Sema/Designator.h" 00033 #include "clang/Lex/Preprocessor.h" 00034 #include "llvm/ADT/ArrayRef.h" 00035 #include "llvm/Support/ErrorHandling.h" 00036 #include "TypeLocBuilder.h" 00037 #include <algorithm> 00038 00039 namespace clang { 00040 using namespace sema; 00041 00042 /// \brief A semantic tree transformation that allows one to transform one 00043 /// abstract syntax tree into another. 00044 /// 00045 /// A new tree transformation is defined by creating a new subclass \c X of 00046 /// \c TreeTransform<X> and then overriding certain operations to provide 00047 /// behavior specific to that transformation. For example, template 00048 /// instantiation is implemented as a tree transformation where the 00049 /// transformation of TemplateTypeParmType nodes involves substituting the 00050 /// template arguments for their corresponding template parameters; a similar 00051 /// transformation is performed for non-type template parameters and 00052 /// template template parameters. 00053 /// 00054 /// This tree-transformation template uses static polymorphism to allow 00055 /// subclasses to customize any of its operations. Thus, a subclass can 00056 /// override any of the transformation or rebuild operators by providing an 00057 /// operation with the same signature as the default implementation. The 00058 /// overridding function should not be virtual. 00059 /// 00060 /// Semantic tree transformations are split into two stages, either of which 00061 /// can be replaced by a subclass. The "transform" step transforms an AST node 00062 /// or the parts of an AST node using the various transformation functions, 00063 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 00064 /// node of the appropriate kind from the pieces. The default transformation 00065 /// routines recursively transform the operands to composite AST nodes (e.g., 00066 /// the pointee type of a PointerType node) and, if any of those operand nodes 00067 /// were changed by the transformation, invokes the rebuild operation to create 00068 /// a new AST node. 00069 /// 00070 /// Subclasses can customize the transformation at various levels. The 00071 /// most coarse-grained transformations involve replacing TransformType(), 00072 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 00073 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 00074 /// new implementations. 00075 /// 00076 /// For more fine-grained transformations, subclasses can replace any of the 00077 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 00078 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 00079 /// replacing TransformTemplateTypeParmType() allows template instantiation 00080 /// to substitute template arguments for their corresponding template 00081 /// parameters. Additionally, subclasses can override the \c RebuildXXX 00082 /// functions to control how AST nodes are rebuilt when their operands change. 00083 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 00084 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 00085 /// be able to use more efficient rebuild steps. 00086 /// 00087 /// There are a handful of other functions that can be overridden, allowing one 00088 /// to avoid traversing nodes that don't need any transformation 00089 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 00090 /// operands have not changed (\c AlwaysRebuild()), and customize the 00091 /// default locations and entity names used for type-checking 00092 /// (\c getBaseLocation(), \c getBaseEntity()). 00093 template<typename Derived> 00094 class TreeTransform { 00095 /// \brief Private RAII object that helps us forget and then re-remember 00096 /// the template argument corresponding to a partially-substituted parameter 00097 /// pack. 00098 class ForgetPartiallySubstitutedPackRAII { 00099 Derived &Self; 00100 TemplateArgument Old; 00101 00102 public: 00103 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 00104 Old = Self.ForgetPartiallySubstitutedPack(); 00105 } 00106 00107 ~ForgetPartiallySubstitutedPackRAII() { 00108 Self.RememberPartiallySubstitutedPack(Old); 00109 } 00110 }; 00111 00112 protected: 00113 Sema &SemaRef; 00114 00115 /// \brief The set of local declarations that have been transformed, for 00116 /// cases where we are forced to build new declarations within the transformer 00117 /// rather than in the subclass (e.g., lambda closure types). 00118 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 00119 00120 public: 00121 /// \brief Initializes a new tree transformer. 00122 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 00123 00124 /// \brief Retrieves a reference to the derived class. 00125 Derived &getDerived() { return static_cast<Derived&>(*this); } 00126 00127 /// \brief Retrieves a reference to the derived class. 00128 const Derived &getDerived() const { 00129 return static_cast<const Derived&>(*this); 00130 } 00131 00132 static inline ExprResult Owned(Expr *E) { return E; } 00133 static inline StmtResult Owned(Stmt *S) { return S; } 00134 00135 /// \brief Retrieves a reference to the semantic analysis object used for 00136 /// this tree transform. 00137 Sema &getSema() const { return SemaRef; } 00138 00139 /// \brief Whether the transformation should always rebuild AST nodes, even 00140 /// if none of the children have changed. 00141 /// 00142 /// Subclasses may override this function to specify when the transformation 00143 /// should rebuild all AST nodes. 00144 bool AlwaysRebuild() { return false; } 00145 00146 /// \brief Returns the location of the entity being transformed, if that 00147 /// information was not available elsewhere in the AST. 00148 /// 00149 /// By default, returns no source-location information. Subclasses can 00150 /// provide an alternative implementation that provides better location 00151 /// information. 00152 SourceLocation getBaseLocation() { return SourceLocation(); } 00153 00154 /// \brief Returns the name of the entity being transformed, if that 00155 /// information was not available elsewhere in the AST. 00156 /// 00157 /// By default, returns an empty name. Subclasses can provide an alternative 00158 /// implementation with a more precise name. 00159 DeclarationName getBaseEntity() { return DeclarationName(); } 00160 00161 /// \brief Sets the "base" location and entity when that 00162 /// information is known based on another transformation. 00163 /// 00164 /// By default, the source location and entity are ignored. Subclasses can 00165 /// override this function to provide a customized implementation. 00166 void setBase(SourceLocation Loc, DeclarationName Entity) { } 00167 00168 /// \brief RAII object that temporarily sets the base location and entity 00169 /// used for reporting diagnostics in types. 00170 class TemporaryBase { 00171 TreeTransform &Self; 00172 SourceLocation OldLocation; 00173 DeclarationName OldEntity; 00174 00175 public: 00176 TemporaryBase(TreeTransform &Self, SourceLocation Location, 00177 DeclarationName Entity) : Self(Self) { 00178 OldLocation = Self.getDerived().getBaseLocation(); 00179 OldEntity = Self.getDerived().getBaseEntity(); 00180 00181 if (Location.isValid()) 00182 Self.getDerived().setBase(Location, Entity); 00183 } 00184 00185 ~TemporaryBase() { 00186 Self.getDerived().setBase(OldLocation, OldEntity); 00187 } 00188 }; 00189 00190 /// \brief Determine whether the given type \p T has already been 00191 /// transformed. 00192 /// 00193 /// Subclasses can provide an alternative implementation of this routine 00194 /// to short-circuit evaluation when it is known that a given type will 00195 /// not change. For example, template instantiation need not traverse 00196 /// non-dependent types. 00197 bool AlreadyTransformed(QualType T) { 00198 return T.isNull(); 00199 } 00200 00201 /// \brief Determine whether the given call argument should be dropped, e.g., 00202 /// because it is a default argument. 00203 /// 00204 /// Subclasses can provide an alternative implementation of this routine to 00205 /// determine which kinds of call arguments get dropped. By default, 00206 /// CXXDefaultArgument nodes are dropped (prior to transformation). 00207 bool DropCallArgument(Expr *E) { 00208 return E->isDefaultArgument(); 00209 } 00210 00211 /// \brief Determine whether we should expand a pack expansion with the 00212 /// given set of parameter packs into separate arguments by repeatedly 00213 /// transforming the pattern. 00214 /// 00215 /// By default, the transformer never tries to expand pack expansions. 00216 /// Subclasses can override this routine to provide different behavior. 00217 /// 00218 /// \param EllipsisLoc The location of the ellipsis that identifies the 00219 /// pack expansion. 00220 /// 00221 /// \param PatternRange The source range that covers the entire pattern of 00222 /// the pack expansion. 00223 /// 00224 /// \param Unexpanded The set of unexpanded parameter packs within the 00225 /// pattern. 00226 /// 00227 /// \param NumUnexpanded The number of unexpanded parameter packs in 00228 /// \p Unexpanded. 00229 /// 00230 /// \param ShouldExpand Will be set to \c true if the transformer should 00231 /// expand the corresponding pack expansions into separate arguments. When 00232 /// set, \c NumExpansions must also be set. 00233 /// 00234 /// \param RetainExpansion Whether the caller should add an unexpanded 00235 /// pack expansion after all of the expanded arguments. This is used 00236 /// when extending explicitly-specified template argument packs per 00237 /// C++0x [temp.arg.explicit]p9. 00238 /// 00239 /// \param NumExpansions The number of separate arguments that will be in 00240 /// the expanded form of the corresponding pack expansion. This is both an 00241 /// input and an output parameter, which can be set by the caller if the 00242 /// number of expansions is known a priori (e.g., due to a prior substitution) 00243 /// and will be set by the callee when the number of expansions is known. 00244 /// The callee must set this value when \c ShouldExpand is \c true; it may 00245 /// set this value in other cases. 00246 /// 00247 /// \returns true if an error occurred (e.g., because the parameter packs 00248 /// are to be instantiated with arguments of different lengths), false 00249 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 00250 /// must be set. 00251 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 00252 SourceRange PatternRange, 00253 llvm::ArrayRef<UnexpandedParameterPack> Unexpanded, 00254 bool &ShouldExpand, 00255 bool &RetainExpansion, 00256 llvm::Optional<unsigned> &NumExpansions) { 00257 ShouldExpand = false; 00258 return false; 00259 } 00260 00261 /// \brief "Forget" about the partially-substituted pack template argument, 00262 /// when performing an instantiation that must preserve the parameter pack 00263 /// use. 00264 /// 00265 /// This routine is meant to be overridden by the template instantiator. 00266 TemplateArgument ForgetPartiallySubstitutedPack() { 00267 return TemplateArgument(); 00268 } 00269 00270 /// \brief "Remember" the partially-substituted pack template argument 00271 /// after performing an instantiation that must preserve the parameter pack 00272 /// use. 00273 /// 00274 /// This routine is meant to be overridden by the template instantiator. 00275 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 00276 00277 /// \brief Note to the derived class when a function parameter pack is 00278 /// being expanded. 00279 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 00280 00281 /// \brief Transforms the given type into another type. 00282 /// 00283 /// By default, this routine transforms a type by creating a 00284 /// TypeSourceInfo for it and delegating to the appropriate 00285 /// function. This is expensive, but we don't mind, because 00286 /// this method is deprecated anyway; all users should be 00287 /// switched to storing TypeSourceInfos. 00288 /// 00289 /// \returns the transformed type. 00290 QualType TransformType(QualType T); 00291 00292 /// \brief Transforms the given type-with-location into a new 00293 /// type-with-location. 00294 /// 00295 /// By default, this routine transforms a type by delegating to the 00296 /// appropriate TransformXXXType to build a new type. Subclasses 00297 /// may override this function (to take over all type 00298 /// transformations) or some set of the TransformXXXType functions 00299 /// to alter the transformation. 00300 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 00301 00302 /// \brief Transform the given type-with-location into a new 00303 /// type, collecting location information in the given builder 00304 /// as necessary. 00305 /// 00306 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 00307 00308 /// \brief Transform the given statement. 00309 /// 00310 /// By default, this routine transforms a statement by delegating to the 00311 /// appropriate TransformXXXStmt function to transform a specific kind of 00312 /// statement or the TransformExpr() function to transform an expression. 00313 /// Subclasses may override this function to transform statements using some 00314 /// other mechanism. 00315 /// 00316 /// \returns the transformed statement. 00317 StmtResult TransformStmt(Stmt *S); 00318 00319 /// \brief Transform the given expression. 00320 /// 00321 /// By default, this routine transforms an expression by delegating to the 00322 /// appropriate TransformXXXExpr function to build a new expression. 00323 /// Subclasses may override this function to transform expressions using some 00324 /// other mechanism. 00325 /// 00326 /// \returns the transformed expression. 00327 ExprResult TransformExpr(Expr *E); 00328 00329 /// \brief Transform the given list of expressions. 00330 /// 00331 /// This routine transforms a list of expressions by invoking 00332 /// \c TransformExpr() for each subexpression. However, it also provides 00333 /// support for variadic templates by expanding any pack expansions (if the 00334 /// derived class permits such expansion) along the way. When pack expansions 00335 /// are present, the number of outputs may not equal the number of inputs. 00336 /// 00337 /// \param Inputs The set of expressions to be transformed. 00338 /// 00339 /// \param NumInputs The number of expressions in \c Inputs. 00340 /// 00341 /// \param IsCall If \c true, then this transform is being performed on 00342 /// function-call arguments, and any arguments that should be dropped, will 00343 /// be. 00344 /// 00345 /// \param Outputs The transformed input expressions will be added to this 00346 /// vector. 00347 /// 00348 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 00349 /// due to transformation. 00350 /// 00351 /// \returns true if an error occurred, false otherwise. 00352 bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall, 00353 SmallVectorImpl<Expr *> &Outputs, 00354 bool *ArgChanged = 0); 00355 00356 /// \brief Transform the given declaration, which is referenced from a type 00357 /// or expression. 00358 /// 00359 /// By default, acts as the identity function on declarations, unless the 00360 /// transformer has had to transform the declaration itself. Subclasses 00361 /// may override this function to provide alternate behavior. 00362 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 00363 llvm::DenseMap<Decl *, Decl *>::iterator Known 00364 = TransformedLocalDecls.find(D); 00365 if (Known != TransformedLocalDecls.end()) 00366 return Known->second; 00367 00368 return D; 00369 } 00370 00371 /// \brief Transform the attributes associated with the given declaration and 00372 /// place them on the new declaration. 00373 /// 00374 /// By default, this operation does nothing. Subclasses may override this 00375 /// behavior to transform attributes. 00376 void transformAttrs(Decl *Old, Decl *New) { } 00377 00378 /// \brief Note that a local declaration has been transformed by this 00379 /// transformer. 00380 /// 00381 /// Local declarations are typically transformed via a call to 00382 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 00383 /// the transformer itself has to transform the declarations. This routine 00384 /// can be overridden by a subclass that keeps track of such mappings. 00385 void transformedLocalDecl(Decl *Old, Decl *New) { 00386 TransformedLocalDecls[Old] = New; 00387 } 00388 00389 /// \brief Transform the definition of the given declaration. 00390 /// 00391 /// By default, invokes TransformDecl() to transform the declaration. 00392 /// Subclasses may override this function to provide alternate behavior. 00393 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 00394 return getDerived().TransformDecl(Loc, D); 00395 } 00396 00397 /// \brief Transform the given declaration, which was the first part of a 00398 /// nested-name-specifier in a member access expression. 00399 /// 00400 /// This specific declaration transformation only applies to the first 00401 /// identifier in a nested-name-specifier of a member access expression, e.g., 00402 /// the \c T in \c x->T::member 00403 /// 00404 /// By default, invokes TransformDecl() to transform the declaration. 00405 /// Subclasses may override this function to provide alternate behavior. 00406 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 00407 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 00408 } 00409 00410 /// \brief Transform the given nested-name-specifier with source-location 00411 /// information. 00412 /// 00413 /// By default, transforms all of the types and declarations within the 00414 /// nested-name-specifier. Subclasses may override this function to provide 00415 /// alternate behavior. 00416 NestedNameSpecifierLoc TransformNestedNameSpecifierLoc( 00417 NestedNameSpecifierLoc NNS, 00418 QualType ObjectType = QualType(), 00419 NamedDecl *FirstQualifierInScope = 0); 00420 00421 /// \brief Transform the given declaration name. 00422 /// 00423 /// By default, transforms the types of conversion function, constructor, 00424 /// and destructor names and then (if needed) rebuilds the declaration name. 00425 /// Identifiers and selectors are returned unmodified. Sublcasses may 00426 /// override this function to provide alternate behavior. 00427 DeclarationNameInfo 00428 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 00429 00430 /// \brief Transform the given template name. 00431 /// 00432 /// \param SS The nested-name-specifier that qualifies the template 00433 /// name. This nested-name-specifier must already have been transformed. 00434 /// 00435 /// \param Name The template name to transform. 00436 /// 00437 /// \param NameLoc The source location of the template name. 00438 /// 00439 /// \param ObjectType If we're translating a template name within a member 00440 /// access expression, this is the type of the object whose member template 00441 /// is being referenced. 00442 /// 00443 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 00444 /// also refers to a name within the current (lexical) scope, this is the 00445 /// declaration it refers to. 00446 /// 00447 /// By default, transforms the template name by transforming the declarations 00448 /// and nested-name-specifiers that occur within the template name. 00449 /// Subclasses may override this function to provide alternate behavior. 00450 TemplateName TransformTemplateName(CXXScopeSpec &SS, 00451 TemplateName Name, 00452 SourceLocation NameLoc, 00453 QualType ObjectType = QualType(), 00454 NamedDecl *FirstQualifierInScope = 0); 00455 00456 /// \brief Transform the given template argument. 00457 /// 00458 /// By default, this operation transforms the type, expression, or 00459 /// declaration stored within the template argument and constructs a 00460 /// new template argument from the transformed result. Subclasses may 00461 /// override this function to provide alternate behavior. 00462 /// 00463 /// Returns true if there was an error. 00464 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 00465 TemplateArgumentLoc &Output); 00466 00467 /// \brief Transform the given set of template arguments. 00468 /// 00469 /// By default, this operation transforms all of the template arguments 00470 /// in the input set using \c TransformTemplateArgument(), and appends 00471 /// the transformed arguments to the output list. 00472 /// 00473 /// Note that this overload of \c TransformTemplateArguments() is merely 00474 /// a convenience function. Subclasses that wish to override this behavior 00475 /// should override the iterator-based member template version. 00476 /// 00477 /// \param Inputs The set of template arguments to be transformed. 00478 /// 00479 /// \param NumInputs The number of template arguments in \p Inputs. 00480 /// 00481 /// \param Outputs The set of transformed template arguments output by this 00482 /// routine. 00483 /// 00484 /// Returns true if an error occurred. 00485 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 00486 unsigned NumInputs, 00487 TemplateArgumentListInfo &Outputs) { 00488 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs); 00489 } 00490 00491 /// \brief Transform the given set of template arguments. 00492 /// 00493 /// By default, this operation transforms all of the template arguments 00494 /// in the input set using \c TransformTemplateArgument(), and appends 00495 /// the transformed arguments to the output list. 00496 /// 00497 /// \param First An iterator to the first template argument. 00498 /// 00499 /// \param Last An iterator one step past the last template argument. 00500 /// 00501 /// \param Outputs The set of transformed template arguments output by this 00502 /// routine. 00503 /// 00504 /// Returns true if an error occurred. 00505 template<typename InputIterator> 00506 bool TransformTemplateArguments(InputIterator First, 00507 InputIterator Last, 00508 TemplateArgumentListInfo &Outputs); 00509 00510 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 00511 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 00512 TemplateArgumentLoc &ArgLoc); 00513 00514 /// \brief Fakes up a TypeSourceInfo for a type. 00515 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 00516 return SemaRef.Context.getTrivialTypeSourceInfo(T, 00517 getDerived().getBaseLocation()); 00518 } 00519 00520 #define ABSTRACT_TYPELOC(CLASS, PARENT) 00521 #define TYPELOC(CLASS, PARENT) \ 00522 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 00523 #include "clang/AST/TypeLocNodes.def" 00524 00525 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 00526 FunctionProtoTypeLoc TL, 00527 CXXRecordDecl *ThisContext, 00528 unsigned ThisTypeQuals); 00529 00530 StmtResult 00531 TransformSEHHandler(Stmt *Handler); 00532 00533 QualType 00534 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 00535 TemplateSpecializationTypeLoc TL, 00536 TemplateName Template); 00537 00538 QualType 00539 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 00540 DependentTemplateSpecializationTypeLoc TL, 00541 TemplateName Template, 00542 CXXScopeSpec &SS); 00543 00544 QualType 00545 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 00546 DependentTemplateSpecializationTypeLoc TL, 00547 NestedNameSpecifierLoc QualifierLoc); 00548 00549 /// \brief Transforms the parameters of a function type into the 00550 /// given vectors. 00551 /// 00552 /// The result vectors should be kept in sync; null entries in the 00553 /// variables vector are acceptable. 00554 /// 00555 /// Return true on error. 00556 bool TransformFunctionTypeParams(SourceLocation Loc, 00557 ParmVarDecl **Params, unsigned NumParams, 00558 const QualType *ParamTypes, 00559 SmallVectorImpl<QualType> &PTypes, 00560 SmallVectorImpl<ParmVarDecl*> *PVars); 00561 00562 /// \brief Transforms a single function-type parameter. Return null 00563 /// on error. 00564 /// 00565 /// \param indexAdjustment - A number to add to the parameter's 00566 /// scope index; can be negative 00567 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 00568 int indexAdjustment, 00569 llvm::Optional<unsigned> NumExpansions, 00570 bool ExpectParameterPack); 00571 00572 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 00573 00574 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 00575 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 00576 00577 #define STMT(Node, Parent) \ 00578 StmtResult Transform##Node(Node *S); 00579 #define EXPR(Node, Parent) \ 00580 ExprResult Transform##Node(Node *E); 00581 #define ABSTRACT_STMT(Stmt) 00582 #include "clang/AST/StmtNodes.inc" 00583 00584 /// \brief Build a new pointer type given its pointee type. 00585 /// 00586 /// By default, performs semantic analysis when building the pointer type. 00587 /// Subclasses may override this routine to provide different behavior. 00588 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 00589 00590 /// \brief Build a new block pointer type given its pointee type. 00591 /// 00592 /// By default, performs semantic analysis when building the block pointer 00593 /// type. Subclasses may override this routine to provide different behavior. 00594 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 00595 00596 /// \brief Build a new reference type given the type it references. 00597 /// 00598 /// By default, performs semantic analysis when building the 00599 /// reference type. Subclasses may override this routine to provide 00600 /// different behavior. 00601 /// 00602 /// \param LValue whether the type was written with an lvalue sigil 00603 /// or an rvalue sigil. 00604 QualType RebuildReferenceType(QualType ReferentType, 00605 bool LValue, 00606 SourceLocation Sigil); 00607 00608 /// \brief Build a new member pointer type given the pointee type and the 00609 /// class type it refers into. 00610 /// 00611 /// By default, performs semantic analysis when building the member pointer 00612 /// type. Subclasses may override this routine to provide different behavior. 00613 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 00614 SourceLocation Sigil); 00615 00616 /// \brief Build a new array type given the element type, size 00617 /// modifier, size of the array (if known), size expression, and index type 00618 /// qualifiers. 00619 /// 00620 /// By default, performs semantic analysis when building the array type. 00621 /// Subclasses may override this routine to provide different behavior. 00622 /// Also by default, all of the other Rebuild*Array 00623 QualType RebuildArrayType(QualType ElementType, 00624 ArrayType::ArraySizeModifier SizeMod, 00625 const llvm::APInt *Size, 00626 Expr *SizeExpr, 00627 unsigned IndexTypeQuals, 00628 SourceRange BracketsRange); 00629 00630 /// \brief Build a new constant array type given the element type, size 00631 /// modifier, (known) size of the array, and index type qualifiers. 00632 /// 00633 /// By default, performs semantic analysis when building the array type. 00634 /// Subclasses may override this routine to provide different behavior. 00635 QualType RebuildConstantArrayType(QualType ElementType, 00636 ArrayType::ArraySizeModifier SizeMod, 00637 const llvm::APInt &Size, 00638 unsigned IndexTypeQuals, 00639 SourceRange BracketsRange); 00640 00641 /// \brief Build a new incomplete array type given the element type, size 00642 /// modifier, and index type qualifiers. 00643 /// 00644 /// By default, performs semantic analysis when building the array type. 00645 /// Subclasses may override this routine to provide different behavior. 00646 QualType RebuildIncompleteArrayType(QualType ElementType, 00647 ArrayType::ArraySizeModifier SizeMod, 00648 unsigned IndexTypeQuals, 00649 SourceRange BracketsRange); 00650 00651 /// \brief Build a new variable-length array type given the element type, 00652 /// size modifier, size expression, and index type qualifiers. 00653 /// 00654 /// By default, performs semantic analysis when building the array type. 00655 /// Subclasses may override this routine to provide different behavior. 00656 QualType RebuildVariableArrayType(QualType ElementType, 00657 ArrayType::ArraySizeModifier SizeMod, 00658 Expr *SizeExpr, 00659 unsigned IndexTypeQuals, 00660 SourceRange BracketsRange); 00661 00662 /// \brief Build a new dependent-sized array type given the element type, 00663 /// size modifier, size expression, and index type qualifiers. 00664 /// 00665 /// By default, performs semantic analysis when building the array type. 00666 /// Subclasses may override this routine to provide different behavior. 00667 QualType RebuildDependentSizedArrayType(QualType ElementType, 00668 ArrayType::ArraySizeModifier SizeMod, 00669 Expr *SizeExpr, 00670 unsigned IndexTypeQuals, 00671 SourceRange BracketsRange); 00672 00673 /// \brief Build a new vector type given the element type and 00674 /// number of elements. 00675 /// 00676 /// By default, performs semantic analysis when building the vector type. 00677 /// Subclasses may override this routine to provide different behavior. 00678 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 00679 VectorType::VectorKind VecKind); 00680 00681 /// \brief Build a new extended vector type given the element type and 00682 /// number of elements. 00683 /// 00684 /// By default, performs semantic analysis when building the vector type. 00685 /// Subclasses may override this routine to provide different behavior. 00686 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 00687 SourceLocation AttributeLoc); 00688 00689 /// \brief Build a new potentially dependently-sized extended vector type 00690 /// given the element type and number of elements. 00691 /// 00692 /// By default, performs semantic analysis when building the vector type. 00693 /// Subclasses may override this routine to provide different behavior. 00694 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 00695 Expr *SizeExpr, 00696 SourceLocation AttributeLoc); 00697 00698 /// \brief Build a new function type. 00699 /// 00700 /// By default, performs semantic analysis when building the function type. 00701 /// Subclasses may override this routine to provide different behavior. 00702 QualType RebuildFunctionProtoType(QualType T, 00703 QualType *ParamTypes, 00704 unsigned NumParamTypes, 00705 bool Variadic, bool HasTrailingReturn, 00706 unsigned Quals, 00707 RefQualifierKind RefQualifier, 00708 const FunctionType::ExtInfo &Info); 00709 00710 /// \brief Build a new unprototyped function type. 00711 QualType RebuildFunctionNoProtoType(QualType ResultType); 00712 00713 /// \brief Rebuild an unresolved typename type, given the decl that 00714 /// the UnresolvedUsingTypenameDecl was transformed to. 00715 QualType RebuildUnresolvedUsingType(Decl *D); 00716 00717 /// \brief Build a new typedef type. 00718 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 00719 return SemaRef.Context.getTypeDeclType(Typedef); 00720 } 00721 00722 /// \brief Build a new class/struct/union type. 00723 QualType RebuildRecordType(RecordDecl *Record) { 00724 return SemaRef.Context.getTypeDeclType(Record); 00725 } 00726 00727 /// \brief Build a new Enum type. 00728 QualType RebuildEnumType(EnumDecl *Enum) { 00729 return SemaRef.Context.getTypeDeclType(Enum); 00730 } 00731 00732 /// \brief Build a new typeof(expr) type. 00733 /// 00734 /// By default, performs semantic analysis when building the typeof type. 00735 /// Subclasses may override this routine to provide different behavior. 00736 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 00737 00738 /// \brief Build a new typeof(type) type. 00739 /// 00740 /// By default, builds a new TypeOfType with the given underlying type. 00741 QualType RebuildTypeOfType(QualType Underlying); 00742 00743 /// \brief Build a new unary transform type. 00744 QualType RebuildUnaryTransformType(QualType BaseType, 00745 UnaryTransformType::UTTKind UKind, 00746 SourceLocation Loc); 00747 00748 /// \brief Build a new C++0x decltype type. 00749 /// 00750 /// By default, performs semantic analysis when building the decltype type. 00751 /// Subclasses may override this routine to provide different behavior. 00752 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 00753 00754 /// \brief Build a new C++0x auto type. 00755 /// 00756 /// By default, builds a new AutoType with the given deduced type. 00757 QualType RebuildAutoType(QualType Deduced) { 00758 return SemaRef.Context.getAutoType(Deduced); 00759 } 00760 00761 /// \brief Build a new template specialization type. 00762 /// 00763 /// By default, performs semantic analysis when building the template 00764 /// specialization type. Subclasses may override this routine to provide 00765 /// different behavior. 00766 QualType RebuildTemplateSpecializationType(TemplateName Template, 00767 SourceLocation TemplateLoc, 00768 TemplateArgumentListInfo &Args); 00769 00770 /// \brief Build a new parenthesized type. 00771 /// 00772 /// By default, builds a new ParenType type from the inner type. 00773 /// Subclasses may override this routine to provide different behavior. 00774 QualType RebuildParenType(QualType InnerType) { 00775 return SemaRef.Context.getParenType(InnerType); 00776 } 00777 00778 /// \brief Build a new qualified name type. 00779 /// 00780 /// By default, builds a new ElaboratedType type from the keyword, 00781 /// the nested-name-specifier and the named type. 00782 /// Subclasses may override this routine to provide different behavior. 00783 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 00784 ElaboratedTypeKeyword Keyword, 00785 NestedNameSpecifierLoc QualifierLoc, 00786 QualType Named) { 00787 return SemaRef.Context.getElaboratedType(Keyword, 00788 QualifierLoc.getNestedNameSpecifier(), 00789 Named); 00790 } 00791 00792 /// \brief Build a new typename type that refers to a template-id. 00793 /// 00794 /// By default, builds a new DependentNameType type from the 00795 /// nested-name-specifier and the given type. Subclasses may override 00796 /// this routine to provide different behavior. 00797 QualType RebuildDependentTemplateSpecializationType( 00798 ElaboratedTypeKeyword Keyword, 00799 NestedNameSpecifierLoc QualifierLoc, 00800 const IdentifierInfo *Name, 00801 SourceLocation NameLoc, 00802 TemplateArgumentListInfo &Args) { 00803 // Rebuild the template name. 00804 // TODO: avoid TemplateName abstraction 00805 CXXScopeSpec SS; 00806 SS.Adopt(QualifierLoc); 00807 TemplateName InstName 00808 = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0); 00809 00810 if (InstName.isNull()) 00811 return QualType(); 00812 00813 // If it's still dependent, make a dependent specialization. 00814 if (InstName.getAsDependentTemplateName()) 00815 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 00816 QualifierLoc.getNestedNameSpecifier(), 00817 Name, 00818 Args); 00819 00820 // Otherwise, make an elaborated type wrapping a non-dependent 00821 // specialization. 00822 QualType T = 00823 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 00824 if (T.isNull()) return QualType(); 00825 00826 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0) 00827 return T; 00828 00829 return SemaRef.Context.getElaboratedType(Keyword, 00830 QualifierLoc.getNestedNameSpecifier(), 00831 T); 00832 } 00833 00834 /// \brief Build a new typename type that refers to an identifier. 00835 /// 00836 /// By default, performs semantic analysis when building the typename type 00837 /// (or elaborated type). Subclasses may override this routine to provide 00838 /// different behavior. 00839 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 00840 SourceLocation KeywordLoc, 00841 NestedNameSpecifierLoc QualifierLoc, 00842 const IdentifierInfo *Id, 00843 SourceLocation IdLoc) { 00844 CXXScopeSpec SS; 00845 SS.Adopt(QualifierLoc); 00846 00847 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 00848 // If the name is still dependent, just build a new dependent name type. 00849 if (!SemaRef.computeDeclContext(SS)) 00850 return SemaRef.Context.getDependentNameType(Keyword, 00851 QualifierLoc.getNestedNameSpecifier(), 00852 Id); 00853 } 00854 00855 if (Keyword == ETK_None || Keyword == ETK_Typename) 00856 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 00857 *Id, IdLoc); 00858 00859 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 00860 00861 // We had a dependent elaborated-type-specifier that has been transformed 00862 // into a non-dependent elaborated-type-specifier. Find the tag we're 00863 // referring to. 00864 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 00865 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 00866 if (!DC) 00867 return QualType(); 00868 00869 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 00870 return QualType(); 00871 00872 TagDecl *Tag = 0; 00873 SemaRef.LookupQualifiedName(Result, DC); 00874 switch (Result.getResultKind()) { 00875 case LookupResult::NotFound: 00876 case LookupResult::NotFoundInCurrentInstantiation: 00877 break; 00878 00879 case LookupResult::Found: 00880 Tag = Result.getAsSingle<TagDecl>(); 00881 break; 00882 00883 case LookupResult::FoundOverloaded: 00884 case LookupResult::FoundUnresolvedValue: 00885 llvm_unreachable("Tag lookup cannot find non-tags"); 00886 00887 case LookupResult::Ambiguous: 00888 // Let the LookupResult structure handle ambiguities. 00889 return QualType(); 00890 } 00891 00892 if (!Tag) { 00893 // Check where the name exists but isn't a tag type and use that to emit 00894 // better diagnostics. 00895 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 00896 SemaRef.LookupQualifiedName(Result, DC); 00897 switch (Result.getResultKind()) { 00898 case LookupResult::Found: 00899 case LookupResult::FoundOverloaded: 00900 case LookupResult::FoundUnresolvedValue: { 00901 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 00902 unsigned Kind = 0; 00903 if (isa<TypedefDecl>(SomeDecl)) Kind = 1; 00904 else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2; 00905 else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3; 00906 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; 00907 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 00908 break; 00909 } 00910 default: 00911 // FIXME: Would be nice to highlight just the source range. 00912 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 00913 << Kind << Id << DC; 00914 break; 00915 } 00916 return QualType(); 00917 } 00918 00919 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 00920 IdLoc, *Id)) { 00921 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 00922 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 00923 return QualType(); 00924 } 00925 00926 // Build the elaborated-type-specifier type. 00927 QualType T = SemaRef.Context.getTypeDeclType(Tag); 00928 return SemaRef.Context.getElaboratedType(Keyword, 00929 QualifierLoc.getNestedNameSpecifier(), 00930 T); 00931 } 00932 00933 /// \brief Build a new pack expansion type. 00934 /// 00935 /// By default, builds a new PackExpansionType type from the given pattern. 00936 /// Subclasses may override this routine to provide different behavior. 00937 QualType RebuildPackExpansionType(QualType Pattern, 00938 SourceRange PatternRange, 00939 SourceLocation EllipsisLoc, 00940 llvm::Optional<unsigned> NumExpansions) { 00941 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 00942 NumExpansions); 00943 } 00944 00945 /// \brief Build a new atomic type given its value type. 00946 /// 00947 /// By default, performs semantic analysis when building the atomic type. 00948 /// Subclasses may override this routine to provide different behavior. 00949 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 00950 00951 /// \brief Build a new template name given a nested name specifier, a flag 00952 /// indicating whether the "template" keyword was provided, and the template 00953 /// that the template name refers to. 00954 /// 00955 /// By default, builds the new template name directly. Subclasses may override 00956 /// this routine to provide different behavior. 00957 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 00958 bool TemplateKW, 00959 TemplateDecl *Template); 00960 00961 /// \brief Build a new template name given a nested name specifier and the 00962 /// name that is referred to as a template. 00963 /// 00964 /// By default, performs semantic analysis to determine whether the name can 00965 /// be resolved to a specific template, then builds the appropriate kind of 00966 /// template name. Subclasses may override this routine to provide different 00967 /// behavior. 00968 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 00969 const IdentifierInfo &Name, 00970 SourceLocation NameLoc, 00971 QualType ObjectType, 00972 NamedDecl *FirstQualifierInScope); 00973 00974 /// \brief Build a new template name given a nested name specifier and the 00975 /// overloaded operator name that is referred to as a template. 00976 /// 00977 /// By default, performs semantic analysis to determine whether the name can 00978 /// be resolved to a specific template, then builds the appropriate kind of 00979 /// template name. Subclasses may override this routine to provide different 00980 /// behavior. 00981 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 00982 OverloadedOperatorKind Operator, 00983 SourceLocation NameLoc, 00984 QualType ObjectType); 00985 00986 /// \brief Build a new template name given a template template parameter pack 00987 /// and the 00988 /// 00989 /// By default, performs semantic analysis to determine whether the name can 00990 /// be resolved to a specific template, then builds the appropriate kind of 00991 /// template name. Subclasses may override this routine to provide different 00992 /// behavior. 00993 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 00994 const TemplateArgument &ArgPack) { 00995 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 00996 } 00997 00998 /// \brief Build a new compound statement. 00999 /// 01000 /// By default, performs semantic analysis to build the new statement. 01001 /// Subclasses may override this routine to provide different behavior. 01002 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 01003 MultiStmtArg Statements, 01004 SourceLocation RBraceLoc, 01005 bool IsStmtExpr) { 01006 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 01007 IsStmtExpr); 01008 } 01009 01010 /// \brief Build a new case statement. 01011 /// 01012 /// By default, performs semantic analysis to build the new statement. 01013 /// Subclasses may override this routine to provide different behavior. 01014 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 01015 Expr *LHS, 01016 SourceLocation EllipsisLoc, 01017 Expr *RHS, 01018 SourceLocation ColonLoc) { 01019 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 01020 ColonLoc); 01021 } 01022 01023 /// \brief Attach the body to a new case statement. 01024 /// 01025 /// By default, performs semantic analysis to build the new statement. 01026 /// Subclasses may override this routine to provide different behavior. 01027 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 01028 getSema().ActOnCaseStmtBody(S, Body); 01029 return S; 01030 } 01031 01032 /// \brief Build a new default statement. 01033 /// 01034 /// By default, performs semantic analysis to build the new statement. 01035 /// Subclasses may override this routine to provide different behavior. 01036 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 01037 SourceLocation ColonLoc, 01038 Stmt *SubStmt) { 01039 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 01040 /*CurScope=*/0); 01041 } 01042 01043 /// \brief Build a new label statement. 01044 /// 01045 /// By default, performs semantic analysis to build the new statement. 01046 /// Subclasses may override this routine to provide different behavior. 01047 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 01048 SourceLocation ColonLoc, Stmt *SubStmt) { 01049 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 01050 } 01051 01052 /// \brief Build a new label statement. 01053 /// 01054 /// By default, performs semantic analysis to build the new statement. 01055 /// Subclasses may override this routine to provide different behavior. 01056 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, const AttrVec &Attrs, 01057 Stmt *SubStmt) { 01058 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 01059 } 01060 01061 /// \brief Build a new "if" statement. 01062 /// 01063 /// By default, performs semantic analysis to build the new statement. 01064 /// Subclasses may override this routine to provide different behavior. 01065 StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 01066 VarDecl *CondVar, Stmt *Then, 01067 SourceLocation ElseLoc, Stmt *Else) { 01068 return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else); 01069 } 01070 01071 /// \brief Start building a new switch statement. 01072 /// 01073 /// By default, performs semantic analysis to build the new statement. 01074 /// Subclasses may override this routine to provide different behavior. 01075 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 01076 Expr *Cond, VarDecl *CondVar) { 01077 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond, 01078 CondVar); 01079 } 01080 01081 /// \brief Attach the body to the switch statement. 01082 /// 01083 /// By default, performs semantic analysis to build the new statement. 01084 /// Subclasses may override this routine to provide different behavior. 01085 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 01086 Stmt *Switch, Stmt *Body) { 01087 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 01088 } 01089 01090 /// \brief Build a new while statement. 01091 /// 01092 /// By default, performs semantic analysis to build the new statement. 01093 /// Subclasses may override this routine to provide different behavior. 01094 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond, 01095 VarDecl *CondVar, Stmt *Body) { 01096 return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body); 01097 } 01098 01099 /// \brief Build a new do-while statement. 01100 /// 01101 /// By default, performs semantic analysis to build the new statement. 01102 /// Subclasses may override this routine to provide different behavior. 01103 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 01104 SourceLocation WhileLoc, SourceLocation LParenLoc, 01105 Expr *Cond, SourceLocation RParenLoc) { 01106 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 01107 Cond, RParenLoc); 01108 } 01109 01110 /// \brief Build a new for statement. 01111 /// 01112 /// By default, performs semantic analysis to build the new statement. 01113 /// Subclasses may override this routine to provide different behavior. 01114 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 01115 Stmt *Init, Sema::FullExprArg Cond, 01116 VarDecl *CondVar, Sema::FullExprArg Inc, 01117 SourceLocation RParenLoc, Stmt *Body) { 01118 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 01119 CondVar, Inc, RParenLoc, Body); 01120 } 01121 01122 /// \brief Build a new goto statement. 01123 /// 01124 /// By default, performs semantic analysis to build the new statement. 01125 /// Subclasses may override this routine to provide different behavior. 01126 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 01127 LabelDecl *Label) { 01128 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 01129 } 01130 01131 /// \brief Build a new indirect goto statement. 01132 /// 01133 /// By default, performs semantic analysis to build the new statement. 01134 /// Subclasses may override this routine to provide different behavior. 01135 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 01136 SourceLocation StarLoc, 01137 Expr *Target) { 01138 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 01139 } 01140 01141 /// \brief Build a new return statement. 01142 /// 01143 /// By default, performs semantic analysis to build the new statement. 01144 /// Subclasses may override this routine to provide different behavior. 01145 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 01146 return getSema().ActOnReturnStmt(ReturnLoc, Result); 01147 } 01148 01149 /// \brief Build a new declaration statement. 01150 /// 01151 /// By default, performs semantic analysis to build the new statement. 01152 /// Subclasses may override this routine to provide different behavior. 01153 StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 01154 SourceLocation StartLoc, 01155 SourceLocation EndLoc) { 01156 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls, NumDecls); 01157 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 01158 } 01159 01160 /// \brief Build a new inline asm statement. 01161 /// 01162 /// By default, performs semantic analysis to build the new statement. 01163 /// Subclasses may override this routine to provide different behavior. 01164 StmtResult RebuildAsmStmt(SourceLocation AsmLoc, 01165 bool IsSimple, 01166 bool IsVolatile, 01167 unsigned NumOutputs, 01168 unsigned NumInputs, 01169 IdentifierInfo **Names, 01170 MultiExprArg Constraints, 01171 MultiExprArg Exprs, 01172 Expr *AsmString, 01173 MultiExprArg Clobbers, 01174 SourceLocation RParenLoc, 01175 bool MSAsm) { 01176 return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 01177 NumInputs, Names, move(Constraints), 01178 Exprs, AsmString, Clobbers, 01179 RParenLoc, MSAsm); 01180 } 01181 01182 /// \brief Build a new Objective-C @try statement. 01183 /// 01184 /// By default, performs semantic analysis to build the new statement. 01185 /// Subclasses may override this routine to provide different behavior. 01186 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 01187 Stmt *TryBody, 01188 MultiStmtArg CatchStmts, 01189 Stmt *Finally) { 01190 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts), 01191 Finally); 01192 } 01193 01194 /// \brief Rebuild an Objective-C exception declaration. 01195 /// 01196 /// By default, performs semantic analysis to build the new declaration. 01197 /// Subclasses may override this routine to provide different behavior. 01198 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 01199 TypeSourceInfo *TInfo, QualType T) { 01200 return getSema().BuildObjCExceptionDecl(TInfo, T, 01201 ExceptionDecl->getInnerLocStart(), 01202 ExceptionDecl->getLocation(), 01203 ExceptionDecl->getIdentifier()); 01204 } 01205 01206 /// \brief Build a new Objective-C @catch statement. 01207 /// 01208 /// By default, performs semantic analysis to build the new statement. 01209 /// Subclasses may override this routine to provide different behavior. 01210 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 01211 SourceLocation RParenLoc, 01212 VarDecl *Var, 01213 Stmt *Body) { 01214 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 01215 Var, Body); 01216 } 01217 01218 /// \brief Build a new Objective-C @finally statement. 01219 /// 01220 /// By default, performs semantic analysis to build the new statement. 01221 /// Subclasses may override this routine to provide different behavior. 01222 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 01223 Stmt *Body) { 01224 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 01225 } 01226 01227 /// \brief Build a new Objective-C @throw statement. 01228 /// 01229 /// By default, performs semantic analysis to build the new statement. 01230 /// Subclasses may override this routine to provide different behavior. 01231 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 01232 Expr *Operand) { 01233 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 01234 } 01235 01236 /// \brief Rebuild the operand to an Objective-C @synchronized statement. 01237 /// 01238 /// By default, performs semantic analysis to build the new statement. 01239 /// Subclasses may override this routine to provide different behavior. 01240 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 01241 Expr *object) { 01242 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 01243 } 01244 01245 /// \brief Build a new Objective-C @synchronized statement. 01246 /// 01247 /// By default, performs semantic analysis to build the new statement. 01248 /// Subclasses may override this routine to provide different behavior. 01249 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 01250 Expr *Object, Stmt *Body) { 01251 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 01252 } 01253 01254 /// \brief Build a new Objective-C @autoreleasepool statement. 01255 /// 01256 /// By default, performs semantic analysis to build the new statement. 01257 /// Subclasses may override this routine to provide different behavior. 01258 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 01259 Stmt *Body) { 01260 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 01261 } 01262 01263 /// \brief Build the collection operand to a new Objective-C fast 01264 /// enumeration statement. 01265 /// 01266 /// By default, performs semantic analysis to build the new statement. 01267 /// Subclasses may override this routine to provide different behavior. 01268 ExprResult RebuildObjCForCollectionOperand(SourceLocation forLoc, 01269 Expr *collection) { 01270 return getSema().ActOnObjCForCollectionOperand(forLoc, collection); 01271 } 01272 01273 /// \brief Build a new Objective-C fast enumeration statement. 01274 /// 01275 /// By default, performs semantic analysis to build the new statement. 01276 /// Subclasses may override this routine to provide different behavior. 01277 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 01278 SourceLocation LParenLoc, 01279 Stmt *Element, 01280 Expr *Collection, 01281 SourceLocation RParenLoc, 01282 Stmt *Body) { 01283 return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc, 01284 Element, 01285 Collection, 01286 RParenLoc, 01287 Body); 01288 } 01289 01290 /// \brief Build a new C++ exception declaration. 01291 /// 01292 /// By default, performs semantic analysis to build the new decaration. 01293 /// Subclasses may override this routine to provide different behavior. 01294 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 01295 TypeSourceInfo *Declarator, 01296 SourceLocation StartLoc, 01297 SourceLocation IdLoc, 01298 IdentifierInfo *Id) { 01299 VarDecl *Var = getSema().BuildExceptionDeclaration(0, Declarator, 01300 StartLoc, IdLoc, Id); 01301 if (Var) 01302 getSema().CurContext->addDecl(Var); 01303 return Var; 01304 } 01305 01306 /// \brief Build a new C++ catch statement. 01307 /// 01308 /// By default, performs semantic analysis to build the new statement. 01309 /// Subclasses may override this routine to provide different behavior. 01310 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 01311 VarDecl *ExceptionDecl, 01312 Stmt *Handler) { 01313 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 01314 Handler)); 01315 } 01316 01317 /// \brief Build a new C++ try statement. 01318 /// 01319 /// By default, performs semantic analysis to build the new statement. 01320 /// Subclasses may override this routine to provide different behavior. 01321 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 01322 Stmt *TryBlock, 01323 MultiStmtArg Handlers) { 01324 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers)); 01325 } 01326 01327 /// \brief Build a new C++0x range-based for statement. 01328 /// 01329 /// By default, performs semantic analysis to build the new statement. 01330 /// Subclasses may override this routine to provide different behavior. 01331 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 01332 SourceLocation ColonLoc, 01333 Stmt *Range, Stmt *BeginEnd, 01334 Expr *Cond, Expr *Inc, 01335 Stmt *LoopVar, 01336 SourceLocation RParenLoc) { 01337 return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd, 01338 Cond, Inc, LoopVar, RParenLoc); 01339 } 01340 01341 /// \brief Build a new C++0x range-based for statement. 01342 /// 01343 /// By default, performs semantic analysis to build the new statement. 01344 /// Subclasses may override this routine to provide different behavior. 01345 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 01346 bool IsIfExists, 01347 NestedNameSpecifierLoc QualifierLoc, 01348 DeclarationNameInfo NameInfo, 01349 Stmt *Nested) { 01350 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 01351 QualifierLoc, NameInfo, Nested); 01352 } 01353 01354 /// \brief Attach body to a C++0x range-based for statement. 01355 /// 01356 /// By default, performs semantic analysis to finish the new statement. 01357 /// Subclasses may override this routine to provide different behavior. 01358 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 01359 return getSema().FinishCXXForRangeStmt(ForRange, Body); 01360 } 01361 01362 StmtResult RebuildSEHTryStmt(bool IsCXXTry, 01363 SourceLocation TryLoc, 01364 Stmt *TryBlock, 01365 Stmt *Handler) { 01366 return getSema().ActOnSEHTryBlock(IsCXXTry,TryLoc,TryBlock,Handler); 01367 } 01368 01369 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, 01370 Expr *FilterExpr, 01371 Stmt *Block) { 01372 return getSema().ActOnSEHExceptBlock(Loc,FilterExpr,Block); 01373 } 01374 01375 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, 01376 Stmt *Block) { 01377 return getSema().ActOnSEHFinallyBlock(Loc,Block); 01378 } 01379 01380 /// \brief Build a new expression that references a declaration. 01381 /// 01382 /// By default, performs semantic analysis to build the new expression. 01383 /// Subclasses may override this routine to provide different behavior. 01384 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 01385 LookupResult &R, 01386 bool RequiresADL) { 01387 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 01388 } 01389 01390 01391 /// \brief Build a new expression that references a declaration. 01392 /// 01393 /// By default, performs semantic analysis to build the new expression. 01394 /// Subclasses may override this routine to provide different behavior. 01395 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 01396 ValueDecl *VD, 01397 const DeclarationNameInfo &NameInfo, 01398 TemplateArgumentListInfo *TemplateArgs) { 01399 CXXScopeSpec SS; 01400 SS.Adopt(QualifierLoc); 01401 01402 // FIXME: loses template args. 01403 01404 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 01405 } 01406 01407 /// \brief Build a new expression in parentheses. 01408 /// 01409 /// By default, performs semantic analysis to build the new expression. 01410 /// Subclasses may override this routine to provide different behavior. 01411 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 01412 SourceLocation RParen) { 01413 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 01414 } 01415 01416 /// \brief Build a new pseudo-destructor expression. 01417 /// 01418 /// By default, performs semantic analysis to build the new expression. 01419 /// Subclasses may override this routine to provide different behavior. 01420 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 01421 SourceLocation OperatorLoc, 01422 bool isArrow, 01423 CXXScopeSpec &SS, 01424 TypeSourceInfo *ScopeType, 01425 SourceLocation CCLoc, 01426 SourceLocation TildeLoc, 01427 PseudoDestructorTypeStorage Destroyed); 01428 01429 /// \brief Build a new unary operator expression. 01430 /// 01431 /// By default, performs semantic analysis to build the new expression. 01432 /// Subclasses may override this routine to provide different behavior. 01433 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 01434 UnaryOperatorKind Opc, 01435 Expr *SubExpr) { 01436 return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr); 01437 } 01438 01439 /// \brief Build a new builtin offsetof expression. 01440 /// 01441 /// By default, performs semantic analysis to build the new expression. 01442 /// Subclasses may override this routine to provide different behavior. 01443 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 01444 TypeSourceInfo *Type, 01445 Sema::OffsetOfComponent *Components, 01446 unsigned NumComponents, 01447 SourceLocation RParenLoc) { 01448 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 01449 NumComponents, RParenLoc); 01450 } 01451 01452 /// \brief Build a new sizeof, alignof or vec_step expression with a 01453 /// type argument. 01454 /// 01455 /// By default, performs semantic analysis to build the new expression. 01456 /// Subclasses may override this routine to provide different behavior. 01457 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 01458 SourceLocation OpLoc, 01459 UnaryExprOrTypeTrait ExprKind, 01460 SourceRange R) { 01461 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 01462 } 01463 01464 /// \brief Build a new sizeof, alignof or vec step expression with an 01465 /// expression argument. 01466 /// 01467 /// By default, performs semantic analysis to build the new expression. 01468 /// Subclasses may override this routine to provide different behavior. 01469 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 01470 UnaryExprOrTypeTrait ExprKind, 01471 SourceRange R) { 01472 ExprResult Result 01473 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 01474 if (Result.isInvalid()) 01475 return ExprError(); 01476 01477 return move(Result); 01478 } 01479 01480 /// \brief Build a new array subscript expression. 01481 /// 01482 /// By default, performs semantic analysis to build the new expression. 01483 /// Subclasses may override this routine to provide different behavior. 01484 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 01485 SourceLocation LBracketLoc, 01486 Expr *RHS, 01487 SourceLocation RBracketLoc) { 01488 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS, 01489 LBracketLoc, RHS, 01490 RBracketLoc); 01491 } 01492 01493 /// \brief Build a new call expression. 01494 /// 01495 /// By default, performs semantic analysis to build the new expression. 01496 /// Subclasses may override this routine to provide different behavior. 01497 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 01498 MultiExprArg Args, 01499 SourceLocation RParenLoc, 01500 Expr *ExecConfig = 0) { 01501 return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc, 01502 move(Args), RParenLoc, ExecConfig); 01503 } 01504 01505 /// \brief Build a new member access expression. 01506 /// 01507 /// By default, performs semantic analysis to build the new expression. 01508 /// Subclasses may override this routine to provide different behavior. 01509 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 01510 bool isArrow, 01511 NestedNameSpecifierLoc QualifierLoc, 01512 SourceLocation TemplateKWLoc, 01513 const DeclarationNameInfo &MemberNameInfo, 01514 ValueDecl *Member, 01515 NamedDecl *FoundDecl, 01516 const TemplateArgumentListInfo *ExplicitTemplateArgs, 01517 NamedDecl *FirstQualifierInScope) { 01518 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 01519 isArrow); 01520 if (!Member->getDeclName()) { 01521 // We have a reference to an unnamed field. This is always the 01522 // base of an anonymous struct/union member access, i.e. the 01523 // field is always of record type. 01524 assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!"); 01525 assert(Member->getType()->isRecordType() && 01526 "unnamed member not of record type?"); 01527 01528 BaseResult = 01529 getSema().PerformObjectMemberConversion(BaseResult.take(), 01530 QualifierLoc.getNestedNameSpecifier(), 01531 FoundDecl, Member); 01532 if (BaseResult.isInvalid()) 01533 return ExprError(); 01534 Base = BaseResult.take(); 01535 ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); 01536 MemberExpr *ME = 01537 new (getSema().Context) MemberExpr(Base, isArrow, 01538 Member, MemberNameInfo, 01539 cast<FieldDecl>(Member)->getType(), 01540 VK, OK_Ordinary); 01541 return getSema().Owned(ME); 01542 } 01543 01544 CXXScopeSpec SS; 01545 SS.Adopt(QualifierLoc); 01546 01547 Base = BaseResult.take(); 01548 QualType BaseType = Base->getType(); 01549 01550 // FIXME: this involves duplicating earlier analysis in a lot of 01551 // cases; we should avoid this when possible. 01552 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 01553 R.addDecl(FoundDecl); 01554 R.resolveKind(); 01555 01556 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 01557 SS, TemplateKWLoc, 01558 FirstQualifierInScope, 01559 R, ExplicitTemplateArgs); 01560 } 01561 01562 /// \brief Build a new binary operator expression. 01563 /// 01564 /// By default, performs semantic analysis to build the new expression. 01565 /// Subclasses may override this routine to provide different behavior. 01566 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 01567 BinaryOperatorKind Opc, 01568 Expr *LHS, Expr *RHS) { 01569 return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS); 01570 } 01571 01572 /// \brief Build a new conditional operator expression. 01573 /// 01574 /// By default, performs semantic analysis to build the new expression. 01575 /// Subclasses may override this routine to provide different behavior. 01576 ExprResult RebuildConditionalOperator(Expr *Cond, 01577 SourceLocation QuestionLoc, 01578 Expr *LHS, 01579 SourceLocation ColonLoc, 01580 Expr *RHS) { 01581 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 01582 LHS, RHS); 01583 } 01584 01585 /// \brief Build a new C-style cast expression. 01586 /// 01587 /// By default, performs semantic analysis to build the new expression. 01588 /// Subclasses may override this routine to provide different behavior. 01589 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 01590 TypeSourceInfo *TInfo, 01591 SourceLocation RParenLoc, 01592 Expr *SubExpr) { 01593 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 01594 SubExpr); 01595 } 01596 01597 /// \brief Build a new compound literal expression. 01598 /// 01599 /// By default, performs semantic analysis to build the new expression. 01600 /// Subclasses may override this routine to provide different behavior. 01601 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 01602 TypeSourceInfo *TInfo, 01603 SourceLocation RParenLoc, 01604 Expr *Init) { 01605 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 01606 Init); 01607 } 01608 01609 /// \brief Build a new extended vector element access expression. 01610 /// 01611 /// By default, performs semantic analysis to build the new expression. 01612 /// Subclasses may override this routine to provide different behavior. 01613 ExprResult RebuildExtVectorElementExpr(Expr *Base, 01614 SourceLocation OpLoc, 01615 SourceLocation AccessorLoc, 01616 IdentifierInfo &Accessor) { 01617 01618 CXXScopeSpec SS; 01619 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 01620 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 01621 OpLoc, /*IsArrow*/ false, 01622 SS, SourceLocation(), 01623 /*FirstQualifierInScope*/ 0, 01624 NameInfo, 01625 /* TemplateArgs */ 0); 01626 } 01627 01628 /// \brief Build a new initializer list expression. 01629 /// 01630 /// By default, performs semantic analysis to build the new expression. 01631 /// Subclasses may override this routine to provide different behavior. 01632 ExprResult RebuildInitList(SourceLocation LBraceLoc, 01633 MultiExprArg Inits, 01634 SourceLocation RBraceLoc, 01635 QualType ResultTy) { 01636 ExprResult Result 01637 = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 01638 if (Result.isInvalid() || ResultTy->isDependentType()) 01639 return move(Result); 01640 01641 // Patch in the result type we were given, which may have been computed 01642 // when the initial InitListExpr was built. 01643 InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 01644 ILE->setType(ResultTy); 01645 return move(Result); 01646 } 01647 01648 /// \brief Build a new designated initializer expression. 01649 /// 01650 /// By default, performs semantic analysis to build the new expression. 01651 /// Subclasses may override this routine to provide different behavior. 01652 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 01653 MultiExprArg ArrayExprs, 01654 SourceLocation EqualOrColonLoc, 01655 bool GNUSyntax, 01656 Expr *Init) { 01657 ExprResult Result 01658 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 01659 Init); 01660 if (Result.isInvalid()) 01661 return ExprError(); 01662 01663 ArrayExprs.release(); 01664 return move(Result); 01665 } 01666 01667 /// \brief Build a new value-initialized expression. 01668 /// 01669 /// By default, builds the implicit value initialization without performing 01670 /// any semantic analysis. Subclasses may override this routine to provide 01671 /// different behavior. 01672 ExprResult RebuildImplicitValueInitExpr(QualType T) { 01673 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 01674 } 01675 01676 /// \brief Build a new \c va_arg expression. 01677 /// 01678 /// By default, performs semantic analysis to build the new expression. 01679 /// Subclasses may override this routine to provide different behavior. 01680 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 01681 Expr *SubExpr, TypeSourceInfo *TInfo, 01682 SourceLocation RParenLoc) { 01683 return getSema().BuildVAArgExpr(BuiltinLoc, 01684 SubExpr, TInfo, 01685 RParenLoc); 01686 } 01687 01688 /// \brief Build a new expression list in parentheses. 01689 /// 01690 /// By default, performs semantic analysis to build the new expression. 01691 /// Subclasses may override this routine to provide different behavior. 01692 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 01693 MultiExprArg SubExprs, 01694 SourceLocation RParenLoc) { 01695 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 01696 } 01697 01698 /// \brief Build a new address-of-label expression. 01699 /// 01700 /// By default, performs semantic analysis, using the name of the label 01701 /// rather than attempting to map the label statement itself. 01702 /// Subclasses may override this routine to provide different behavior. 01703 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 01704 SourceLocation LabelLoc, LabelDecl *Label) { 01705 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 01706 } 01707 01708 /// \brief Build a new GNU statement expression. 01709 /// 01710 /// By default, performs semantic analysis to build the new expression. 01711 /// Subclasses may override this routine to provide different behavior. 01712 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 01713 Stmt *SubStmt, 01714 SourceLocation RParenLoc) { 01715 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 01716 } 01717 01718 /// \brief Build a new __builtin_choose_expr expression. 01719 /// 01720 /// By default, performs semantic analysis to build the new expression. 01721 /// Subclasses may override this routine to provide different behavior. 01722 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 01723 Expr *Cond, Expr *LHS, Expr *RHS, 01724 SourceLocation RParenLoc) { 01725 return SemaRef.ActOnChooseExpr(BuiltinLoc, 01726 Cond, LHS, RHS, 01727 RParenLoc); 01728 } 01729 01730 /// \brief Build a new generic selection expression. 01731 /// 01732 /// By default, performs semantic analysis to build the new expression. 01733 /// Subclasses may override this routine to provide different behavior. 01734 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 01735 SourceLocation DefaultLoc, 01736 SourceLocation RParenLoc, 01737 Expr *ControllingExpr, 01738 TypeSourceInfo **Types, 01739 Expr **Exprs, 01740 unsigned NumAssocs) { 01741 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 01742 ControllingExpr, Types, Exprs, 01743 NumAssocs); 01744 } 01745 01746 /// \brief Build a new overloaded operator call expression. 01747 /// 01748 /// By default, performs semantic analysis to build the new expression. 01749 /// The semantic analysis provides the behavior of template instantiation, 01750 /// copying with transformations that turn what looks like an overloaded 01751 /// operator call into a use of a builtin operator, performing 01752 /// argument-dependent lookup, etc. Subclasses may override this routine to 01753 /// provide different behavior. 01754 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 01755 SourceLocation OpLoc, 01756 Expr *Callee, 01757 Expr *First, 01758 Expr *Second); 01759 01760 /// \brief Build a new C++ "named" cast expression, such as static_cast or 01761 /// reinterpret_cast. 01762 /// 01763 /// By default, this routine dispatches to one of the more-specific routines 01764 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 01765 /// Subclasses may override this routine to provide different behavior. 01766 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 01767 Stmt::StmtClass Class, 01768 SourceLocation LAngleLoc, 01769 TypeSourceInfo *TInfo, 01770 SourceLocation RAngleLoc, 01771 SourceLocation LParenLoc, 01772 Expr *SubExpr, 01773 SourceLocation RParenLoc) { 01774 switch (Class) { 01775 case Stmt::CXXStaticCastExprClass: 01776 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 01777 RAngleLoc, LParenLoc, 01778 SubExpr, RParenLoc); 01779 01780 case Stmt::CXXDynamicCastExprClass: 01781 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 01782 RAngleLoc, LParenLoc, 01783 SubExpr, RParenLoc); 01784 01785 case Stmt::CXXReinterpretCastExprClass: 01786 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 01787 RAngleLoc, LParenLoc, 01788 SubExpr, 01789 RParenLoc); 01790 01791 case Stmt::CXXConstCastExprClass: 01792 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 01793 RAngleLoc, LParenLoc, 01794 SubExpr, RParenLoc); 01795 01796 default: 01797 llvm_unreachable("Invalid C++ named cast"); 01798 } 01799 } 01800 01801 /// \brief Build a new C++ static_cast expression. 01802 /// 01803 /// By default, performs semantic analysis to build the new expression. 01804 /// Subclasses may override this routine to provide different behavior. 01805 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 01806 SourceLocation LAngleLoc, 01807 TypeSourceInfo *TInfo, 01808 SourceLocation RAngleLoc, 01809 SourceLocation LParenLoc, 01810 Expr *SubExpr, 01811 SourceLocation RParenLoc) { 01812 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 01813 TInfo, SubExpr, 01814 SourceRange(LAngleLoc, RAngleLoc), 01815 SourceRange(LParenLoc, RParenLoc)); 01816 } 01817 01818 /// \brief Build a new C++ dynamic_cast expression. 01819 /// 01820 /// By default, performs semantic analysis to build the new expression. 01821 /// Subclasses may override this routine to provide different behavior. 01822 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 01823 SourceLocation LAngleLoc, 01824 TypeSourceInfo *TInfo, 01825 SourceLocation RAngleLoc, 01826 SourceLocation LParenLoc, 01827 Expr *SubExpr, 01828 SourceLocation RParenLoc) { 01829 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 01830 TInfo, SubExpr, 01831 SourceRange(LAngleLoc, RAngleLoc), 01832 SourceRange(LParenLoc, RParenLoc)); 01833 } 01834 01835 /// \brief Build a new C++ reinterpret_cast expression. 01836 /// 01837 /// By default, performs semantic analysis to build the new expression. 01838 /// Subclasses may override this routine to provide different behavior. 01839 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 01840 SourceLocation LAngleLoc, 01841 TypeSourceInfo *TInfo, 01842 SourceLocation RAngleLoc, 01843 SourceLocation LParenLoc, 01844 Expr *SubExpr, 01845 SourceLocation RParenLoc) { 01846 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 01847 TInfo, SubExpr, 01848 SourceRange(LAngleLoc, RAngleLoc), 01849 SourceRange(LParenLoc, RParenLoc)); 01850 } 01851 01852 /// \brief Build a new C++ const_cast expression. 01853 /// 01854 /// By default, performs semantic analysis to build the new expression. 01855 /// Subclasses may override this routine to provide different behavior. 01856 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 01857 SourceLocation LAngleLoc, 01858 TypeSourceInfo *TInfo, 01859 SourceLocation RAngleLoc, 01860 SourceLocation LParenLoc, 01861 Expr *SubExpr, 01862 SourceLocation RParenLoc) { 01863 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 01864 TInfo, SubExpr, 01865 SourceRange(LAngleLoc, RAngleLoc), 01866 SourceRange(LParenLoc, RParenLoc)); 01867 } 01868 01869 /// \brief Build a new C++ functional-style cast expression. 01870 /// 01871 /// By default, performs semantic analysis to build the new expression. 01872 /// Subclasses may override this routine to provide different behavior. 01873 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 01874 SourceLocation LParenLoc, 01875 Expr *Sub, 01876 SourceLocation RParenLoc) { 01877 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 01878 MultiExprArg(&Sub, 1), 01879 RParenLoc); 01880 } 01881 01882 /// \brief Build a new C++ typeid(type) expression. 01883 /// 01884 /// By default, performs semantic analysis to build the new expression. 01885 /// Subclasses may override this routine to provide different behavior. 01886 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 01887 SourceLocation TypeidLoc, 01888 TypeSourceInfo *Operand, 01889 SourceLocation RParenLoc) { 01890 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 01891 RParenLoc); 01892 } 01893 01894 01895 /// \brief Build a new C++ typeid(expr) expression. 01896 /// 01897 /// By default, performs semantic analysis to build the new expression. 01898 /// Subclasses may override this routine to provide different behavior. 01899 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 01900 SourceLocation TypeidLoc, 01901 Expr *Operand, 01902 SourceLocation RParenLoc) { 01903 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 01904 RParenLoc); 01905 } 01906 01907 /// \brief Build a new C++ __uuidof(type) expression. 01908 /// 01909 /// By default, performs semantic analysis to build the new expression. 01910 /// Subclasses may override this routine to provide different behavior. 01911 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 01912 SourceLocation TypeidLoc, 01913 TypeSourceInfo *Operand, 01914 SourceLocation RParenLoc) { 01915 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 01916 RParenLoc); 01917 } 01918 01919 /// \brief Build a new C++ __uuidof(expr) expression. 01920 /// 01921 /// By default, performs semantic analysis to build the new expression. 01922 /// Subclasses may override this routine to provide different behavior. 01923 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 01924 SourceLocation TypeidLoc, 01925 Expr *Operand, 01926 SourceLocation RParenLoc) { 01927 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 01928 RParenLoc); 01929 } 01930 01931 /// \brief Build a new C++ "this" expression. 01932 /// 01933 /// By default, builds a new "this" expression without performing any 01934 /// semantic analysis. Subclasses may override this routine to provide 01935 /// different behavior. 01936 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 01937 QualType ThisType, 01938 bool isImplicit) { 01939 getSema().CheckCXXThisCapture(ThisLoc); 01940 return getSema().Owned( 01941 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 01942 isImplicit)); 01943 } 01944 01945 /// \brief Build a new C++ throw expression. 01946 /// 01947 /// By default, performs semantic analysis to build the new expression. 01948 /// Subclasses may override this routine to provide different behavior. 01949 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 01950 bool IsThrownVariableInScope) { 01951 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 01952 } 01953 01954 /// \brief Build a new C++ default-argument expression. 01955 /// 01956 /// By default, builds a new default-argument expression, which does not 01957 /// require any semantic analysis. Subclasses may override this routine to 01958 /// provide different behavior. 01959 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 01960 ParmVarDecl *Param) { 01961 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 01962 Param)); 01963 } 01964 01965 /// \brief Build a new C++ zero-initialization expression. 01966 /// 01967 /// By default, performs semantic analysis to build the new expression. 01968 /// Subclasses may override this routine to provide different behavior. 01969 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 01970 SourceLocation LParenLoc, 01971 SourceLocation RParenLoc) { 01972 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, 01973 MultiExprArg(getSema(), 0, 0), 01974 RParenLoc); 01975 } 01976 01977 /// \brief Build a new C++ "new" expression. 01978 /// 01979 /// By default, performs semantic analysis to build the new expression. 01980 /// Subclasses may override this routine to provide different behavior. 01981 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 01982 bool UseGlobal, 01983 SourceLocation PlacementLParen, 01984 MultiExprArg PlacementArgs, 01985 SourceLocation PlacementRParen, 01986 SourceRange TypeIdParens, 01987 QualType AllocatedType, 01988 TypeSourceInfo *AllocatedTypeInfo, 01989 Expr *ArraySize, 01990 SourceRange DirectInitRange, 01991 Expr *Initializer) { 01992 return getSema().BuildCXXNew(StartLoc, UseGlobal, 01993 PlacementLParen, 01994 move(PlacementArgs), 01995 PlacementRParen, 01996 TypeIdParens, 01997 AllocatedType, 01998 AllocatedTypeInfo, 01999 ArraySize, 02000 DirectInitRange, 02001 Initializer); 02002 } 02003 02004 /// \brief Build a new C++ "delete" expression. 02005 /// 02006 /// By default, performs semantic analysis to build the new expression. 02007 /// Subclasses may override this routine to provide different behavior. 02008 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 02009 bool IsGlobalDelete, 02010 bool IsArrayForm, 02011 Expr *Operand) { 02012 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 02013 Operand); 02014 } 02015 02016 /// \brief Build a new unary type trait expression. 02017 /// 02018 /// By default, performs semantic analysis to build the new expression. 02019 /// Subclasses may override this routine to provide different behavior. 02020 ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 02021 SourceLocation StartLoc, 02022 TypeSourceInfo *T, 02023 SourceLocation RParenLoc) { 02024 return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc); 02025 } 02026 02027 /// \brief Build a new binary type trait expression. 02028 /// 02029 /// By default, performs semantic analysis to build the new expression. 02030 /// Subclasses may override this routine to provide different behavior. 02031 ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait, 02032 SourceLocation StartLoc, 02033 TypeSourceInfo *LhsT, 02034 TypeSourceInfo *RhsT, 02035 SourceLocation RParenLoc) { 02036 return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc); 02037 } 02038 02039 /// \brief Build a new type trait expression. 02040 /// 02041 /// By default, performs semantic analysis to build the new expression. 02042 /// Subclasses may override this routine to provide different behavior. 02043 ExprResult RebuildTypeTrait(TypeTrait Trait, 02044 SourceLocation StartLoc, 02045 ArrayRef<TypeSourceInfo *> Args, 02046 SourceLocation RParenLoc) { 02047 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 02048 } 02049 02050 /// \brief Build a new array type trait expression. 02051 /// 02052 /// By default, performs semantic analysis to build the new expression. 02053 /// Subclasses may override this routine to provide different behavior. 02054 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 02055 SourceLocation StartLoc, 02056 TypeSourceInfo *TSInfo, 02057 Expr *DimExpr, 02058 SourceLocation RParenLoc) { 02059 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 02060 } 02061 02062 /// \brief Build a new expression trait expression. 02063 /// 02064 /// By default, performs semantic analysis to build the new expression. 02065 /// Subclasses may override this routine to provide different behavior. 02066 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 02067 SourceLocation StartLoc, 02068 Expr *Queried, 02069 SourceLocation RParenLoc) { 02070 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 02071 } 02072 02073 /// \brief Build a new (previously unresolved) declaration reference 02074 /// expression. 02075 /// 02076 /// By default, performs semantic analysis to build the new expression. 02077 /// Subclasses may override this routine to provide different behavior. 02078 ExprResult RebuildDependentScopeDeclRefExpr( 02079 NestedNameSpecifierLoc QualifierLoc, 02080 SourceLocation TemplateKWLoc, 02081 const DeclarationNameInfo &NameInfo, 02082 const TemplateArgumentListInfo *TemplateArgs) { 02083 CXXScopeSpec SS; 02084 SS.Adopt(QualifierLoc); 02085 02086 if (TemplateArgs || TemplateKWLoc.isValid()) 02087 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, 02088 NameInfo, TemplateArgs); 02089 02090 return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo); 02091 } 02092 02093 /// \brief Build a new template-id expression. 02094 /// 02095 /// By default, performs semantic analysis to build the new expression. 02096 /// Subclasses may override this routine to provide different behavior. 02097 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 02098 SourceLocation TemplateKWLoc, 02099 LookupResult &R, 02100 bool RequiresADL, 02101 const TemplateArgumentListInfo *TemplateArgs) { 02102 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 02103 TemplateArgs); 02104 } 02105 02106 /// \brief Build a new object-construction expression. 02107 /// 02108 /// By default, performs semantic analysis to build the new expression. 02109 /// Subclasses may override this routine to provide different behavior. 02110 ExprResult RebuildCXXConstructExpr(QualType T, 02111 SourceLocation Loc, 02112 CXXConstructorDecl *Constructor, 02113 bool IsElidable, 02114 MultiExprArg Args, 02115 bool HadMultipleCandidates, 02116 bool RequiresZeroInit, 02117 CXXConstructExpr::ConstructionKind ConstructKind, 02118 SourceRange ParenRange) { 02119 ASTOwningVector<Expr*> ConvertedArgs(SemaRef); 02120 if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, 02121 ConvertedArgs)) 02122 return ExprError(); 02123 02124 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 02125 move_arg(ConvertedArgs), 02126 HadMultipleCandidates, 02127 RequiresZeroInit, ConstructKind, 02128 ParenRange); 02129 } 02130 02131 /// \brief Build a new object-construction expression. 02132 /// 02133 /// By default, performs semantic analysis to build the new expression. 02134 /// Subclasses may override this routine to provide different behavior. 02135 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 02136 SourceLocation LParenLoc, 02137 MultiExprArg Args, 02138 SourceLocation RParenLoc) { 02139 return getSema().BuildCXXTypeConstructExpr(TSInfo, 02140 LParenLoc, 02141 move(Args), 02142 RParenLoc); 02143 } 02144 02145 /// \brief Build a new object-construction expression. 02146 /// 02147 /// By default, performs semantic analysis to build the new expression. 02148 /// Subclasses may override this routine to provide different behavior. 02149 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 02150 SourceLocation LParenLoc, 02151 MultiExprArg Args, 02152 SourceLocation RParenLoc) { 02153 return getSema().BuildCXXTypeConstructExpr(TSInfo, 02154 LParenLoc, 02155 move(Args), 02156 RParenLoc); 02157 } 02158 02159 /// \brief Build a new member reference expression. 02160 /// 02161 /// By default, performs semantic analysis to build the new expression. 02162 /// Subclasses may override this routine to provide different behavior. 02163 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 02164 QualType BaseType, 02165 bool IsArrow, 02166 SourceLocation OperatorLoc, 02167 NestedNameSpecifierLoc QualifierLoc, 02168 SourceLocation TemplateKWLoc, 02169 NamedDecl *FirstQualifierInScope, 02170 const DeclarationNameInfo &MemberNameInfo, 02171 const TemplateArgumentListInfo *TemplateArgs) { 02172 CXXScopeSpec SS; 02173 SS.Adopt(QualifierLoc); 02174 02175 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 02176 OperatorLoc, IsArrow, 02177 SS, TemplateKWLoc, 02178 FirstQualifierInScope, 02179 MemberNameInfo, 02180 TemplateArgs); 02181 } 02182 02183 /// \brief Build a new member reference expression. 02184 /// 02185 /// By default, performs semantic analysis to build the new expression. 02186 /// Subclasses may override this routine to provide different behavior. 02187 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 02188 SourceLocation OperatorLoc, 02189 bool IsArrow, 02190 NestedNameSpecifierLoc QualifierLoc, 02191 SourceLocation TemplateKWLoc, 02192 NamedDecl *FirstQualifierInScope, 02193 LookupResult &R, 02194 const TemplateArgumentListInfo *TemplateArgs) { 02195 CXXScopeSpec SS; 02196 SS.Adopt(QualifierLoc); 02197 02198 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 02199 OperatorLoc, IsArrow, 02200 SS, TemplateKWLoc, 02201 FirstQualifierInScope, 02202 R, TemplateArgs); 02203 } 02204 02205 /// \brief Build a new noexcept expression. 02206 /// 02207 /// By default, performs semantic analysis to build the new expression. 02208 /// Subclasses may override this routine to provide different behavior. 02209 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 02210 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 02211 } 02212 02213 /// \brief Build a new expression to compute the length of a parameter pack. 02214 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 02215 SourceLocation PackLoc, 02216 SourceLocation RParenLoc, 02217 llvm::Optional<unsigned> Length) { 02218 if (Length) 02219 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 02220 OperatorLoc, Pack, PackLoc, 02221 RParenLoc, *Length); 02222 02223 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 02224 OperatorLoc, Pack, PackLoc, 02225 RParenLoc); 02226 } 02227 02228 /// \brief Build a new Objective-C boxed expression. 02229 /// 02230 /// By default, performs semantic analysis to build the new expression. 02231 /// Subclasses may override this routine to provide different behavior. 02232 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 02233 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 02234 } 02235 02236 /// \brief Build a new Objective-C array literal. 02237 /// 02238 /// By default, performs semantic analysis to build the new expression. 02239 /// Subclasses may override this routine to provide different behavior. 02240 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 02241 Expr **Elements, unsigned NumElements) { 02242 return getSema().BuildObjCArrayLiteral(Range, 02243 MultiExprArg(Elements, NumElements)); 02244 } 02245 02246 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 02247 Expr *Base, Expr *Key, 02248 ObjCMethodDecl *getterMethod, 02249 ObjCMethodDecl *setterMethod) { 02250 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 02251 getterMethod, setterMethod); 02252 } 02253 02254 /// \brief Build a new Objective-C dictionary literal. 02255 /// 02256 /// By default, performs semantic analysis to build the new expression. 02257 /// Subclasses may override this routine to provide different behavior. 02258 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 02259 ObjCDictionaryElement *Elements, 02260 unsigned NumElements) { 02261 return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements); 02262 } 02263 02264 /// \brief Build a new Objective-C @encode expression. 02265 /// 02266 /// By default, performs semantic analysis to build the new expression. 02267 /// Subclasses may override this routine to provide different behavior. 02268 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 02269 TypeSourceInfo *EncodeTypeInfo, 02270 SourceLocation RParenLoc) { 02271 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, 02272 RParenLoc)); 02273 } 02274 02275 /// \brief Build a new Objective-C class message. 02276 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 02277 Selector Sel, 02278 ArrayRef<SourceLocation> SelectorLocs, 02279 ObjCMethodDecl *Method, 02280 SourceLocation LBracLoc, 02281 MultiExprArg Args, 02282 SourceLocation RBracLoc) { 02283 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 02284 ReceiverTypeInfo->getType(), 02285 /*SuperLoc=*/SourceLocation(), 02286 Sel, Method, LBracLoc, SelectorLocs, 02287 RBracLoc, move(Args)); 02288 } 02289 02290 /// \brief Build a new Objective-C instance message. 02291 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 02292 Selector Sel, 02293 ArrayRef<SourceLocation> SelectorLocs, 02294 ObjCMethodDecl *Method, 02295 SourceLocation LBracLoc, 02296 MultiExprArg Args, 02297 SourceLocation RBracLoc) { 02298 return SemaRef.BuildInstanceMessage(Receiver, 02299 Receiver->getType(), 02300 /*SuperLoc=*/SourceLocation(), 02301 Sel, Method, LBracLoc, SelectorLocs, 02302 RBracLoc, move(Args)); 02303 } 02304 02305 /// \brief Build a new Objective-C ivar reference expression. 02306 /// 02307 /// By default, performs semantic analysis to build the new expression. 02308 /// Subclasses may override this routine to provide different behavior. 02309 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 02310 SourceLocation IvarLoc, 02311 bool IsArrow, bool IsFreeIvar) { 02312 // FIXME: We lose track of the IsFreeIvar bit. 02313 CXXScopeSpec SS; 02314 ExprResult Base = getSema().Owned(BaseArg); 02315 LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc, 02316 Sema::LookupMemberName); 02317 ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 02318 /*FIME:*/IvarLoc, 02319 SS, 0, 02320 false); 02321 if (Result.isInvalid() || Base.isInvalid()) 02322 return ExprError(); 02323 02324 if (Result.get()) 02325 return move(Result); 02326 02327 return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(), 02328 /*FIXME:*/IvarLoc, IsArrow, 02329 SS, SourceLocation(), 02330 /*FirstQualifierInScope=*/0, 02331 R, 02332 /*TemplateArgs=*/0); 02333 } 02334 02335 /// \brief Build a new Objective-C property reference expression. 02336 /// 02337 /// By default, performs semantic analysis to build the new expression. 02338 /// Subclasses may override this routine to provide different behavior. 02339 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 02340 ObjCPropertyDecl *Property, 02341 SourceLocation PropertyLoc) { 02342 CXXScopeSpec SS; 02343 ExprResult Base = getSema().Owned(BaseArg); 02344 LookupResult R(getSema(), Property->getDeclName(), PropertyLoc, 02345 Sema::LookupMemberName); 02346 bool IsArrow = false; 02347 ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 02348 /*FIME:*/PropertyLoc, 02349 SS, 0, false); 02350 if (Result.isInvalid() || Base.isInvalid()) 02351 return ExprError(); 02352 02353 if (Result.get()) 02354 return move(Result); 02355 02356 return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(), 02357 /*FIXME:*/PropertyLoc, IsArrow, 02358 SS, SourceLocation(), 02359 /*FirstQualifierInScope=*/0, 02360 R, 02361 /*TemplateArgs=*/0); 02362 } 02363 02364 /// \brief Build a new Objective-C property reference expression. 02365 /// 02366 /// By default, performs semantic analysis to build the new expression. 02367 /// Subclasses may override this routine to provide different behavior. 02368 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 02369 ObjCMethodDecl *Getter, 02370 ObjCMethodDecl *Setter, 02371 SourceLocation PropertyLoc) { 02372 // Since these expressions can only be value-dependent, we do not 02373 // need to perform semantic analysis again. 02374 return Owned( 02375 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 02376 VK_LValue, OK_ObjCProperty, 02377 PropertyLoc, Base)); 02378 } 02379 02380 /// \brief Build a new Objective-C "isa" expression. 02381 /// 02382 /// By default, performs semantic analysis to build the new expression. 02383 /// Subclasses may override this routine to provide different behavior. 02384 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 02385 bool IsArrow) { 02386 CXXScopeSpec SS; 02387 ExprResult Base = getSema().Owned(BaseArg); 02388 LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc, 02389 Sema::LookupMemberName); 02390 ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 02391 /*FIME:*/IsaLoc, 02392 SS, 0, false); 02393 if (Result.isInvalid() || Base.isInvalid()) 02394 return ExprError(); 02395 02396 if (Result.get()) 02397 return move(Result); 02398 02399 return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(), 02400 /*FIXME:*/IsaLoc, IsArrow, 02401 SS, SourceLocation(), 02402 /*FirstQualifierInScope=*/0, 02403 R, 02404 /*TemplateArgs=*/0); 02405 } 02406 02407 /// \brief Build a new shuffle vector expression. 02408 /// 02409 /// By default, performs semantic analysis to build the new expression. 02410 /// Subclasses may override this routine to provide different behavior. 02411 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 02412 MultiExprArg SubExprs, 02413 SourceLocation RParenLoc) { 02414 // Find the declaration for __builtin_shufflevector 02415 const IdentifierInfo &Name 02416 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 02417 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 02418 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 02419 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 02420 02421 // Build a reference to the __builtin_shufflevector builtin 02422 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 02423 ExprResult Callee 02424 = SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Builtin, false, 02425 Builtin->getType(), 02426 VK_LValue, BuiltinLoc)); 02427 Callee = SemaRef.UsualUnaryConversions(Callee.take()); 02428 if (Callee.isInvalid()) 02429 return ExprError(); 02430 02431 // Build the CallExpr 02432 unsigned NumSubExprs = SubExprs.size(); 02433 Expr **Subs = (Expr **)SubExprs.release(); 02434 ExprResult TheCall = SemaRef.Owned( 02435 new (SemaRef.Context) CallExpr(SemaRef.Context, Callee.take(), 02436 Subs, NumSubExprs, 02437 Builtin->getCallResultType(), 02438 Expr::getValueKindForType(Builtin->getResultType()), 02439 RParenLoc)); 02440 02441 // Type-check the __builtin_shufflevector expression. 02442 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.take())); 02443 } 02444 02445 /// \brief Build a new template argument pack expansion. 02446 /// 02447 /// By default, performs semantic analysis to build a new pack expansion 02448 /// for a template argument. Subclasses may override this routine to provide 02449 /// different behavior. 02450 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 02451 SourceLocation EllipsisLoc, 02452 llvm::Optional<unsigned> NumExpansions) { 02453 switch (Pattern.getArgument().getKind()) { 02454 case TemplateArgument::Expression: { 02455 ExprResult Result 02456 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 02457 EllipsisLoc, NumExpansions); 02458 if (Result.isInvalid()) 02459 return TemplateArgumentLoc(); 02460 02461 return TemplateArgumentLoc(Result.get(), Result.get()); 02462 } 02463 02464 case TemplateArgument::Template: 02465 return TemplateArgumentLoc(TemplateArgument( 02466 Pattern.getArgument().getAsTemplate(), 02467 NumExpansions), 02468 Pattern.getTemplateQualifierLoc(), 02469 Pattern.getTemplateNameLoc(), 02470 EllipsisLoc); 02471 02472 case TemplateArgument::Null: 02473 case TemplateArgument::Integral: 02474 case TemplateArgument::Declaration: 02475 case TemplateArgument::Pack: 02476 case TemplateArgument::TemplateExpansion: 02477 llvm_unreachable("Pack expansion pattern has no parameter packs"); 02478 02479 case TemplateArgument::Type: 02480 if (TypeSourceInfo *Expansion 02481 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 02482 EllipsisLoc, 02483 NumExpansions)) 02484 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 02485 Expansion); 02486 break; 02487 } 02488 02489 return TemplateArgumentLoc(); 02490 } 02491 02492 /// \brief Build a new expression pack expansion. 02493 /// 02494 /// By default, performs semantic analysis to build a new pack expansion 02495 /// for an expression. Subclasses may override this routine to provide 02496 /// different behavior. 02497 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 02498 llvm::Optional<unsigned> NumExpansions) { 02499 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 02500 } 02501 02502 /// \brief Build a new atomic operation expression. 02503 /// 02504 /// By default, performs semantic analysis to build the new expression. 02505 /// Subclasses may override this routine to provide different behavior. 02506 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 02507 MultiExprArg SubExprs, 02508 QualType RetTy, 02509 AtomicExpr::AtomicOp Op, 02510 SourceLocation RParenLoc) { 02511 // Just create the expression; there is not any interesting semantic 02512 // analysis here because we can't actually build an AtomicExpr until 02513 // we are sure it is semantically sound. 02514 unsigned NumSubExprs = SubExprs.size(); 02515 Expr **Subs = (Expr **)SubExprs.release(); 02516 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, Subs, 02517 NumSubExprs, RetTy, Op, 02518 RParenLoc); 02519 } 02520 02521 private: 02522 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 02523 QualType ObjectType, 02524 NamedDecl *FirstQualifierInScope, 02525 CXXScopeSpec &SS); 02526 02527 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 02528 QualType ObjectType, 02529 NamedDecl *FirstQualifierInScope, 02530 CXXScopeSpec &SS); 02531 }; 02532 02533 template<typename Derived> 02534 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 02535 if (!S) 02536 return SemaRef.Owned(S); 02537 02538 switch (S->getStmtClass()) { 02539 case Stmt::NoStmtClass: break; 02540 02541 // Transform individual statement nodes 02542 #define STMT(Node, Parent) \ 02543 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 02544 #define ABSTRACT_STMT(Node) 02545 #define EXPR(Node, Parent) 02546 #include "clang/AST/StmtNodes.inc" 02547 02548 // Transform expressions by calling TransformExpr. 02549 #define STMT(Node, Parent) 02550 #define ABSTRACT_STMT(Stmt) 02551 #define EXPR(Node, Parent) case Stmt::Node##Class: 02552 #include "clang/AST/StmtNodes.inc" 02553 { 02554 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 02555 if (E.isInvalid()) 02556 return StmtError(); 02557 02558 return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take())); 02559 } 02560 } 02561 02562 return SemaRef.Owned(S); 02563 } 02564 02565 02566 template<typename Derived> 02567 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 02568 if (!E) 02569 return SemaRef.Owned(E); 02570 02571 switch (E->getStmtClass()) { 02572 case Stmt::NoStmtClass: break; 02573 #define STMT(Node, Parent) case Stmt::Node##Class: break; 02574 #define ABSTRACT_STMT(Stmt) 02575 #define EXPR(Node, Parent) \ 02576 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 02577 #include "clang/AST/StmtNodes.inc" 02578 } 02579 02580 return SemaRef.Owned(E); 02581 } 02582 02583 template<typename Derived> 02584 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs, 02585 unsigned NumInputs, 02586 bool IsCall, 02587 SmallVectorImpl<Expr *> &Outputs, 02588 bool *ArgChanged) { 02589 for (unsigned I = 0; I != NumInputs; ++I) { 02590 // If requested, drop call arguments that need to be dropped. 02591 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 02592 if (ArgChanged) 02593 *ArgChanged = true; 02594 02595 break; 02596 } 02597 02598 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 02599 Expr *Pattern = Expansion->getPattern(); 02600 02601 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 02602 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 02603 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 02604 02605 // Determine whether the set of unexpanded parameter packs can and should 02606 // be expanded. 02607 bool Expand = true; 02608 bool RetainExpansion = false; 02609 llvm::Optional<unsigned> OrigNumExpansions 02610 = Expansion->getNumExpansions(); 02611 llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 02612 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 02613 Pattern->getSourceRange(), 02614 Unexpanded, 02615 Expand, RetainExpansion, 02616 NumExpansions)) 02617 return true; 02618 02619 if (!Expand) { 02620 // The transform has determined that we should perform a simple 02621 // transformation on the pack expansion, producing another pack 02622 // expansion. 02623 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 02624 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 02625 if (OutPattern.isInvalid()) 02626 return true; 02627 02628 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 02629 Expansion->getEllipsisLoc(), 02630 NumExpansions); 02631 if (Out.isInvalid()) 02632 return true; 02633 02634 if (ArgChanged) 02635 *ArgChanged = true; 02636 Outputs.push_back(Out.get()); 02637 continue; 02638 } 02639 02640 // Record right away that the argument was changed. This needs 02641 // to happen even if the array expands to nothing. 02642 if (ArgChanged) *ArgChanged = true; 02643 02644 // The transform has determined that we should perform an elementwise 02645 // expansion of the pattern. Do so. 02646 for (unsigned I = 0; I != *NumExpansions; ++I) { 02647 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 02648 ExprResult Out = getDerived().TransformExpr(Pattern); 02649 if (Out.isInvalid()) 02650 return true; 02651 02652 if (Out.get()->containsUnexpandedParameterPack()) { 02653 Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(), 02654 OrigNumExpansions); 02655 if (Out.isInvalid()) 02656 return true; 02657 } 02658 02659 Outputs.push_back(Out.get()); 02660 } 02661 02662 continue; 02663 } 02664 02665 ExprResult Result = getDerived().TransformExpr(Inputs[I]); 02666 if (Result.isInvalid()) 02667 return true; 02668 02669 if (Result.get() != Inputs[I] && ArgChanged) 02670 *ArgChanged = true; 02671 02672 Outputs.push_back(Result.get()); 02673 } 02674 02675 return false; 02676 } 02677 02678 template<typename Derived> 02679 NestedNameSpecifierLoc 02680 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 02681 NestedNameSpecifierLoc NNS, 02682 QualType ObjectType, 02683 NamedDecl *FirstQualifierInScope) { 02684 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 02685 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 02686 Qualifier = Qualifier.getPrefix()) 02687 Qualifiers.push_back(Qualifier); 02688 02689 CXXScopeSpec SS; 02690 while (!Qualifiers.empty()) { 02691 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 02692 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 02693 02694 switch (QNNS->getKind()) { 02695 case NestedNameSpecifier::Identifier: 02696 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0, 02697 *QNNS->getAsIdentifier(), 02698 Q.getLocalBeginLoc(), 02699 Q.getLocalEndLoc(), 02700 ObjectType, false, SS, 02701 FirstQualifierInScope, false)) 02702 return NestedNameSpecifierLoc(); 02703 02704 break; 02705 02706 case NestedNameSpecifier::Namespace: { 02707 NamespaceDecl *NS 02708 = cast_or_null<NamespaceDecl>( 02709 getDerived().TransformDecl( 02710 Q.getLocalBeginLoc(), 02711 QNNS->getAsNamespace())); 02712 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 02713 break; 02714 } 02715 02716 case NestedNameSpecifier::NamespaceAlias: { 02717 NamespaceAliasDecl *Alias 02718 = cast_or_null<NamespaceAliasDecl>( 02719 getDerived().TransformDecl(Q.getLocalBeginLoc(), 02720 QNNS->getAsNamespaceAlias())); 02721 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 02722 Q.getLocalEndLoc()); 02723 break; 02724 } 02725 02726 case NestedNameSpecifier::Global: 02727 // There is no meaningful transformation that one could perform on the 02728 // global scope. 02729 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 02730 break; 02731 02732 case NestedNameSpecifier::TypeSpecWithTemplate: 02733 case NestedNameSpecifier::TypeSpec: { 02734 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 02735 FirstQualifierInScope, SS); 02736 02737 if (!TL) 02738 return NestedNameSpecifierLoc(); 02739 02740 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 02741 (SemaRef.getLangOpts().CPlusPlus0x && 02742 TL.getType()->isEnumeralType())) { 02743 assert(!TL.getType().hasLocalQualifiers() && 02744 "Can't get cv-qualifiers here"); 02745 if (TL.getType()->isEnumeralType()) 02746 SemaRef.Diag(TL.getBeginLoc(), 02747 diag::warn_cxx98_compat_enum_nested_name_spec); 02748 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 02749 Q.getLocalEndLoc()); 02750 break; 02751 } 02752 // If the nested-name-specifier is an invalid type def, don't emit an 02753 // error because a previous error should have already been emitted. 02754 TypedefTypeLoc* TTL = dyn_cast<TypedefTypeLoc>(&TL); 02755 if (!TTL || !TTL->getTypedefNameDecl()->isInvalidDecl()) { 02756 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 02757 << TL.getType() << SS.getRange(); 02758 } 02759 return NestedNameSpecifierLoc(); 02760 } 02761 } 02762 02763 // The qualifier-in-scope and object type only apply to the leftmost entity. 02764 FirstQualifierInScope = 0; 02765 ObjectType = QualType(); 02766 } 02767 02768 // Don't rebuild the nested-name-specifier if we don't have to. 02769 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 02770 !getDerived().AlwaysRebuild()) 02771 return NNS; 02772 02773 // If we can re-use the source-location data from the original 02774 // nested-name-specifier, do so. 02775 if (SS.location_size() == NNS.getDataLength() && 02776 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 02777 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 02778 02779 // Allocate new nested-name-specifier location information. 02780 return SS.getWithLocInContext(SemaRef.Context); 02781 } 02782 02783 template<typename Derived> 02784 DeclarationNameInfo 02785 TreeTransform<Derived> 02786 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 02787 DeclarationName Name = NameInfo.getName(); 02788 if (!Name) 02789 return DeclarationNameInfo(); 02790 02791 switch (Name.getNameKind()) { 02792 case DeclarationName::Identifier: 02793 case DeclarationName::ObjCZeroArgSelector: 02794 case DeclarationName::ObjCOneArgSelector: 02795 case DeclarationName::ObjCMultiArgSelector: 02796 case DeclarationName::CXXOperatorName: 02797 case DeclarationName::CXXLiteralOperatorName: 02798 case DeclarationName::CXXUsingDirective: 02799 return NameInfo; 02800 02801 case DeclarationName::CXXConstructorName: 02802 case DeclarationName::CXXDestructorName: 02803 case DeclarationName::CXXConversionFunctionName: { 02804 TypeSourceInfo *NewTInfo; 02805 CanQualType NewCanTy; 02806 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 02807 NewTInfo = getDerived().TransformType(OldTInfo); 02808 if (!NewTInfo) 02809 return DeclarationNameInfo(); 02810 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 02811 } 02812 else { 02813 NewTInfo = 0; 02814 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 02815 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 02816 if (NewT.isNull()) 02817 return DeclarationNameInfo(); 02818 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 02819 } 02820 02821 DeclarationName NewName 02822 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 02823 NewCanTy); 02824 DeclarationNameInfo NewNameInfo(NameInfo); 02825 NewNameInfo.setName(NewName); 02826 NewNameInfo.setNamedTypeInfo(NewTInfo); 02827 return NewNameInfo; 02828 } 02829 } 02830 02831 llvm_unreachable("Unknown name kind."); 02832 } 02833 02834 template<typename Derived> 02835 TemplateName 02836 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 02837 TemplateName Name, 02838 SourceLocation NameLoc, 02839 QualType ObjectType, 02840 NamedDecl *FirstQualifierInScope) { 02841 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 02842 TemplateDecl *Template = QTN->getTemplateDecl(); 02843 assert(Template && "qualified template name must refer to a template"); 02844 02845 TemplateDecl *TransTemplate 02846 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 02847 Template)); 02848 if (!TransTemplate) 02849 return TemplateName(); 02850 02851 if (!getDerived().AlwaysRebuild() && 02852 SS.getScopeRep() == QTN->getQualifier() && 02853 TransTemplate == Template) 02854 return Name; 02855 02856 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 02857 TransTemplate); 02858 } 02859 02860 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 02861 if (SS.getScopeRep()) { 02862 // These apply to the scope specifier, not the template. 02863 ObjectType = QualType(); 02864 FirstQualifierInScope = 0; 02865 } 02866 02867 if (!getDerived().AlwaysRebuild() && 02868 SS.getScopeRep() == DTN->getQualifier() && 02869 ObjectType.isNull()) 02870 return Name; 02871 02872 if (DTN->isIdentifier()) { 02873 return getDerived().RebuildTemplateName(SS, 02874 *DTN->getIdentifier(), 02875 NameLoc, 02876 ObjectType, 02877 FirstQualifierInScope); 02878 } 02879 02880 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 02881 ObjectType); 02882 } 02883 02884 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 02885 TemplateDecl *TransTemplate 02886 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 02887 Template)); 02888 if (!TransTemplate) 02889 return TemplateName(); 02890 02891 if (!getDerived().AlwaysRebuild() && 02892 TransTemplate == Template) 02893 return Name; 02894 02895 return TemplateName(TransTemplate); 02896 } 02897 02898 if (SubstTemplateTemplateParmPackStorage *SubstPack 02899 = Name.getAsSubstTemplateTemplateParmPack()) { 02900 TemplateTemplateParmDecl *TransParam 02901 = cast_or_null<TemplateTemplateParmDecl>( 02902 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 02903 if (!TransParam) 02904 return TemplateName(); 02905 02906 if (!getDerived().AlwaysRebuild() && 02907 TransParam == SubstPack->getParameterPack()) 02908 return Name; 02909 02910 return getDerived().RebuildTemplateName(TransParam, 02911 SubstPack->getArgumentPack()); 02912 } 02913 02914 // These should be getting filtered out before they reach the AST. 02915 llvm_unreachable("overloaded function decl survived to here"); 02916 } 02917 02918 template<typename Derived> 02919 void TreeTransform<Derived>::InventTemplateArgumentLoc( 02920 const TemplateArgument &Arg, 02921 TemplateArgumentLoc &Output) { 02922 SourceLocation Loc = getDerived().getBaseLocation(); 02923 switch (Arg.getKind()) { 02924 case TemplateArgument::Null: 02925 llvm_unreachable("null template argument in TreeTransform"); 02926 break; 02927 02928 case TemplateArgument::Type: 02929 Output = TemplateArgumentLoc(Arg, 02930 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 02931 02932 break; 02933 02934 case TemplateArgument::Template: 02935 case TemplateArgument::TemplateExpansion: { 02936 NestedNameSpecifierLocBuilder Builder; 02937 TemplateName Template = Arg.getAsTemplate(); 02938 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 02939 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 02940 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 02941 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 02942 02943 if (Arg.getKind() == TemplateArgument::Template) 02944 Output = TemplateArgumentLoc(Arg, 02945 Builder.getWithLocInContext(SemaRef.Context), 02946 Loc); 02947 else 02948 Output = TemplateArgumentLoc(Arg, 02949 Builder.getWithLocInContext(SemaRef.Context), 02950 Loc, Loc); 02951 02952 break; 02953 } 02954 02955 case TemplateArgument::Expression: 02956 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 02957 break; 02958 02959 case TemplateArgument::Declaration: 02960 case TemplateArgument::Integral: 02961 case TemplateArgument::Pack: 02962 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 02963 break; 02964 } 02965 } 02966 02967 template<typename Derived> 02968 bool TreeTransform<Derived>::TransformTemplateArgument( 02969 const TemplateArgumentLoc &Input, 02970 TemplateArgumentLoc &Output) { 02971 const TemplateArgument &Arg = Input.getArgument(); 02972 switch (Arg.getKind()) { 02973 case TemplateArgument::Null: 02974 case TemplateArgument::Integral: 02975 Output = Input; 02976 return false; 02977 02978 case TemplateArgument::Type: { 02979 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 02980 if (DI == NULL) 02981 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 02982 02983 DI = getDerived().TransformType(DI); 02984 if (!DI) return true; 02985 02986 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 02987 return false; 02988 } 02989 02990 case TemplateArgument::Declaration: { 02991 // FIXME: we should never have to transform one of these. 02992 DeclarationName Name; 02993 if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 02994 Name = ND->getDeclName(); 02995 TemporaryBase Rebase(*this, Input.getLocation(), Name); 02996 Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl()); 02997 if (!D) return true; 02998 02999 Expr *SourceExpr = Input.getSourceDeclExpression(); 03000 if (SourceExpr) { 03001 EnterExpressionEvaluationContext Unevaluated(getSema(), 03002 Sema::ConstantEvaluated); 03003 ExprResult E = getDerived().TransformExpr(SourceExpr); 03004 E = SemaRef.ActOnConstantExpression(E); 03005 SourceExpr = (E.isInvalid() ? 0 : E.take()); 03006 } 03007 03008 Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 03009 return false; 03010 } 03011 03012 case TemplateArgument::Template: { 03013 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 03014 if (QualifierLoc) { 03015 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 03016 if (!QualifierLoc) 03017 return true; 03018 } 03019 03020 CXXScopeSpec SS; 03021 SS.Adopt(QualifierLoc); 03022 TemplateName Template 03023 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 03024 Input.getTemplateNameLoc()); 03025 if (Template.isNull()) 03026 return true; 03027 03028 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 03029 Input.getTemplateNameLoc()); 03030 return false; 03031 } 03032 03033 case TemplateArgument::TemplateExpansion: 03034 llvm_unreachable("Caller should expand pack expansions"); 03035 03036 case TemplateArgument::Expression: { 03037 // Template argument expressions are constant expressions. 03038 EnterExpressionEvaluationContext Unevaluated(getSema(), 03039 Sema::ConstantEvaluated); 03040 03041 Expr *InputExpr = Input.getSourceExpression(); 03042 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 03043 03044 ExprResult E = getDerived().TransformExpr(InputExpr); 03045 E = SemaRef.ActOnConstantExpression(E); 03046 if (E.isInvalid()) return true; 03047 Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take()); 03048 return false; 03049 } 03050 03051 case TemplateArgument::Pack: { 03052 SmallVector<TemplateArgument, 4> TransformedArgs; 03053 TransformedArgs.reserve(Arg.pack_size()); 03054 for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 03055 AEnd = Arg.pack_end(); 03056 A != AEnd; ++A) { 03057 03058 // FIXME: preserve source information here when we start 03059 // caring about parameter packs. 03060 03061 TemplateArgumentLoc InputArg; 03062 TemplateArgumentLoc OutputArg; 03063 getDerived().InventTemplateArgumentLoc(*A, InputArg); 03064 if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 03065 return true; 03066 03067 TransformedArgs.push_back(OutputArg.getArgument()); 03068 } 03069 03070 TemplateArgument *TransformedArgsPtr 03071 = new (getSema().Context) TemplateArgument[TransformedArgs.size()]; 03072 std::copy(TransformedArgs.begin(), TransformedArgs.end(), 03073 TransformedArgsPtr); 03074 Output = TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr, 03075 TransformedArgs.size()), 03076 Input.getLocInfo()); 03077 return false; 03078 } 03079 } 03080 03081 // Work around bogus GCC warning 03082 return true; 03083 } 03084 03085 /// \brief Iterator adaptor that invents template argument location information 03086 /// for each of the template arguments in its underlying iterator. 03087 template<typename Derived, typename InputIterator> 03088 class TemplateArgumentLocInventIterator { 03089 TreeTransform<Derived> &Self; 03090 InputIterator Iter; 03091 03092 public: 03093 typedef TemplateArgumentLoc value_type; 03094 typedef TemplateArgumentLoc reference; 03095 typedef typename std::iterator_traits<InputIterator>::difference_type 03096 difference_type; 03097 typedef std::input_iterator_tag iterator_category; 03098 03099 class pointer { 03100 TemplateArgumentLoc Arg; 03101 03102 public: 03103 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 03104 03105 const TemplateArgumentLoc *operator->() const { return &Arg; } 03106 }; 03107 03108 TemplateArgumentLocInventIterator() { } 03109 03110 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 03111 InputIterator Iter) 03112 : Self(Self), Iter(Iter) { } 03113 03114 TemplateArgumentLocInventIterator &operator++() { 03115 ++Iter; 03116 return *this; 03117 } 03118 03119 TemplateArgumentLocInventIterator operator++(int) { 03120 TemplateArgumentLocInventIterator Old(*this); 03121 ++(*this); 03122 return Old; 03123 } 03124 03125 reference operator*() const { 03126 TemplateArgumentLoc Result; 03127 Self.InventTemplateArgumentLoc(*Iter, Result); 03128 return Result; 03129 } 03130 03131 pointer operator->() const { return pointer(**this); } 03132 03133 friend bool operator==(const TemplateArgumentLocInventIterator &X, 03134 const TemplateArgumentLocInventIterator &Y) { 03135 return X.Iter == Y.Iter; 03136 } 03137 03138 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 03139 const TemplateArgumentLocInventIterator &Y) { 03140 return X.Iter != Y.Iter; 03141 } 03142 }; 03143 03144 template<typename Derived> 03145 template<typename InputIterator> 03146 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First, 03147 InputIterator Last, 03148 TemplateArgumentListInfo &Outputs) { 03149 for (; First != Last; ++First) { 03150 TemplateArgumentLoc Out; 03151 TemplateArgumentLoc In = *First; 03152 03153 if (In.getArgument().getKind() == TemplateArgument::Pack) { 03154 // Unpack argument packs, which we translate them into separate 03155 // arguments. 03156 // FIXME: We could do much better if we could guarantee that the 03157 // TemplateArgumentLocInfo for the pack expansion would be usable for 03158 // all of the template arguments in the argument pack. 03159 typedef TemplateArgumentLocInventIterator<Derived, 03160 TemplateArgument::pack_iterator> 03161 PackLocIterator; 03162 if (TransformTemplateArguments(PackLocIterator(*this, 03163 In.getArgument().pack_begin()), 03164 PackLocIterator(*this, 03165 In.getArgument().pack_end()), 03166 Outputs)) 03167 return true; 03168 03169 continue; 03170 } 03171 03172 if (In.getArgument().isPackExpansion()) { 03173 // We have a pack expansion, for which we will be substituting into 03174 // the pattern. 03175 SourceLocation Ellipsis; 03176 llvm::Optional<unsigned> OrigNumExpansions; 03177 TemplateArgumentLoc Pattern 03178 = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions, 03179 getSema().Context); 03180 03181 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 03182 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 03183 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 03184 03185 // Determine whether the set of unexpanded parameter packs can and should 03186 // be expanded. 03187 bool Expand = true; 03188 bool RetainExpansion = false; 03189 llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 03190 if (getDerived().TryExpandParameterPacks(Ellipsis, 03191 Pattern.getSourceRange(), 03192 Unexpanded, 03193 Expand, 03194 RetainExpansion, 03195 NumExpansions)) 03196 return true; 03197 03198 if (!Expand) { 03199 // The transform has determined that we should perform a simple 03200 // transformation on the pack expansion, producing another pack 03201 // expansion. 03202 TemplateArgumentLoc OutPattern; 03203 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 03204 if (getDerived().TransformTemplateArgument(Pattern, OutPattern)) 03205 return true; 03206 03207 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 03208 NumExpansions); 03209 if (Out.getArgument().isNull()) 03210 return true; 03211 03212 Outputs.addArgument(Out); 03213 continue; 03214 } 03215 03216 // The transform has determined that we should perform an elementwise 03217 // expansion of the pattern. Do so. 03218 for (unsigned I = 0; I != *NumExpansions; ++I) { 03219 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 03220 03221 if (getDerived().TransformTemplateArgument(Pattern, Out)) 03222 return true; 03223 03224 if (Out.getArgument().containsUnexpandedParameterPack()) { 03225 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 03226 OrigNumExpansions); 03227 if (Out.getArgument().isNull()) 03228 return true; 03229 } 03230 03231 Outputs.addArgument(Out); 03232 } 03233 03234 // If we're supposed to retain a pack expansion, do so by temporarily 03235 // forgetting the partially-substituted parameter pack. 03236 if (RetainExpansion) { 03237 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 03238 03239 if (getDerived().TransformTemplateArgument(Pattern, Out)) 03240 return true; 03241 03242 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 03243 OrigNumExpansions); 03244 if (Out.getArgument().isNull()) 03245 return true; 03246 03247 Outputs.addArgument(Out); 03248 } 03249 03250 continue; 03251 } 03252 03253 // The simple case: 03254 if (getDerived().TransformTemplateArgument(In, Out)) 03255 return true; 03256 03257 Outputs.addArgument(Out); 03258 } 03259 03260 return false; 03261 03262 } 03263 03264 //===----------------------------------------------------------------------===// 03265 // Type transformation 03266 //===----------------------------------------------------------------------===// 03267 03268 template<typename Derived> 03269 QualType TreeTransform<Derived>::TransformType(QualType T) { 03270 if (getDerived().AlreadyTransformed(T)) 03271 return T; 03272 03273 // Temporary workaround. All of these transformations should 03274 // eventually turn into transformations on TypeLocs. 03275 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 03276 getDerived().getBaseLocation()); 03277 03278 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 03279 03280 if (!NewDI) 03281 return QualType(); 03282 03283 return NewDI->getType(); 03284 } 03285 03286 template<typename Derived> 03287 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 03288 // Refine the base location to the type's location. 03289 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 03290 getDerived().getBaseEntity()); 03291 if (getDerived().AlreadyTransformed(DI->getType())) 03292 return DI; 03293 03294 TypeLocBuilder TLB; 03295 03296 TypeLoc TL = DI->getTypeLoc(); 03297 TLB.reserve(TL.getFullDataSize()); 03298 03299 QualType Result = getDerived().TransformType(TLB, TL); 03300 if (Result.isNull()) 03301 return 0; 03302 03303 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 03304 } 03305 03306 template<typename Derived> 03307 QualType 03308 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 03309 switch (T.getTypeLocClass()) { 03310 #define ABSTRACT_TYPELOC(CLASS, PARENT) 03311 #define TYPELOC(CLASS, PARENT) \ 03312 case TypeLoc::CLASS: \ 03313 return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 03314 #include "clang/AST/TypeLocNodes.def" 03315 } 03316 03317 llvm_unreachable("unhandled type loc!"); 03318 } 03319 03320 /// FIXME: By default, this routine adds type qualifiers only to types 03321 /// that can have qualifiers, and silently suppresses those qualifiers 03322 /// that are not permitted (e.g., qualifiers on reference or function 03323 /// types). This is the right thing for template instantiation, but 03324 /// probably not for other clients. 03325 template<typename Derived> 03326 QualType 03327 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 03328 QualifiedTypeLoc T) { 03329 Qualifiers Quals = T.getType().getLocalQualifiers(); 03330 03331 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 03332 if (Result.isNull()) 03333 return QualType(); 03334 03335 // Silently suppress qualifiers if the result type can't be qualified. 03336 // FIXME: this is the right thing for template instantiation, but 03337 // probably not for other clients. 03338 if (Result->isFunctionType() || Result->isReferenceType()) 03339 return Result; 03340 03341 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 03342 // resulting type. 03343 if (Quals.hasObjCLifetime()) { 03344 if (!Result->isObjCLifetimeType() && !Result->isDependentType()) 03345 Quals.removeObjCLifetime(); 03346 else if (Result.getObjCLifetime()) { 03347 // Objective-C ARC: 03348 // A lifetime qualifier applied to a substituted template parameter 03349 // overrides the lifetime qualifier from the template argument. 03350 if (const SubstTemplateTypeParmType *SubstTypeParam 03351 = dyn_cast<SubstTemplateTypeParmType>(Result)) { 03352 QualType Replacement = SubstTypeParam->getReplacementType(); 03353 Qualifiers Qs = Replacement.getQualifiers(); 03354 Qs.removeObjCLifetime(); 03355 Replacement 03356 = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), 03357 Qs); 03358 Result = SemaRef.Context.getSubstTemplateTypeParmType( 03359 SubstTypeParam->getReplacedParameter(), 03360 Replacement); 03361 TLB.TypeWasModifiedSafely(Result); 03362 } else { 03363 // Otherwise, complain about the addition of a qualifier to an 03364 // already-qualified type. 03365 SourceRange R = TLB.getTemporaryTypeLoc(Result).getSourceRange(); 03366 SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant) 03367 << Result << R; 03368 03369 Quals.removeObjCLifetime(); 03370 } 03371 } 03372 } 03373 if (!Quals.empty()) { 03374 Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); 03375 TLB.push<QualifiedTypeLoc>(Result); 03376 // No location information to preserve. 03377 } 03378 03379 return Result; 03380 } 03381 03382 template<typename Derived> 03383 TypeLoc 03384 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 03385 QualType ObjectType, 03386 NamedDecl *UnqualLookup, 03387 CXXScopeSpec &SS) { 03388 QualType T = TL.getType(); 03389 if (getDerived().AlreadyTransformed(T)) 03390 return TL; 03391 03392 TypeLocBuilder TLB; 03393 QualType Result; 03394 03395 if (isa<TemplateSpecializationType>(T)) { 03396 TemplateSpecializationTypeLoc SpecTL 03397 = cast<TemplateSpecializationTypeLoc>(TL); 03398 03399 TemplateName Template = 03400 getDerived().TransformTemplateName(SS, 03401 SpecTL.getTypePtr()->getTemplateName(), 03402 SpecTL.getTemplateNameLoc(), 03403 ObjectType, UnqualLookup); 03404 if (Template.isNull()) 03405 return TypeLoc(); 03406 03407 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 03408 Template); 03409 } else if (isa<DependentTemplateSpecializationType>(T)) { 03410 DependentTemplateSpecializationTypeLoc SpecTL 03411 = cast<DependentTemplateSpecializationTypeLoc>(TL); 03412 03413 TemplateName Template 03414 = getDerived().RebuildTemplateName(SS, 03415 *SpecTL.getTypePtr()->getIdentifier(), 03416 SpecTL.getTemplateNameLoc(), 03417 ObjectType, UnqualLookup); 03418 if (Template.isNull()) 03419 return TypeLoc(); 03420 03421 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 03422 SpecTL, 03423 Template, 03424 SS); 03425 } else { 03426 // Nothing special needs to be done for these. 03427 Result = getDerived().TransformType(TLB, TL); 03428 } 03429 03430 if (Result.isNull()) 03431 return TypeLoc(); 03432 03433 return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc(); 03434 } 03435 03436 template<typename Derived> 03437 TypeSourceInfo * 03438 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 03439 QualType ObjectType, 03440 NamedDecl *UnqualLookup, 03441 CXXScopeSpec &SS) { 03442 // FIXME: Painfully copy-paste from the above! 03443 03444 QualType T = TSInfo->getType(); 03445 if (getDerived().AlreadyTransformed(T)) 03446 return TSInfo; 03447 03448 TypeLocBuilder TLB; 03449 QualType Result; 03450 03451 TypeLoc TL = TSInfo->getTypeLoc(); 03452 if (isa<TemplateSpecializationType>(T)) { 03453 TemplateSpecializationTypeLoc SpecTL 03454 = cast<TemplateSpecializationTypeLoc>(TL); 03455 03456 TemplateName Template 03457 = getDerived().TransformTemplateName(SS, 03458 SpecTL.getTypePtr()->getTemplateName(), 03459 SpecTL.getTemplateNameLoc(), 03460 ObjectType, UnqualLookup); 03461 if (Template.isNull()) 03462 return 0; 03463 03464 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 03465 Template); 03466 } else if (isa<DependentTemplateSpecializationType>(T)) { 03467 DependentTemplateSpecializationTypeLoc SpecTL 03468 = cast<DependentTemplateSpecializationTypeLoc>(TL); 03469 03470 TemplateName Template 03471 = getDerived().RebuildTemplateName(SS, 03472 *SpecTL.getTypePtr()->getIdentifier(), 03473 SpecTL.getTemplateNameLoc(), 03474 ObjectType, UnqualLookup); 03475 if (Template.isNull()) 03476 return 0; 03477 03478 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 03479 SpecTL, 03480 Template, 03481 SS); 03482 } else { 03483 // Nothing special needs to be done for these. 03484 Result = getDerived().TransformType(TLB, TL); 03485 } 03486 03487 if (Result.isNull()) 03488 return 0; 03489 03490 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 03491 } 03492 03493 template <class TyLoc> static inline 03494 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 03495 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 03496 NewT.setNameLoc(T.getNameLoc()); 03497 return T.getType(); 03498 } 03499 03500 template<typename Derived> 03501 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 03502 BuiltinTypeLoc T) { 03503 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 03504 NewT.setBuiltinLoc(T.getBuiltinLoc()); 03505 if (T.needsExtraLocalData()) 03506 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 03507 return T.getType(); 03508 } 03509 03510 template<typename Derived> 03511 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 03512 ComplexTypeLoc T) { 03513 // FIXME: recurse? 03514 return TransformTypeSpecType(TLB, T); 03515 } 03516 03517 template<typename Derived> 03518 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 03519 PointerTypeLoc TL) { 03520 QualType PointeeType 03521 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 03522 if (PointeeType.isNull()) 03523 return QualType(); 03524 03525 QualType Result = TL.getType(); 03526 if (PointeeType->getAs<ObjCObjectType>()) { 03527 // A dependent pointer type 'T *' has is being transformed such 03528 // that an Objective-C class type is being replaced for 'T'. The 03529 // resulting pointer type is an ObjCObjectPointerType, not a 03530 // PointerType. 03531 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 03532 03533 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 03534 NewT.setStarLoc(TL.getStarLoc()); 03535 return Result; 03536 } 03537 03538 if (getDerived().AlwaysRebuild() || 03539 PointeeType != TL.getPointeeLoc().getType()) { 03540 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 03541 if (Result.isNull()) 03542 return QualType(); 03543 } 03544 03545 // Objective-C ARC can add lifetime qualifiers to the type that we're 03546 // pointing to. 03547 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 03548 03549 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 03550 NewT.setSigilLoc(TL.getSigilLoc()); 03551 return Result; 03552 } 03553 03554 template<typename Derived> 03555 QualType 03556 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 03557 BlockPointerTypeLoc TL) { 03558 QualType PointeeType 03559 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 03560 if (PointeeType.isNull()) 03561 return QualType(); 03562 03563 QualType Result = TL.getType(); 03564 if (getDerived().AlwaysRebuild() || 03565 PointeeType != TL.getPointeeLoc().getType()) { 03566 Result = getDerived().RebuildBlockPointerType(PointeeType, 03567 TL.getSigilLoc()); 03568 if (Result.isNull()) 03569 return QualType(); 03570 } 03571 03572 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 03573 NewT.setSigilLoc(TL.getSigilLoc()); 03574 return Result; 03575 } 03576 03577 /// Transforms a reference type. Note that somewhat paradoxically we 03578 /// don't care whether the type itself is an l-value type or an r-value 03579 /// type; we only care if the type was *written* as an l-value type 03580 /// or an r-value type. 03581 template<typename Derived> 03582 QualType 03583 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 03584 ReferenceTypeLoc TL) { 03585 const ReferenceType *T = TL.getTypePtr(); 03586 03587 // Note that this works with the pointee-as-written. 03588 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 03589 if (PointeeType.isNull()) 03590 return QualType(); 03591 03592 QualType Result = TL.getType(); 03593 if (getDerived().AlwaysRebuild() || 03594 PointeeType != T->getPointeeTypeAsWritten()) { 03595 Result = getDerived().RebuildReferenceType(PointeeType, 03596 T->isSpelledAsLValue(), 03597 TL.getSigilLoc()); 03598 if (Result.isNull()) 03599 return QualType(); 03600 } 03601 03602 // Objective-C ARC can add lifetime qualifiers to the type that we're 03603 // referring to. 03604 TLB.TypeWasModifiedSafely( 03605 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 03606 03607 // r-value references can be rebuilt as l-value references. 03608 ReferenceTypeLoc NewTL; 03609 if (isa<LValueReferenceType>(Result)) 03610 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 03611 else 03612 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 03613 NewTL.setSigilLoc(TL.getSigilLoc()); 03614 03615 return Result; 03616 } 03617 03618 template<typename Derived> 03619 QualType 03620 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 03621 LValueReferenceTypeLoc TL) { 03622 return TransformReferenceType(TLB, TL); 03623 } 03624 03625 template<typename Derived> 03626 QualType 03627 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 03628 RValueReferenceTypeLoc TL) { 03629 return TransformReferenceType(TLB, TL); 03630 } 03631 03632 template<typename Derived> 03633 QualType 03634 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 03635 MemberPointerTypeLoc TL) { 03636 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 03637 if (PointeeType.isNull()) 03638 return QualType(); 03639 03640 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 03641 TypeSourceInfo* NewClsTInfo = 0; 03642 if (OldClsTInfo) { 03643 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 03644 if (!NewClsTInfo) 03645 return QualType(); 03646 } 03647 03648 const MemberPointerType *T = TL.getTypePtr(); 03649 QualType OldClsType = QualType(T->getClass(), 0); 03650 QualType NewClsType; 03651 if (NewClsTInfo) 03652 NewClsType = NewClsTInfo->getType(); 03653 else { 03654 NewClsType = getDerived().TransformType(OldClsType); 03655 if (NewClsType.isNull()) 03656 return QualType(); 03657 } 03658 03659 QualType Result = TL.getType(); 03660 if (getDerived().AlwaysRebuild() || 03661 PointeeType != T->getPointeeType() || 03662 NewClsType != OldClsType) { 03663 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 03664 TL.getStarLoc()); 03665 if (Result.isNull()) 03666 return QualType(); 03667 } 03668 03669 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 03670 NewTL.setSigilLoc(TL.getSigilLoc()); 03671 NewTL.setClassTInfo(NewClsTInfo); 03672 03673 return Result; 03674 } 03675 03676 template<typename Derived> 03677 QualType 03678 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 03679 ConstantArrayTypeLoc TL) { 03680 const ConstantArrayType *T = TL.getTypePtr(); 03681 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 03682 if (ElementType.isNull()) 03683 return QualType(); 03684 03685 QualType Result = TL.getType(); 03686 if (getDerived().AlwaysRebuild() || 03687 ElementType != T->getElementType()) { 03688 Result = getDerived().RebuildConstantArrayType(ElementType, 03689 T->getSizeModifier(), 03690 T->getSize(), 03691 T->getIndexTypeCVRQualifiers(), 03692 TL.getBracketsRange()); 03693 if (Result.isNull()) 03694 return QualType(); 03695 } 03696 03697 // We might have either a ConstantArrayType or a VariableArrayType now: 03698 // a ConstantArrayType is allowed to have an element type which is a 03699 // VariableArrayType if the type is dependent. Fortunately, all array 03700 // types have the same location layout. 03701 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 03702 NewTL.setLBracketLoc(TL.getLBracketLoc()); 03703 NewTL.setRBracketLoc(TL.getRBracketLoc()); 03704 03705 Expr *Size = TL.getSizeExpr(); 03706 if (Size) { 03707 EnterExpressionEvaluationContext Unevaluated(SemaRef, 03708 Sema::ConstantEvaluated); 03709 Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 03710 Size = SemaRef.ActOnConstantExpression(Size).take(); 03711 } 03712 NewTL.setSizeExpr(Size); 03713 03714 return Result; 03715 } 03716 03717 template<typename Derived> 03718 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 03719 TypeLocBuilder &TLB, 03720 IncompleteArrayTypeLoc TL) { 03721 const IncompleteArrayType *T = TL.getTypePtr(); 03722 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 03723 if (ElementType.isNull()) 03724 return QualType(); 03725 03726 QualType Result = TL.getType(); 03727 if (getDerived().AlwaysRebuild() || 03728 ElementType != T->getElementType()) { 03729 Result = getDerived().RebuildIncompleteArrayType(ElementType, 03730 T->getSizeModifier(), 03731 T->getIndexTypeCVRQualifiers(), 03732 TL.getBracketsRange()); 03733 if (Result.isNull()) 03734 return QualType(); 03735 } 03736 03737 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 03738 NewTL.setLBracketLoc(TL.getLBracketLoc()); 03739 NewTL.setRBracketLoc(TL.getRBracketLoc()); 03740 NewTL.setSizeExpr(0); 03741 03742 return Result; 03743 } 03744 03745 template<typename Derived> 03746 QualType 03747 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 03748 VariableArrayTypeLoc TL) { 03749 const VariableArrayType *T = TL.getTypePtr(); 03750 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 03751 if (ElementType.isNull()) 03752 return QualType(); 03753 03754 ExprResult SizeResult 03755 = getDerived().TransformExpr(T->getSizeExpr()); 03756 if (SizeResult.isInvalid()) 03757 return QualType(); 03758 03759 Expr *Size = SizeResult.take(); 03760 03761 QualType Result = TL.getType(); 03762 if (getDerived().AlwaysRebuild() || 03763 ElementType != T->getElementType() || 03764 Size != T->getSizeExpr()) { 03765 Result = getDerived().RebuildVariableArrayType(ElementType, 03766 T->getSizeModifier(), 03767 Size, 03768 T->getIndexTypeCVRQualifiers(), 03769 TL.getBracketsRange()); 03770 if (Result.isNull()) 03771 return QualType(); 03772 } 03773 03774 VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 03775 NewTL.setLBracketLoc(TL.getLBracketLoc()); 03776 NewTL.setRBracketLoc(TL.getRBracketLoc()); 03777 NewTL.setSizeExpr(Size); 03778 03779 return Result; 03780 } 03781 03782 template<typename Derived> 03783 QualType 03784 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 03785 DependentSizedArrayTypeLoc TL) { 03786 const DependentSizedArrayType *T = TL.getTypePtr(); 03787 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 03788 if (ElementType.isNull()) 03789 return QualType(); 03790 03791 // Array bounds are constant expressions. 03792 EnterExpressionEvaluationContext Unevaluated(SemaRef, 03793 Sema::ConstantEvaluated); 03794 03795 // Prefer the expression from the TypeLoc; the other may have been uniqued. 03796 Expr *origSize = TL.getSizeExpr(); 03797 if (!origSize) origSize = T->getSizeExpr(); 03798 03799 ExprResult sizeResult 03800 = getDerived().TransformExpr(origSize); 03801 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 03802 if (sizeResult.isInvalid()) 03803 return QualType(); 03804 03805 Expr *size = sizeResult.get(); 03806 03807 QualType Result = TL.getType(); 03808 if (getDerived().AlwaysRebuild() || 03809 ElementType != T->getElementType() || 03810 size != origSize) { 03811 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 03812 T->getSizeModifier(), 03813 size, 03814 T->getIndexTypeCVRQualifiers(), 03815 TL.getBracketsRange()); 03816 if (Result.isNull()) 03817 return QualType(); 03818 } 03819 03820 // We might have any sort of array type now, but fortunately they 03821 // all have the same location layout. 03822 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 03823 NewTL.setLBracketLoc(TL.getLBracketLoc()); 03824 NewTL.setRBracketLoc(TL.getRBracketLoc()); 03825 NewTL.setSizeExpr(size); 03826 03827 return Result; 03828 } 03829 03830 template<typename Derived> 03831 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 03832 TypeLocBuilder &TLB, 03833 DependentSizedExtVectorTypeLoc TL) { 03834 const DependentSizedExtVectorType *T = TL.getTypePtr(); 03835 03836 // FIXME: ext vector locs should be nested 03837 QualType ElementType = getDerived().TransformType(T->getElementType()); 03838 if (ElementType.isNull()) 03839 return QualType(); 03840 03841 // Vector sizes are constant expressions. 03842 EnterExpressionEvaluationContext Unevaluated(SemaRef, 03843 Sema::ConstantEvaluated); 03844 03845 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 03846 Size = SemaRef.ActOnConstantExpression(Size); 03847 if (Size.isInvalid()) 03848 return QualType(); 03849 03850 QualType Result = TL.getType(); 03851 if (getDerived().AlwaysRebuild() || 03852 ElementType != T->getElementType() || 03853 Size.get() != T->getSizeExpr()) { 03854 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 03855 Size.take(), 03856 T->getAttributeLoc()); 03857 if (Result.isNull()) 03858 return QualType(); 03859 } 03860 03861 // Result might be dependent or not. 03862 if (isa<DependentSizedExtVectorType>(Result)) { 03863 DependentSizedExtVectorTypeLoc NewTL 03864 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 03865 NewTL.setNameLoc(TL.getNameLoc()); 03866 } else { 03867 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 03868 NewTL.setNameLoc(TL.getNameLoc()); 03869 } 03870 03871 return Result; 03872 } 03873 03874 template<typename Derived> 03875 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 03876 VectorTypeLoc TL) { 03877 const VectorType *T = TL.getTypePtr(); 03878 QualType ElementType = getDerived().TransformType(T->getElementType()); 03879 if (ElementType.isNull()) 03880 return QualType(); 03881 03882 QualType Result = TL.getType(); 03883 if (getDerived().AlwaysRebuild() || 03884 ElementType != T->getElementType()) { 03885 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 03886 T->getVectorKind()); 03887 if (Result.isNull()) 03888 return QualType(); 03889 } 03890 03891 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 03892 NewTL.setNameLoc(TL.getNameLoc()); 03893 03894 return Result; 03895 } 03896 03897 template<typename Derived> 03898 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 03899 ExtVectorTypeLoc TL) { 03900 const VectorType *T = TL.getTypePtr(); 03901 QualType ElementType = getDerived().TransformType(T->getElementType()); 03902 if (ElementType.isNull()) 03903 return QualType(); 03904 03905 QualType Result = TL.getType(); 03906 if (getDerived().AlwaysRebuild() || 03907 ElementType != T->getElementType()) { 03908 Result = getDerived().RebuildExtVectorType(ElementType, 03909 T->getNumElements(), 03910 /*FIXME*/ SourceLocation()); 03911 if (Result.isNull()) 03912 return QualType(); 03913 } 03914 03915 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 03916 NewTL.setNameLoc(TL.getNameLoc()); 03917 03918 return Result; 03919 } 03920 03921 template<typename Derived> 03922 ParmVarDecl * 03923 TreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm, 03924 int indexAdjustment, 03925 llvm::Optional<unsigned> NumExpansions, 03926 bool ExpectParameterPack) { 03927 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 03928 TypeSourceInfo *NewDI = 0; 03929 03930 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 03931 // If we're substituting into a pack expansion type and we know the 03932 // length we want to expand to, just substitute for the pattern. 03933 TypeLoc OldTL = OldDI->getTypeLoc(); 03934 PackExpansionTypeLoc OldExpansionTL = cast<PackExpansionTypeLoc>(OldTL); 03935 03936 TypeLocBuilder TLB; 03937 TypeLoc NewTL = OldDI->getTypeLoc(); 03938 TLB.reserve(NewTL.getFullDataSize()); 03939 03940 QualType Result = getDerived().TransformType(TLB, 03941 OldExpansionTL.getPatternLoc()); 03942 if (Result.isNull()) 03943 return 0; 03944 03945 Result = RebuildPackExpansionType(Result, 03946 OldExpansionTL.getPatternLoc().getSourceRange(), 03947 OldExpansionTL.getEllipsisLoc(), 03948 NumExpansions); 03949 if (Result.isNull()) 03950 return 0; 03951 03952 PackExpansionTypeLoc NewExpansionTL 03953 = TLB.push<PackExpansionTypeLoc>(Result); 03954 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 03955 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 03956 } else 03957 NewDI = getDerived().TransformType(OldDI); 03958 if (!NewDI) 03959 return 0; 03960 03961 if (NewDI == OldDI && indexAdjustment == 0) 03962 return OldParm; 03963 03964 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 03965 OldParm->getDeclContext(), 03966 OldParm->getInnerLocStart(), 03967 OldParm->getLocation(), 03968 OldParm->getIdentifier(), 03969 NewDI->getType(), 03970 NewDI, 03971 OldParm->getStorageClass(), 03972 OldParm->getStorageClassAsWritten(), 03973 /* DefArg */ NULL); 03974 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 03975 OldParm->getFunctionScopeIndex() + indexAdjustment); 03976 return newParm; 03977 } 03978 03979 template<typename Derived> 03980 bool TreeTransform<Derived>:: 03981 TransformFunctionTypeParams(SourceLocation Loc, 03982 ParmVarDecl **Params, unsigned NumParams, 03983 const QualType *ParamTypes, 03984 SmallVectorImpl<QualType> &OutParamTypes, 03985 SmallVectorImpl<ParmVarDecl*> *PVars) { 03986 int indexAdjustment = 0; 03987 03988 for (unsigned i = 0; i != NumParams; ++i) { 03989 if (ParmVarDecl *OldParm = Params[i]) { 03990 assert(OldParm->getFunctionScopeIndex() == i); 03991 03992 llvm::Optional<unsigned> NumExpansions; 03993 ParmVarDecl *NewParm = 0; 03994 if (OldParm->isParameterPack()) { 03995 // We have a function parameter pack that may need to be expanded. 03996 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 03997 03998 // Find the parameter packs that could be expanded. 03999 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 04000 PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL); 04001 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 04002 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 04003 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 04004 04005 // Determine whether we should expand the parameter packs. 04006 bool ShouldExpand = false; 04007 bool RetainExpansion = false; 04008 llvm::Optional<unsigned> OrigNumExpansions 04009 = ExpansionTL.getTypePtr()->getNumExpansions(); 04010 NumExpansions = OrigNumExpansions; 04011 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 04012 Pattern.getSourceRange(), 04013 Unexpanded, 04014 ShouldExpand, 04015 RetainExpansion, 04016 NumExpansions)) { 04017 return true; 04018 } 04019 04020 if (ShouldExpand) { 04021 // Expand the function parameter pack into multiple, separate 04022 // parameters. 04023 getDerived().ExpandingFunctionParameterPack(OldParm); 04024 for (unsigned I = 0; I != *NumExpansions; ++I) { 04025 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 04026 ParmVarDecl *NewParm 04027 = getDerived().TransformFunctionTypeParam(OldParm, 04028 indexAdjustment++, 04029 OrigNumExpansions, 04030 /*ExpectParameterPack=*/false); 04031 if (!NewParm) 04032 return true; 04033 04034 OutParamTypes.push_back(NewParm->getType()); 04035 if (PVars) 04036 PVars->push_back(NewParm); 04037 } 04038 04039 // If we're supposed to retain a pack expansion, do so by temporarily 04040 // forgetting the partially-substituted parameter pack. 04041 if (RetainExpansion) { 04042 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 04043 ParmVarDecl *NewParm 04044 = getDerived().TransformFunctionTypeParam(OldParm, 04045 indexAdjustment++, 04046 OrigNumExpansions, 04047 /*ExpectParameterPack=*/false); 04048 if (!NewParm) 04049 return true; 04050 04051 OutParamTypes.push_back(NewParm->getType()); 04052 if (PVars) 04053 PVars->push_back(NewParm); 04054 } 04055 04056 // The next parameter should have the same adjustment as the 04057 // last thing we pushed, but we post-incremented indexAdjustment 04058 // on every push. Also, if we push nothing, the adjustment should 04059 // go down by one. 04060 indexAdjustment--; 04061 04062 // We're done with the pack expansion. 04063 continue; 04064 } 04065 04066 // We'll substitute the parameter now without expanding the pack 04067 // expansion. 04068 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 04069 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 04070 indexAdjustment, 04071 NumExpansions, 04072 /*ExpectParameterPack=*/true); 04073 } else { 04074 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 04075 indexAdjustment, 04076 llvm::Optional<unsigned>(), 04077 /*ExpectParameterPack=*/false); 04078 } 04079 04080 if (!NewParm) 04081 return true; 04082 04083 OutParamTypes.push_back(NewParm->getType()); 04084 if (PVars) 04085 PVars->push_back(NewParm); 04086 continue; 04087 } 04088 04089 // Deal with the possibility that we don't have a parameter 04090 // declaration for this parameter. 04091 QualType OldType = ParamTypes[i]; 04092 bool IsPackExpansion = false; 04093 llvm::Optional<unsigned> NumExpansions; 04094 QualType NewType; 04095 if (const PackExpansionType *Expansion 04096 = dyn_cast<PackExpansionType>(OldType)) { 04097 // We have a function parameter pack that may need to be expanded. 04098 QualType Pattern = Expansion->getPattern(); 04099 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 04100 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 04101 04102 // Determine whether we should expand the parameter packs. 04103 bool ShouldExpand = false; 04104 bool RetainExpansion = false; 04105 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 04106 Unexpanded, 04107 ShouldExpand, 04108 RetainExpansion, 04109 NumExpansions)) { 04110 return true; 04111 } 04112 04113 if (ShouldExpand) { 04114 // Expand the function parameter pack into multiple, separate 04115 // parameters. 04116 for (unsigned I = 0; I != *NumExpansions; ++I) { 04117 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 04118 QualType NewType = getDerived().TransformType(Pattern); 04119 if (NewType.isNull()) 04120 return true; 04121 04122 OutParamTypes.push_back(NewType); 04123 if (PVars) 04124 PVars->push_back(0); 04125 } 04126 04127 // We're done with the pack expansion. 04128 continue; 04129 } 04130 04131 // If we're supposed to retain a pack expansion, do so by temporarily 04132 // forgetting the partially-substituted parameter pack. 04133 if (RetainExpansion) { 04134 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 04135 QualType NewType = getDerived().TransformType(Pattern); 04136 if (NewType.isNull()) 04137 return true; 04138 04139 OutParamTypes.push_back(NewType); 04140 if (PVars) 04141 PVars->push_back(0); 04142 } 04143 04144 // We'll substitute the parameter now without expanding the pack 04145 // expansion. 04146 OldType = Expansion->getPattern(); 04147 IsPackExpansion = true; 04148 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 04149 NewType = getDerived().TransformType(OldType); 04150 } else { 04151 NewType = getDerived().TransformType(OldType); 04152 } 04153 04154 if (NewType.isNull()) 04155 return true; 04156 04157 if (IsPackExpansion) 04158 NewType = getSema().Context.getPackExpansionType(NewType, 04159 NumExpansions); 04160 04161 OutParamTypes.push_back(NewType); 04162 if (PVars) 04163 PVars->push_back(0); 04164 } 04165 04166 #ifndef NDEBUG 04167 if (PVars) { 04168 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 04169 if (ParmVarDecl *parm = (*PVars)[i]) 04170 assert(parm->getFunctionScopeIndex() == i); 04171 } 04172 #endif 04173 04174 return false; 04175 } 04176 04177 template<typename Derived> 04178 QualType 04179 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 04180 FunctionProtoTypeLoc TL) { 04181 return getDerived().TransformFunctionProtoType(TLB, TL, 0, 0); 04182 } 04183 04184 template<typename Derived> 04185 QualType 04186 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 04187 FunctionProtoTypeLoc TL, 04188 CXXRecordDecl *ThisContext, 04189 unsigned ThisTypeQuals) { 04190 // Transform the parameters and return type. 04191 // 04192 // We are required to instantiate the params and return type in source order. 04193 // When the function has a trailing return type, we instantiate the 04194 // parameters before the return type, since the return type can then refer 04195 // to the parameters themselves (via decltype, sizeof, etc.). 04196 // 04197 SmallVector<QualType, 4> ParamTypes; 04198 SmallVector<ParmVarDecl*, 4> ParamDecls; 04199 const FunctionProtoType *T = TL.getTypePtr(); 04200 04201 QualType ResultType; 04202 04203 if (TL.getTrailingReturn()) { 04204 if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 04205 TL.getParmArray(), 04206 TL.getNumArgs(), 04207 TL.getTypePtr()->arg_type_begin(), 04208 ParamTypes, &ParamDecls)) 04209 return QualType(); 04210 04211 { 04212 // C++11 [expr.prim.general]p3: 04213 // If a declaration declares a member function or member function 04214 // template of a class X, the expression this is a prvalue of type 04215 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 04216 // and the end of the function-definition, member-declarator, or 04217 // declarator. 04218 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 04219 04220 ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 04221 if (ResultType.isNull()) 04222 return QualType(); 04223 } 04224 } 04225 else { 04226 ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 04227 if (ResultType.isNull()) 04228 return QualType(); 04229 04230 if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 04231 TL.getParmArray(), 04232 TL.getNumArgs(), 04233 TL.getTypePtr()->arg_type_begin(), 04234 ParamTypes, &ParamDecls)) 04235 return QualType(); 04236 } 04237 04238 // FIXME: Need to transform the exception-specification too. 04239 04240 QualType Result = TL.getType(); 04241 if (getDerived().AlwaysRebuild() || 04242 ResultType != T->getResultType() || 04243 T->getNumArgs() != ParamTypes.size() || 04244 !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 04245 Result = getDerived().RebuildFunctionProtoType(ResultType, 04246 ParamTypes.data(), 04247 ParamTypes.size(), 04248 T->isVariadic(), 04249 T->hasTrailingReturn(), 04250 T->getTypeQuals(), 04251 T->getRefQualifier(), 04252 T->getExtInfo()); 04253 if (Result.isNull()) 04254 return QualType(); 04255 } 04256 04257 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 04258 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 04259 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 04260 NewTL.setTrailingReturn(TL.getTrailingReturn()); 04261 for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 04262 NewTL.setArg(i, ParamDecls[i]); 04263 04264 return Result; 04265 } 04266 04267 template<typename Derived> 04268 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 04269 TypeLocBuilder &TLB, 04270 FunctionNoProtoTypeLoc TL) { 04271 const FunctionNoProtoType *T = TL.getTypePtr(); 04272 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 04273 if (ResultType.isNull()) 04274 return QualType(); 04275 04276 QualType Result = TL.getType(); 04277 if (getDerived().AlwaysRebuild() || 04278 ResultType != T->getResultType()) 04279 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 04280 04281 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 04282 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 04283 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 04284 NewTL.setTrailingReturn(false); 04285 04286 return Result; 04287 } 04288 04289 template<typename Derived> QualType 04290 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 04291 UnresolvedUsingTypeLoc TL) { 04292 const UnresolvedUsingType *T = TL.getTypePtr(); 04293 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 04294 if (!D) 04295 return QualType(); 04296 04297 QualType Result = TL.getType(); 04298 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 04299 Result = getDerived().RebuildUnresolvedUsingType(D); 04300 if (Result.isNull()) 04301 return QualType(); 04302 } 04303 04304 // We might get an arbitrary type spec type back. We should at 04305 // least always get a type spec type, though. 04306 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 04307 NewTL.setNameLoc(TL.getNameLoc()); 04308 04309 return Result; 04310 } 04311 04312 template<typename Derived> 04313 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 04314 TypedefTypeLoc TL) { 04315 const TypedefType *T = TL.getTypePtr(); 04316 TypedefNameDecl *Typedef 04317 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 04318 T->getDecl())); 04319 if (!Typedef) 04320 return QualType(); 04321 04322 QualType Result = TL.getType(); 04323 if (getDerived().AlwaysRebuild() || 04324 Typedef != T->getDecl()) { 04325 Result = getDerived().RebuildTypedefType(Typedef); 04326 if (Result.isNull()) 04327 return QualType(); 04328 } 04329 04330 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 04331 NewTL.setNameLoc(TL.getNameLoc()); 04332 04333 return Result; 04334 } 04335 04336 template<typename Derived> 04337 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 04338 TypeOfExprTypeLoc TL) { 04339 // typeof expressions are not potentially evaluated contexts 04340 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 04341 04342 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 04343 if (E.isInvalid()) 04344 return QualType(); 04345 04346 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 04347 if (E.isInvalid()) 04348 return QualType(); 04349 04350 QualType Result = TL.getType(); 04351 if (getDerived().AlwaysRebuild() || 04352 E.get() != TL.getUnderlyingExpr()) { 04353 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 04354 if (Result.isNull()) 04355 return QualType(); 04356 } 04357 else E.take(); 04358 04359 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 04360 NewTL.setTypeofLoc(TL.getTypeofLoc()); 04361 NewTL.setLParenLoc(TL.getLParenLoc()); 04362 NewTL.setRParenLoc(TL.getRParenLoc()); 04363 04364 return Result; 04365 } 04366 04367 template<typename Derived> 04368 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 04369 TypeOfTypeLoc TL) { 04370 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 04371 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 04372 if (!New_Under_TI) 04373 return QualType(); 04374 04375 QualType Result = TL.getType(); 04376 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 04377 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 04378 if (Result.isNull()) 04379 return QualType(); 04380 } 04381 04382 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 04383 NewTL.setTypeofLoc(TL.getTypeofLoc()); 04384 NewTL.setLParenLoc(TL.getLParenLoc()); 04385 NewTL.setRParenLoc(TL.getRParenLoc()); 04386 NewTL.setUnderlyingTInfo(New_Under_TI); 04387 04388 return Result; 04389 } 04390 04391 template<typename Derived> 04392 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 04393 DecltypeTypeLoc TL) { 04394 const DecltypeType *T = TL.getTypePtr(); 04395 04396 // decltype expressions are not potentially evaluated contexts 04397 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 0, 04398 /*IsDecltype=*/ true); 04399 04400 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 04401 if (E.isInvalid()) 04402 return QualType(); 04403 04404 E = getSema().ActOnDecltypeExpression(E.take()); 04405 if (E.isInvalid()) 04406 return QualType(); 04407 04408 QualType Result = TL.getType(); 04409 if (getDerived().AlwaysRebuild() || 04410 E.get() != T->getUnderlyingExpr()) { 04411 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 04412 if (Result.isNull()) 04413 return QualType(); 04414 } 04415 else E.take(); 04416 04417 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 04418 NewTL.setNameLoc(TL.getNameLoc()); 04419 04420 return Result; 04421 } 04422 04423 template<typename Derived> 04424 QualType TreeTransform<Derived>::TransformUnaryTransformType( 04425 TypeLocBuilder &TLB, 04426 UnaryTransformTypeLoc TL) { 04427 QualType Result = TL.getType(); 04428 if (Result->isDependentType()) { 04429 const UnaryTransformType *T = TL.getTypePtr(); 04430 QualType NewBase = 04431 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 04432 Result = getDerived().RebuildUnaryTransformType(NewBase, 04433 T->getUTTKind(), 04434 TL.getKWLoc()); 04435 if (Result.isNull()) 04436 return QualType(); 04437 } 04438 04439 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 04440 NewTL.setKWLoc(TL.getKWLoc()); 04441 NewTL.setParensRange(TL.getParensRange()); 04442 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 04443 return Result; 04444 } 04445 04446 template<typename Derived> 04447 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 04448 AutoTypeLoc TL) { 04449 const AutoType *T = TL.getTypePtr(); 04450 QualType OldDeduced = T->getDeducedType(); 04451 QualType NewDeduced; 04452 if (!OldDeduced.isNull()) { 04453 NewDeduced = getDerived().TransformType(OldDeduced); 04454 if (NewDeduced.isNull()) 04455 return QualType(); 04456 } 04457 04458 QualType Result = TL.getType(); 04459 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced) { 04460 Result = getDerived().RebuildAutoType(NewDeduced); 04461 if (Result.isNull()) 04462 return QualType(); 04463 } 04464 04465 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 04466 NewTL.setNameLoc(TL.getNameLoc()); 04467 04468 return Result; 04469 } 04470 04471 template<typename Derived> 04472 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 04473 RecordTypeLoc TL) { 04474 const RecordType *T = TL.getTypePtr(); 04475 RecordDecl *Record 04476 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 04477 T->getDecl())); 04478 if (!Record) 04479 return QualType(); 04480 04481 QualType Result = TL.getType(); 04482 if (getDerived().AlwaysRebuild() || 04483 Record != T->getDecl()) { 04484 Result = getDerived().RebuildRecordType(Record); 04485 if (Result.isNull()) 04486 return QualType(); 04487 } 04488 04489 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 04490 NewTL.setNameLoc(TL.getNameLoc()); 04491 04492 return Result; 04493 } 04494 04495 template<typename Derived> 04496 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 04497 EnumTypeLoc TL) { 04498 const EnumType *T = TL.getTypePtr(); 04499 EnumDecl *Enum 04500 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 04501 T->getDecl())); 04502 if (!Enum) 04503 return QualType(); 04504 04505 QualType Result = TL.getType(); 04506 if (getDerived().AlwaysRebuild() || 04507 Enum != T->getDecl()) { 04508 Result = getDerived().RebuildEnumType(Enum); 04509 if (Result.isNull()) 04510 return QualType(); 04511 } 04512 04513 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 04514 NewTL.setNameLoc(TL.getNameLoc()); 04515 04516 return Result; 04517 } 04518 04519 template<typename Derived> 04520 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 04521 TypeLocBuilder &TLB, 04522 InjectedClassNameTypeLoc TL) { 04523 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 04524 TL.getTypePtr()->getDecl()); 04525 if (!D) return QualType(); 04526 04527 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 04528 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 04529 return T; 04530 } 04531 04532 template<typename Derived> 04533 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 04534 TypeLocBuilder &TLB, 04535 TemplateTypeParmTypeLoc TL) { 04536 return TransformTypeSpecType(TLB, TL); 04537 } 04538 04539 template<typename Derived> 04540 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 04541 TypeLocBuilder &TLB, 04542 SubstTemplateTypeParmTypeLoc TL) { 04543 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 04544 04545 // Substitute into the replacement type, which itself might involve something 04546 // that needs to be transformed. This only tends to occur with default 04547 // template arguments of template template parameters. 04548 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 04549 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 04550 if (Replacement.isNull()) 04551 return QualType(); 04552 04553 // Always canonicalize the replacement type. 04554 Replacement = SemaRef.Context.getCanonicalType(Replacement); 04555 QualType Result 04556 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 04557 Replacement); 04558 04559 // Propagate type-source information. 04560 SubstTemplateTypeParmTypeLoc NewTL 04561 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 04562 NewTL.setNameLoc(TL.getNameLoc()); 04563 return Result; 04564 04565 } 04566 04567 template<typename Derived> 04568 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 04569 TypeLocBuilder &TLB, 04570 SubstTemplateTypeParmPackTypeLoc TL) { 04571 return TransformTypeSpecType(TLB, TL); 04572 } 04573 04574 template<typename Derived> 04575 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 04576 TypeLocBuilder &TLB, 04577 TemplateSpecializationTypeLoc TL) { 04578 const TemplateSpecializationType *T = TL.getTypePtr(); 04579 04580 // The nested-name-specifier never matters in a TemplateSpecializationType, 04581 // because we can't have a dependent nested-name-specifier anyway. 04582 CXXScopeSpec SS; 04583 TemplateName Template 04584 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 04585 TL.getTemplateNameLoc()); 04586 if (Template.isNull()) 04587 return QualType(); 04588 04589 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 04590 } 04591 04592 template<typename Derived> 04593 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 04594 AtomicTypeLoc TL) { 04595 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 04596 if (ValueType.isNull()) 04597 return QualType(); 04598 04599 QualType Result = TL.getType(); 04600 if (getDerived().AlwaysRebuild() || 04601 ValueType != TL.getValueLoc().getType()) { 04602 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 04603 if (Result.isNull()) 04604 return QualType(); 04605 } 04606 04607 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 04608 NewTL.setKWLoc(TL.getKWLoc()); 04609 NewTL.setLParenLoc(TL.getLParenLoc()); 04610 NewTL.setRParenLoc(TL.getRParenLoc()); 04611 04612 return Result; 04613 } 04614 04615 namespace { 04616 /// \brief Simple iterator that traverses the template arguments in a 04617 /// container that provides a \c getArgLoc() member function. 04618 /// 04619 /// This iterator is intended to be used with the iterator form of 04620 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 04621 template<typename ArgLocContainer> 04622 class TemplateArgumentLocContainerIterator { 04623 ArgLocContainer *Container; 04624 unsigned Index; 04625 04626 public: 04627 typedef TemplateArgumentLoc value_type; 04628 typedef TemplateArgumentLoc reference; 04629 typedef int difference_type; 04630 typedef std::input_iterator_tag iterator_category; 04631 04632 class pointer { 04633 TemplateArgumentLoc Arg; 04634 04635 public: 04636 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 04637 04638 const TemplateArgumentLoc *operator->() const { 04639 return &Arg; 04640 } 04641 }; 04642 04643 04644 TemplateArgumentLocContainerIterator() {} 04645 04646 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 04647 unsigned Index) 04648 : Container(&Container), Index(Index) { } 04649 04650 TemplateArgumentLocContainerIterator &operator++() { 04651 ++Index; 04652 return *this; 04653 } 04654 04655 TemplateArgumentLocContainerIterator operator++(int) { 04656 TemplateArgumentLocContainerIterator Old(*this); 04657 ++(*this); 04658 return Old; 04659 } 04660 04661 TemplateArgumentLoc operator*() const { 04662 return Container->getArgLoc(Index); 04663 } 04664 04665 pointer operator->() const { 04666 return pointer(Container->getArgLoc(Index)); 04667 } 04668 04669 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 04670 const TemplateArgumentLocContainerIterator &Y) { 04671 return X.Container == Y.Container && X.Index == Y.Index; 04672 } 04673 04674 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 04675 const TemplateArgumentLocContainerIterator &Y) { 04676 return !(X == Y); 04677 } 04678 }; 04679 } 04680 04681 04682 template <typename Derived> 04683 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 04684 TypeLocBuilder &TLB, 04685 TemplateSpecializationTypeLoc TL, 04686 TemplateName Template) { 04687 TemplateArgumentListInfo NewTemplateArgs; 04688 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 04689 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 04690 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 04691 ArgIterator; 04692 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 04693 ArgIterator(TL, TL.getNumArgs()), 04694 NewTemplateArgs)) 04695 return QualType(); 04696 04697 // FIXME: maybe don't rebuild if all the template arguments are the same. 04698 04699 QualType Result = 04700 getDerived().RebuildTemplateSpecializationType(Template, 04701 TL.getTemplateNameLoc(), 04702 NewTemplateArgs); 04703 04704 if (!Result.isNull()) { 04705 // Specializations of template template parameters are represented as 04706 // TemplateSpecializationTypes, and substitution of type alias templates 04707 // within a dependent context can transform them into 04708 // DependentTemplateSpecializationTypes. 04709 if (isa<DependentTemplateSpecializationType>(Result)) { 04710 DependentTemplateSpecializationTypeLoc NewTL 04711 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 04712 NewTL.setElaboratedKeywordLoc(SourceLocation()); 04713 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 04714 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 04715 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 04716 NewTL.setLAngleLoc(TL.getLAngleLoc()); 04717 NewTL.setRAngleLoc(TL.getRAngleLoc()); 04718 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 04719 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 04720 return Result; 04721 } 04722 04723 TemplateSpecializationTypeLoc NewTL 04724 = TLB.push<TemplateSpecializationTypeLoc>(Result); 04725 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 04726 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 04727 NewTL.setLAngleLoc(TL.getLAngleLoc()); 04728 NewTL.setRAngleLoc(TL.getRAngleLoc()); 04729 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 04730 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 04731 } 04732 04733 return Result; 04734 } 04735 04736 template <typename Derived> 04737 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 04738 TypeLocBuilder &TLB, 04739 DependentTemplateSpecializationTypeLoc TL, 04740 TemplateName Template, 04741 CXXScopeSpec &SS) { 04742 TemplateArgumentListInfo NewTemplateArgs; 04743 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 04744 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 04745 typedef TemplateArgumentLocContainerIterator< 04746 DependentTemplateSpecializationTypeLoc> ArgIterator; 04747 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 04748 ArgIterator(TL, TL.getNumArgs()), 04749 NewTemplateArgs)) 04750 return QualType(); 04751 04752 // FIXME: maybe don't rebuild if all the template arguments are the same. 04753 04754 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 04755 QualType Result 04756 = getSema().Context.getDependentTemplateSpecializationType( 04757 TL.getTypePtr()->getKeyword(), 04758 DTN->getQualifier(), 04759 DTN->getIdentifier(), 04760 NewTemplateArgs); 04761 04762 DependentTemplateSpecializationTypeLoc NewTL 04763 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 04764 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 04765 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 04766 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 04767 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 04768 NewTL.setLAngleLoc(TL.getLAngleLoc()); 04769 NewTL.setRAngleLoc(TL.getRAngleLoc()); 04770 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 04771 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 04772 return Result; 04773 } 04774 04775 QualType Result 04776 = getDerived().RebuildTemplateSpecializationType(Template, 04777 TL.getTemplateNameLoc(), 04778 NewTemplateArgs); 04779 04780 if (!Result.isNull()) { 04781 /// FIXME: Wrap this in an elaborated-type-specifier? 04782 TemplateSpecializationTypeLoc NewTL 04783 = TLB.push<TemplateSpecializationTypeLoc>(Result); 04784 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 04785 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 04786 NewTL.setLAngleLoc(TL.getLAngleLoc()); 04787 NewTL.setRAngleLoc(TL.getRAngleLoc()); 04788 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 04789 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 04790 } 04791 04792 return Result; 04793 } 04794 04795 template<typename Derived> 04796 QualType 04797 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 04798 ElaboratedTypeLoc TL) { 04799 const ElaboratedType *T = TL.getTypePtr(); 04800 04801 NestedNameSpecifierLoc QualifierLoc; 04802 // NOTE: the qualifier in an ElaboratedType is optional. 04803 if (TL.getQualifierLoc()) { 04804 QualifierLoc 04805 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 04806 if (!QualifierLoc) 04807 return QualType(); 04808 } 04809 04810 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 04811 if (NamedT.isNull()) 04812 return QualType(); 04813 04814 // C++0x [dcl.type.elab]p2: 04815 // If the identifier resolves to a typedef-name or the simple-template-id 04816 // resolves to an alias template specialization, the 04817 // elaborated-type-specifier is ill-formed. 04818 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 04819 if (const TemplateSpecializationType *TST = 04820 NamedT->getAs<TemplateSpecializationType>()) { 04821 TemplateName Template = TST->getTemplateName(); 04822 if (TypeAliasTemplateDecl *TAT = 04823 dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) { 04824 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 04825 diag::err_tag_reference_non_tag) << 4; 04826 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 04827 } 04828 } 04829 } 04830 04831 QualType Result = TL.getType(); 04832 if (getDerived().AlwaysRebuild() || 04833 QualifierLoc != TL.getQualifierLoc() || 04834 NamedT != T->getNamedType()) { 04835 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 04836 T->getKeyword(), 04837 QualifierLoc, NamedT); 04838 if (Result.isNull()) 04839 return QualType(); 04840 } 04841 04842 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 04843 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 04844 NewTL.setQualifierLoc(QualifierLoc); 04845 return Result; 04846 } 04847 04848 template<typename Derived> 04849 QualType TreeTransform<Derived>::TransformAttributedType( 04850 TypeLocBuilder &TLB, 04851 AttributedTypeLoc TL) { 04852 const AttributedType *oldType = TL.getTypePtr(); 04853 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 04854 if (modifiedType.isNull()) 04855 return QualType(); 04856 04857 QualType result = TL.getType(); 04858 04859 // FIXME: dependent operand expressions? 04860 if (getDerived().AlwaysRebuild() || 04861 modifiedType != oldType->getModifiedType()) { 04862 // TODO: this is really lame; we should really be rebuilding the 04863 // equivalent type from first principles. 04864 QualType equivalentType 04865 = getDerived().TransformType(oldType->getEquivalentType()); 04866 if (equivalentType.isNull()) 04867 return QualType(); 04868 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 04869 modifiedType, 04870 equivalentType); 04871 } 04872 04873 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 04874 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 04875 if (TL.hasAttrOperand()) 04876 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 04877 if (TL.hasAttrExprOperand()) 04878 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 04879 else if (TL.hasAttrEnumOperand()) 04880 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 04881 04882 return result; 04883 } 04884 04885 template<typename Derived> 04886 QualType 04887 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 04888 ParenTypeLoc TL) { 04889 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 04890 if (Inner.isNull()) 04891 return QualType(); 04892 04893 QualType Result = TL.getType(); 04894 if (getDerived().AlwaysRebuild() || 04895 Inner != TL.getInnerLoc().getType()) { 04896 Result = getDerived().RebuildParenType(Inner); 04897 if (Result.isNull()) 04898 return QualType(); 04899 } 04900 04901 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 04902 NewTL.setLParenLoc(TL.getLParenLoc()); 04903 NewTL.setRParenLoc(TL.getRParenLoc()); 04904 return Result; 04905 } 04906 04907 template<typename Derived> 04908 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 04909 DependentNameTypeLoc TL) { 04910 const DependentNameType *T = TL.getTypePtr(); 04911 04912 NestedNameSpecifierLoc QualifierLoc 04913 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 04914 if (!QualifierLoc) 04915 return QualType(); 04916 04917 QualType Result 04918 = getDerived().RebuildDependentNameType(T->getKeyword(), 04919 TL.getElaboratedKeywordLoc(), 04920 QualifierLoc, 04921 T->getIdentifier(), 04922 TL.getNameLoc()); 04923 if (Result.isNull()) 04924 return QualType(); 04925 04926 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 04927 QualType NamedT = ElabT->getNamedType(); 04928 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 04929 04930 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 04931 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 04932 NewTL.setQualifierLoc(QualifierLoc); 04933 } else { 04934 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 04935 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 04936 NewTL.setQualifierLoc(QualifierLoc); 04937 NewTL.setNameLoc(TL.getNameLoc()); 04938 } 04939 return Result; 04940 } 04941 04942 template<typename Derived> 04943 QualType TreeTransform<Derived>:: 04944 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 04945 DependentTemplateSpecializationTypeLoc TL) { 04946 NestedNameSpecifierLoc QualifierLoc; 04947 if (TL.getQualifierLoc()) { 04948 QualifierLoc 04949 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 04950 if (!QualifierLoc) 04951 return QualType(); 04952 } 04953 04954 return getDerived() 04955 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 04956 } 04957 04958 template<typename Derived> 04959 QualType TreeTransform<Derived>:: 04960 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 04961 DependentTemplateSpecializationTypeLoc TL, 04962 NestedNameSpecifierLoc QualifierLoc) { 04963 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 04964 04965 TemplateArgumentListInfo NewTemplateArgs; 04966 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 04967 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 04968 04969 typedef TemplateArgumentLocContainerIterator< 04970 DependentTemplateSpecializationTypeLoc> ArgIterator; 04971 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 04972 ArgIterator(TL, TL.getNumArgs()), 04973 NewTemplateArgs)) 04974 return QualType(); 04975 04976 QualType Result 04977 = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 04978 QualifierLoc, 04979 T->getIdentifier(), 04980 TL.getTemplateNameLoc(), 04981 NewTemplateArgs); 04982 if (Result.isNull()) 04983 return QualType(); 04984 04985 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 04986 QualType NamedT = ElabT->getNamedType(); 04987 04988 // Copy information relevant to the template specialization. 04989 TemplateSpecializationTypeLoc NamedTL 04990 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 04991 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 04992 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 04993 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 04994 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 04995 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 04996 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 04997 04998 // Copy information relevant to the elaborated type. 04999 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 05000 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 05001 NewTL.setQualifierLoc(QualifierLoc); 05002 } else if (isa<DependentTemplateSpecializationType>(Result)) { 05003 DependentTemplateSpecializationTypeLoc SpecTL 05004 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 05005 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 05006 SpecTL.setQualifierLoc(QualifierLoc); 05007 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 05008 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 05009 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 05010 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 05011 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 05012 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 05013 } else { 05014 TemplateSpecializationTypeLoc SpecTL 05015 = TLB.push<TemplateSpecializationTypeLoc>(Result); 05016 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 05017 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 05018 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 05019 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 05020 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 05021 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 05022 } 05023 return Result; 05024 } 05025 05026 template<typename Derived> 05027 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 05028 PackExpansionTypeLoc TL) { 05029 QualType Pattern 05030 = getDerived().TransformType(TLB, TL.getPatternLoc()); 05031 if (Pattern.isNull()) 05032 return QualType(); 05033 05034 QualType Result = TL.getType(); 05035 if (getDerived().AlwaysRebuild() || 05036 Pattern != TL.getPatternLoc().getType()) { 05037 Result = getDerived().RebuildPackExpansionType(Pattern, 05038 TL.getPatternLoc().getSourceRange(), 05039 TL.getEllipsisLoc(), 05040 TL.getTypePtr()->getNumExpansions()); 05041 if (Result.isNull()) 05042 return QualType(); 05043 } 05044 05045 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 05046 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 05047 return Result; 05048 } 05049 05050 template<typename Derived> 05051 QualType 05052 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 05053 ObjCInterfaceTypeLoc TL) { 05054 // ObjCInterfaceType is never dependent. 05055 TLB.pushFullCopy(TL); 05056 return TL.getType(); 05057 } 05058 05059 template<typename Derived> 05060 QualType 05061 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 05062 ObjCObjectTypeLoc TL) { 05063 // ObjCObjectType is never dependent. 05064 TLB.pushFullCopy(TL); 05065 return TL.getType(); 05066 } 05067 05068 template<typename Derived> 05069 QualType 05070 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 05071 ObjCObjectPointerTypeLoc TL) { 05072 // ObjCObjectPointerType is never dependent. 05073 TLB.pushFullCopy(TL); 05074 return TL.getType(); 05075 } 05076 05077 //===----------------------------------------------------------------------===// 05078 // Statement transformation 05079 //===----------------------------------------------------------------------===// 05080 template<typename Derived> 05081 StmtResult 05082 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 05083 return SemaRef.Owned(S); 05084 } 05085 05086 template<typename Derived> 05087 StmtResult 05088 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 05089 return getDerived().TransformCompoundStmt(S, false); 05090 } 05091 05092 template<typename Derived> 05093 StmtResult 05094 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 05095 bool IsStmtExpr) { 05096 Sema::CompoundScopeRAII CompoundScope(getSema()); 05097 05098 bool SubStmtInvalid = false; 05099 bool SubStmtChanged = false; 05100 ASTOwningVector<Stmt*> Statements(getSema()); 05101 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 05102 B != BEnd; ++B) { 05103 StmtResult Result = getDerived().TransformStmt(*B); 05104 if (Result.isInvalid()) { 05105 // Immediately fail if this was a DeclStmt, since it's very 05106 // likely that this will cause problems for future statements. 05107 if (isa<DeclStmt>(*B)) 05108 return StmtError(); 05109 05110 // Otherwise, just keep processing substatements and fail later. 05111 SubStmtInvalid = true; 05112 continue; 05113 } 05114 05115 SubStmtChanged = SubStmtChanged || Result.get() != *B; 05116 Statements.push_back(Result.takeAs<Stmt>()); 05117 } 05118 05119 if (SubStmtInvalid) 05120 return StmtError(); 05121 05122 if (!getDerived().AlwaysRebuild() && 05123 !SubStmtChanged) 05124 return SemaRef.Owned(S); 05125 05126 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 05127 move_arg(Statements), 05128 S->getRBracLoc(), 05129 IsStmtExpr); 05130 } 05131 05132 template<typename Derived> 05133 StmtResult 05134 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 05135 ExprResult LHS, RHS; 05136 { 05137 EnterExpressionEvaluationContext Unevaluated(SemaRef, 05138 Sema::ConstantEvaluated); 05139 05140 // Transform the left-hand case value. 05141 LHS = getDerived().TransformExpr(S->getLHS()); 05142 LHS = SemaRef.ActOnConstantExpression(LHS); 05143 if (LHS.isInvalid()) 05144 return StmtError(); 05145 05146 // Transform the right-hand case value (for the GNU case-range extension). 05147 RHS = getDerived().TransformExpr(S->getRHS()); 05148 RHS = SemaRef.ActOnConstantExpression(RHS); 05149 if (RHS.isInvalid()) 05150 return StmtError(); 05151 } 05152 05153 // Build the case statement. 05154 // Case statements are always rebuilt so that they will attached to their 05155 // transformed switch statement. 05156 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 05157 LHS.get(), 05158 S->getEllipsisLoc(), 05159 RHS.get(), 05160 S->getColonLoc()); 05161 if (Case.isInvalid()) 05162 return StmtError(); 05163 05164 // Transform the statement following the case 05165 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 05166 if (SubStmt.isInvalid()) 05167 return StmtError(); 05168 05169 // Attach the body to the case statement 05170 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 05171 } 05172 05173 template<typename Derived> 05174 StmtResult 05175 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 05176 // Transform the statement following the default case 05177 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 05178 if (SubStmt.isInvalid()) 05179 return StmtError(); 05180 05181 // Default statements are always rebuilt 05182 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 05183 SubStmt.get()); 05184 } 05185 05186 template<typename Derived> 05187 StmtResult 05188 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 05189 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 05190 if (SubStmt.isInvalid()) 05191 return StmtError(); 05192 05193 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 05194 S->getDecl()); 05195 if (!LD) 05196 return StmtError(); 05197 05198 05199 // FIXME: Pass the real colon location in. 05200 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 05201 cast<LabelDecl>(LD), SourceLocation(), 05202 SubStmt.get()); 05203 } 05204 05205 template<typename Derived> 05206 StmtResult 05207 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 05208 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 05209 if (SubStmt.isInvalid()) 05210 return StmtError(); 05211 05212 // TODO: transform attributes 05213 if (SubStmt.get() == S->getSubStmt() /* && attrs are the same */) 05214 return S; 05215 05216 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), 05217 S->getAttrs(), 05218 SubStmt.get()); 05219 } 05220 05221 template<typename Derived> 05222 StmtResult 05223 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 05224 // Transform the condition 05225 ExprResult Cond; 05226 VarDecl *ConditionVar = 0; 05227 if (S->getConditionVariable()) { 05228 ConditionVar 05229 = cast_or_null<VarDecl>( 05230 getDerived().TransformDefinition( 05231 S->getConditionVariable()->getLocation(), 05232 S->getConditionVariable())); 05233 if (!ConditionVar) 05234 return StmtError(); 05235 } else { 05236 Cond = getDerived().TransformExpr(S->getCond()); 05237 05238 if (Cond.isInvalid()) 05239 return StmtError(); 05240 05241 // Convert the condition to a boolean value. 05242 if (S->getCond()) { 05243 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(), 05244 Cond.get()); 05245 if (CondE.isInvalid()) 05246 return StmtError(); 05247 05248 Cond = CondE.get(); 05249 } 05250 } 05251 05252 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 05253 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 05254 return StmtError(); 05255 05256 // Transform the "then" branch. 05257 StmtResult Then = getDerived().TransformStmt(S->getThen()); 05258 if (Then.isInvalid()) 05259 return StmtError(); 05260 05261 // Transform the "else" branch. 05262 StmtResult Else = getDerived().TransformStmt(S->getElse()); 05263 if (Else.isInvalid()) 05264 return StmtError(); 05265 05266 if (!getDerived().AlwaysRebuild() && 05267 FullCond.get() == S->getCond() && 05268 ConditionVar == S->getConditionVariable() && 05269 Then.get() == S->getThen() && 05270 Else.get() == S->getElse()) 05271 return SemaRef.Owned(S); 05272 05273 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 05274 Then.get(), 05275 S->getElseLoc(), Else.get()); 05276 } 05277 05278 template<typename Derived> 05279 StmtResult 05280 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 05281 // Transform the condition. 05282 ExprResult Cond; 05283 VarDecl *ConditionVar = 0; 05284 if (S->getConditionVariable()) { 05285 ConditionVar 05286 = cast_or_null<VarDecl>( 05287 getDerived().TransformDefinition( 05288 S->getConditionVariable()->getLocation(), 05289 S->getConditionVariable())); 05290 if (!ConditionVar) 05291 return StmtError(); 05292 } else { 05293 Cond = getDerived().TransformExpr(S->getCond()); 05294 05295 if (Cond.isInvalid()) 05296 return StmtError(); 05297 } 05298 05299 // Rebuild the switch statement. 05300 StmtResult Switch 05301 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 05302 ConditionVar); 05303 if (Switch.isInvalid()) 05304 return StmtError(); 05305 05306 // Transform the body of the switch statement. 05307 StmtResult Body = getDerived().TransformStmt(S->getBody()); 05308 if (Body.isInvalid()) 05309 return StmtError(); 05310 05311 // Complete the switch statement. 05312 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 05313 Body.get()); 05314 } 05315 05316 template<typename Derived> 05317 StmtResult 05318 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 05319 // Transform the condition 05320 ExprResult Cond; 05321 VarDecl *ConditionVar = 0; 05322 if (S->getConditionVariable()) { 05323 ConditionVar 05324 = cast_or_null<VarDecl>( 05325 getDerived().TransformDefinition( 05326 S->getConditionVariable()->getLocation(), 05327 S->getConditionVariable())); 05328 if (!ConditionVar) 05329 return StmtError(); 05330 } else { 05331 Cond = getDerived().TransformExpr(S->getCond()); 05332 05333 if (Cond.isInvalid()) 05334 return StmtError(); 05335 05336 if (S->getCond()) { 05337 // Convert the condition to a boolean value. 05338 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(), 05339 Cond.get()); 05340 if (CondE.isInvalid()) 05341 return StmtError(); 05342 Cond = CondE; 05343 } 05344 } 05345 05346 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 05347 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 05348 return StmtError(); 05349 05350 // Transform the body 05351 StmtResult Body = getDerived().TransformStmt(S->getBody()); 05352 if (Body.isInvalid()) 05353 return StmtError(); 05354 05355 if (!getDerived().AlwaysRebuild() && 05356 FullCond.get() == S->getCond() && 05357 ConditionVar == S->getConditionVariable() && 05358 Body.get() == S->getBody()) 05359 return Owned(S); 05360 05361 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 05362 ConditionVar, Body.get()); 05363 } 05364 05365 template<typename Derived> 05366 StmtResult 05367 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 05368 // Transform the body 05369 StmtResult Body = getDerived().TransformStmt(S->getBody()); 05370 if (Body.isInvalid()) 05371 return StmtError(); 05372 05373 // Transform the condition 05374 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 05375 if (Cond.isInvalid()) 05376 return StmtError(); 05377 05378 if (!getDerived().AlwaysRebuild() && 05379 Cond.get() == S->getCond() && 05380 Body.get() == S->getBody()) 05381 return SemaRef.Owned(S); 05382 05383 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 05384 /*FIXME:*/S->getWhileLoc(), Cond.get(), 05385 S->getRParenLoc()); 05386 } 05387 05388 template<typename Derived> 05389 StmtResult 05390 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 05391 // Transform the initialization statement 05392 StmtResult Init = getDerived().TransformStmt(S->getInit()); 05393 if (Init.isInvalid()) 05394 return StmtError(); 05395 05396 // Transform the condition 05397 ExprResult Cond; 05398 VarDecl *ConditionVar = 0; 05399 if (S->getConditionVariable()) { 05400 ConditionVar 05401 = cast_or_null<VarDecl>( 05402 getDerived().TransformDefinition( 05403 S->getConditionVariable()->getLocation(), 05404 S->getConditionVariable())); 05405 if (!ConditionVar) 05406 return StmtError(); 05407 } else { 05408 Cond = getDerived().TransformExpr(S->getCond()); 05409 05410 if (Cond.isInvalid()) 05411 return StmtError(); 05412 05413 if (S->getCond()) { 05414 // Convert the condition to a boolean value. 05415 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(), 05416 Cond.get()); 05417 if (CondE.isInvalid()) 05418 return StmtError(); 05419 05420 Cond = CondE.get(); 05421 } 05422 } 05423 05424 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 05425 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 05426 return StmtError(); 05427 05428 // Transform the increment 05429 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 05430 if (Inc.isInvalid()) 05431 return StmtError(); 05432 05433 Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get())); 05434 if (S->getInc() && !FullInc.get()) 05435 return StmtError(); 05436 05437 // Transform the body 05438 StmtResult Body = getDerived().TransformStmt(S->getBody()); 05439 if (Body.isInvalid()) 05440 return StmtError(); 05441 05442 if (!getDerived().AlwaysRebuild() && 05443 Init.get() == S->getInit() && 05444 FullCond.get() == S->getCond() && 05445 Inc.get() == S->getInc() && 05446 Body.get() == S->getBody()) 05447 return SemaRef.Owned(S); 05448 05449 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 05450 Init.get(), FullCond, ConditionVar, 05451 FullInc, S->getRParenLoc(), Body.get()); 05452 } 05453 05454 template<typename Derived> 05455 StmtResult 05456 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 05457 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 05458 S->getLabel()); 05459 if (!LD) 05460 return StmtError(); 05461 05462 // Goto statements must always be rebuilt, to resolve the label. 05463 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 05464 cast<LabelDecl>(LD)); 05465 } 05466 05467 template<typename Derived> 05468 StmtResult 05469 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 05470 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 05471 if (Target.isInvalid()) 05472 return StmtError(); 05473 Target = SemaRef.MaybeCreateExprWithCleanups(Target.take()); 05474 05475 if (!getDerived().AlwaysRebuild() && 05476 Target.get() == S->getTarget()) 05477 return SemaRef.Owned(S); 05478 05479 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 05480 Target.get()); 05481 } 05482 05483 template<typename Derived> 05484 StmtResult 05485 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 05486 return SemaRef.Owned(S); 05487 } 05488 05489 template<typename Derived> 05490 StmtResult 05491 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 05492 return SemaRef.Owned(S); 05493 } 05494 05495 template<typename Derived> 05496 StmtResult 05497 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 05498 ExprResult Result = getDerived().TransformExpr(S->getRetValue()); 05499 if (Result.isInvalid()) 05500 return StmtError(); 05501 05502 // FIXME: We always rebuild the return statement because there is no way 05503 // to tell whether the return type of the function has changed. 05504 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 05505 } 05506 05507 template<typename Derived> 05508 StmtResult 05509 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 05510 bool DeclChanged = false; 05511 SmallVector<Decl *, 4> Decls; 05512 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 05513 D != DEnd; ++D) { 05514 Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 05515 *D); 05516 if (!Transformed) 05517 return StmtError(); 05518 05519 if (Transformed != *D) 05520 DeclChanged = true; 05521 05522 Decls.push_back(Transformed); 05523 } 05524 05525 if (!getDerived().AlwaysRebuild() && !DeclChanged) 05526 return SemaRef.Owned(S); 05527 05528 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 05529 S->getStartLoc(), S->getEndLoc()); 05530 } 05531 05532 template<typename Derived> 05533 StmtResult 05534 TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 05535 05536 ASTOwningVector<Expr*> Constraints(getSema()); 05537 ASTOwningVector<Expr*> Exprs(getSema()); 05538 SmallVector<IdentifierInfo *, 4> Names; 05539 05540 ExprResult AsmString; 05541 ASTOwningVector<Expr*> Clobbers(getSema()); 05542 05543 bool ExprsChanged = false; 05544 05545 // Go through the outputs. 05546 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 05547 Names.push_back(S->getOutputIdentifier(I)); 05548 05549 // No need to transform the constraint literal. 05550 Constraints.push_back(S->getOutputConstraintLiteral(I)); 05551 05552 // Transform the output expr. 05553 Expr *OutputExpr = S->getOutputExpr(I); 05554 ExprResult Result = getDerived().TransformExpr(OutputExpr); 05555 if (Result.isInvalid()) 05556 return StmtError(); 05557 05558 ExprsChanged |= Result.get() != OutputExpr; 05559 05560 Exprs.push_back(Result.get()); 05561 } 05562 05563 // Go through the inputs. 05564 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 05565 Names.push_back(S->getInputIdentifier(I)); 05566 05567 // No need to transform the constraint literal. 05568 Constraints.push_back(S->getInputConstraintLiteral(I)); 05569 05570 // Transform the input expr. 05571 Expr *InputExpr = S->getInputExpr(I); 05572 ExprResult Result = getDerived().TransformExpr(InputExpr); 05573 if (Result.isInvalid()) 05574 return StmtError(); 05575 05576 ExprsChanged |= Result.get() != InputExpr; 05577 05578 Exprs.push_back(Result.get()); 05579 } 05580 05581 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 05582 return SemaRef.Owned(S); 05583 05584 // Go through the clobbers. 05585 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 05586 Clobbers.push_back(S->getClobber(I)); 05587 05588 // No need to transform the asm string literal. 05589 AsmString = SemaRef.Owned(S->getAsmString()); 05590 05591 return getDerived().RebuildAsmStmt(S->getAsmLoc(), 05592 S->isSimple(), 05593 S->isVolatile(), 05594 S->getNumOutputs(), 05595 S->getNumInputs(), 05596 Names.data(), 05597 move_arg(Constraints), 05598 move_arg(Exprs), 05599 AsmString.get(), 05600 move_arg(Clobbers), 05601 S->getRParenLoc(), 05602 S->isMSAsm()); 05603 } 05604 05605 05606 template<typename Derived> 05607 StmtResult 05608 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 05609 // Transform the body of the @try. 05610 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 05611 if (TryBody.isInvalid()) 05612 return StmtError(); 05613 05614 // Transform the @catch statements (if present). 05615 bool AnyCatchChanged = false; 05616 ASTOwningVector<Stmt*> CatchStmts(SemaRef); 05617 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 05618 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 05619 if (Catch.isInvalid()) 05620 return StmtError(); 05621 if (Catch.get() != S->getCatchStmt(I)) 05622 AnyCatchChanged = true; 05623 CatchStmts.push_back(Catch.release()); 05624 } 05625 05626 // Transform the @finally statement (if present). 05627 StmtResult Finally; 05628 if (S->getFinallyStmt()) { 05629 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 05630 if (Finally.isInvalid()) 05631 return StmtError(); 05632 } 05633 05634 // If nothing changed, just retain this statement. 05635 if (!getDerived().AlwaysRebuild() && 05636 TryBody.get() == S->getTryBody() && 05637 !AnyCatchChanged && 05638 Finally.get() == S->getFinallyStmt()) 05639 return SemaRef.Owned(S); 05640 05641 // Build a new statement. 05642 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 05643 move_arg(CatchStmts), Finally.get()); 05644 } 05645 05646 template<typename Derived> 05647 StmtResult 05648 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 05649 // Transform the @catch parameter, if there is one. 05650 VarDecl *Var = 0; 05651 if (VarDecl *FromVar = S->getCatchParamDecl()) { 05652 TypeSourceInfo *TSInfo = 0; 05653 if (FromVar->getTypeSourceInfo()) { 05654 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 05655 if (!TSInfo) 05656 return StmtError(); 05657 } 05658 05659 QualType T; 05660 if (TSInfo) 05661 T = TSInfo->getType(); 05662 else { 05663 T = getDerived().TransformType(FromVar->getType()); 05664 if (T.isNull()) 05665 return StmtError(); 05666 } 05667 05668 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 05669 if (!Var) 05670 return StmtError(); 05671 } 05672 05673 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 05674 if (Body.isInvalid()) 05675 return StmtError(); 05676 05677 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 05678 S->getRParenLoc(), 05679 Var, Body.get()); 05680 } 05681 05682 template<typename Derived> 05683 StmtResult 05684 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 05685 // Transform the body. 05686 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 05687 if (Body.isInvalid()) 05688 return StmtError(); 05689 05690 // If nothing changed, just retain this statement. 05691 if (!getDerived().AlwaysRebuild() && 05692 Body.get() == S->getFinallyBody()) 05693 return SemaRef.Owned(S); 05694 05695 // Build a new statement. 05696 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 05697 Body.get()); 05698 } 05699 05700 template<typename Derived> 05701 StmtResult 05702 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 05703 ExprResult Operand; 05704 if (S->getThrowExpr()) { 05705 Operand = getDerived().TransformExpr(S->getThrowExpr()); 05706 if (Operand.isInvalid()) 05707 return StmtError(); 05708 } 05709 05710 if (!getDerived().AlwaysRebuild() && 05711 Operand.get() == S->getThrowExpr()) 05712 return getSema().Owned(S); 05713 05714 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 05715 } 05716 05717 template<typename Derived> 05718 StmtResult 05719 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 05720 ObjCAtSynchronizedStmt *S) { 05721 // Transform the object we are locking. 05722 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 05723 if (Object.isInvalid()) 05724 return StmtError(); 05725 Object = 05726 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 05727 Object.get()); 05728 if (Object.isInvalid()) 05729 return StmtError(); 05730 05731 // Transform the body. 05732 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 05733 if (Body.isInvalid()) 05734 return StmtError(); 05735 05736 // If nothing change, just retain the current statement. 05737 if (!getDerived().AlwaysRebuild() && 05738 Object.get() == S->getSynchExpr() && 05739 Body.get() == S->getSynchBody()) 05740 return SemaRef.Owned(S); 05741 05742 // Build a new statement. 05743 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 05744 Object.get(), Body.get()); 05745 } 05746 05747 template<typename Derived> 05748 StmtResult 05749 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 05750 ObjCAutoreleasePoolStmt *S) { 05751 // Transform the body. 05752 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 05753 if (Body.isInvalid()) 05754 return StmtError(); 05755 05756 // If nothing changed, just retain this statement. 05757 if (!getDerived().AlwaysRebuild() && 05758 Body.get() == S->getSubStmt()) 05759 return SemaRef.Owned(S); 05760 05761 // Build a new statement. 05762 return getDerived().RebuildObjCAutoreleasePoolStmt( 05763 S->getAtLoc(), Body.get()); 05764 } 05765 05766 template<typename Derived> 05767 StmtResult 05768 TreeTransform<Derived>::TransformObjCForCollectionStmt( 05769 ObjCForCollectionStmt *S) { 05770 // Transform the element statement. 05771 StmtResult Element = getDerived().TransformStmt(S->getElement()); 05772 if (Element.isInvalid()) 05773 return StmtError(); 05774 05775 // Transform the collection expression. 05776 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 05777 if (Collection.isInvalid()) 05778 return StmtError(); 05779 Collection = getDerived().RebuildObjCForCollectionOperand(S->getForLoc(), 05780 Collection.take()); 05781 if (Collection.isInvalid()) 05782 return StmtError(); 05783 05784 // Transform the body. 05785 StmtResult Body = getDerived().TransformStmt(S->getBody()); 05786 if (Body.isInvalid()) 05787 return StmtError(); 05788 05789 // If nothing changed, just retain this statement. 05790 if (!getDerived().AlwaysRebuild() && 05791 Element.get() == S->getElement() && 05792 Collection.get() == S->getCollection() && 05793 Body.get() == S->getBody()) 05794 return SemaRef.Owned(S); 05795 05796 // Build a new statement. 05797 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 05798 /*FIXME:*/S->getForLoc(), 05799 Element.get(), 05800 Collection.get(), 05801 S->getRParenLoc(), 05802 Body.get()); 05803 } 05804 05805 05806 template<typename Derived> 05807 StmtResult 05808 TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 05809 // Transform the exception declaration, if any. 05810 VarDecl *Var = 0; 05811 if (S->getExceptionDecl()) { 05812 VarDecl *ExceptionDecl = S->getExceptionDecl(); 05813 TypeSourceInfo *T = getDerived().TransformType( 05814 ExceptionDecl->getTypeSourceInfo()); 05815 if (!T) 05816 return StmtError(); 05817 05818 Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T, 05819 ExceptionDecl->getInnerLocStart(), 05820 ExceptionDecl->getLocation(), 05821 ExceptionDecl->getIdentifier()); 05822 if (!Var || Var->isInvalidDecl()) 05823 return StmtError(); 05824 } 05825 05826 // Transform the actual exception handler. 05827 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 05828 if (Handler.isInvalid()) 05829 return StmtError(); 05830 05831 if (!getDerived().AlwaysRebuild() && 05832 !Var && 05833 Handler.get() == S->getHandlerBlock()) 05834 return SemaRef.Owned(S); 05835 05836 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 05837 Var, 05838 Handler.get()); 05839 } 05840 05841 template<typename Derived> 05842 StmtResult 05843 TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 05844 // Transform the try block itself. 05845 StmtResult TryBlock 05846 = getDerived().TransformCompoundStmt(S->getTryBlock()); 05847 if (TryBlock.isInvalid()) 05848 return StmtError(); 05849 05850 // Transform the handlers. 05851 bool HandlerChanged = false; 05852 ASTOwningVector<Stmt*> Handlers(SemaRef); 05853 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 05854 StmtResult Handler 05855 = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 05856 if (Handler.isInvalid()) 05857 return StmtError(); 05858 05859 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 05860 Handlers.push_back(Handler.takeAs<Stmt>()); 05861 } 05862 05863 if (!getDerived().AlwaysRebuild() && 05864 TryBlock.get() == S->getTryBlock() && 05865 !HandlerChanged) 05866 return SemaRef.Owned(S); 05867 05868 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 05869 move_arg(Handlers)); 05870 } 05871 05872 template<typename Derived> 05873 StmtResult 05874 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 05875 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 05876 if (Range.isInvalid()) 05877 return StmtError(); 05878 05879 StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt()); 05880 if (BeginEnd.isInvalid()) 05881 return StmtError(); 05882 05883 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 05884 if (Cond.isInvalid()) 05885 return StmtError(); 05886 if (Cond.get()) 05887 Cond = SemaRef.CheckBooleanCondition(Cond.take(), S->getColonLoc()); 05888 if (Cond.isInvalid()) 05889 return StmtError(); 05890 if (Cond.get()) 05891 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.take()); 05892 05893 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 05894 if (Inc.isInvalid()) 05895 return StmtError(); 05896 if (Inc.get()) 05897 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.take()); 05898 05899 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 05900 if (LoopVar.isInvalid()) 05901 return StmtError(); 05902 05903 StmtResult NewStmt = S; 05904 if (getDerived().AlwaysRebuild() || 05905 Range.get() != S->getRangeStmt() || 05906 BeginEnd.get() != S->getBeginEndStmt() || 05907 Cond.get() != S->getCond() || 05908 Inc.get() != S->getInc() || 05909 LoopVar.get() != S->getLoopVarStmt()) 05910 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 05911 S->getColonLoc(), Range.get(), 05912 BeginEnd.get(), Cond.get(), 05913 Inc.get(), LoopVar.get(), 05914 S->getRParenLoc()); 05915 05916 StmtResult Body = getDerived().TransformStmt(S->getBody()); 05917 if (Body.isInvalid()) 05918 return StmtError(); 05919 05920 // Body has changed but we didn't rebuild the for-range statement. Rebuild 05921 // it now so we have a new statement to attach the body to. 05922 if (Body.get() != S->getBody() && NewStmt.get() == S) 05923 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 05924 S->getColonLoc(), Range.get(), 05925 BeginEnd.get(), Cond.get(), 05926 Inc.get(), LoopVar.get(), 05927 S->getRParenLoc()); 05928 05929 if (NewStmt.get() == S) 05930 return SemaRef.Owned(S); 05931 05932 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 05933 } 05934 05935 template<typename Derived> 05936 StmtResult 05937 TreeTransform<Derived>::TransformMSDependentExistsStmt( 05938 MSDependentExistsStmt *S) { 05939 // Transform the nested-name-specifier, if any. 05940 NestedNameSpecifierLoc QualifierLoc; 05941 if (S->getQualifierLoc()) { 05942 QualifierLoc 05943 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 05944 if (!QualifierLoc) 05945 return StmtError(); 05946 } 05947 05948 // Transform the declaration name. 05949 DeclarationNameInfo NameInfo = S->getNameInfo(); 05950 if (NameInfo.getName()) { 05951 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 05952 if (!NameInfo.getName()) 05953 return StmtError(); 05954 } 05955 05956 // Check whether anything changed. 05957 if (!getDerived().AlwaysRebuild() && 05958 QualifierLoc == S->getQualifierLoc() && 05959 NameInfo.getName() == S->getNameInfo().getName()) 05960 return S; 05961 05962 // Determine whether this name exists, if we can. 05963 CXXScopeSpec SS; 05964 SS.Adopt(QualifierLoc); 05965 bool Dependent = false; 05966 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/0, SS, NameInfo)) { 05967 case Sema::IER_Exists: 05968 if (S->isIfExists()) 05969 break; 05970 05971 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 05972 05973 case Sema::IER_DoesNotExist: 05974 if (S->isIfNotExists()) 05975 break; 05976 05977 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 05978 05979 case Sema::IER_Dependent: 05980 Dependent = true; 05981 break; 05982 05983 case Sema::IER_Error: 05984 return StmtError(); 05985 } 05986 05987 // We need to continue with the instantiation, so do so now. 05988 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 05989 if (SubStmt.isInvalid()) 05990 return StmtError(); 05991 05992 // If we have resolved the name, just transform to the substatement. 05993 if (!Dependent) 05994 return SubStmt; 05995 05996 // The name is still dependent, so build a dependent expression again. 05997 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 05998 S->isIfExists(), 05999 QualifierLoc, 06000 NameInfo, 06001 SubStmt.get()); 06002 } 06003 06004 template<typename Derived> 06005 StmtResult 06006 TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 06007 StmtResult TryBlock; // = getDerived().TransformCompoundStmt(S->getTryBlock()); 06008 if(TryBlock.isInvalid()) return StmtError(); 06009 06010 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 06011 if(!getDerived().AlwaysRebuild() && 06012 TryBlock.get() == S->getTryBlock() && 06013 Handler.get() == S->getHandler()) 06014 return SemaRef.Owned(S); 06015 06016 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), 06017 S->getTryLoc(), 06018 TryBlock.take(), 06019 Handler.take()); 06020 } 06021 06022 template<typename Derived> 06023 StmtResult 06024 TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 06025 StmtResult Block; // = getDerived().TransformCompoundStatement(S->getBlock()); 06026 if(Block.isInvalid()) return StmtError(); 06027 06028 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), 06029 Block.take()); 06030 } 06031 06032 template<typename Derived> 06033 StmtResult 06034 TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 06035 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 06036 if(FilterExpr.isInvalid()) return StmtError(); 06037 06038 StmtResult Block; // = getDerived().TransformCompoundStatement(S->getBlock()); 06039 if(Block.isInvalid()) return StmtError(); 06040 06041 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), 06042 FilterExpr.take(), 06043 Block.take()); 06044 } 06045 06046 template<typename Derived> 06047 StmtResult 06048 TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 06049 if(isa<SEHFinallyStmt>(Handler)) 06050 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 06051 else 06052 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 06053 } 06054 06055 //===----------------------------------------------------------------------===// 06056 // Expression transformation 06057 //===----------------------------------------------------------------------===// 06058 template<typename Derived> 06059 ExprResult 06060 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 06061 return SemaRef.Owned(E); 06062 } 06063 06064 template<typename Derived> 06065 ExprResult 06066 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 06067 NestedNameSpecifierLoc QualifierLoc; 06068 if (E->getQualifierLoc()) { 06069 QualifierLoc 06070 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 06071 if (!QualifierLoc) 06072 return ExprError(); 06073 } 06074 06075 ValueDecl *ND 06076 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 06077 E->getDecl())); 06078 if (!ND) 06079 return ExprError(); 06080 06081 DeclarationNameInfo NameInfo = E->getNameInfo(); 06082 if (NameInfo.getName()) { 06083 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 06084 if (!NameInfo.getName()) 06085 return ExprError(); 06086 } 06087 06088 if (!getDerived().AlwaysRebuild() && 06089 QualifierLoc == E->getQualifierLoc() && 06090 ND == E->getDecl() && 06091 NameInfo.getName() == E->getDecl()->getDeclName() && 06092 !E->hasExplicitTemplateArgs()) { 06093 06094 // Mark it referenced in the new context regardless. 06095 // FIXME: this is a bit instantiation-specific. 06096 SemaRef.MarkDeclRefReferenced(E); 06097 06098 return SemaRef.Owned(E); 06099 } 06100 06101 TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 06102 if (E->hasExplicitTemplateArgs()) { 06103 TemplateArgs = &TransArgs; 06104 TransArgs.setLAngleLoc(E->getLAngleLoc()); 06105 TransArgs.setRAngleLoc(E->getRAngleLoc()); 06106 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 06107 E->getNumTemplateArgs(), 06108 TransArgs)) 06109 return ExprError(); 06110 } 06111 06112 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 06113 TemplateArgs); 06114 } 06115 06116 template<typename Derived> 06117 ExprResult 06118 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 06119 return SemaRef.Owned(E); 06120 } 06121 06122 template<typename Derived> 06123 ExprResult 06124 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 06125 return SemaRef.Owned(E); 06126 } 06127 06128 template<typename Derived> 06129 ExprResult 06130 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 06131 return SemaRef.Owned(E); 06132 } 06133 06134 template<typename Derived> 06135 ExprResult 06136 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 06137 return SemaRef.Owned(E); 06138 } 06139 06140 template<typename Derived> 06141 ExprResult 06142 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 06143 return SemaRef.Owned(E); 06144 } 06145 06146 template<typename Derived> 06147 ExprResult 06148 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 06149 return SemaRef.MaybeBindToTemporary(E); 06150 } 06151 06152 template<typename Derived> 06153 ExprResult 06154 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 06155 ExprResult ControllingExpr = 06156 getDerived().TransformExpr(E->getControllingExpr()); 06157 if (ControllingExpr.isInvalid()) 06158 return ExprError(); 06159 06160 SmallVector<Expr *, 4> AssocExprs; 06161 SmallVector<TypeSourceInfo *, 4> AssocTypes; 06162 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 06163 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 06164 if (TS) { 06165 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 06166 if (!AssocType) 06167 return ExprError(); 06168 AssocTypes.push_back(AssocType); 06169 } else { 06170 AssocTypes.push_back(0); 06171 } 06172 06173 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 06174 if (AssocExpr.isInvalid()) 06175 return ExprError(); 06176 AssocExprs.push_back(AssocExpr.release()); 06177 } 06178 06179 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 06180 E->getDefaultLoc(), 06181 E->getRParenLoc(), 06182 ControllingExpr.release(), 06183 AssocTypes.data(), 06184 AssocExprs.data(), 06185 E->getNumAssocs()); 06186 } 06187 06188 template<typename Derived> 06189 ExprResult 06190 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 06191 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 06192 if (SubExpr.isInvalid()) 06193 return ExprError(); 06194 06195 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 06196 return SemaRef.Owned(E); 06197 06198 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 06199 E->getRParen()); 06200 } 06201 06202 template<typename Derived> 06203 ExprResult 06204 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 06205 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 06206 if (SubExpr.isInvalid()) 06207 return ExprError(); 06208 06209 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 06210 return SemaRef.Owned(E); 06211 06212 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 06213 E->getOpcode(), 06214 SubExpr.get()); 06215 } 06216 06217 template<typename Derived> 06218 ExprResult 06219 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 06220 // Transform the type. 06221 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 06222 if (!Type) 06223 return ExprError(); 06224 06225 // Transform all of the components into components similar to what the 06226 // parser uses. 06227 // FIXME: It would be slightly more efficient in the non-dependent case to 06228 // just map FieldDecls, rather than requiring the rebuilder to look for 06229 // the fields again. However, __builtin_offsetof is rare enough in 06230 // template code that we don't care. 06231 bool ExprChanged = false; 06232 typedef Sema::OffsetOfComponent Component; 06233 typedef OffsetOfExpr::OffsetOfNode Node; 06234 SmallVector<Component, 4> Components; 06235 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 06236 const Node &ON = E->getComponent(I); 06237 Component Comp; 06238 Comp.isBrackets = true; 06239 Comp.LocStart = ON.getSourceRange().getBegin(); 06240 Comp.LocEnd = ON.getSourceRange().getEnd(); 06241 switch (ON.getKind()) { 06242 case Node::Array: { 06243 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 06244 ExprResult Index = getDerived().TransformExpr(FromIndex); 06245 if (Index.isInvalid()) 06246 return ExprError(); 06247 06248 ExprChanged = ExprChanged || Index.get() != FromIndex; 06249 Comp.isBrackets = true; 06250 Comp.U.E = Index.get(); 06251 break; 06252 } 06253 06254 case Node::Field: 06255 case Node::Identifier: 06256 Comp.isBrackets = false; 06257 Comp.U.IdentInfo = ON.getFieldName(); 06258 if (!Comp.U.IdentInfo) 06259 continue; 06260 06261 break; 06262 06263 case Node::Base: 06264 // Will be recomputed during the rebuild. 06265 continue; 06266 } 06267 06268 Components.push_back(Comp); 06269 } 06270 06271 // If nothing changed, retain the existing expression. 06272 if (!getDerived().AlwaysRebuild() && 06273 Type == E->getTypeSourceInfo() && 06274 !ExprChanged) 06275 return SemaRef.Owned(E); 06276 06277 // Build a new offsetof expression. 06278 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 06279 Components.data(), Components.size(), 06280 E->getRParenLoc()); 06281 } 06282 06283 template<typename Derived> 06284 ExprResult 06285 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 06286 assert(getDerived().AlreadyTransformed(E->getType()) && 06287 "opaque value expression requires transformation"); 06288 return SemaRef.Owned(E); 06289 } 06290 06291 template<typename Derived> 06292 ExprResult 06293 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 06294 // Rebuild the syntactic form. The original syntactic form has 06295 // opaque-value expressions in it, so strip those away and rebuild 06296 // the result. This is a really awful way of doing this, but the 06297 // better solution (rebuilding the semantic expressions and 06298 // rebinding OVEs as necessary) doesn't work; we'd need 06299 // TreeTransform to not strip away implicit conversions. 06300 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 06301 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 06302 if (result.isInvalid()) return ExprError(); 06303 06304 // If that gives us a pseudo-object result back, the pseudo-object 06305 // expression must have been an lvalue-to-rvalue conversion which we 06306 // should reapply. 06307 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 06308 result = SemaRef.checkPseudoObjectRValue(result.take()); 06309 06310 return result; 06311 } 06312 06313 template<typename Derived> 06314 ExprResult 06315 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 06316 UnaryExprOrTypeTraitExpr *E) { 06317 if (E->isArgumentType()) { 06318 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 06319 06320 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 06321 if (!NewT) 06322 return ExprError(); 06323 06324 if (!getDerived().AlwaysRebuild() && OldT == NewT) 06325 return SemaRef.Owned(E); 06326 06327 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 06328 E->getKind(), 06329 E->getSourceRange()); 06330 } 06331 06332 // C++0x [expr.sizeof]p1: 06333 // The operand is either an expression, which is an unevaluated operand 06334 // [...] 06335 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 06336 06337 ExprResult SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 06338 if (SubExpr.isInvalid()) 06339 return ExprError(); 06340 06341 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 06342 return SemaRef.Owned(E); 06343 06344 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 06345 E->getOperatorLoc(), 06346 E->getKind(), 06347 E->getSourceRange()); 06348 } 06349 06350 template<typename Derived> 06351 ExprResult 06352 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 06353 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 06354 if (LHS.isInvalid()) 06355 return ExprError(); 06356 06357 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 06358 if (RHS.isInvalid()) 06359 return ExprError(); 06360 06361 06362 if (!getDerived().AlwaysRebuild() && 06363 LHS.get() == E->getLHS() && 06364 RHS.get() == E->getRHS()) 06365 return SemaRef.Owned(E); 06366 06367 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 06368 /*FIXME:*/E->getLHS()->getLocStart(), 06369 RHS.get(), 06370 E->getRBracketLoc()); 06371 } 06372 06373 template<typename Derived> 06374 ExprResult 06375 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 06376 // Transform the callee. 06377 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 06378 if (Callee.isInvalid()) 06379 return ExprError(); 06380 06381 // Transform arguments. 06382 bool ArgChanged = false; 06383 ASTOwningVector<Expr*> Args(SemaRef); 06384 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 06385 &ArgChanged)) 06386 return ExprError(); 06387 06388 if (!getDerived().AlwaysRebuild() && 06389 Callee.get() == E->getCallee() && 06390 !ArgChanged) 06391 return SemaRef.MaybeBindToTemporary(E);; 06392 06393 // FIXME: Wrong source location information for the '('. 06394 SourceLocation FakeLParenLoc 06395 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 06396 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 06397 move_arg(Args), 06398 E->getRParenLoc()); 06399 } 06400 06401 template<typename Derived> 06402 ExprResult 06403 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 06404 ExprResult Base = getDerived().TransformExpr(E->getBase()); 06405 if (Base.isInvalid()) 06406 return ExprError(); 06407 06408 NestedNameSpecifierLoc QualifierLoc; 06409 if (E->hasQualifier()) { 06410 QualifierLoc 06411 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 06412 06413 if (!QualifierLoc) 06414 return ExprError(); 06415 } 06416 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 06417 06418 ValueDecl *Member 06419 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 06420 E->getMemberDecl())); 06421 if (!Member) 06422 return ExprError(); 06423 06424 NamedDecl *FoundDecl = E->getFoundDecl(); 06425 if (FoundDecl == E->getMemberDecl()) { 06426 FoundDecl = Member; 06427 } else { 06428 FoundDecl = cast_or_null<NamedDecl>( 06429 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 06430 if (!FoundDecl) 06431 return ExprError(); 06432 } 06433 06434 if (!getDerived().AlwaysRebuild() && 06435 Base.get() == E->getBase() && 06436 QualifierLoc == E->getQualifierLoc() && 06437 Member == E->getMemberDecl() && 06438 FoundDecl == E->getFoundDecl() && 06439 !E->hasExplicitTemplateArgs()) { 06440 06441 // Mark it referenced in the new context regardless. 06442 // FIXME: this is a bit instantiation-specific. 06443 SemaRef.MarkMemberReferenced(E); 06444 06445 return SemaRef.Owned(E); 06446 } 06447 06448 TemplateArgumentListInfo TransArgs; 06449 if (E->hasExplicitTemplateArgs()) { 06450 TransArgs.setLAngleLoc(E->getLAngleLoc()); 06451 TransArgs.setRAngleLoc(E->getRAngleLoc()); 06452 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 06453 E->getNumTemplateArgs(), 06454 TransArgs)) 06455 return ExprError(); 06456 } 06457 06458 // FIXME: Bogus source location for the operator 06459 SourceLocation FakeOperatorLoc 06460 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 06461 06462 // FIXME: to do this check properly, we will need to preserve the 06463 // first-qualifier-in-scope here, just in case we had a dependent 06464 // base (and therefore couldn't do the check) and a 06465 // nested-name-qualifier (and therefore could do the lookup). 06466 NamedDecl *FirstQualifierInScope = 0; 06467 06468 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 06469 E->isArrow(), 06470 QualifierLoc, 06471 TemplateKWLoc, 06472 E->getMemberNameInfo(), 06473 Member, 06474 FoundDecl, 06475 (E->hasExplicitTemplateArgs() 06476 ? &TransArgs : 0), 06477 FirstQualifierInScope); 06478 } 06479 06480 template<typename Derived> 06481 ExprResult 06482 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 06483 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 06484 if (LHS.isInvalid()) 06485 return ExprError(); 06486 06487 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 06488 if (RHS.isInvalid()) 06489 return ExprError(); 06490 06491 if (!getDerived().AlwaysRebuild() && 06492 LHS.get() == E->getLHS() && 06493 RHS.get() == E->getRHS()) 06494 return SemaRef.Owned(E); 06495 06496 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 06497 LHS.get(), RHS.get()); 06498 } 06499 06500 template<typename Derived> 06501 ExprResult 06502 TreeTransform<Derived>::TransformCompoundAssignOperator( 06503 CompoundAssignOperator *E) { 06504 return getDerived().TransformBinaryOperator(E); 06505 } 06506 06507 template<typename Derived> 06508 ExprResult TreeTransform<Derived>:: 06509 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 06510 // Just rebuild the common and RHS expressions and see whether we 06511 // get any changes. 06512 06513 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 06514 if (commonExpr.isInvalid()) 06515 return ExprError(); 06516 06517 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 06518 if (rhs.isInvalid()) 06519 return ExprError(); 06520 06521 if (!getDerived().AlwaysRebuild() && 06522 commonExpr.get() == e->getCommon() && 06523 rhs.get() == e->getFalseExpr()) 06524 return SemaRef.Owned(e); 06525 06526 return getDerived().RebuildConditionalOperator(commonExpr.take(), 06527 e->getQuestionLoc(), 06528 0, 06529 e->getColonLoc(), 06530 rhs.get()); 06531 } 06532 06533 template<typename Derived> 06534 ExprResult 06535 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 06536 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 06537 if (Cond.isInvalid()) 06538 return ExprError(); 06539 06540 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 06541 if (LHS.isInvalid()) 06542 return ExprError(); 06543 06544 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 06545 if (RHS.isInvalid()) 06546 return ExprError(); 06547 06548 if (!getDerived().AlwaysRebuild() && 06549 Cond.get() == E->getCond() && 06550 LHS.get() == E->getLHS() && 06551 RHS.get() == E->getRHS()) 06552 return SemaRef.Owned(E); 06553 06554 return getDerived().RebuildConditionalOperator(Cond.get(), 06555 E->getQuestionLoc(), 06556 LHS.get(), 06557 E->getColonLoc(), 06558 RHS.get()); 06559 } 06560 06561 template<typename Derived> 06562 ExprResult 06563 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 06564 // Implicit casts are eliminated during transformation, since they 06565 // will be recomputed by semantic analysis after transformation. 06566 return getDerived().TransformExpr(E->getSubExprAsWritten()); 06567 } 06568 06569 template<typename Derived> 06570 ExprResult 06571 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 06572 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 06573 if (!Type) 06574 return ExprError(); 06575 06576 ExprResult SubExpr 06577 = getDerived().TransformExpr(E->getSubExprAsWritten()); 06578 if (SubExpr.isInvalid()) 06579 return ExprError(); 06580 06581 if (!getDerived().AlwaysRebuild() && 06582 Type == E->getTypeInfoAsWritten() && 06583 SubExpr.get() == E->getSubExpr()) 06584 return SemaRef.Owned(E); 06585 06586 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 06587 Type, 06588 E->getRParenLoc(), 06589 SubExpr.get()); 06590 } 06591 06592 template<typename Derived> 06593 ExprResult 06594 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 06595 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 06596 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 06597 if (!NewT) 06598 return ExprError(); 06599 06600 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 06601 if (Init.isInvalid()) 06602 return ExprError(); 06603 06604 if (!getDerived().AlwaysRebuild() && 06605 OldT == NewT && 06606 Init.get() == E->getInitializer()) 06607 return SemaRef.MaybeBindToTemporary(E); 06608 06609 // Note: the expression type doesn't necessarily match the 06610 // type-as-written, but that's okay, because it should always be 06611 // derivable from the initializer. 06612 06613 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 06614 /*FIXME:*/E->getInitializer()->getLocEnd(), 06615 Init.get()); 06616 } 06617 06618 template<typename Derived> 06619 ExprResult 06620 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 06621 ExprResult Base = getDerived().TransformExpr(E->getBase()); 06622 if (Base.isInvalid()) 06623 return ExprError(); 06624 06625 if (!getDerived().AlwaysRebuild() && 06626 Base.get() == E->getBase()) 06627 return SemaRef.Owned(E); 06628 06629 // FIXME: Bad source location 06630 SourceLocation FakeOperatorLoc 06631 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 06632 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 06633 E->getAccessorLoc(), 06634 E->getAccessor()); 06635 } 06636 06637 template<typename Derived> 06638 ExprResult 06639 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 06640 bool InitChanged = false; 06641 06642 ASTOwningVector<Expr*, 4> Inits(SemaRef); 06643 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 06644 Inits, &InitChanged)) 06645 return ExprError(); 06646 06647 if (!getDerived().AlwaysRebuild() && !InitChanged) 06648 return SemaRef.Owned(E); 06649 06650 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 06651 E->getRBraceLoc(), E->getType()); 06652 } 06653 06654 template<typename Derived> 06655 ExprResult 06656 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 06657 Designation Desig; 06658 06659 // transform the initializer value 06660 ExprResult Init = getDerived().TransformExpr(E->getInit()); 06661 if (Init.isInvalid()) 06662 return ExprError(); 06663 06664 // transform the designators. 06665 ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef); 06666 bool ExprChanged = false; 06667 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 06668 DEnd = E->designators_end(); 06669 D != DEnd; ++D) { 06670 if (D->isFieldDesignator()) { 06671 Desig.AddDesignator(Designator::getField(D->getFieldName(), 06672 D->getDotLoc(), 06673 D->getFieldLoc())); 06674 continue; 06675 } 06676 06677 if (D->isArrayDesignator()) { 06678 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 06679 if (Index.isInvalid()) 06680 return ExprError(); 06681 06682 Desig.AddDesignator(Designator::getArray(Index.get(), 06683 D->getLBracketLoc())); 06684 06685 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 06686 ArrayExprs.push_back(Index.release()); 06687 continue; 06688 } 06689 06690 assert(D->isArrayRangeDesignator() && "New kind of designator?"); 06691 ExprResult Start 06692 = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 06693 if (Start.isInvalid()) 06694 return ExprError(); 06695 06696 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 06697 if (End.isInvalid()) 06698 return ExprError(); 06699 06700 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 06701 End.get(), 06702 D->getLBracketLoc(), 06703 D->getEllipsisLoc())); 06704 06705 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 06706 End.get() != E->getArrayRangeEnd(*D); 06707 06708 ArrayExprs.push_back(Start.release()); 06709 ArrayExprs.push_back(End.release()); 06710 } 06711 06712 if (!getDerived().AlwaysRebuild() && 06713 Init.get() == E->getInit() && 06714 !ExprChanged) 06715 return SemaRef.Owned(E); 06716 06717 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 06718 E->getEqualOrColonLoc(), 06719 E->usesGNUSyntax(), Init.get()); 06720 } 06721 06722 template<typename Derived> 06723 ExprResult 06724 TreeTransform<Derived>::TransformImplicitValueInitExpr( 06725 ImplicitValueInitExpr *E) { 06726 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 06727 06728 // FIXME: Will we ever have proper type location here? Will we actually 06729 // need to transform the type? 06730 QualType T = getDerived().TransformType(E->getType()); 06731 if (T.isNull()) 06732 return ExprError(); 06733 06734 if (!getDerived().AlwaysRebuild() && 06735 T == E->getType()) 06736 return SemaRef.Owned(E); 06737 06738 return getDerived().RebuildImplicitValueInitExpr(T); 06739 } 06740 06741 template<typename Derived> 06742 ExprResult 06743 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 06744 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 06745 if (!TInfo) 06746 return ExprError(); 06747 06748 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 06749 if (SubExpr.isInvalid()) 06750 return ExprError(); 06751 06752 if (!getDerived().AlwaysRebuild() && 06753 TInfo == E->getWrittenTypeInfo() && 06754 SubExpr.get() == E->getSubExpr()) 06755 return SemaRef.Owned(E); 06756 06757 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 06758 TInfo, E->getRParenLoc()); 06759 } 06760 06761 template<typename Derived> 06762 ExprResult 06763 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 06764 bool ArgumentChanged = false; 06765 ASTOwningVector<Expr*, 4> Inits(SemaRef); 06766 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 06767 &ArgumentChanged)) 06768 return ExprError(); 06769 06770 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 06771 move_arg(Inits), 06772 E->getRParenLoc()); 06773 } 06774 06775 /// \brief Transform an address-of-label expression. 06776 /// 06777 /// By default, the transformation of an address-of-label expression always 06778 /// rebuilds the expression, so that the label identifier can be resolved to 06779 /// the corresponding label statement by semantic analysis. 06780 template<typename Derived> 06781 ExprResult 06782 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 06783 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 06784 E->getLabel()); 06785 if (!LD) 06786 return ExprError(); 06787 06788 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 06789 cast<LabelDecl>(LD)); 06790 } 06791 06792 template<typename Derived> 06793 ExprResult 06794 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 06795 SemaRef.ActOnStartStmtExpr(); 06796 StmtResult SubStmt 06797 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 06798 if (SubStmt.isInvalid()) { 06799 SemaRef.ActOnStmtExprError(); 06800 return ExprError(); 06801 } 06802 06803 if (!getDerived().AlwaysRebuild() && 06804 SubStmt.get() == E->getSubStmt()) { 06805 // Calling this an 'error' is unintuitive, but it does the right thing. 06806 SemaRef.ActOnStmtExprError(); 06807 return SemaRef.MaybeBindToTemporary(E); 06808 } 06809 06810 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 06811 SubStmt.get(), 06812 E->getRParenLoc()); 06813 } 06814 06815 template<typename Derived> 06816 ExprResult 06817 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 06818 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 06819 if (Cond.isInvalid()) 06820 return ExprError(); 06821 06822 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 06823 if (LHS.isInvalid()) 06824 return ExprError(); 06825 06826 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 06827 if (RHS.isInvalid()) 06828 return ExprError(); 06829 06830 if (!getDerived().AlwaysRebuild() && 06831 Cond.get() == E->getCond() && 06832 LHS.get() == E->getLHS() && 06833 RHS.get() == E->getRHS()) 06834 return SemaRef.Owned(E); 06835 06836 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 06837 Cond.get(), LHS.get(), RHS.get(), 06838 E->getRParenLoc()); 06839 } 06840 06841 template<typename Derived> 06842 ExprResult 06843 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 06844 return SemaRef.Owned(E); 06845 } 06846 06847 template<typename Derived> 06848 ExprResult 06849 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 06850 switch (E->getOperator()) { 06851 case OO_New: 06852 case OO_Delete: 06853 case OO_Array_New: 06854 case OO_Array_Delete: 06855 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 06856 06857 case OO_Call: { 06858 // This is a call to an object's operator(). 06859 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 06860 06861 // Transform the object itself. 06862 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 06863 if (Object.isInvalid()) 06864 return ExprError(); 06865 06866 // FIXME: Poor location information 06867 SourceLocation FakeLParenLoc 06868 = SemaRef.PP.getLocForEndOfToken( 06869 static_cast<Expr *>(Object.get())->getLocEnd()); 06870 06871 // Transform the call arguments. 06872 ASTOwningVector<Expr*> Args(SemaRef); 06873 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 06874 Args)) 06875 return ExprError(); 06876 06877 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 06878 move_arg(Args), 06879 E->getLocEnd()); 06880 } 06881 06882 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 06883 case OO_##Name: 06884 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 06885 #include "clang/Basic/OperatorKinds.def" 06886 case OO_Subscript: 06887 // Handled below. 06888 break; 06889 06890 case OO_Conditional: 06891 llvm_unreachable("conditional operator is not actually overloadable"); 06892 06893 case OO_None: 06894 case NUM_OVERLOADED_OPERATORS: 06895 llvm_unreachable("not an overloaded operator?"); 06896 } 06897 06898 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 06899 if (Callee.isInvalid()) 06900 return ExprError(); 06901 06902 ExprResult First = getDerived().TransformExpr(E->getArg(0)); 06903 if (First.isInvalid()) 06904 return ExprError(); 06905 06906 ExprResult Second; 06907 if (E->getNumArgs() == 2) { 06908 Second = getDerived().TransformExpr(E->getArg(1)); 06909 if (Second.isInvalid()) 06910 return ExprError(); 06911 } 06912 06913 if (!getDerived().AlwaysRebuild() && 06914 Callee.get() == E->getCallee() && 06915 First.get() == E->getArg(0) && 06916 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 06917 return SemaRef.MaybeBindToTemporary(E); 06918 06919 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 06920 E->getOperatorLoc(), 06921 Callee.get(), 06922 First.get(), 06923 Second.get()); 06924 } 06925 06926 template<typename Derived> 06927 ExprResult 06928 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 06929 return getDerived().TransformCallExpr(E); 06930 } 06931 06932 template<typename Derived> 06933 ExprResult 06934 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 06935 // Transform the callee. 06936 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 06937 if (Callee.isInvalid()) 06938 return ExprError(); 06939 06940 // Transform exec config. 06941 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 06942 if (EC.isInvalid()) 06943 return ExprError(); 06944 06945 // Transform arguments. 06946 bool ArgChanged = false; 06947 ASTOwningVector<Expr*> Args(SemaRef); 06948 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 06949 &ArgChanged)) 06950 return ExprError(); 06951 06952 if (!getDerived().AlwaysRebuild() && 06953 Callee.get() == E->getCallee() && 06954 !ArgChanged) 06955 return SemaRef.MaybeBindToTemporary(E); 06956 06957 // FIXME: Wrong source location information for the '('. 06958 SourceLocation FakeLParenLoc 06959 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 06960 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 06961 move_arg(Args), 06962 E->getRParenLoc(), EC.get()); 06963 } 06964 06965 template<typename Derived> 06966 ExprResult 06967 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 06968 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 06969 if (!Type) 06970 return ExprError(); 06971 06972 ExprResult SubExpr 06973 = getDerived().TransformExpr(E->getSubExprAsWritten()); 06974 if (SubExpr.isInvalid()) 06975 return ExprError(); 06976 06977 if (!getDerived().AlwaysRebuild() && 06978 Type == E->getTypeInfoAsWritten() && 06979 SubExpr.get() == E->getSubExpr()) 06980 return SemaRef.Owned(E); 06981 06982 // FIXME: Poor source location information here. 06983 SourceLocation FakeLAngleLoc 06984 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 06985 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 06986 SourceLocation FakeRParenLoc 06987 = SemaRef.PP.getLocForEndOfToken( 06988 E->getSubExpr()->getSourceRange().getEnd()); 06989 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 06990 E->getStmtClass(), 06991 FakeLAngleLoc, 06992 Type, 06993 FakeRAngleLoc, 06994 FakeRAngleLoc, 06995 SubExpr.get(), 06996 FakeRParenLoc); 06997 } 06998 06999 template<typename Derived> 07000 ExprResult 07001 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 07002 return getDerived().TransformCXXNamedCastExpr(E); 07003 } 07004 07005 template<typename Derived> 07006 ExprResult 07007 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 07008 return getDerived().TransformCXXNamedCastExpr(E); 07009 } 07010 07011 template<typename Derived> 07012 ExprResult 07013 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 07014 CXXReinterpretCastExpr *E) { 07015 return getDerived().TransformCXXNamedCastExpr(E); 07016 } 07017 07018 template<typename Derived> 07019 ExprResult 07020 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 07021 return getDerived().TransformCXXNamedCastExpr(E); 07022 } 07023 07024 template<typename Derived> 07025 ExprResult 07026 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 07027 CXXFunctionalCastExpr *E) { 07028 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 07029 if (!Type) 07030 return ExprError(); 07031 07032 ExprResult SubExpr 07033 = getDerived().TransformExpr(E->getSubExprAsWritten()); 07034 if (SubExpr.isInvalid()) 07035 return ExprError(); 07036 07037 if (!getDerived().AlwaysRebuild() && 07038 Type == E->getTypeInfoAsWritten() && 07039 SubExpr.get() == E->getSubExpr()) 07040 return SemaRef.Owned(E); 07041 07042 return getDerived().RebuildCXXFunctionalCastExpr(Type, 07043 /*FIXME:*/E->getSubExpr()->getLocStart(), 07044 SubExpr.get(), 07045 E->getRParenLoc()); 07046 } 07047 07048 template<typename Derived> 07049 ExprResult 07050 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 07051 if (E->isTypeOperand()) { 07052 TypeSourceInfo *TInfo 07053 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 07054 if (!TInfo) 07055 return ExprError(); 07056 07057 if (!getDerived().AlwaysRebuild() && 07058 TInfo == E->getTypeOperandSourceInfo()) 07059 return SemaRef.Owned(E); 07060 07061 return getDerived().RebuildCXXTypeidExpr(E->getType(), 07062 E->getLocStart(), 07063 TInfo, 07064 E->getLocEnd()); 07065 } 07066 07067 // We don't know whether the subexpression is potentially evaluated until 07068 // after we perform semantic analysis. We speculatively assume it is 07069 // unevaluated; it will get fixed later if the subexpression is in fact 07070 // potentially evaluated. 07071 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 07072 07073 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 07074 if (SubExpr.isInvalid()) 07075 return ExprError(); 07076 07077 if (!getDerived().AlwaysRebuild() && 07078 SubExpr.get() == E->getExprOperand()) 07079 return SemaRef.Owned(E); 07080 07081 return getDerived().RebuildCXXTypeidExpr(E->getType(), 07082 E->getLocStart(), 07083 SubExpr.get(), 07084 E->getLocEnd()); 07085 } 07086 07087 template<typename Derived> 07088 ExprResult 07089 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 07090 if (E->isTypeOperand()) { 07091 TypeSourceInfo *TInfo 07092 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 07093 if (!TInfo) 07094 return ExprError(); 07095 07096 if (!getDerived().AlwaysRebuild() && 07097 TInfo == E->getTypeOperandSourceInfo()) 07098 return SemaRef.Owned(E); 07099 07100 return getDerived().RebuildCXXUuidofExpr(E->getType(), 07101 E->getLocStart(), 07102 TInfo, 07103 E->getLocEnd()); 07104 } 07105 07106 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 07107 07108 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 07109 if (SubExpr.isInvalid()) 07110 return ExprError(); 07111 07112 if (!getDerived().AlwaysRebuild() && 07113 SubExpr.get() == E->getExprOperand()) 07114 return SemaRef.Owned(E); 07115 07116 return getDerived().RebuildCXXUuidofExpr(E->getType(), 07117 E->getLocStart(), 07118 SubExpr.get(), 07119 E->getLocEnd()); 07120 } 07121 07122 template<typename Derived> 07123 ExprResult 07124 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 07125 return SemaRef.Owned(E); 07126 } 07127 07128 template<typename Derived> 07129 ExprResult 07130 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 07131 CXXNullPtrLiteralExpr *E) { 07132 return SemaRef.Owned(E); 07133 } 07134 07135 template<typename Derived> 07136 ExprResult 07137 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 07138 DeclContext *DC = getSema().getFunctionLevelDeclContext(); 07139 QualType T; 07140 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) 07141 T = MD->getThisType(getSema().Context); 07142 else 07143 T = getSema().Context.getPointerType( 07144 getSema().Context.getRecordType(cast<CXXRecordDecl>(DC))); 07145 07146 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 07147 // Make sure that we capture 'this'. 07148 getSema().CheckCXXThisCapture(E->getLocStart()); 07149 return SemaRef.Owned(E); 07150 } 07151 07152 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 07153 } 07154 07155 template<typename Derived> 07156 ExprResult 07157 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 07158 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 07159 if (SubExpr.isInvalid()) 07160 return ExprError(); 07161 07162 if (!getDerived().AlwaysRebuild() && 07163 SubExpr.get() == E->getSubExpr()) 07164 return SemaRef.Owned(E); 07165 07166 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 07167 E->isThrownVariableInScope()); 07168 } 07169 07170 template<typename Derived> 07171 ExprResult 07172 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 07173 ParmVarDecl *Param 07174 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 07175 E->getParam())); 07176 if (!Param) 07177 return ExprError(); 07178 07179 if (!getDerived().AlwaysRebuild() && 07180 Param == E->getParam()) 07181 return SemaRef.Owned(E); 07182 07183 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 07184 } 07185 07186 template<typename Derived> 07187 ExprResult 07188 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 07189 CXXScalarValueInitExpr *E) { 07190 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 07191 if (!T) 07192 return ExprError(); 07193 07194 if (!getDerived().AlwaysRebuild() && 07195 T == E->getTypeSourceInfo()) 07196 return SemaRef.Owned(E); 07197 07198 return getDerived().RebuildCXXScalarValueInitExpr(T, 07199 /*FIXME:*/T->getTypeLoc().getEndLoc(), 07200 E->getRParenLoc()); 07201 } 07202 07203 template<typename Derived> 07204 ExprResult 07205 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 07206 // Transform the type that we're allocating 07207 TypeSourceInfo *AllocTypeInfo 07208 = getDerived().TransformType(E->getAllocatedTypeSourceInfo()); 07209 if (!AllocTypeInfo) 07210 return ExprError(); 07211 07212 // Transform the size of the array we're allocating (if any). 07213 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 07214 if (ArraySize.isInvalid()) 07215 return ExprError(); 07216 07217 // Transform the placement arguments (if any). 07218 bool ArgumentChanged = false; 07219 ASTOwningVector<Expr*> PlacementArgs(SemaRef); 07220 if (getDerived().TransformExprs(E->getPlacementArgs(), 07221 E->getNumPlacementArgs(), true, 07222 PlacementArgs, &ArgumentChanged)) 07223 return ExprError(); 07224 07225 // Transform the initializer (if any). 07226 Expr *OldInit = E->getInitializer(); 07227 ExprResult NewInit; 07228 if (OldInit) 07229 NewInit = getDerived().TransformExpr(OldInit); 07230 if (NewInit.isInvalid()) 07231 return ExprError(); 07232 07233 // Transform new operator and delete operator. 07234 FunctionDecl *OperatorNew = 0; 07235 if (E->getOperatorNew()) { 07236 OperatorNew = cast_or_null<FunctionDecl>( 07237 getDerived().TransformDecl(E->getLocStart(), 07238 E->getOperatorNew())); 07239 if (!OperatorNew) 07240 return ExprError(); 07241 } 07242 07243 FunctionDecl *OperatorDelete = 0; 07244 if (E->getOperatorDelete()) { 07245 OperatorDelete = cast_or_null<FunctionDecl>( 07246 getDerived().TransformDecl(E->getLocStart(), 07247 E->getOperatorDelete())); 07248 if (!OperatorDelete) 07249 return ExprError(); 07250 } 07251 07252 if (!getDerived().AlwaysRebuild() && 07253 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 07254 ArraySize.get() == E->getArraySize() && 07255 NewInit.get() == OldInit && 07256 OperatorNew == E->getOperatorNew() && 07257 OperatorDelete == E->getOperatorDelete() && 07258 !ArgumentChanged) { 07259 // Mark any declarations we need as referenced. 07260 // FIXME: instantiation-specific. 07261 if (OperatorNew) 07262 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 07263 if (OperatorDelete) 07264 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 07265 07266 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 07267 QualType ElementType 07268 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 07269 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 07270 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 07271 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 07272 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 07273 } 07274 } 07275 } 07276 07277 return SemaRef.Owned(E); 07278 } 07279 07280 QualType AllocType = AllocTypeInfo->getType(); 07281 if (!ArraySize.get()) { 07282 // If no array size was specified, but the new expression was 07283 // instantiated with an array type (e.g., "new T" where T is 07284 // instantiated with "int[4]"), extract the outer bound from the 07285 // array type as our array size. We do this with constant and 07286 // dependently-sized array types. 07287 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 07288 if (!ArrayT) { 07289 // Do nothing 07290 } else if (const ConstantArrayType *ConsArrayT 07291 = dyn_cast<ConstantArrayType>(ArrayT)) { 07292 ArraySize 07293 = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context, 07294 ConsArrayT->getSize(), 07295 SemaRef.Context.getSizeType(), 07296 /*FIXME:*/E->getLocStart())); 07297 AllocType = ConsArrayT->getElementType(); 07298 } else if (const DependentSizedArrayType *DepArrayT 07299 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 07300 if (DepArrayT->getSizeExpr()) { 07301 ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()); 07302 AllocType = DepArrayT->getElementType(); 07303 } 07304 } 07305 } 07306 07307 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 07308 E->isGlobalNew(), 07309 /*FIXME:*/E->getLocStart(), 07310 move_arg(PlacementArgs), 07311 /*FIXME:*/E->getLocStart(), 07312 E->getTypeIdParens(), 07313 AllocType, 07314 AllocTypeInfo, 07315 ArraySize.get(), 07316 E->getDirectInitRange(), 07317 NewInit.take()); 07318 } 07319 07320 template<typename Derived> 07321 ExprResult 07322 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 07323 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 07324 if (Operand.isInvalid()) 07325 return ExprError(); 07326 07327 // Transform the delete operator, if known. 07328 FunctionDecl *OperatorDelete = 0; 07329 if (E->getOperatorDelete()) { 07330 OperatorDelete = cast_or_null<FunctionDecl>( 07331 getDerived().TransformDecl(E->getLocStart(), 07332 E->getOperatorDelete())); 07333 if (!OperatorDelete) 07334 return ExprError(); 07335 } 07336 07337 if (!getDerived().AlwaysRebuild() && 07338 Operand.get() == E->getArgument() && 07339 OperatorDelete == E->getOperatorDelete()) { 07340 // Mark any declarations we need as referenced. 07341 // FIXME: instantiation-specific. 07342 if (OperatorDelete) 07343 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 07344 07345 if (!E->getArgument()->isTypeDependent()) { 07346 QualType Destroyed = SemaRef.Context.getBaseElementType( 07347 E->getDestroyedType()); 07348 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 07349 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 07350 SemaRef.MarkFunctionReferenced(E->getLocStart(), 07351 SemaRef.LookupDestructor(Record)); 07352 } 07353 } 07354 07355 return SemaRef.Owned(E); 07356 } 07357 07358 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 07359 E->isGlobalDelete(), 07360 E->isArrayForm(), 07361 Operand.get()); 07362 } 07363 07364 template<typename Derived> 07365 ExprResult 07366 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 07367 CXXPseudoDestructorExpr *E) { 07368 ExprResult Base = getDerived().TransformExpr(E->getBase()); 07369 if (Base.isInvalid()) 07370 return ExprError(); 07371 07372 ParsedType ObjectTypePtr; 07373 bool MayBePseudoDestructor = false; 07374 Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 07375 E->getOperatorLoc(), 07376 E->isArrow()? tok::arrow : tok::period, 07377 ObjectTypePtr, 07378 MayBePseudoDestructor); 07379 if (Base.isInvalid()) 07380 return ExprError(); 07381 07382 QualType ObjectType = ObjectTypePtr.get(); 07383 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 07384 if (QualifierLoc) { 07385 QualifierLoc 07386 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 07387 if (!QualifierLoc) 07388 return ExprError(); 07389 } 07390 CXXScopeSpec SS; 07391 SS.Adopt(QualifierLoc); 07392 07393 PseudoDestructorTypeStorage Destroyed; 07394 if (E->getDestroyedTypeInfo()) { 07395 TypeSourceInfo *DestroyedTypeInfo 07396 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 07397 ObjectType, 0, SS); 07398 if (!DestroyedTypeInfo) 07399 return ExprError(); 07400 Destroyed = DestroyedTypeInfo; 07401 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 07402 // We aren't likely to be able to resolve the identifier down to a type 07403 // now anyway, so just retain the identifier. 07404 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 07405 E->getDestroyedTypeLoc()); 07406 } else { 07407 // Look for a destructor known with the given name. 07408 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 07409 *E->getDestroyedTypeIdentifier(), 07410 E->getDestroyedTypeLoc(), 07411 /*Scope=*/0, 07412 SS, ObjectTypePtr, 07413 false); 07414 if (!T) 07415 return ExprError(); 07416 07417 Destroyed 07418 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 07419 E->getDestroyedTypeLoc()); 07420 } 07421 07422 TypeSourceInfo *ScopeTypeInfo = 0; 07423 if (E->getScopeTypeInfo()) { 07424 ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo()); 07425 if (!ScopeTypeInfo) 07426 return ExprError(); 07427 } 07428 07429 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 07430 E->getOperatorLoc(), 07431 E->isArrow(), 07432 SS, 07433 ScopeTypeInfo, 07434 E->getColonColonLoc(), 07435 E->getTildeLoc(), 07436 Destroyed); 07437 } 07438 07439 template<typename Derived> 07440 ExprResult 07441 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 07442 UnresolvedLookupExpr *Old) { 07443 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 07444 Sema::LookupOrdinaryName); 07445 07446 // Transform all the decls. 07447 for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 07448 E = Old->decls_end(); I != E; ++I) { 07449 NamedDecl *InstD = static_cast<NamedDecl*>( 07450 getDerived().TransformDecl(Old->getNameLoc(), 07451 *I)); 07452 if (!InstD) { 07453 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 07454 // This can happen because of dependent hiding. 07455 if (isa<UsingShadowDecl>(*I)) 07456 continue; 07457 else 07458 return ExprError(); 07459 } 07460 07461 // Expand using declarations. 07462 if (isa<UsingDecl>(InstD)) { 07463 UsingDecl *UD = cast<UsingDecl>(InstD); 07464 for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 07465 E = UD->shadow_end(); I != E; ++I) 07466 R.addDecl(*I); 07467 continue; 07468 } 07469 07470 R.addDecl(InstD); 07471 } 07472 07473 // Resolve a kind, but don't do any further analysis. If it's 07474 // ambiguous, the callee needs to deal with it. 07475 R.resolveKind(); 07476 07477 // Rebuild the nested-name qualifier, if present. 07478 CXXScopeSpec SS; 07479 if (Old->getQualifierLoc()) { 07480 NestedNameSpecifierLoc QualifierLoc 07481 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 07482 if (!QualifierLoc) 07483 return ExprError(); 07484 07485 SS.Adopt(QualifierLoc); 07486 } 07487 07488 if (Old->getNamingClass()) { 07489 CXXRecordDecl *NamingClass 07490 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 07491 Old->getNameLoc(), 07492 Old->getNamingClass())); 07493 if (!NamingClass) 07494 return ExprError(); 07495 07496 R.setNamingClass(NamingClass); 07497 } 07498 07499 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 07500 07501 // If we have neither explicit template arguments, nor the template keyword, 07502 // it's a normal declaration name. 07503 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) 07504 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 07505 07506 // If we have template arguments, rebuild them, then rebuild the 07507 // templateid expression. 07508 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 07509 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 07510 Old->getNumTemplateArgs(), 07511 TransArgs)) 07512 return ExprError(); 07513 07514 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 07515 Old->requiresADL(), &TransArgs); 07516 } 07517 07518 template<typename Derived> 07519 ExprResult 07520 TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 07521 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 07522 if (!T) 07523 return ExprError(); 07524 07525 if (!getDerived().AlwaysRebuild() && 07526 T == E->getQueriedTypeSourceInfo()) 07527 return SemaRef.Owned(E); 07528 07529 return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 07530 E->getLocStart(), 07531 T, 07532 E->getLocEnd()); 07533 } 07534 07535 template<typename Derived> 07536 ExprResult 07537 TreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 07538 TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo()); 07539 if (!LhsT) 07540 return ExprError(); 07541 07542 TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo()); 07543 if (!RhsT) 07544 return ExprError(); 07545 07546 if (!getDerived().AlwaysRebuild() && 07547 LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo()) 07548 return SemaRef.Owned(E); 07549 07550 return getDerived().RebuildBinaryTypeTrait(E->getTrait(), 07551 E->getLocStart(), 07552 LhsT, RhsT, 07553 E->getLocEnd()); 07554 } 07555 07556 template<typename Derived> 07557 ExprResult 07558 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 07559 bool ArgChanged = false; 07560 llvm::SmallVector<TypeSourceInfo *, 4> Args; 07561 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 07562 TypeSourceInfo *From = E->getArg(I); 07563 TypeLoc FromTL = From->getTypeLoc(); 07564 if (!isa<PackExpansionTypeLoc>(FromTL)) { 07565 TypeLocBuilder TLB; 07566 TLB.reserve(FromTL.getFullDataSize()); 07567 QualType To = getDerived().TransformType(TLB, FromTL); 07568 if (To.isNull()) 07569 return ExprError(); 07570 07571 if (To == From->getType()) 07572 Args.push_back(From); 07573 else { 07574 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 07575 ArgChanged = true; 07576 } 07577 continue; 07578 } 07579 07580 ArgChanged = true; 07581 07582 // We have a pack expansion. Instantiate it. 07583 PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(FromTL); 07584 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 07585 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 07586 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 07587 07588 // Determine whether the set of unexpanded parameter packs can and should 07589 // be expanded. 07590 bool Expand = true; 07591 bool RetainExpansion = false; 07592 llvm::Optional<unsigned> OrigNumExpansions 07593 = ExpansionTL.getTypePtr()->getNumExpansions(); 07594 llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 07595 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 07596 PatternTL.getSourceRange(), 07597 Unexpanded, 07598 Expand, RetainExpansion, 07599 NumExpansions)) 07600 return ExprError(); 07601 07602 if (!Expand) { 07603 // The transform has determined that we should perform a simple 07604 // transformation on the pack expansion, producing another pack 07605 // expansion. 07606 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 07607 07608 TypeLocBuilder TLB; 07609 TLB.reserve(From->getTypeLoc().getFullDataSize()); 07610 07611 QualType To = getDerived().TransformType(TLB, PatternTL); 07612 if (To.isNull()) 07613 return ExprError(); 07614 07615 To = getDerived().RebuildPackExpansionType(To, 07616 PatternTL.getSourceRange(), 07617 ExpansionTL.getEllipsisLoc(), 07618 NumExpansions); 07619 if (To.isNull()) 07620 return ExprError(); 07621 07622 PackExpansionTypeLoc ToExpansionTL 07623 = TLB.push<PackExpansionTypeLoc>(To); 07624 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 07625 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 07626 continue; 07627 } 07628 07629 // Expand the pack expansion by substituting for each argument in the 07630 // pack(s). 07631 for (unsigned I = 0; I != *NumExpansions; ++I) { 07632 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 07633 TypeLocBuilder TLB; 07634 TLB.reserve(PatternTL.getFullDataSize()); 07635 QualType To = getDerived().TransformType(TLB, PatternTL); 07636 if (To.isNull()) 07637 return ExprError(); 07638 07639 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 07640 } 07641 07642 if (!RetainExpansion) 07643 continue; 07644 07645 // If we're supposed to retain a pack expansion, do so by temporarily 07646 // forgetting the partially-substituted parameter pack. 07647 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 07648 07649 TypeLocBuilder TLB; 07650 TLB.reserve(From->getTypeLoc().getFullDataSize()); 07651 07652 QualType To = getDerived().TransformType(TLB, PatternTL); 07653 if (To.isNull()) 07654 return ExprError(); 07655 07656 To = getDerived().RebuildPackExpansionType(To, 07657 PatternTL.getSourceRange(), 07658 ExpansionTL.getEllipsisLoc(), 07659 NumExpansions); 07660 if (To.isNull()) 07661 return ExprError(); 07662 07663 PackExpansionTypeLoc ToExpansionTL 07664 = TLB.push<PackExpansionTypeLoc>(To); 07665 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 07666 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 07667 } 07668 07669 if (!getDerived().AlwaysRebuild() && !ArgChanged) 07670 return SemaRef.Owned(E); 07671 07672 return getDerived().RebuildTypeTrait(E->getTrait(), 07673 E->getLocStart(), 07674 Args, 07675 E->getLocEnd()); 07676 } 07677 07678 template<typename Derived> 07679 ExprResult 07680 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 07681 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 07682 if (!T) 07683 return ExprError(); 07684 07685 if (!getDerived().AlwaysRebuild() && 07686 T == E->getQueriedTypeSourceInfo()) 07687 return SemaRef.Owned(E); 07688 07689 ExprResult SubExpr; 07690 { 07691 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 07692 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 07693 if (SubExpr.isInvalid()) 07694 return ExprError(); 07695 07696 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 07697 return SemaRef.Owned(E); 07698 } 07699 07700 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 07701 E->getLocStart(), 07702 T, 07703 SubExpr.get(), 07704 E->getLocEnd()); 07705 } 07706 07707 template<typename Derived> 07708 ExprResult 07709 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 07710 ExprResult SubExpr; 07711 { 07712 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 07713 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 07714 if (SubExpr.isInvalid()) 07715 return ExprError(); 07716 07717 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 07718 return SemaRef.Owned(E); 07719 } 07720 07721 return getDerived().RebuildExpressionTrait( 07722 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 07723 } 07724 07725 template<typename Derived> 07726 ExprResult 07727 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 07728 DependentScopeDeclRefExpr *E) { 07729 NestedNameSpecifierLoc QualifierLoc 07730 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 07731 if (!QualifierLoc) 07732 return ExprError(); 07733 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 07734 07735 // TODO: If this is a conversion-function-id, verify that the 07736 // destination type name (if present) resolves the same way after 07737 // instantiation as it did in the local scope. 07738 07739 DeclarationNameInfo NameInfo 07740 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 07741 if (!NameInfo.getName()) 07742 return ExprError(); 07743 07744 if (!E->hasExplicitTemplateArgs()) { 07745 if (!getDerived().AlwaysRebuild() && 07746 QualifierLoc == E->getQualifierLoc() && 07747 // Note: it is sufficient to compare the Name component of NameInfo: 07748 // if name has not changed, DNLoc has not changed either. 07749 NameInfo.getName() == E->getDeclName()) 07750 return SemaRef.Owned(E); 07751 07752 return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 07753 TemplateKWLoc, 07754 NameInfo, 07755 /*TemplateArgs*/ 0); 07756 } 07757 07758 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 07759 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 07760 E->getNumTemplateArgs(), 07761 TransArgs)) 07762 return ExprError(); 07763 07764 return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 07765 TemplateKWLoc, 07766 NameInfo, 07767 &TransArgs); 07768 } 07769 07770 template<typename Derived> 07771 ExprResult 07772 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 07773 // CXXConstructExprs are always implicit, so when we have a 07774 // 1-argument construction we just transform that argument. 07775 if (E->getNumArgs() == 1 || 07776 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) 07777 return getDerived().TransformExpr(E->getArg(0)); 07778 07779 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 07780 07781 QualType T = getDerived().TransformType(E->getType()); 07782 if (T.isNull()) 07783 return ExprError(); 07784 07785 CXXConstructorDecl *Constructor 07786 = cast_or_null<CXXConstructorDecl>( 07787 getDerived().TransformDecl(E->getLocStart(), 07788 E->getConstructor())); 07789 if (!Constructor) 07790 return ExprError(); 07791 07792 bool ArgumentChanged = false; 07793 ASTOwningVector<Expr*> Args(SemaRef); 07794 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 07795 &ArgumentChanged)) 07796 return ExprError(); 07797 07798 if (!getDerived().AlwaysRebuild() && 07799 T == E->getType() && 07800 Constructor == E->getConstructor() && 07801 !ArgumentChanged) { 07802 // Mark the constructor as referenced. 07803 // FIXME: Instantiation-specific 07804 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 07805 return SemaRef.Owned(E); 07806 } 07807 07808 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 07809 Constructor, E->isElidable(), 07810 move_arg(Args), 07811 E->hadMultipleCandidates(), 07812 E->requiresZeroInitialization(), 07813 E->getConstructionKind(), 07814 E->getParenRange()); 07815 } 07816 07817 /// \brief Transform a C++ temporary-binding expression. 07818 /// 07819 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 07820 /// transform the subexpression and return that. 07821 template<typename Derived> 07822 ExprResult 07823 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 07824 return getDerived().TransformExpr(E->getSubExpr()); 07825 } 07826 07827 /// \brief Transform a C++ expression that contains cleanups that should 07828 /// be run after the expression is evaluated. 07829 /// 07830 /// Since ExprWithCleanups nodes are implicitly generated, we 07831 /// just transform the subexpression and return that. 07832 template<typename Derived> 07833 ExprResult 07834 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 07835 return getDerived().TransformExpr(E->getSubExpr()); 07836 } 07837 07838 template<typename Derived> 07839 ExprResult 07840 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 07841 CXXTemporaryObjectExpr *E) { 07842 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 07843 if (!T) 07844 return ExprError(); 07845 07846 CXXConstructorDecl *Constructor 07847 = cast_or_null<CXXConstructorDecl>( 07848 getDerived().TransformDecl(E->getLocStart(), 07849 E->getConstructor())); 07850 if (!Constructor) 07851 return ExprError(); 07852 07853 bool ArgumentChanged = false; 07854 ASTOwningVector<Expr*> Args(SemaRef); 07855 Args.reserve(E->getNumArgs()); 07856 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 07857 &ArgumentChanged)) 07858 return ExprError(); 07859 07860 if (!getDerived().AlwaysRebuild() && 07861 T == E->getTypeSourceInfo() && 07862 Constructor == E->getConstructor() && 07863 !ArgumentChanged) { 07864 // FIXME: Instantiation-specific 07865 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 07866 return SemaRef.MaybeBindToTemporary(E); 07867 } 07868 07869 return getDerived().RebuildCXXTemporaryObjectExpr(T, 07870 /*FIXME:*/T->getTypeLoc().getEndLoc(), 07871 move_arg(Args), 07872 E->getLocEnd()); 07873 } 07874 07875 template<typename Derived> 07876 ExprResult 07877 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 07878 // Create the local class that will describe the lambda. 07879 CXXRecordDecl *Class 07880 = getSema().createLambdaClosureType(E->getIntroducerRange(), 07881 /*KnownDependent=*/false); 07882 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 07883 07884 // Transform the type of the lambda parameters and start the definition of 07885 // the lambda itself. 07886 TypeSourceInfo *MethodTy 07887 = TransformType(E->getCallOperator()->getTypeSourceInfo()); 07888 if (!MethodTy) 07889 return ExprError(); 07890 07891 // Transform lambda parameters. 07892 bool Invalid = false; 07893 llvm::SmallVector<QualType, 4> ParamTypes; 07894 llvm::SmallVector<ParmVarDecl *, 4> Params; 07895 if (getDerived().TransformFunctionTypeParams(E->getLocStart(), 07896 E->getCallOperator()->param_begin(), 07897 E->getCallOperator()->param_size(), 07898 0, ParamTypes, &Params)) 07899 Invalid = true; 07900 07901 // Build the call operator. 07902 // Note: Once a lambda mangling number and context declaration have been 07903 // assigned, they never change. 07904 unsigned ManglingNumber = E->getLambdaClass()->getLambdaManglingNumber(); 07905 Decl *ContextDecl = E->getLambdaClass()->getLambdaContextDecl(); 07906 CXXMethodDecl *CallOperator 07907 = getSema().startLambdaDefinition(Class, E->getIntroducerRange(), 07908 MethodTy, 07909 E->getCallOperator()->getLocEnd(), 07910 Params, ManglingNumber, ContextDecl); 07911 getDerived().transformAttrs(E->getCallOperator(), CallOperator); 07912 07913 // FIXME: Instantiation-specific. 07914 CallOperator->setInstantiationOfMemberFunction(E->getCallOperator(), 07915 TSK_ImplicitInstantiation); 07916 07917 // Introduce the context of the call operator. 07918 Sema::ContextRAII SavedContext(getSema(), CallOperator); 07919 07920 // Enter the scope of the lambda. 07921 sema::LambdaScopeInfo *LSI 07922 = getSema().enterLambdaScope(CallOperator, E->getIntroducerRange(), 07923 E->getCaptureDefault(), 07924 E->hasExplicitParameters(), 07925 E->hasExplicitResultType(), 07926 E->isMutable()); 07927 07928 // Transform captures. 07929 bool FinishedExplicitCaptures = false; 07930 for (LambdaExpr::capture_iterator C = E->capture_begin(), 07931 CEnd = E->capture_end(); 07932 C != CEnd; ++C) { 07933 // When we hit the first implicit capture, tell Sema that we've finished 07934 // the list of explicit captures. 07935 if (!FinishedExplicitCaptures && C->isImplicit()) { 07936 getSema().finishLambdaExplicitCaptures(LSI); 07937 FinishedExplicitCaptures = true; 07938 } 07939 07940 // Capturing 'this' is trivial. 07941 if (C->capturesThis()) { 07942 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit()); 07943 continue; 07944 } 07945 07946 // Determine the capture kind for Sema. 07947 Sema::TryCaptureKind Kind 07948 = C->isImplicit()? Sema::TryCapture_Implicit 07949 : C->getCaptureKind() == LCK_ByCopy 07950 ? Sema::TryCapture_ExplicitByVal 07951 : Sema::TryCapture_ExplicitByRef; 07952 SourceLocation EllipsisLoc; 07953 if (C->isPackExpansion()) { 07954 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 07955 bool ShouldExpand = false; 07956 bool RetainExpansion = false; 07957 llvm::Optional<unsigned> NumExpansions; 07958 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 07959 C->getLocation(), 07960 Unexpanded, 07961 ShouldExpand, RetainExpansion, 07962 NumExpansions)) 07963 return ExprError(); 07964 07965 if (ShouldExpand) { 07966 // The transform has determined that we should perform an expansion; 07967 // transform and capture each of the arguments. 07968 // expansion of the pattern. Do so. 07969 VarDecl *Pack = C->getCapturedVar(); 07970 for (unsigned I = 0; I != *NumExpansions; ++I) { 07971 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 07972 VarDecl *CapturedVar 07973 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 07974 Pack)); 07975 if (!CapturedVar) { 07976 Invalid = true; 07977 continue; 07978 } 07979 07980 // Capture the transformed variable. 07981 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 07982 } 07983 continue; 07984 } 07985 07986 EllipsisLoc = C->getEllipsisLoc(); 07987 } 07988 07989 // Transform the captured variable. 07990 VarDecl *CapturedVar 07991 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 07992 C->getCapturedVar())); 07993 if (!CapturedVar) { 07994 Invalid = true; 07995 continue; 07996 } 07997 07998 // Capture the transformed variable. 07999 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 08000 } 08001 if (!FinishedExplicitCaptures) 08002 getSema().finishLambdaExplicitCaptures(LSI); 08003 08004 08005 // Enter a new evaluation context to insulate the lambda from any 08006 // cleanups from the enclosing full-expression. 08007 getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated); 08008 08009 if (Invalid) { 08010 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 08011 /*IsInstantiation=*/true); 08012 return ExprError(); 08013 } 08014 08015 // Instantiate the body of the lambda expression. 08016 StmtResult Body = getDerived().TransformStmt(E->getBody()); 08017 if (Body.isInvalid()) { 08018 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 08019 /*IsInstantiation=*/true); 08020 return ExprError(); 08021 } 08022 08023 return getSema().ActOnLambdaExpr(E->getLocStart(), Body.take(), 08024 /*CurScope=*/0, /*IsInstantiation=*/true); 08025 } 08026 08027 template<typename Derived> 08028 ExprResult 08029 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 08030 CXXUnresolvedConstructExpr *E) { 08031 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 08032 if (!T) 08033 return ExprError(); 08034 08035 bool ArgumentChanged = false; 08036 ASTOwningVector<Expr*> Args(SemaRef); 08037 Args.reserve(E->arg_size()); 08038 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 08039 &ArgumentChanged)) 08040 return ExprError(); 08041 08042 if (!getDerived().AlwaysRebuild() && 08043 T == E->getTypeSourceInfo() && 08044 !ArgumentChanged) 08045 return SemaRef.Owned(E); 08046 08047 // FIXME: we're faking the locations of the commas 08048 return getDerived().RebuildCXXUnresolvedConstructExpr(T, 08049 E->getLParenLoc(), 08050 move_arg(Args), 08051 E->getRParenLoc()); 08052 } 08053 08054 template<typename Derived> 08055 ExprResult 08056 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 08057 CXXDependentScopeMemberExpr *E) { 08058 // Transform the base of the expression. 08059 ExprResult Base((Expr*) 0); 08060 Expr *OldBase; 08061 QualType BaseType; 08062 QualType ObjectType; 08063 if (!E->isImplicitAccess()) { 08064 OldBase = E->getBase(); 08065 Base = getDerived().TransformExpr(OldBase); 08066 if (Base.isInvalid()) 08067 return ExprError(); 08068 08069 // Start the member reference and compute the object's type. 08070 ParsedType ObjectTy; 08071 bool MayBePseudoDestructor = false; 08072 Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 08073 E->getOperatorLoc(), 08074 E->isArrow()? tok::arrow : tok::period, 08075 ObjectTy, 08076 MayBePseudoDestructor); 08077 if (Base.isInvalid()) 08078 return ExprError(); 08079 08080 ObjectType = ObjectTy.get(); 08081 BaseType = ((Expr*) Base.get())->getType(); 08082 } else { 08083 OldBase = 0; 08084 BaseType = getDerived().TransformType(E->getBaseType()); 08085 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 08086 } 08087 08088 // Transform the first part of the nested-name-specifier that qualifies 08089 // the member name. 08090 NamedDecl *FirstQualifierInScope 08091 = getDerived().TransformFirstQualifierInScope( 08092 E->getFirstQualifierFoundInScope(), 08093 E->getQualifierLoc().getBeginLoc()); 08094 08095 NestedNameSpecifierLoc QualifierLoc; 08096 if (E->getQualifier()) { 08097 QualifierLoc 08098 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 08099 ObjectType, 08100 FirstQualifierInScope); 08101 if (!QualifierLoc) 08102 return ExprError(); 08103 } 08104 08105 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 08106 08107 // TODO: If this is a conversion-function-id, verify that the 08108 // destination type name (if present) resolves the same way after 08109 // instantiation as it did in the local scope. 08110 08111 DeclarationNameInfo NameInfo 08112 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 08113 if (!NameInfo.getName()) 08114 return ExprError(); 08115 08116 if (!E->hasExplicitTemplateArgs()) { 08117 // This is a reference to a member without an explicitly-specified 08118 // template argument list. Optimize for this common case. 08119 if (!getDerived().AlwaysRebuild() && 08120 Base.get() == OldBase && 08121 BaseType == E->getBaseType() && 08122 QualifierLoc == E->getQualifierLoc() && 08123 NameInfo.getName() == E->getMember() && 08124 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 08125 return SemaRef.Owned(E); 08126 08127 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 08128 BaseType, 08129 E->isArrow(), 08130 E->getOperatorLoc(), 08131 QualifierLoc, 08132 TemplateKWLoc, 08133 FirstQualifierInScope, 08134 NameInfo, 08135 /*TemplateArgs*/ 0); 08136 } 08137 08138 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 08139 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 08140 E->getNumTemplateArgs(), 08141 TransArgs)) 08142 return ExprError(); 08143 08144 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 08145 BaseType, 08146 E->isArrow(), 08147 E->getOperatorLoc(), 08148 QualifierLoc, 08149 TemplateKWLoc, 08150 FirstQualifierInScope, 08151 NameInfo, 08152 &TransArgs); 08153 } 08154 08155 template<typename Derived> 08156 ExprResult 08157 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 08158 // Transform the base of the expression. 08159 ExprResult Base((Expr*) 0); 08160 QualType BaseType; 08161 if (!Old->isImplicitAccess()) { 08162 Base = getDerived().TransformExpr(Old->getBase()); 08163 if (Base.isInvalid()) 08164 return ExprError(); 08165 Base = getSema().PerformMemberExprBaseConversion(Base.take(), 08166 Old->isArrow()); 08167 if (Base.isInvalid()) 08168 return ExprError(); 08169 BaseType = Base.get()->getType(); 08170 } else { 08171 BaseType = getDerived().TransformType(Old->getBaseType()); 08172 } 08173 08174 NestedNameSpecifierLoc QualifierLoc; 08175 if (Old->getQualifierLoc()) { 08176 QualifierLoc 08177 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 08178 if (!QualifierLoc) 08179 return ExprError(); 08180 } 08181 08182 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 08183 08184 LookupResult R(SemaRef, Old->getMemberNameInfo(), 08185 Sema::LookupOrdinaryName); 08186 08187 // Transform all the decls. 08188 for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 08189 E = Old->decls_end(); I != E; ++I) { 08190 NamedDecl *InstD = static_cast<NamedDecl*>( 08191 getDerived().TransformDecl(Old->getMemberLoc(), 08192 *I)); 08193 if (!InstD) { 08194 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 08195 // This can happen because of dependent hiding. 08196 if (isa<UsingShadowDecl>(*I)) 08197 continue; 08198 else { 08199 R.clear(); 08200 return ExprError(); 08201 } 08202 } 08203 08204 // Expand using declarations. 08205 if (isa<UsingDecl>(InstD)) { 08206 UsingDecl *UD = cast<UsingDecl>(InstD); 08207 for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 08208 E = UD->shadow_end(); I != E; ++I) 08209 R.addDecl(*I); 08210 continue; 08211 } 08212 08213 R.addDecl(InstD); 08214 } 08215 08216 R.resolveKind(); 08217 08218 // Determine the naming class. 08219 if (Old->getNamingClass()) { 08220 CXXRecordDecl *NamingClass 08221 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 08222 Old->getMemberLoc(), 08223 Old->getNamingClass())); 08224 if (!NamingClass) 08225 return ExprError(); 08226 08227 R.setNamingClass(NamingClass); 08228 } 08229 08230 TemplateArgumentListInfo TransArgs; 08231 if (Old->hasExplicitTemplateArgs()) { 08232 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 08233 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 08234 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 08235 Old->getNumTemplateArgs(), 08236 TransArgs)) 08237 return ExprError(); 08238 } 08239 08240 // FIXME: to do this check properly, we will need to preserve the 08241 // first-qualifier-in-scope here, just in case we had a dependent 08242 // base (and therefore couldn't do the check) and a 08243 // nested-name-qualifier (and therefore could do the lookup). 08244 NamedDecl *FirstQualifierInScope = 0; 08245 08246 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 08247 BaseType, 08248 Old->getOperatorLoc(), 08249 Old->isArrow(), 08250 QualifierLoc, 08251 TemplateKWLoc, 08252 FirstQualifierInScope, 08253 R, 08254 (Old->hasExplicitTemplateArgs() 08255 ? &TransArgs : 0)); 08256 } 08257 08258 template<typename Derived> 08259 ExprResult 08260 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 08261 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 08262 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 08263 if (SubExpr.isInvalid()) 08264 return ExprError(); 08265 08266 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 08267 return SemaRef.Owned(E); 08268 08269 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 08270 } 08271 08272 template<typename Derived> 08273 ExprResult 08274 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 08275 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 08276 if (Pattern.isInvalid()) 08277 return ExprError(); 08278 08279 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 08280 return SemaRef.Owned(E); 08281 08282 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 08283 E->getNumExpansions()); 08284 } 08285 08286 template<typename Derived> 08287 ExprResult 08288 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 08289 // If E is not value-dependent, then nothing will change when we transform it. 08290 // Note: This is an instantiation-centric view. 08291 if (!E->isValueDependent()) 08292 return SemaRef.Owned(E); 08293 08294 // Note: None of the implementations of TryExpandParameterPacks can ever 08295 // produce a diagnostic when given only a single unexpanded parameter pack, 08296 // so 08297 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 08298 bool ShouldExpand = false; 08299 bool RetainExpansion = false; 08300 llvm::Optional<unsigned> NumExpansions; 08301 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 08302 Unexpanded, 08303 ShouldExpand, RetainExpansion, 08304 NumExpansions)) 08305 return ExprError(); 08306 08307 if (RetainExpansion) 08308 return SemaRef.Owned(E); 08309 08310 NamedDecl *Pack = E->getPack(); 08311 if (!ShouldExpand) { 08312 Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(), 08313 Pack)); 08314 if (!Pack) 08315 return ExprError(); 08316 } 08317 08318 08319 // We now know the length of the parameter pack, so build a new expression 08320 // that stores that length. 08321 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 08322 E->getPackLoc(), E->getRParenLoc(), 08323 NumExpansions); 08324 } 08325 08326 template<typename Derived> 08327 ExprResult 08328 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 08329 SubstNonTypeTemplateParmPackExpr *E) { 08330 // Default behavior is to do nothing with this transformation. 08331 return SemaRef.Owned(E); 08332 } 08333 08334 template<typename Derived> 08335 ExprResult 08336 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 08337 SubstNonTypeTemplateParmExpr *E) { 08338 // Default behavior is to do nothing with this transformation. 08339 return SemaRef.Owned(E); 08340 } 08341 08342 template<typename Derived> 08343 ExprResult 08344 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 08345 MaterializeTemporaryExpr *E) { 08346 return getDerived().TransformExpr(E->GetTemporaryExpr()); 08347 } 08348 08349 template<typename Derived> 08350 ExprResult 08351 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 08352 return SemaRef.MaybeBindToTemporary(E); 08353 } 08354 08355 template<typename Derived> 08356 ExprResult 08357 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 08358 return SemaRef.Owned(E); 08359 } 08360 08361 template<typename Derived> 08362 ExprResult 08363 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 08364 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 08365 if (SubExpr.isInvalid()) 08366 return ExprError(); 08367 08368 if (!getDerived().AlwaysRebuild() && 08369 SubExpr.get() == E->getSubExpr()) 08370 return SemaRef.Owned(E); 08371 08372 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 08373 } 08374 08375 template<typename Derived> 08376 ExprResult 08377 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 08378 // Transform each of the elements. 08379 llvm::SmallVector<Expr *, 8> Elements; 08380 bool ArgChanged = false; 08381 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 08382 /*IsCall=*/false, Elements, &ArgChanged)) 08383 return ExprError(); 08384 08385 if (!getDerived().AlwaysRebuild() && !ArgChanged) 08386 return SemaRef.MaybeBindToTemporary(E); 08387 08388 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 08389 Elements.data(), 08390 Elements.size()); 08391 } 08392 08393 template<typename Derived> 08394 ExprResult 08395 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 08396 ObjCDictionaryLiteral *E) { 08397 // Transform each of the elements. 08398 llvm::SmallVector<ObjCDictionaryElement, 8> Elements; 08399 bool ArgChanged = false; 08400 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 08401 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 08402 08403 if (OrigElement.isPackExpansion()) { 08404 // This key/value element is a pack expansion. 08405 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 08406 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 08407 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 08408 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 08409 08410 // Determine whether the set of unexpanded parameter packs can 08411 // and should be expanded. 08412 bool Expand = true; 08413 bool RetainExpansion = false; 08414 llvm::Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 08415 llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 08416 SourceRange PatternRange(OrigElement.Key->getLocStart(), 08417 OrigElement.Value->getLocEnd()); 08418 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 08419 PatternRange, 08420 Unexpanded, 08421 Expand, RetainExpansion, 08422 NumExpansions)) 08423 return ExprError(); 08424 08425 if (!Expand) { 08426 // The transform has determined that we should perform a simple 08427 // transformation on the pack expansion, producing another pack 08428 // expansion. 08429 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 08430 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 08431 if (Key.isInvalid()) 08432 return ExprError(); 08433 08434 if (Key.get() != OrigElement.Key) 08435 ArgChanged = true; 08436 08437 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 08438 if (Value.isInvalid()) 08439 return ExprError(); 08440 08441 if (Value.get() != OrigElement.Value) 08442 ArgChanged = true; 08443 08444 ObjCDictionaryElement Expansion = { 08445 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 08446 }; 08447 Elements.push_back(Expansion); 08448 continue; 08449 } 08450 08451 // Record right away that the argument was changed. This needs 08452 // to happen even if the array expands to nothing. 08453 ArgChanged = true; 08454 08455 // The transform has determined that we should perform an elementwise 08456 // expansion of the pattern. Do so. 08457 for (unsigned I = 0; I != *NumExpansions; ++I) { 08458 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 08459 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 08460 if (Key.isInvalid()) 08461 return ExprError(); 08462 08463 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 08464 if (Value.isInvalid()) 08465 return ExprError(); 08466 08467 ObjCDictionaryElement Element = { 08468 Key.get(), Value.get(), SourceLocation(), NumExpansions 08469 }; 08470 08471 // If any unexpanded parameter packs remain, we still have a 08472 // pack expansion. 08473 if (Key.get()->containsUnexpandedParameterPack() || 08474 Value.get()->containsUnexpandedParameterPack()) 08475 Element.EllipsisLoc = OrigElement.EllipsisLoc; 08476 08477 Elements.push_back(Element); 08478 } 08479 08480 // We've finished with this pack expansion. 08481 continue; 08482 } 08483 08484 // Transform and check key. 08485 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 08486 if (Key.isInvalid()) 08487 return ExprError(); 08488 08489 if (Key.get() != OrigElement.Key) 08490 ArgChanged = true; 08491 08492 // Transform and check value. 08493 ExprResult Value 08494 = getDerived().TransformExpr(OrigElement.Value); 08495 if (Value.isInvalid()) 08496 return ExprError(); 08497 08498 if (Value.get() != OrigElement.Value) 08499 ArgChanged = true; 08500 08501 ObjCDictionaryElement Element = { 08502 Key.get(), Value.get(), SourceLocation(), llvm::Optional<unsigned>() 08503 }; 08504 Elements.push_back(Element); 08505 } 08506 08507 if (!getDerived().AlwaysRebuild() && !ArgChanged) 08508 return SemaRef.MaybeBindToTemporary(E); 08509 08510 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 08511 Elements.data(), 08512 Elements.size()); 08513 } 08514 08515 template<typename Derived> 08516 ExprResult 08517 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 08518 TypeSourceInfo *EncodedTypeInfo 08519 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 08520 if (!EncodedTypeInfo) 08521 return ExprError(); 08522 08523 if (!getDerived().AlwaysRebuild() && 08524 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 08525 return SemaRef.Owned(E); 08526 08527 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 08528 EncodedTypeInfo, 08529 E->getRParenLoc()); 08530 } 08531 08532 template<typename Derived> 08533 ExprResult TreeTransform<Derived>:: 08534 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 08535 ExprResult result = getDerived().TransformExpr(E->getSubExpr()); 08536 if (result.isInvalid()) return ExprError(); 08537 Expr *subExpr = result.take(); 08538 08539 if (!getDerived().AlwaysRebuild() && 08540 subExpr == E->getSubExpr()) 08541 return SemaRef.Owned(E); 08542 08543 return SemaRef.Owned(new(SemaRef.Context) 08544 ObjCIndirectCopyRestoreExpr(subExpr, E->getType(), E->shouldCopy())); 08545 } 08546 08547 template<typename Derived> 08548 ExprResult TreeTransform<Derived>:: 08549 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 08550 TypeSourceInfo *TSInfo 08551 = getDerived().TransformType(E->getTypeInfoAsWritten()); 08552 if (!TSInfo) 08553 return ExprError(); 08554 08555 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 08556 if (Result.isInvalid()) 08557 return ExprError(); 08558 08559 if (!getDerived().AlwaysRebuild() && 08560 TSInfo == E->getTypeInfoAsWritten() && 08561 Result.get() == E->getSubExpr()) 08562 return SemaRef.Owned(E); 08563 08564 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 08565 E->getBridgeKeywordLoc(), TSInfo, 08566 Result.get()); 08567 } 08568 08569 template<typename Derived> 08570 ExprResult 08571 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 08572 // Transform arguments. 08573 bool ArgChanged = false; 08574 ASTOwningVector<Expr*> Args(SemaRef); 08575 Args.reserve(E->getNumArgs()); 08576 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 08577 &ArgChanged)) 08578 return ExprError(); 08579 08580 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 08581 // Class message: transform the receiver type. 08582 TypeSourceInfo *ReceiverTypeInfo 08583 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 08584 if (!ReceiverTypeInfo) 08585 return ExprError(); 08586 08587 // If nothing changed, just retain the existing message send. 08588 if (!getDerived().AlwaysRebuild() && 08589 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 08590 return SemaRef.MaybeBindToTemporary(E); 08591 08592 // Build a new class message send. 08593 SmallVector<SourceLocation, 16> SelLocs; 08594 E->getSelectorLocs(SelLocs); 08595 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 08596 E->getSelector(), 08597 SelLocs, 08598 E->getMethodDecl(), 08599 E->getLeftLoc(), 08600 move_arg(Args), 08601 E->getRightLoc()); 08602 } 08603 08604 // Instance message: transform the receiver 08605 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 08606 "Only class and instance messages may be instantiated"); 08607 ExprResult Receiver 08608 = getDerived().TransformExpr(E->getInstanceReceiver()); 08609 if (Receiver.isInvalid()) 08610 return ExprError(); 08611 08612 // If nothing changed, just retain the existing message send. 08613 if (!getDerived().AlwaysRebuild() && 08614 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 08615 return SemaRef.MaybeBindToTemporary(E); 08616 08617 // Build a new instance message send. 08618 SmallVector<SourceLocation, 16> SelLocs; 08619 E->getSelectorLocs(SelLocs); 08620 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 08621 E->getSelector(), 08622 SelLocs, 08623 E->getMethodDecl(), 08624 E->getLeftLoc(), 08625 move_arg(Args), 08626 E->getRightLoc()); 08627 } 08628 08629 template<typename Derived> 08630 ExprResult 08631 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 08632 return SemaRef.Owned(E); 08633 } 08634 08635 template<typename Derived> 08636 ExprResult 08637 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 08638 return SemaRef.Owned(E); 08639 } 08640 08641 template<typename Derived> 08642 ExprResult 08643 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 08644 // Transform the base expression. 08645 ExprResult Base = getDerived().TransformExpr(E->getBase()); 08646 if (Base.isInvalid()) 08647 return ExprError(); 08648 08649 // We don't need to transform the ivar; it will never change. 08650 08651 // If nothing changed, just retain the existing expression. 08652 if (!getDerived().AlwaysRebuild() && 08653 Base.get() == E->getBase()) 08654 return SemaRef.Owned(E); 08655 08656 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 08657 E->getLocation(), 08658 E->isArrow(), E->isFreeIvar()); 08659 } 08660 08661 template<typename Derived> 08662 ExprResult 08663 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 08664 // 'super' and types never change. Property never changes. Just 08665 // retain the existing expression. 08666 if (!E->isObjectReceiver()) 08667 return SemaRef.Owned(E); 08668 08669 // Transform the base expression. 08670 ExprResult Base = getDerived().TransformExpr(E->getBase()); 08671 if (Base.isInvalid()) 08672 return ExprError(); 08673 08674 // We don't need to transform the property; it will never change. 08675 08676 // If nothing changed, just retain the existing expression. 08677 if (!getDerived().AlwaysRebuild() && 08678 Base.get() == E->getBase()) 08679 return SemaRef.Owned(E); 08680 08681 if (E->isExplicitProperty()) 08682 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 08683 E->getExplicitProperty(), 08684 E->getLocation()); 08685 08686 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 08687 SemaRef.Context.PseudoObjectTy, 08688 E->getImplicitPropertyGetter(), 08689 E->getImplicitPropertySetter(), 08690 E->getLocation()); 08691 } 08692 08693 template<typename Derived> 08694 ExprResult 08695 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 08696 // Transform the base expression. 08697 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 08698 if (Base.isInvalid()) 08699 return ExprError(); 08700 08701 // Transform the key expression. 08702 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 08703 if (Key.isInvalid()) 08704 return ExprError(); 08705 08706 // If nothing changed, just retain the existing expression. 08707 if (!getDerived().AlwaysRebuild() && 08708 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 08709 return SemaRef.Owned(E); 08710 08711 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 08712 Base.get(), Key.get(), 08713 E->getAtIndexMethodDecl(), 08714 E->setAtIndexMethodDecl()); 08715 } 08716 08717 template<typename Derived> 08718 ExprResult 08719 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 08720 // Transform the base expression. 08721 ExprResult Base = getDerived().TransformExpr(E->getBase()); 08722 if (Base.isInvalid()) 08723 return ExprError(); 08724 08725 // If nothing changed, just retain the existing expression. 08726 if (!getDerived().AlwaysRebuild() && 08727 Base.get() == E->getBase()) 08728 return SemaRef.Owned(E); 08729 08730 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 08731 E->isArrow()); 08732 } 08733 08734 template<typename Derived> 08735 ExprResult 08736 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 08737 bool ArgumentChanged = false; 08738 ASTOwningVector<Expr*> SubExprs(SemaRef); 08739 SubExprs.reserve(E->getNumSubExprs()); 08740 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 08741 SubExprs, &ArgumentChanged)) 08742 return ExprError(); 08743 08744 if (!getDerived().AlwaysRebuild() && 08745 !ArgumentChanged) 08746 return SemaRef.Owned(E); 08747 08748 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 08749 move_arg(SubExprs), 08750 E->getRParenLoc()); 08751 } 08752 08753 template<typename Derived> 08754 ExprResult 08755 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 08756 BlockDecl *oldBlock = E->getBlockDecl(); 08757 08758 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0); 08759 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 08760 08761 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 08762 blockScope->TheDecl->setBlockMissingReturnType( 08763 oldBlock->blockMissingReturnType()); 08764 08765 SmallVector<ParmVarDecl*, 4> params; 08766 SmallVector<QualType, 4> paramTypes; 08767 08768 // Parameter substitution. 08769 if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 08770 oldBlock->param_begin(), 08771 oldBlock->param_size(), 08772 0, paramTypes, ¶ms)) { 08773 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 08774 return ExprError(); 08775 } 08776 08777 const FunctionType *exprFunctionType = E->getFunctionType(); 08778 QualType exprResultType = 08779 getDerived().TransformType(exprFunctionType->getResultType()); 08780 08781 // Don't allow returning a objc interface by value. 08782 if (exprResultType->isObjCObjectType()) { 08783 getSema().Diag(E->getCaretLocation(), 08784 diag::err_object_cannot_be_passed_returned_by_value) 08785 << 0 << exprResultType; 08786 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 08787 return ExprError(); 08788 } 08789 08790 QualType functionType = getDerived().RebuildFunctionProtoType( 08791 exprResultType, 08792 paramTypes.data(), 08793 paramTypes.size(), 08794 oldBlock->isVariadic(), 08795 false, 0, RQ_None, 08796 exprFunctionType->getExtInfo()); 08797 blockScope->FunctionType = functionType; 08798 08799 // Set the parameters on the block decl. 08800 if (!params.empty()) 08801 blockScope->TheDecl->setParams(params); 08802 08803 if (!oldBlock->blockMissingReturnType()) { 08804 blockScope->HasImplicitReturnType = false; 08805 blockScope->ReturnType = exprResultType; 08806 } 08807 08808 // Transform the body 08809 StmtResult body = getDerived().TransformStmt(E->getBody()); 08810 if (body.isInvalid()) { 08811 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 08812 return ExprError(); 08813 } 08814 08815 #ifndef NDEBUG 08816 // In builds with assertions, make sure that we captured everything we 08817 // captured before. 08818 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 08819 for (BlockDecl::capture_iterator i = oldBlock->capture_begin(), 08820 e = oldBlock->capture_end(); i != e; ++i) { 08821 VarDecl *oldCapture = i->getVariable(); 08822 08823 // Ignore parameter packs. 08824 if (isa<ParmVarDecl>(oldCapture) && 08825 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 08826 continue; 08827 08828 VarDecl *newCapture = 08829 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 08830 oldCapture)); 08831 assert(blockScope->CaptureMap.count(newCapture)); 08832 } 08833 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 08834 } 08835 #endif 08836 08837 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 08838 /*Scope=*/0); 08839 } 08840 08841 template<typename Derived> 08842 ExprResult 08843 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 08844 llvm_unreachable("Cannot transform asType expressions yet"); 08845 } 08846 08847 template<typename Derived> 08848 ExprResult 08849 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 08850 QualType RetTy = getDerived().TransformType(E->getType()); 08851 bool ArgumentChanged = false; 08852 ASTOwningVector<Expr*> SubExprs(SemaRef); 08853 SubExprs.reserve(E->getNumSubExprs()); 08854 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 08855 SubExprs, &ArgumentChanged)) 08856 return ExprError(); 08857 08858 if (!getDerived().AlwaysRebuild() && 08859 !ArgumentChanged) 08860 return SemaRef.Owned(E); 08861 08862 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), move_arg(SubExprs), 08863 RetTy, E->getOp(), E->getRParenLoc()); 08864 } 08865 08866 //===----------------------------------------------------------------------===// 08867 // Type reconstruction 08868 //===----------------------------------------------------------------------===// 08869 08870 template<typename Derived> 08871 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 08872 SourceLocation Star) { 08873 return SemaRef.BuildPointerType(PointeeType, Star, 08874 getDerived().getBaseEntity()); 08875 } 08876 08877 template<typename Derived> 08878 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 08879 SourceLocation Star) { 08880 return SemaRef.BuildBlockPointerType(PointeeType, Star, 08881 getDerived().getBaseEntity()); 08882 } 08883 08884 template<typename Derived> 08885 QualType 08886 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 08887 bool WrittenAsLValue, 08888 SourceLocation Sigil) { 08889 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 08890 Sigil, getDerived().getBaseEntity()); 08891 } 08892 08893 template<typename Derived> 08894 QualType 08895 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 08896 QualType ClassType, 08897 SourceLocation Sigil) { 08898 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 08899 Sigil, getDerived().getBaseEntity()); 08900 } 08901 08902 template<typename Derived> 08903 QualType 08904 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 08905 ArrayType::ArraySizeModifier SizeMod, 08906 const llvm::APInt *Size, 08907 Expr *SizeExpr, 08908 unsigned IndexTypeQuals, 08909 SourceRange BracketsRange) { 08910 if (SizeExpr || !Size) 08911 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 08912 IndexTypeQuals, BracketsRange, 08913 getDerived().getBaseEntity()); 08914 08915 QualType Types[] = { 08916 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 08917 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 08918 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 08919 }; 08920 const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 08921 QualType SizeType; 08922 for (unsigned I = 0; I != NumTypes; ++I) 08923 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 08924 SizeType = Types[I]; 08925 break; 08926 } 08927 08928 // Note that we can return a VariableArrayType here in the case where 08929 // the element type was a dependent VariableArrayType. 08930 IntegerLiteral *ArraySize 08931 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 08932 /*FIXME*/BracketsRange.getBegin()); 08933 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 08934 IndexTypeQuals, BracketsRange, 08935 getDerived().getBaseEntity()); 08936 } 08937 08938 template<typename Derived> 08939 QualType 08940 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 08941 ArrayType::ArraySizeModifier SizeMod, 08942 const llvm::APInt &Size, 08943 unsigned IndexTypeQuals, 08944 SourceRange BracketsRange) { 08945 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 08946 IndexTypeQuals, BracketsRange); 08947 } 08948 08949 template<typename Derived> 08950 QualType 08951 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 08952 ArrayType::ArraySizeModifier SizeMod, 08953 unsigned IndexTypeQuals, 08954 SourceRange BracketsRange) { 08955 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 08956 IndexTypeQuals, BracketsRange); 08957 } 08958 08959 template<typename Derived> 08960 QualType 08961 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 08962 ArrayType::ArraySizeModifier SizeMod, 08963 Expr *SizeExpr, 08964 unsigned IndexTypeQuals, 08965 SourceRange BracketsRange) { 08966 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 08967 SizeExpr, 08968 IndexTypeQuals, BracketsRange); 08969 } 08970 08971 template<typename Derived> 08972 QualType 08973 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 08974 ArrayType::ArraySizeModifier SizeMod, 08975 Expr *SizeExpr, 08976 unsigned IndexTypeQuals, 08977 SourceRange BracketsRange) { 08978 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 08979 SizeExpr, 08980 IndexTypeQuals, BracketsRange); 08981 } 08982 08983 template<typename Derived> 08984 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 08985 unsigned NumElements, 08986 VectorType::VectorKind VecKind) { 08987 // FIXME: semantic checking! 08988 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 08989 } 08990 08991 template<typename Derived> 08992 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 08993 unsigned NumElements, 08994 SourceLocation AttributeLoc) { 08995 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 08996 NumElements, true); 08997 IntegerLiteral *VectorSize 08998 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 08999 AttributeLoc); 09000 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 09001 } 09002 09003 template<typename Derived> 09004 QualType 09005 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 09006 Expr *SizeExpr, 09007 SourceLocation AttributeLoc) { 09008 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 09009 } 09010 09011 template<typename Derived> 09012 QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 09013 QualType *ParamTypes, 09014 unsigned NumParamTypes, 09015 bool Variadic, 09016 bool HasTrailingReturn, 09017 unsigned Quals, 09018 RefQualifierKind RefQualifier, 09019 const FunctionType::ExtInfo &Info) { 09020 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 09021 HasTrailingReturn, Quals, RefQualifier, 09022 getDerived().getBaseLocation(), 09023 getDerived().getBaseEntity(), 09024 Info); 09025 } 09026 09027 template<typename Derived> 09028 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 09029 return SemaRef.Context.getFunctionNoProtoType(T); 09030 } 09031 09032 template<typename Derived> 09033 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 09034 assert(D && "no decl found"); 09035 if (D->isInvalidDecl()) return QualType(); 09036 09037 // FIXME: Doesn't account for ObjCInterfaceDecl! 09038 TypeDecl *Ty; 09039 if (isa<UsingDecl>(D)) { 09040 UsingDecl *Using = cast<UsingDecl>(D); 09041 assert(Using->isTypeName() && 09042 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 09043 09044 // A valid resolved using typename decl points to exactly one type decl. 09045 assert(++Using->shadow_begin() == Using->shadow_end()); 09046 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 09047 09048 } else { 09049 assert(isa<UnresolvedUsingTypenameDecl>(D) && 09050 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 09051 Ty = cast<UnresolvedUsingTypenameDecl>(D); 09052 } 09053 09054 return SemaRef.Context.getTypeDeclType(Ty); 09055 } 09056 09057 template<typename Derived> 09058 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 09059 SourceLocation Loc) { 09060 return SemaRef.BuildTypeofExprType(E, Loc); 09061 } 09062 09063 template<typename Derived> 09064 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 09065 return SemaRef.Context.getTypeOfType(Underlying); 09066 } 09067 09068 template<typename Derived> 09069 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 09070 SourceLocation Loc) { 09071 return SemaRef.BuildDecltypeType(E, Loc); 09072 } 09073 09074 template<typename Derived> 09075 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 09076 UnaryTransformType::UTTKind UKind, 09077 SourceLocation Loc) { 09078 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 09079 } 09080 09081 template<typename Derived> 09082 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 09083 TemplateName Template, 09084 SourceLocation TemplateNameLoc, 09085 TemplateArgumentListInfo &TemplateArgs) { 09086 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 09087 } 09088 09089 template<typename Derived> 09090 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 09091 SourceLocation KWLoc) { 09092 return SemaRef.BuildAtomicType(ValueType, KWLoc); 09093 } 09094 09095 template<typename Derived> 09096 TemplateName 09097 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 09098 bool TemplateKW, 09099 TemplateDecl *Template) { 09100 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 09101 Template); 09102 } 09103 09104 template<typename Derived> 09105 TemplateName 09106 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 09107 const IdentifierInfo &Name, 09108 SourceLocation NameLoc, 09109 QualType ObjectType, 09110 NamedDecl *FirstQualifierInScope) { 09111 UnqualifiedId TemplateName; 09112 TemplateName.setIdentifier(&Name, NameLoc); 09113 Sema::TemplateTy Template; 09114 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 09115 getSema().ActOnDependentTemplateName(/*Scope=*/0, 09116 SS, TemplateKWLoc, TemplateName, 09117 ParsedType::make(ObjectType), 09118 /*EnteringContext=*/false, 09119 Template); 09120 return Template.get(); 09121 } 09122 09123 template<typename Derived> 09124 TemplateName 09125 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 09126 OverloadedOperatorKind Operator, 09127 SourceLocation NameLoc, 09128 QualType ObjectType) { 09129 UnqualifiedId Name; 09130 // FIXME: Bogus location information. 09131 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 09132 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 09133 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 09134 Sema::TemplateTy Template; 09135 getSema().ActOnDependentTemplateName(/*Scope=*/0, 09136 SS, TemplateKWLoc, Name, 09137 ParsedType::make(ObjectType), 09138 /*EnteringContext=*/false, 09139 Template); 09140 return Template.template getAsVal<TemplateName>(); 09141 } 09142 09143 template<typename Derived> 09144 ExprResult 09145 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 09146 SourceLocation OpLoc, 09147 Expr *OrigCallee, 09148 Expr *First, 09149 Expr *Second) { 09150 Expr *Callee = OrigCallee->IgnoreParenCasts(); 09151 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 09152 09153 // Determine whether this should be a builtin operation. 09154 if (Op == OO_Subscript) { 09155 if (!First->getType()->isOverloadableType() && 09156 !Second->getType()->isOverloadableType()) 09157 return getSema().CreateBuiltinArraySubscriptExpr(First, 09158 Callee->getLocStart(), 09159 Second, OpLoc); 09160 } else if (Op == OO_Arrow) { 09161 // -> is never a builtin operation. 09162 return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc); 09163 } else if (Second == 0 || isPostIncDec) { 09164 if (!First->getType()->isOverloadableType()) { 09165 // The argument is not of overloadable type, so try to create a 09166 // built-in unary operation. 09167 UnaryOperatorKind Opc 09168 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 09169 09170 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 09171 } 09172 } else { 09173 if (!First->getType()->isOverloadableType() && 09174 !Second->getType()->isOverloadableType()) { 09175 // Neither of the arguments is an overloadable type, so try to 09176 // create a built-in binary operation. 09177 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 09178 ExprResult Result 09179 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 09180 if (Result.isInvalid()) 09181 return ExprError(); 09182 09183 return move(Result); 09184 } 09185 } 09186 09187 // Compute the transformed set of functions (and function templates) to be 09188 // used during overload resolution. 09189 UnresolvedSet<16> Functions; 09190 09191 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 09192 assert(ULE->requiresADL()); 09193 09194 // FIXME: Do we have to check 09195 // IsAcceptableNonMemberOperatorCandidate for each of these? 09196 Functions.append(ULE->decls_begin(), ULE->decls_end()); 09197 } else { 09198 Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl()); 09199 } 09200 09201 // Add any functions found via argument-dependent lookup. 09202 Expr *Args[2] = { First, Second }; 09203 unsigned NumArgs = 1 + (Second != 0); 09204 09205 // Create the overloaded operator invocation for unary operators. 09206 if (NumArgs == 1 || isPostIncDec) { 09207 UnaryOperatorKind Opc 09208 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 09209 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 09210 } 09211 09212 if (Op == OO_Subscript) { 09213 SourceLocation LBrace; 09214 SourceLocation RBrace; 09215 09216 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 09217 DeclarationNameLoc &NameLoc = DRE->getNameInfo().getInfo(); 09218 LBrace = SourceLocation::getFromRawEncoding( 09219 NameLoc.CXXOperatorName.BeginOpNameLoc); 09220 RBrace = SourceLocation::getFromRawEncoding( 09221 NameLoc.CXXOperatorName.EndOpNameLoc); 09222 } else { 09223 LBrace = Callee->getLocStart(); 09224 RBrace = OpLoc; 09225 } 09226 09227 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 09228 First, Second); 09229 } 09230 09231 // Create the overloaded operator invocation for binary operators. 09232 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 09233 ExprResult Result 09234 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 09235 if (Result.isInvalid()) 09236 return ExprError(); 09237 09238 return move(Result); 09239 } 09240 09241 template<typename Derived> 09242 ExprResult 09243 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 09244 SourceLocation OperatorLoc, 09245 bool isArrow, 09246 CXXScopeSpec &SS, 09247 TypeSourceInfo *ScopeType, 09248 SourceLocation CCLoc, 09249 SourceLocation TildeLoc, 09250 PseudoDestructorTypeStorage Destroyed) { 09251 QualType BaseType = Base->getType(); 09252 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 09253 (!isArrow && !BaseType->getAs<RecordType>()) || 09254 (isArrow && BaseType->getAs<PointerType>() && 09255 !BaseType->getAs<PointerType>()->getPointeeType() 09256 ->template getAs<RecordType>())){ 09257 // This pseudo-destructor expression is still a pseudo-destructor. 09258 return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc, 09259 isArrow? tok::arrow : tok::period, 09260 SS, ScopeType, CCLoc, TildeLoc, 09261 Destroyed, 09262 /*FIXME?*/true); 09263 } 09264 09265 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 09266 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 09267 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 09268 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 09269 NameInfo.setNamedTypeInfo(DestroyedType); 09270 09271 // The scope type is now known to be a valid nested name specifier 09272 // component. Tack it on to the end of the nested name specifier. 09273 if (ScopeType) 09274 SS.Extend(SemaRef.Context, SourceLocation(), 09275 ScopeType->getTypeLoc(), CCLoc); 09276 09277 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 09278 return getSema().BuildMemberReferenceExpr(Base, BaseType, 09279 OperatorLoc, isArrow, 09280 SS, TemplateKWLoc, 09281 /*FIXME: FirstQualifier*/ 0, 09282 NameInfo, 09283 /*TemplateArgs*/ 0); 09284 } 09285 09286 } // end namespace clang 09287 09288 #endif // LLVM_CLANG_SEMA_TREETRANSFORM_H