TreeTransform.h revision 85737a71fee8c737f7cfba79a0aca89298fe573b
1a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall//===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/ 2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// The LLVM Compiler Infrastructure 4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source 6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details. 7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/ 8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file implements a semantic tree transformation that takes a given 10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// AST and rebuilds it, possibly transforming some nodes in the process. 11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/ 13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H 14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H 15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "Sema.h" 17dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h" 18c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h" 19657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h" 20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h" 21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h" 2243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h" 2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h" 2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h" 25a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h" 26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h" 27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h" 28b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h" 29a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h" 30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm> 31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang { 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one 35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another. 36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of 381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template 40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the 41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the 42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar 43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and 44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters. 45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow 471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can 48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an 49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The 50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual. 51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which 53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node 54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions, 55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST 56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation 57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g., 58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes 59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create 60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node. 61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The 63670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(), 64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely 66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations. 67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the 69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 7043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template 73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX 74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change. 75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild 76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may 77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps. 78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation 81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the 83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking 84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()). 85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform { 87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected: 88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &SemaRef; 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningStmtResult OwningStmtResult; 92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::StmtArg StmtArg; 94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::ExprArg ExprArg; 95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::MultiExprArg MultiExprArg; 9643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor typedef Sema::MultiStmtArg MultiStmtArg; 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Initializes a new tree transformer. 99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Derived &getDerived() { return static_cast<Derived&>(*this); } 103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Derived &getDerived() const { 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return static_cast<const Derived&>(*this); 107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the semantic analysis object used for 110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this tree transform. 111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &getSema() const { return SemaRef; } 1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Whether the transformation should always rebuild AST nodes, even 114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// if none of the children have changed. 115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function to specify when the transformation 117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// should rebuild all AST nodes. 118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlwaysRebuild() { return false; } 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the location of the entity being transformed, if that 121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, returns no source-location information. Subclasses can 124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// provide an alternative implementation that provides better location 125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information. 126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation getBaseLocation() { return SourceLocation(); } 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the name of the entity being transformed, if that 129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns an empty name. Subclasses can provide an alternative 132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// implementation with a more precise name. 133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor DeclarationName getBaseEntity() { return DeclarationName(); } 134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Sets the "base" location and entity when that 136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// information is known based on another transformation. 137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, the source location and entity are ignored. Subclasses can 139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// override this function to provide a customized implementation. 140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor void setBase(SourceLocation Loc, DeclarationName Entity) { } 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief RAII object that temporarily sets the base location and entity 143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// used for reporting diagnostics in types. 144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor class TemporaryBase { 145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TreeTransform &Self; 146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OldLocation; 147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OldEntity; 1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor public: 150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase(TreeTransform &Self, SourceLocation Location, 1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Entity) : Self(Self) { 152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldLocation = Self.getDerived().getBaseLocation(); 153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldEntity = Self.getDerived().getBaseEntity(); 154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(Location, Entity); 155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ~TemporaryBase() { 158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(OldLocation, OldEntity); 159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor }; 1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determine whether the given type \p T has already been 163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformed. 164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses can provide an alternative implementation of this routine 1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// to short-circuit evaluation when it is known that a given type will 167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not change. For example, template instantiation need not traverse 168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// non-dependent types. 169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlreadyTransformed(QualType T) { 170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.isNull(); 171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by creating a 176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// DeclaratorInfo for it and delegating to the appropriate 177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// function. This is expensive, but we don't mind, because 178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// this method is deprecated anyway; all users should be 179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// switched to storing DeclaratorInfos. 180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType TransformType(QualType T); 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transforms the given type-with-location into a new 185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type-with-location. 186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// 187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// By default, this routine transforms a type by delegating to the 188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// appropriate TransformXXXType to build a new type. Subclasses 189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// may override this function (to take over all type 190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// transformations) or some set of the TransformXXXType functions 191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// to alter the transformation. 192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *TransformType(DeclaratorInfo *DI); 193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Transform the given type-with-location into a new 195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// type, collecting location information in the given builder 196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// as necessary. 197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 200657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this routine transforms a statement by delegating to the 20343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 20443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 20543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 20643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 20743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 20843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 211657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 212657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E) { 220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false); 221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Transform the given expression. 224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand); 2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Decl *TransformDecl(Decl *D) { return D; } 23943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 24043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, invokes TransformDecl() to transform the declaration. 24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 24443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); } 2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2466cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// \brief Transform the given declaration, which was the first part of a 2476cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// nested-name-specifier in a member access expression. 2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// This specific declaration transformation only applies to the first 2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// identifier in a nested-name-specifier of a member access expression, e.g., 2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// the \c T in \c x->T::member 2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// 2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// By default, invokes TransformDecl() to transform the declaration. 2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor /// Subclasses may override this function to provide alternate behavior. 2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor return cast_or_null<NamedDecl>(getDerived().TransformDecl(D)); 2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor } 2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor 259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, transforms all of the types and declarations within the 262dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 265a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 266c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 267c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 27081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName TransformDeclarationName(DeclarationName Name, 276dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 277dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType = QualType()); 2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 281d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and nested-name-specifiers that occur within the template name. 283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 2853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType = QualType()); 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 291670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 292670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 293833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// 294833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// Returns true if there was an error. 295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output); 297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall void InventTemplateArgumentLoc(const TemplateArgument &Arg, 300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &ArgLoc); 301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /// \brief Fakes up a DeclaratorInfo for a type. 303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DeclaratorInfo *InventDeclaratorInfo(QualType T) { 304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.Context.getTrivialDeclaratorInfo(T, 305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().getBaseLocation()); 306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 3071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 31385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 31485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 315dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType 316dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TransformTemplateSpecializationType(const TemplateSpecializationType *T, 317dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType); 318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType 320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransformTemplateSpecializationType(TypeLocBuilder &TLB, 321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType); 323dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 32443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 32743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Transform##Node(Node *E); 330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 33785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 34385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 34585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \brief Build a new reference type given the type it references. 346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 34785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// By default, performs semantic analysis when building the 34885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// reference type. Subclasses may override this routine to provide 34985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// different behavior. 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 35185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// \param LValue whether the type was written with an lvalue sigil 35285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall /// or an rvalue sigil. 35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildReferenceType(QualType ReferentType, 35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool LValue, 35585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new Objective C object pointer type. 36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType RebuildObjCObjectPointerType(QualType PointeeType, 36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil); 368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 39185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 39285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 40185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 40285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange); 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4767da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4777da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4787da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4797da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4807da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 4981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateLoc, 506833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation LAngleLoc, 507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *Args, 508833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall unsigned NumArgs, 509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation RAngleLoc); 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 5181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 5231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 5271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getTypenameType(NNS, 528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 539833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const IdentifierInfo *Id, 540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR) { 541833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTypenameType(NNS, *Id, SR); 542dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 551dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 552a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 554c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 574dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 575dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and a set of 589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// overloaded function templates. 590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 593d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 594d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 595d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl); 5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 597d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 598d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 599d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 600d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 601d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 602d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 603d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 604d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 6053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 6063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 6301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 6501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 6701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StmtArg Then, SourceLocation ElseLoc, 67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Else) { 67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else)); 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) { 68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnStartOfSwitchStmt(move(Cond)); 68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body)); 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 7121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Init, ExprArg Cond, ExprArg Inc, 72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond), 72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Inc), RParenLoc, move(Body)); 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclaratorInfo *Declarator, 77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 7931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 811a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 812a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 813a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NamedDecl *ND, SourceLocation Loc) { 814a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 815a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 816a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 819a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor &SS, 820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 832a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 834a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 835a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 836a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 837a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 838a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 839a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 840a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 841a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 842a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 843a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 844a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 845a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 846a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 847a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 848a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 850a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OperatorLoc, 855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor isArrow? tok::arrow : tok::period, 856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedTypeLoc, 857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Name, 858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Sema::DeclPtrTy::make((Decl *)0), 859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor &SS); 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr)); 870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc, 877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R); 879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 8931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 8991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 92983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 93083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 93183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member) { 933d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 934d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 935d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 9361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 938d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 939d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 940d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 941d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 942d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 94483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 94583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 94683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 94783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 94883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 94983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 950017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 953017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Member->getDeclName(), 95483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 95583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor &SS); 956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 9591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 9661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(), 967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)RHS.get()); 968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 9701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.release(); 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.release(); 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (getSema().Context) ImplicitCastExpr(T, Kind, 997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 10181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 10331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Accessor, 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBraceLoc) { 1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 10541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 11031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 11521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 11821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 11831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 11871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 11881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 11911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 11941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 11961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 12651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 127888650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 128288650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 13151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 13161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1342f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 13541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 13551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ conditional declaration expression. 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqLoc, 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var) { 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EqLoc, 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var)); 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 13881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 14231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS, 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 14401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1452f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier, 1453f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor SourceRange QualifierRange, 1454f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor TemplateName Template, 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TemplateLoc, 1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *TemplateArgs, 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumTemplateArgs, 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc) { 1460f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange, 1461f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Template, TemplateLoc, 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgs, NumTemplateArgs, 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc); 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1475ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1476ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson SourceLocation(), 1477ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson T, Constructor, IsElidable, 1478f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson move(Args)); 1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15220dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1525a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1526a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1528c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1529c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 15300dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1532a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1534a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1535a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1539017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor MemberLoc, 1540017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Name, 1541a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1542c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor &SS, 1543c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 15463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Build a new member reference expression with explicit template 15473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// arguments. 15483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow, 15533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 15543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NestedNameSpecifier *Qualifier, 15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceRange QualifierRange, 15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template, 15573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation TemplateNameLoc, 15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierInScope, 15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation LAngleLoc, 1560833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *TemplateArgs, 15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor unsigned NumTemplateArgs, 15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation RAngleLoc) { 15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult Base = move(BaseE); 15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 15651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: We're going to end up looking up the template based on its name, 15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr. 15723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor DeclarationName Name; 15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 15743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = ActualTemplate->getDeclName(); 15751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (OverloadedFunctionDecl *Ovl 15763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = Template.getAsOverloadedFunctionDecl()) 15773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Ovl->getDeclName(); 15783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor else 15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Template.getAsDependentTemplateName()->getName(); 15801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 15823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OperatorLoc, OpKind, 15833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateNameLoc, Name, true, 15843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor LAngleLoc, TemplateArgs, 15853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NumTemplateArgs, RAngleLoc, 15863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Sema::DeclPtrTy(), &SS); 15873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 15981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 16141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 16161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 16251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BuiltinLoc, false, false); 1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 166043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 166343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 166943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 167243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 167543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 167843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned(E.takeAs<Stmt>()); 168143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1688670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1703657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1704657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1705657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1708a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1709c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1710c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 17110979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 17120979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 17131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 171443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1716dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 17171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1719c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1724c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1725a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1726c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1732a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1733a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1734a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1738a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1739c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1740c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1744dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1754dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1761fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName()); 1762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1763d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1764d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1769dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1773dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1774dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1779dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1780dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1781dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 17821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1784dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1785dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 178681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 178981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 179381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 179581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 179681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 179881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 179981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 180081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 180181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1802dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType T; 1803dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor if (!ObjectType.isNull() && 1804dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1805dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TemplateSpecializationType *SpecType 1806dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1807dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = TransformTemplateSpecializationType(SpecType, ObjectType); 1808dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor } else 1809dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = getDerived().TransformType(Name.getCXXNameType()); 181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 18121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 18141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 181581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 181681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 18181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 182081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 182181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 182281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 18231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 18243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 18253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1826d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 18271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1852d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl); 1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1872dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1873dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType); 1877d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1882d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1883d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1885d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1886d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1887d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1889d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1890d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1892d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1893d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 18941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1895d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1896d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1899d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1901d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 19021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1903d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransOvl); 1904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1905d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1906d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc( 1908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg, 1909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation Loc = getDerived().getBaseLocation(); 1911670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1912670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::llvm_unreachable("null template argument in TreeTransform"); 1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1916833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 1917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, 1918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc)); 1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 1924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 1927670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1928833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 1929828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall break; 1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 1935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument( 1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc &Input, 1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc &Output) { 1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &Arg = Input.getArgument(); 1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 1941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 1942833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = Input; 1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1945670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DeclaratorInfo *DI = Input.getSourceDeclaratorInfo(); 1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (DI == NULL) 1948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = InventDeclaratorInfo(Input.getArgument().getAsType()); 1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall DI = getDerived().TransformType(DI); 1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!DI) return true; 1952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1953833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 1954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1955670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1957670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: we should never have to transform one of these. 1959972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor DeclarationName Name; 1960972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl())) 1961972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor Name = ND->getDeclName(); 1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemporaryBase Rebase(*this, SourceLocation(), Name); 1963670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1964833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!D) return true; 1965833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1966828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Expr *SourceExpr = Input.getSourceDeclExpression(); 1967828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (SourceExpr) { 1968828bff2079b6a91ecd7ed5b842c59527d7682789John McCall EnterExpressionEvaluationContext Unevaluated(getSema(), 1969828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Action::Unevaluated); 1970828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr); 1971828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (E.isInvalid()) 1972828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = NULL; 1973828bff2079b6a91ecd7ed5b842c59527d7682789John McCall else { 1974828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr = E.takeAs<Expr>(); 1975828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceExpr->Retain(); 1976828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1977828bff2079b6a91ecd7ed5b842c59527d7682789John McCall } 1978828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 1979828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr); 1980833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1981670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1983670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1984670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 19851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 1986670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *InputExpr = Input.getSourceExpression(); 1989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 1990833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1991833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Sema::OwningExprResult E 1992833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformExpr(InputExpr); 1993833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (E.isInvalid()) return true; 1994833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 1995833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Expr *ETaken = E.takeAs<Expr>(); 1996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall ETaken->Retain(); 1997833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken); 1998833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 1999670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2001670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 2002670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 2003670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 20041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 2005670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 2006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: preserve source information here when we start 2009833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // caring about parameter packs. 2010833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2011828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc InputArg; 2012828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TemplateArgumentLoc OutputArg; 2013828bff2079b6a91ecd7ed5b842c59527d7682789John McCall getDerived().InventTemplateArgumentLoc(*A, InputArg); 2014828bff2079b6a91ecd7ed5b842c59527d7682789John McCall if (getDerived().TransformTemplateArgument(InputArg, OutputArg)) 2015833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2017828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TransformedArgs.push_back(OutputArg.getArgument()); 2018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2019670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 20201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 2021670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 2022828bff2079b6a91ecd7ed5b842c59527d7682789John McCall Output = TemplateArgumentLoc(Result, Input.getLocInfo()); 2023833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 2024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 2025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2027670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 2028833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 2029670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 2030670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 2042a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T); 20434802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 2044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2045a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(DI); 20461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) { 2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 20571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 20591bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 2061a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, TL); 2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TLB.getDeclaratorInfo(SemaRef.Context, Result); 2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 2076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::llvm_unreachable("unhandled type loc!"); 2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 20901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 20911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedTypeLoc T) { 2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Qualifiers Quals = T.getType().getQualifiers(); 2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 21051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 213385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType, \ 213485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); \ 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BuiltinTypeLoc T) { 2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB, 2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FixedWidthIntTypeLoc T) { 2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ComplexTypeLoc T) { 2161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointerTypeLoc TL) { 2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BlockPointerTypeLoc TL) { 2175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 217885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type. Note that somewhat paradoxically we 217985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value 218085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type; we only care if the type was *written* as an l-value type 218185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type. 218285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived> 218385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType 218485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 218585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc TL) { 218685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall const ReferenceType *T = TL.getTypePtr(); 218785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // Note that this works with the pointee-as-written. 218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (PointeeType.isNull()) 219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType Result = TL.getType(); 219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (getDerived().AlwaysRebuild() || 219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall PointeeType != T->getPointeeTypeAsWritten()) { 219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildReferenceType(PointeeType, 219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->isSpelledAsLValue(), 219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getSigilLoc()); 219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (Result.isNull()) 220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return QualType(); 220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall } 220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall // r-value references can be rebuilt as l-value references. 220485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall ReferenceTypeLoc NewTL; 220585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall if (isa<LValueReferenceType>(Result)) 220685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 220785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall else 220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 220985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 221085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return Result; 221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall} 221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall 2214a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2215a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2216a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2217a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall LValueReferenceTypeLoc TL) { 221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2219a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 22201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2221a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2222a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2223a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RValueReferenceTypeLoc TL) { 222585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return TransformReferenceType(TLB, TL); 2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2230a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2231a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc TL) { 2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 224885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType, 224985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getStarLoc()); 2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2251a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2252a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 22601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc TL) { 2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 227585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 227685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 22841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc TL) { 2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 230985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall T->getIndexTypeCVRQualifiers(), 231085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc TL) { 2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2332670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2333670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2334670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 235085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayTypeLoc TL) { 2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2373670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2374670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 23751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 239185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall TL.getBracketsRange()); 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc TL) { 2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2418670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2419670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2420670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2427eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2428eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc TL) { 2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc TL) { 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 24921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 24961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc TL) { 2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Transform the parameters. 2506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 2508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo(); 2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall assert(OldDI->getType() == T->getArgType(i)); 2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(OldDI); 2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewDI == OldDI) 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = OldParm; 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else 2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = ParmVarDecl::Create(SemaRef.Context, 2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getDeclContext(), 2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getLocation(), 2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getIdentifier(), 2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI->getType(), 2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI, 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getStorageClass(), 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* DefArg */ NULL); 2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.push_back(NewType); 2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamDecls.push_back(NewParm); 2548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 25491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc TL) { 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2590a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc TL) { 2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc TL) { 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprType *T = TL.getTypePtr(); 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2621670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2622670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 26361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc TL) { 2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfType *T = TL.getTypePtr(); 2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: should be an inner type, or at least have a DeclaratorInfo. 2649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 2651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfType(Underlying); 2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2662a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc TL) { 2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2672670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2673670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 26741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2692577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2694577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc TL) { 2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 27101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc TL) { 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27397da2431c23ef1ee8acb114e39692246e1801afc2John McCall 27407da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc TL) { 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 27467da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 27477da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 27487da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 27491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 27601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 27627da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 27631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateTypeParmTypeLoc TL) { 2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2770577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2771577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 27721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 277349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall SubstTemplateTypeParmTypeLoc TL) { 2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 277749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 277849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 277949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2780dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType 2781dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType( 2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc TL) { 2784833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(TLB, TL, QualType()); 2785833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2787833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived> 2788833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2789833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *TST, 2790833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2791833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: this entire method is a temporary workaround; callers 2792833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // should be rewritten to provide real type locs. 2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2794833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Fake up a TemplateSpecializationTypeLoc. 2795833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder TLB; 2796833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL 2797833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0)); 2798833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2799828bff2079b6a91ecd7ed5b842c59527d7682789John McCall SourceLocation BaseLoc = getDerived().getBaseLocation(); 2800828bff2079b6a91ecd7ed5b842c59527d7682789John McCall 2801828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setTemplateNameLoc(BaseLoc); 2802828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setLAngleLoc(BaseLoc); 2803828bff2079b6a91ecd7ed5b842c59527d7682789John McCall TL.setRAngleLoc(BaseLoc); 2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgument &TA = TST->getArg(i); 2806833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc TAL; 2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().InventTemplateArgumentLoc(TA, TAL); 2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.setArgLocInfo(i, TAL.getLocInfo()); 2809833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 2810833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2811833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder IgnoredTLB; 2812833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType); 2813dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2814dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2815dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2817833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TypeLocBuilder &TLB, 2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc TL, 2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType ObjectType) { 2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateSpecializationType *T = TL.getTypePtr(); 2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 28221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2823dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2827833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> NewTemplateArgs(T->getNumArgs()); 2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) 2829833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), 2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTemplateArgs[i])) 2831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // FIXME: maybe don't rebuild if all the template arguments are the same. 2834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2835833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall QualType Result = 2836833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall getDerived().RebuildTemplateSpecializationType(Template, 2837833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getTemplateNameLoc(), 2838833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getLAngleLoc(), 2839833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTemplateArgs.data(), 2840833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTemplateArgs.size(), 2841833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TL.getRAngleLoc()); 28421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2843833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (!Result.isNull()) { 2844833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateSpecializationTypeLoc NewTL 2845833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2846833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 2847833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setLAngleLoc(TL.getLAngleLoc()); 2848833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setRAngleLoc(TL.getRAngleLoc()); 2849833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 2850833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 28521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2853833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Result; 2854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2857a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2858a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc TL) { 2860a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2862577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2863577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2864577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2865577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2869577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2880a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2881a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc TL) { 2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 2890833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2891833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall /* FIXME: preserve source information better than this */ 2892833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceRange SR(TL.getNameLoc()); 2893833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 2894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2895833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR); 2896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 28981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2901577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 29021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2904577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 29061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2907577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 29111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 2913a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR); 2915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2916a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2918a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2919a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 2920a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2926a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCInterfaceTypeLoc TL) { 292954e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 293054e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 2931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCObjectPointerTypeLoc TL) { 293754e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 293854e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 293924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 294024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 294243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 294343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 294443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 294543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 294843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 294943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 295043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 295143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 295243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 295343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 295443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 295543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 295643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 295943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 296543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 29671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 297043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 29711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 29741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 29811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // The case value expressions are not potentially evaluated. 298643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 29871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the left-hand case value. 298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult LHS = getDerived().TransformExpr(S->getLHS()); 299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (LHS.isInvalid()) 299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the right-hand case value (for the GNU case-range extension). 299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult RHS = getDerived().TransformExpr(S->getRHS()); 299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (RHS.isInvalid()) 299643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 299943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 300143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 300243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 300343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 300443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 300543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 300643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 300743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 301043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 301143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 301243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 301543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 30451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 30461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 304843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 30531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 306443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 306643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 30681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 30691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then), 30711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 307243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 307443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 307943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond)); 308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 309543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 309843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 310243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 31061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 310943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 311043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 311243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 311343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 311443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body)); 311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 312243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 312543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 314743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 315343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 315443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 315743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 315943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 316243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 316743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 317043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 31711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 317343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 317443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Init), move(Cond), move(Inc), 317543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 317743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 31791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 31801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 31821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 31951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 32041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 32101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 321143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 321443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 321643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 321743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 321843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 321943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 32201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 322143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 322243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 322343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 322643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 32381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 32411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 32431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 324743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 325043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 32531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 325443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 325643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 326043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 326343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 326643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 32701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 327443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 327743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 327843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 32861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 32911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 32941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 329543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 330643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 331543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 331643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 331743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 331843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 331943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 332143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 332243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclaratorInfo(), 333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 333543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 334143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 335443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 33551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 33661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 33751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 33791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 33831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 33871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 33901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 33921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 33961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 33971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 33991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 34011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 3405a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3406a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3407a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3408a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor E->getQualifierRange()); 3409a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3410a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3411a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3412a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 34131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *ND 3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3418a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3419a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3420a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3421a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor !E->hasExplicitTemplateArgumentList()) 34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3424a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: We're losing the explicit template arguments in this transformation. 3425a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3426833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 3427a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3428833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 3429833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 3430a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3431a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3432a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3433a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: Pass the qualifier/qualifier range along. 3434a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3435a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND, E->getLocation()); 3436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 34411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 34431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 34591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 34651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 3471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 34761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 34901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 35015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getOperatorLoc(), DeclarationName()); 35025557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 3503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getArgumentType()); 3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getArgumentType()) 3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(), 35111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 35161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 35211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 35781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 35991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 360583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 36061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 360783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 360883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3609c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 361083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 361183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 36121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *Member 3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 362083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member == E->getMemberDecl()) 36221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 363083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 363183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Member); 3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 36381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 36451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 36571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 36631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CompoundAssignOperator *E) { 3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformBinaryOperator(E); 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 36721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 369247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 36931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 369447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 36991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 37001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 37015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 37025557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 37035557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have type information here? It seems like we won't, 37045557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // so do we even need to transform the type? 3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 37161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 37251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 37271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 37321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 37391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 37901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 37971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 38091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 38111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 38231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBraceLoc()); 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 38311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 383443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 383943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 38661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 38791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 39001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ImplicitValueInitExpr *E) { 39015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 39025557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor 39035557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // FIXME: Will we ever have proper type location here? Will we actually 39045557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor // need to transform the type? 3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 39111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 3920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 39211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 39691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 39921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 39971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 40101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 40181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 40441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 40451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 40691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 40701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 40811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCallExpr(E); 4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 40911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 40941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 41071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 41101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 41271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 41281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 41341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 41411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXReinterpretCastExpr *E) { 4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 41471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXFunctionalCastExpr *E) { 4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 41581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 41711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 4176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 41841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 41871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 42051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 42071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 42141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 42231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 42241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXNullPtrLiteralExpr *E) { 42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 42391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 42531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 42601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 42671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 42911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) { 43021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *Var 430343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl())); 4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Var) 4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 43081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Var == E->getVarDecl()) 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getStartLoc(), 4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var); 4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 43181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 434243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 43571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 43761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 43821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4393a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4394a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXPseudoDestructorExpr *E) { 4395a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4396a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4397a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4399a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4400a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4401a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4402a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4403a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 44041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4405a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 4406a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 4407a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 4408a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 4409a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 4410a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4411a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4413a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 4414a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 4415a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 4416a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 4417a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 44181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4419a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4420a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4421a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4422a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 4423a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 4424a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 4425a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4426a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4428a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4429a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr( 44311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnresolvedFunctionNameExpr *E) { 4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // There is no transformation we can apply to an unresolved function name. 44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 44381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 44401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr( 44631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnresolvedDeclRefExpr *E) { 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4465f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4466f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 447181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 447281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 447381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 44741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getDeclName()) 44781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 44791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnresolvedDeclRefExpr(NNS, 4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 44891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) { 4490fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor TemporaryBase Rebase(*this, E->getTemplateNameLoc(), DeclarationName()); 4491fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor 44921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateName(E->getTemplateName()); 4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Template.isNull()) 4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4497f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4498f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (E->getQualifier()) { 4499f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4500f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4501f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (!Qualifier) 4502f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return SemaRef.ExprError(); 4503f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4504f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor 4505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 4508833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // compare template arguments (yet). 45141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: It's possible that we'll find out now that the template name 4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // actually refers to a type, in which case the caller is actually dealing 4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // with a functional cast. Give a reasonable error message! 4518f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(), 4519f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Template, E->getTemplateNameLoc(), 4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLAngleLoc(), 4521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.data(), 4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.size(), 4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRAngleLoc()); 4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 45281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 45431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 45591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 45661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to 45671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the 4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 45831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new 45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the 4585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 4586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 4587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 45901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXExprWithTemporaries *E) { 4591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 4598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 46031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXTemporaryObjectExpr *E) { 4604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 46181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 46281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 46341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 46391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 46531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXUnresolvedConstructExpr *E) { 4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 46741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 46781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 46791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( 46921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXUnresolvedMemberExpr *E) { 4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46986cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Start the member reference and compute the object's type. 4699a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Sema::TypeTy *ObjectType = 0; 47001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4701a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getOperatorLoc(), 4702a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4703a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType); 4704a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (Base.isInvalid()) 4705a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47076cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 47086cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 4709c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 47106cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 47116cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 47126cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 47131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4714a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4715a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4717a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType::getFromOpaquePtr(ObjectType), 4719c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 4720a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4721a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4722a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 4725dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4726dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 472781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 472881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 47291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!E->hasExplicitTemplateArgumentList()) { 47313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 47323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 47333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 47343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Base.get() == E->getBase() && 47353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 47363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 47373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 47381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 47413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 47423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 47433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 47443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 47453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 47463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 47473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope); 47483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 47493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 47503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This is an ugly hack, which forces the same template name to 47513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // be looked up multiple times. Yuck! 47523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This also won't work for, e.g., x->template operator+<int> 47533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName OrigTemplateName 47543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo()); 47551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 47571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getDerived().TransformTemplateName(OrigTemplateName, 47583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 47593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (Template.isNull()) 47603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 47611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4762833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs()); 47633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4764833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], 4765833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TransArgs[I])) 47663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 47673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 47681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4772a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4773a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 47743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Template, 4775c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor E->getMemberLoc(), 47763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 47773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getLAngleLoc(), 47783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.data(), 47793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.size(), 47803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getRAngleLoc()); 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 47851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 47861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 47911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 48001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 48061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 48091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 48121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 48171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 48231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 48241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 48321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 48331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 48441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 48471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 48551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 486009105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 48611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCImplicitSetterGetterRefExpr *E) { 4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 48641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 48691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 4870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 48721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 48771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 48801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 48851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 48921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 48961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 48991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 49001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 4902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 49081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 4909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 49111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 49161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 4917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 49191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 49211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 4924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 492785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 492885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 492985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star, 4930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 493485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 493585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Star) { 493685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star, 4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 494285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 494385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall bool WrittenAsLValue, 494485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 494585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(), 494685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 4947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 49491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 49501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 495185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 495285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall QualType ClassType, 495385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 49540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 495585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall Sigil, getDerived().getBaseEntity()); 4956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 49591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 496085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType, 496185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceLocation Sigil) { 496285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil, 4963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 4964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 4965a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4966a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 4967a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 4969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 4971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 4972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 4974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 4975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 4976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 4977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 49781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 49801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 49811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 49821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 4983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 4984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 4985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 4986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 4987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 4988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 4989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 4990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 49911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 4993577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 49941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 49961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 4997577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 49981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 4999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 50001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 50021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 50031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 5004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 500685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 500785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 50081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 500985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 50131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 50141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 5015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 501685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall unsigned IndexTypeQuals, 501785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall SourceRange BracketsRange) { 50181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 501985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall IndexTypeQuals, BracketsRange); 5020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 50211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 50231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 50241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 5025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 50291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 50351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 50361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 5037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5039577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 5040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 50411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 5042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 5043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 5044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 5048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 5049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 5050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 5051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 50521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 5055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 5056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 5058577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 5059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 50601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 5061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5062577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 5063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 5064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 50651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 50671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 50681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 5070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 5071577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 5072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 50731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 50761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 5077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 50781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 5079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 5081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 5082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 5083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 5084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 50851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 5088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 5089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 5090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 5091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 5093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 5094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5096577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5097577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 5098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 5099577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 5103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 5104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 5105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 5107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 5108833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateName Template, 5109833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation TemplateNameLoc, 5110833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation LAngleLoc, 5111833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *Args, 5112833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall unsigned NumArgs, 5113833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall SourceLocation RAngleLoc) { 5114833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, LAngleLoc, 5115833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Args, NumArgs, RAngleLoc); 5116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 51171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5118dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5119dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5120dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5121dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5122a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 5123c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 5124c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 5125dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 5126dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 5127dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 5128dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 5129dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 51301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 5131495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 5132c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 5133c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 5134495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor false)); 5135dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5136dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5137dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5138dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5139dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5140dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5141dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5142dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5143dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5144dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5145dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5146dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5147dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5148dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5149dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5150dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 5151dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 5152dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 51530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!T.hasQualifiers() && "Can't get cv-qualifiers here"); 5154dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5155dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5156dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 51571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5158dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5159dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5160dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 51611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5162d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 51631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5164d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5165d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5166d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5168d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5169d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5170d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 51721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5173d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5174d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5175d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl) { 5176d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 5177d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5178d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5179d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 51801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5181d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 51823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 51833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5184d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5185d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 51861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 51873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 51883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 51893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor II, 51903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 51913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 51923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor ObjectType.getAsOpaquePtr()) 51933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5194d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 51951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 51971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5205f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl DeclRefExpr *DRE 5206f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts()); 5207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 52081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5210f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) { 5211f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (!FirstExpr->getType()->isOverloadableType() && 5212f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl !SecondExpr->getType()->isOverloadableType()) 5213f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return getSema().CreateBuiltinArraySubscriptExpr(move(First), 5214f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl DRE->getLocStart(), 5215f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(Second), OpLoc); 5216f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl } else if (SecondExpr == 0 || isPostIncDec) { 5217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 52221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 52261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 52351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 52411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 5244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 52451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we have to check 5247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // IsAcceptableNonMemberOperatorCandidate for each of these? 52488f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F) 5249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Functions.insert(*F); 52501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 52541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 5255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 5256644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs, 5257644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl Functions); 52581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 52611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 52651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5266f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl if (Op == OO_Subscript) 5267f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl return SemaRef.CreateOverloadedArraySubscriptExpr(DRE->getLocStart(), OpLoc, 5268f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl move(First),move(Second)); 5269f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl 5270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 52711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 52731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 52771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 52801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 52821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5286