TreeTransform.h revision a2813cec2605ce7878d1b13471d685f689b251af
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. 293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg); 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 300dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType 301dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TransformTemplateSpecializationType(const TemplateSpecializationType *T, 302dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType); 303dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 30443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 30743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Transform##Node(Node *E); 310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildPointerType(QualType PointeeType); 318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildBlockPointerType(QualType PointeeType); 324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new lvalue reference type given the type it references. 326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the lvalue reference 328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildLValueReferenceType(QualType ReferentType); 330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new rvalue reference type given the type it references. 332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the rvalue reference 334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRValueReferenceType(QualType ReferentType); 3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType); 3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new Objective C object pointer type. 345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildObjCObjectPointerType(QualType PointeeType); 346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /// \brief Build a new unprototyped function type. 436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType RebuildFunctionNoProtoType(QualType ResultType); 437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4527da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4537da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4547da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4557da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4567da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 4741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs); 4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getTypenameType(NNS, 501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const IdentifierInfo *Id) { 513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTypenameType(NNS, *Id, 514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange(getDerived().getBaseLocation())); 515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 518dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 519dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 520dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 521dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 522dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 523dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 524dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 525a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 526c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 527c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 528dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 529dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 534dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 535dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 536dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 537dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 538dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 539dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 540dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 542dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 550d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 551d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 552d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 553d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 554d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 555d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 556d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 557d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 558d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 559d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 560d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 561d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and a set of 562d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// overloaded function templates. 563d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 564d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 565d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 566d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 567d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 568d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl); 5691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 570d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 571d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 572d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 573d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 574d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 575d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 5783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 5793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 5801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 58343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 58443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 58543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 58643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 58743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 58843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 58943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 59043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 59143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 59243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 59343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 59443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 59543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 59643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 59743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 59843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 59943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 60043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 60143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 60243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 6031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 60443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 60543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 6231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StmtArg Then, SourceLocation ElseLoc, 64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Else) { 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else)); 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) { 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnStartOfSwitchStmt(move(Cond)); 65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body)); 67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Init, ExprArg Cond, ExprArg Inc, 69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond), 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Inc), RParenLoc, move(Body)); 69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclaratorInfo *Declarator, 75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch 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 RebuildCXXCatchStmt(SourceLocation CatchLoc, 76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 7661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 784a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier, 785a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 786a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NamedDecl *ND, SourceLocation Loc) { 787a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor CXXScopeSpec SS; 788a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setScopeRep(Qualifier); 789a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SS.setRange(QualifierRange); 790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 792a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor &SS, 793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 7951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 805a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 807a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 808a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 809a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 810a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 811a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 812a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 813a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 814a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 815a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 816a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 817a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 818a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 819a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 820a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 821a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 823a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 824a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 827a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OperatorLoc, 828a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor isArrow? tok::arrow : tok::period, 829a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedTypeLoc, 830a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Name, 831a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Sema::DeclPtrTy::make((Decl *)0), 832a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor &SS); 8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr)); 843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc, 850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R); 852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 8541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 8751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 8851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 8971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 90283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 90383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 90483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member) { 906d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 907d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 908d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 911d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 912d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 913d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 914d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 915d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 91783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 91883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 91983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 92083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 92183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 92283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 923017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 926017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Member->getDeclName(), 92783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 92883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor &SS); 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 9391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(), 940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)RHS.get()); 941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.release(); 945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.release(); 946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 9501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (getSema().Context) ImplicitCastExpr(T, Kind, 970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access 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. 10061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Accessor, 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBraceLoc) { 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 10271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 10551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 10751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 10761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 10861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 11331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 11501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 11561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 11661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 11671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 11691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 11901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 12061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 12381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 125188650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 125588650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 12681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 12801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 12851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 12881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 12891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 12931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1315f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 13271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ conditional declaration expression. 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqLoc, 1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var) { 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EqLoc, 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var)); 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 13611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS, 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1425f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier, 1426f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor SourceRange QualifierRange, 1427f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor TemplateName Template, 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TemplateLoc, 1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgument *TemplateArgs, 1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumTemplateArgs, 1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc) { 1433f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange, 1434f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Template, TemplateLoc, 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgs, NumTemplateArgs, 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc); 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1448ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1449ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson SourceLocation(), 1450ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson T, Constructor, IsElidable, 1451f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson move(Args)); 1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 14950dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1498a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1499a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1501c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1502c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 15030dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1505a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1507a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1508a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 15091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1512017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor MemberLoc, 1513017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Name, 1514a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1515c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor &SS, 1516c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 15193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Build a new member reference expression with explicit template 15203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// arguments. 15213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 15253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow, 15263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 15273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NestedNameSpecifier *Qualifier, 15283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceRange QualifierRange, 15293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template, 15303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation TemplateNameLoc, 15313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierInScope, 15323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation LAngleLoc, 15333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const TemplateArgument *TemplateArgs, 15343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor unsigned NumTemplateArgs, 15353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation RAngleLoc) { 15363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult Base = move(BaseE); 15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: We're going to end up looking up the template based on its name, 15443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr. 15453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor DeclarationName Name; 15463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 15473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = ActualTemplate->getDeclName(); 15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (OverloadedFunctionDecl *Ovl 15493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = Template.getAsOverloadedFunctionDecl()) 15503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Ovl->getDeclName(); 15513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor else 15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Template.getAsDependentTemplateName()->getName(); 15531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OperatorLoc, OpKind, 15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateNameLoc, Name, true, 15573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor LAngleLoc, TemplateArgs, 15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NumTemplateArgs, RAngleLoc, 15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Sema::DeclPtrTy(), &SS); 15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 15711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 15981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 16031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 16061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BuiltinLoc, false, false); 1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 163043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 163143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 163243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 163343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 163543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 163643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 163843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 163943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 164043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 164143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 164243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 164443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 164543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 164643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 164743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 164843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 164943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 165043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 165143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned(E.takeAs<Stmt>()); 165443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 16591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1661670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 16731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1676657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1677657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1678657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1679dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1680dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1681a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1682c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1683c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 16840979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 16850979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 168743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1688dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1691c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1692c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 16951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1697c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1698a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1699c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1700dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1705a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1706a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1707a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1711a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1712c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1713c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 17141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 17161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1717dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1734dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1735d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1736d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1741dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 17541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 175581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1756dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor SourceLocation Loc, 1757dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 175881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 175981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 176081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 176181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 176281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 176381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 176481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 176581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 176681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 176781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 176881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 17691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 177081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 177181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 177281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 177381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 1774dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType T; 1775dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor if (!ObjectType.isNull() && 1776dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1777dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor TemplateSpecializationType *SpecType 1778dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1779dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = TransformTemplateSpecializationType(SpecType, ObjectType); 1780dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor } else 1781dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor T = getDerived().TransformType(Name.getCXXNameType()); 178281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 17841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 179381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 17951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 17963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 17973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 17991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1802d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1803d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1805d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1807d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1808d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1809d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1811d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1812d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1813d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1814d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1816d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1817d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1820d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 18221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1824d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl); 1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1844dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor NNS == DTN->getQualifier() && 1845dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor ObjectType.isNull()) 1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType); 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1865d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 18661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1875d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransOvl); 1876d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1877d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 18791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument 1880670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) { 1881670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1882670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1883670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1884670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Arg; 18851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1886670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor QualType T = getDerived().TransformType(Arg.getAsType()); 1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (T.isNull()) 1889670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1890670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), T); 1891670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 18921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1893670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (!D) 1896670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1897670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), D); 1898670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 18991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1900670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1901670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 19021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 1903670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 19041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr()); 1906670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (E.isInvalid()) 1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1908670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(E.takeAs<Expr>()); 1909670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1911670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 1912670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 1913670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 19141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 1915670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 1916670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 1917670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument TA = getDerived().TransformTemplateArgument(*A); 1918670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (TA.isNull()) 1919670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TA; 19201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1921670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.push_back(TA); 1922670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1923670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 19241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 1925670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 1926670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Result; 1927670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1928670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1930670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 1931670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1932670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 1933670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 1936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 1940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 19421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Temporary workaround. All of these transformations should 1944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // eventually turn into transformations on TypeLocs. 1945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T); 19464802a311f402836f1f226a3d7a87e6a3088f9704John McCall DI->getTypeLoc().initialize(getDerived().getBaseLocation()); 1947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 1948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(DI); 19491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 1951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 19521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return NewDI->getType(); 1954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1957a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) { 1958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlreadyTransformed(DI->getType())) 1959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return DI; 19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1961a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder TLB; 19621bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 1963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLoc TL = DI->getTypeLoc(); 1964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.reserve(TL.getFullDataSize()); 19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1966a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, TL); 1967a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 1968a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return 0; 19691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1970a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TLB.getDeclaratorInfo(SemaRef.Context, Result); 1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 1974a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 1975a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 1976a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall switch (T.getTypeLocClass()) { 1977a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 1978a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \ 1979a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall case TypeLoc::CLASS: \ 1980a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T)); 1981a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def" 1982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1984a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::llvm_unreachable("unhandled type loc!"); 1985a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 1986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1988a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types 1989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers 1990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function 1991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but 1992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients. 19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 19941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 1995a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 1996a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedTypeLoc T) { 1997a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Qualifiers Quals = T.getType().getQualifiers(); 1998a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 1999a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 2000a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2003a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Silently suppress qualifiers if the result type can't be qualified. 2004a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this is the right thing for template instantiation, but 2005a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // probably not for other clients. 2006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result->isFunctionType() || Result->isReferenceType()) 2007a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 20081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = SemaRef.Context.getQualifiedType(Result, Quals); 2010a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2011a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TLB.push<QualifiedTypeLoc>(Result); 2012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2013a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // No location information to preserve. 2014a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2015a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2016a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2017a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2018a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline 2019a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 2020a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TyLoc NewT = TLB.push<TyLoc>(T.getType()); 2021a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setNameLoc(T.getNameLoc()); 2022a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return T.getType(); 2023a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 2024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make 2026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work. 2027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \ 2028a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2035a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 2036a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType); \ 2037a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \ 2042a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewT.setSigilLoc(TL.getSigilLoc()); \ 2043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2045a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0) 2046a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Reference collapsing forces us to transform reference types 2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// differently from the other pointer-like types. 2049a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformReferenceType(TypeClass) do { \ 2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType \ 2051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(TLB, TL.getPointeeLoc()); \ 2052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (PointeeType.isNull()) \ 2053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); \ 2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || \ 2057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != TL.getPointeeLoc().getType()) { \ 2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().Rebuild##TypeClass(PointeeType); \ 2059a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) \ 2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); \ 2061a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } \ 2062a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall \ 2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* Workaround: rebuild doesn't always change the type */ \ 2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* FIXME: avoid losing this location information. */ \ 2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result == PointeeType) \ 2066a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ReferenceTypeLoc NewTL; \ 2068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<LValueReferenceType>(Result)) \ 2069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL = TLB.push<LValueReferenceTypeLoc>(Result); \ 2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else \ 2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL = TLB.push<RValueReferenceTypeLoc>(Result); \ 2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); \ 2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; \ 2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while (0) 2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BuiltinTypeLoc T) { 2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 20821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 20831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB, 2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FixedWidthIntTypeLoc T) { 2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 20881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 2091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ComplexTypeLoc T) { 2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: recurse? 2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, T); 2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 20951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointerTypeLoc TL) { 2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(PointerType); 2100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall BlockPointerTypeLoc TL) { 2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformPointerLikeType(BlockPointerType); 2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall LValueReferenceTypeLoc TL) { 2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformReferenceType(LValueReferenceType); 2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 21151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RValueReferenceTypeLoc TL) { 2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TransformReferenceType(RValueReferenceType); 2121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 21241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc TL) { 2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerType *T = TL.getTypePtr(); 2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 2130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: preserve source information for this. 2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ClassType 2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformType(QualType(T->getClass(), 0)); 2136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall PointeeType != T->getPointeeType() || 2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ClassType != QualType(T->getClass(), 0)) { 2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType); 2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSigilLoc(TL.getSigilLoc()); 2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc TL) { 2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayType *T = TL.getTypePtr(); 2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildConstantArrayType(ElementType, 2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSize(), 2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers()); 2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2172a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result); 2175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = TL.getSizeExpr(); 2179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Size) { 2180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 2182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 2190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc TL) { 2192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayType *T = TL.getTypePtr(); 2193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildIncompleteArrayType(ElementType, 2201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers()); 2203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 2208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2210a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(0); 2211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2216a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2217a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 2218a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc TL) { 2219a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayType *T = TL.getTypePtr(); 2220a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2224670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2225670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2226670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2227a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2228a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2229a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2236a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVariableArrayType(ElementType, 2239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2241a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 2242a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getBracketsRange()); 2243a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 2249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2251a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 22521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 2259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayTypeLoc TL) { 2260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedArrayType *T = TL.getTypePtr(); 2261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 2262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2265670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2266670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 22671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Sema::OwningExprResult SizeResult 2269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = getDerived().TransformExpr(T->getSizeExpr()); 2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (SizeResult.isInvalid()) 2271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Expr *Size = static_cast<Expr*>(SizeResult.get()); 2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType() || 2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Size != T->getSizeExpr()) { 2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedArrayType(ElementType, 2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getSizeModifier(), 2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall move(SizeResult), 2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getIndexTypeCVRQualifiers(), 2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getBracketsRange()); 2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else SizeResult.take(); 22881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // We might have any sort of array type now, but fortunately they 2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // all have the same location layout. 2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLBracketLoc(TL.getLBracketLoc()); 2293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRBracketLoc(TL.getRBracketLoc()); 2294a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setSizeExpr(Size); 2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc TL) { 2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorType *T = TL.getTypePtr(); 2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: ext vector locs should be nested 2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2310670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2311670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2312670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2319eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall ElementType != T->getElementType() || 2320eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall Size.get() != T->getSizeExpr()) { 2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 2322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else Size.take(); 2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Result might be dependent or not. 2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (isa<DependentSizedExtVectorType>(Result)) { 2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DependentSizedExtVectorTypeLoc NewTL 2332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc TL) { 2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc TL) { 2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall VectorType *T = TL.getTypePtr(); 2368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElementType != T->getElementType()) { 2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildExtVectorType(ElementType, 2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getNumElements(), 2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /*FIXME*/ SourceLocation()); 2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 23841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 23881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc TL) { 2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoType *T = TL.getTypePtr(); 2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Transform the parameters. 2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall llvm::SmallVector<ParmVarDecl*, 4> ParamDecls; 2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *OldParm = TL.getArg(i); 2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType NewType; 2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParmVarDecl *NewParm; 2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (OldParm) { 2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo(); 2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall assert(OldDI->getType() == T->getArgType(i)); 2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DeclaratorInfo *NewDI = getDerived().TransformType(OldDI); 2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (!NewDI) 2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewDI == OldDI) 2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = OldParm; 2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else 2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = ParmVarDecl::Create(SemaRef.Context, 2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getDeclContext(), 2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getLocation(), 2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getIdentifier(), 2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI->getType(), 2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewDI, 2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall OldParm->getStorageClass(), 2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall /* DefArg */ NULL); 2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = NewParm->getType(); 2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // Deal with the possibility that we don't have a parameter 2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // declaration for this parameter. 2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewParm = 0; 2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType OldType = T->getArgType(i); 2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewType = getDerived().TransformType(OldType); 2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (NewType.isNull()) 2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 24371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.push_back(NewType); 2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamDecls.push_back(NewParm); 2440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 24411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType() || 2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionProtoType(ResultType, 2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.data(), 2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ParamTypes.size(), 2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->isVariadic(), 2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall T->getTypeQuals()); 2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 24541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setArg(i, ParamDecls[i]); 2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc TL) { 2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoType *T = TL.getTypePtr(); 2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (ResultType.isNull()) 2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ResultType != T->getResultType()) 2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildFunctionNoProtoType(ResultType); 2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setLParenLoc(TL.getLParenLoc()); 2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setRParenLoc(TL.getRParenLoc()); 2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc TL) { 2488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefType *T = TL.getTypePtr(); 2489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Typedef != T->getDecl()) { 2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypedefType(Typedef); 2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc TL) { 2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprType *T = TL.getTypePtr(); 2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2513670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2514670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 25151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfExprType(move(E)); 2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 25281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc TL) { 2538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfType *T = TL.getTypePtr(); 2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: should be an inner type, or at least have a DeclaratorInfo. 2541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 2543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypeOfType(Underlying); 2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 25521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 25581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc TL) { 2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeType *T = TL.getTypePtr(); 2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2564670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2565670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 25661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall E.get() != T->getUnderlyingExpr()) { 2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildDecltypeType(move(E)); 2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall else E.take(); 2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 25821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc TL) { 2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordType *T = TL.getTypePtr(); 2590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 25941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Record != T->getDecl()) { 2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildRecordType(Record); 2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 26021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc TL) { 2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumType *T = TL.getTypePtr(); 2613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Enum != T->getDecl()) { 2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildEnumType(Enum); 2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 26317da2431c23ef1ee8acb114e39692246e1801afc2John McCall 26327da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc TL) { 2635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedType *T = TL.getTypePtr(); 2636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // FIXME: this should be a nested type. 26387da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 26397da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 26407da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 26411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Underlying != T->getUnderlyingType()) { 2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 26547da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 26551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateTypeParmTypeLoc TL) { 2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 26641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 266549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall SubstTemplateTypeParmTypeLoc TL) { 2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return TransformTypeSpecType(TLB, TL); 266949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 267049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 267149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2672dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType 2673dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType( 2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypeLocBuilder &TLB, 2675a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc TL) { 2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall // TODO: figure out how make this work with an ObjectType. 2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result 2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TransformTemplateSpecializationType(TL.getTypePtr(), QualType()); 2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TemplateSpecializationTypeLoc NewTL 2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall = TLB.push<TemplateSpecializationTypeLoc>(Result); 2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2687dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor} 2688dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor 2689dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived> 2690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2691dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor const TemplateSpecializationType *T, 2692dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType ObjectType) { 26931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2694dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 26971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs; 2699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.reserve(T->getNumArgs()); 2700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end(); 2701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Arg != ArgEnd; ++Arg) { 2702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg); 2703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewArg.isNull()) 2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.push_back(NewArg); 2707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 27081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: early abort if all of the template arguments and such are the 2710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // same. 27111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: We're missing the locations of the template name, '<', and '>'. 2713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTemplateSpecializationType(Template, 2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.data(), 2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.size()); 2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB, 2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc TL) { 2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameType *T = TL.getTypePtr(); 2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2725577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2726577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2729577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2730577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result = TL.getType(); 2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (getDerived().AlwaysRebuild() || 2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NNS != T->getQualifier() || 2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Named != T->getNamedType()) { 2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildQualifiedNameType(NNS, Named); 2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } 2741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result); 2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2746577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB, 2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc TL) { 2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameType *T = TL.getTypePtr(); 2752577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2753577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 27544a959d8788179d654df6b213b08d2b064989211dDouglas Gregor SourceRange(/*FIXME:*/getDerived().getBaseLocation())); 2755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2756577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall QualType Result; 2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2760577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 27611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2762577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2763577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 27651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2767577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 27701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, NewTemplateId); 2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall } else { 2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier()); 2774577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall if (Result.isNull()) 2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return QualType(); 2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result); 2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall NewTL.setNameLoc(TL.getNameLoc()); 2780577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return Result; 2782577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCInterfaceTypeLoc TL) { 278854e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCInterfaceType unimplemented"); 278954e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 2790577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 27911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 2794a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall ObjCObjectPointerTypeLoc TL) { 279654e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(false && "TransformObjCObjectPointerType unimplemented"); 279754e14c4db764c0636160d26c5bbf491637c83a76John McCall return QualType(); 279824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 279924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2800577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 280143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 280243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 280343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 280443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 28051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 28061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 280743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 280843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 280943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 281043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 281143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 281243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 281343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 281443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 281543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 281643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 28171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 281843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 281943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 282043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 282143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 282243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 282343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 282443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 282543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 28261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 282743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 282843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 282943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 28301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 283143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 283243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 28331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 283443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 283543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 283643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 283743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 283843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 283943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 28401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 284143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 284243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 28431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 284443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // The case value expressions are not potentially evaluated. 284543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 28461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 284743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the left-hand case value. 284843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult LHS = getDerived().TransformExpr(S->getLHS()); 284943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (LHS.isInvalid()) 285043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 285243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the right-hand case value (for the GNU case-range extension). 285343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult RHS = getDerived().TransformExpr(S->getRHS()); 285443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (RHS.isInvalid()) 285543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 285743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 285843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 285943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 286043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 286143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 286243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 286343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 286443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 286543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 286643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 286843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 286943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 287043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 287143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 287343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 287443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 287543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 287643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 287743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 287843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 28791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 288043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 288143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 288243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 288343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 288543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 288643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 288743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 288843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 28891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 289043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 289143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 28921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 289343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 289443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 289543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 289743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 289843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 289943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 290043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 290143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 29021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 290343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 29041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 29051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 290643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 290743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 290843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 290943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 291143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 29121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 291343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 291443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 291543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 291643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 291843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 291943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 292043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 292143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 292343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 292443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 292543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 292643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 29271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 29281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 292943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then), 29301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 293143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 293243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 293343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 293443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 293643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 293743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 293843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 293943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 294143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 294243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond)); 294343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 294443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 294643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 294743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 294843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 294943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 295143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 295243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 295343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 295443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 29551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 295643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 29581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 295943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 29651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 29741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 29751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body)); 297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 29781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 29911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 29951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 29961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 299943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 300343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 300543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 300643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 300743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 300843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 301143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 301243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 301343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 30301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 30311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Init), move(Cond), move(Inc), 303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 30381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 30391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 30411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 304343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 304843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 30541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 30631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 306443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 306643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 30691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 307643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 30791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 308143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 30831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 30861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 30941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 30971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 309843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 309943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 31001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 31021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 310943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 311143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 31121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 311343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 311443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 311543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 311643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 311943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 312243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 312543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 312743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 31291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 31451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 31501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 31531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 315443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 31551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 315743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 316043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 31621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 316543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 316743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 31681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 317043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 31711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 317243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 317343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 317443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 317543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 317743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclaratorInfo(), 319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 32021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 32101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 321243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 321343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 32141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 321543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 321643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 321743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 321843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 321943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 322243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 322343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 322443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 32251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 322643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 322743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 32381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 32421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 324443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 32461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 324743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 32491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 325043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 32511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 3254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 32551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 32561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 32571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 32581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 32591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 32601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 32621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 32631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 3264a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier = 0; 3265a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (E->getQualifier()) { 3266a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3267a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor E->getQualifierRange()); 3268a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!Qualifier) 3269a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3270a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3271a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *ND 3273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 32761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3277a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!getDerived().AlwaysRebuild() && 3278a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier == E->getQualifier() && 3279a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND == E->getDecl() && 3280a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor !E->hasExplicitTemplateArgumentList()) 32811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 32821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3283a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: We're losing the explicit template arguments in this transformation. 3284a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3285a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 3286a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3287a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor TemplateArgument TransArg 3288a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 3289a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (TransArg.isNull()) 3290a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SemaRef.ExprError(); 3291a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3292a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor TransArgs.push_back(TransArg); 3293a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 3294a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 3295a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // FIXME: Pass the qualifier/qualifier range along. 3296a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(), 3297a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor ND, E->getLocation()); 3298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 33051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 33191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 33271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 33381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 33391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 33441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 33451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 33521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 33531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 3355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 33611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 3362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getArgumentType()); 3364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getArgumentType()) 3368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 33691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(), 33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 3372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 33761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 3377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 33811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 33891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 34111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 34381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 34421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 34581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 346583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 346783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 346883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3469c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 347083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 347183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 34721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *Member 3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 348083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member == E->getMemberDecl()) 34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 349083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 349183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 34931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Member); 3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 34981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 35051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 35231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CompoundAssignOperator *E) { 3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformBinaryOperator(E); 3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 35321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 35501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 355247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 355447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 35591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 35601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 35751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 35811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 3582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 35831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 35881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 35921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 35951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 36081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 36241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 36371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 36461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 36531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 36561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 36651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBraceLoc()); 3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 36871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 36891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 369043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 369543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 37151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 37351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 37381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ImplicitValueInitExpr *E) { 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 37631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 37731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 37961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 38211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 38361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 38441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 38491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 38621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 38701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 38871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 3891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 38951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 38961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 38971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 39211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 39221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 3928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 39331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCallExpr(E); 3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 39431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 39461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 39621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 39691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 3976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 39791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 39861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 39931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXReinterpretCastExpr *E) { 3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 39991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXFunctionalCastExpr *E) { 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 40101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 40231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 40361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 40391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 40531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 40571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 40591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 40661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 40751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 40761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 40771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 40831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXNullPtrLiteralExpr *E) { 40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 40911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 41051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 41121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 41191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 41201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 41431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) { 41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *Var 415543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl())); 4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Var) 4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Var == E->getVarDecl()) 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getStartLoc(), 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var); 4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 41701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 419443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 42041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 42091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 42231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 42281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 42351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4245a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 4246a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXPseudoDestructorExpr *E) { 4247a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4248a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 4249a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4251a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 4252a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4253a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4254a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 4255a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4257a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 4258a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 4259a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 4260a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 4261a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 4262a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 4263a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4265a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 4266a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 4267a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 4268a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 4269a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 42701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4271a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 4272a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 4273a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 4274a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 4275a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 4276a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 4277a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 4278a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4280a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 4281a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr( 42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnresolvedFunctionNameExpr *E) { 4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // There is no transformation we can apply to an unresolved function name. 42851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 42901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 42921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 4294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 43041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr( 43151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnresolvedDeclRefExpr *E) { 4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 4317f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4318f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 432381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 432481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 432581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 43261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getDeclName()) 43301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnresolvedDeclRefExpr(NNS, 4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 43411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) { 43421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateName(E->getTemplateName()); 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Template.isNull()) 4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4347f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4348f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (E->getQualifier()) { 4349f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4350f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor E->getQualifierRange()); 4351f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor if (!Qualifier) 4352f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return SemaRef.ExprError(); 4353f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor } 4354f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor 4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 43571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateArgument TransArg 4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isNull()) 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.push_back(TransArg); 4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // compare template arguments (yet). 43671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: It's possible that we'll find out now that the template name 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // actually refers to a type, in which case the caller is actually dealing 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // with a functional cast. Give a reasonable error message! 4371f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(), 4372f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor Template, E->getTemplateNameLoc(), 4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLAngleLoc(), 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.data(), 4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.size(), 4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRAngleLoc()); 4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 43811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to 44201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the 4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 44361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new 44371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the 4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 44431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXExprWithTemporaries *E) { 4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 44561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXTemporaryObjectExpr *E) { 4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 44711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 44771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 44811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 44871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 44921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 45061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXUnresolvedConstructExpr *E) { 4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 45271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 45311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 45411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( 45451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXUnresolvedMemberExpr *E) { 4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 45501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Start the member reference and compute the object's type. 4552a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Sema::TypeTy *ObjectType = 0; 45531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4554a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getOperatorLoc(), 4555a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4556a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType); 4557a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (Base.isInvalid()) 4558a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 45591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45606cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // Transform the first part of the nested-name-specifier that qualifies 45616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor // the member name. 4562c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 45636cd219879ffce00920189ec1dcea927a42602961Douglas Gregor = getDerived().TransformFirstQualifierInScope( 45646cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getFirstQualifierFoundInScope(), 45656cd219879ffce00920189ec1dcea927a42602961Douglas Gregor E->getQualifierRange().getBegin()); 45661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4567a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4568a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4569a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4570a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4571c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType::getFromOpaquePtr(ObjectType), 4572c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 4573a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4574a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4575a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 45761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 4578dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4579dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 458081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 458181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 45821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!E->hasExplicitTemplateArgumentList()) { 45843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 45853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 45863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 45873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Base.get() == E->getBase() && 45883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 45893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 45903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 45911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 45921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 45943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 45953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 45963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 45973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 45983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 45993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 46003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope); 46013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 46023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 46033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This is an ugly hack, which forces the same template name to 46043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // be looked up multiple times. Yuck! 46053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This also won't work for, e.g., x->template operator+<int> 46063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName OrigTemplateName 46073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo()); 46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 46101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getDerived().TransformTemplateName(OrigTemplateName, 46113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 46123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (Template.isNull()) 46133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 46141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 46163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 46171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateArgument TransArg 46183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 46193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TransArg.isNull()) 46203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 46211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.push_back(TransArg); 46233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 46241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4628a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4629a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 46303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Template, 4631c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor E->getMemberLoc(), 46323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 46333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getLAngleLoc(), 46343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.data(), 46353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.size(), 46363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getRAngleLoc()); 4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 46411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 46421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 46451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 46461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 46471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 4649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 46561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 46621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 46651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 46681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 46711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 46721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 46731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 46741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 46771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 46781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 46791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 46801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 46891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 46951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 46991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 47001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 47031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 47111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 471609105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 47171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCImplicitSetterGetterRefExpr *E) { 4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 47201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 47251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 47281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 47331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 47411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 47551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 47641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 47721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 47751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) { 47840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), 4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) { 47910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), 4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 47961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 47971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) { 47990953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(), 4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 48041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 48051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) { 48070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(), 4808577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4809577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4811577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4812577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 48131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 4814577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ClassType) { 48150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 4816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4818577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4819577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 48211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 4822a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType) { 4823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), 4824a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseLocation(), 4825a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall getDerived().getBaseEntity()); 4826a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 4827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 4829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType 4830577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 4831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4832577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 4833577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 4834577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 4836577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 4837577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 4838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 4839577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 48401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 48421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 48431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 48441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 4845577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 4846577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 4847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 4848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 4849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 4850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 4851577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 4852577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 48531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 4855577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 48561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4857577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 4859577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 48601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 4861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 48621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4863577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 48641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 48651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 4866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 4868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 48691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 4870577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 4871577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 48741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 48751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 4876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 48781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 4879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 4880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 48811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 48831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 48841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 4885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4888577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 48891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4890577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 4891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 4892577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4893577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 48951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 48961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 4897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4900577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 49011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4902577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 4903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 4904577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4907577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 4908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 4909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 4910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 4911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 49121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 4915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 4916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 4917577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 4918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 4919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 49201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 4921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 4922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 4923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 4924577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 49251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 49271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 49281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 4929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 4931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 4932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 49361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 4937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 49381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 4939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 49401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 4941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 4942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 49451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 4948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall return SemaRef.Context.getFunctionNoProtoType(T); 4949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} 4950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall 4951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived> 4952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 4953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 4954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 4958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 4959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4960577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 4963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 4964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 4968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateName Template, 4969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 4970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs) { 4971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Missing source locations for the template name, <, >. 4972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(), 49731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation(), Args, NumArgs, 49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation()); 4975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 49761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4977dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4978dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4979dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4980dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 4981a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 4982c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 4983c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 4984dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 4985dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 4986dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 4987dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 4988dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 49891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 4990495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 4991c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 4992c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 4993495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor false)); 4994dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 4995dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 4996dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4997dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4998dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4999dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5000dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 5001dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 5002dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 5003dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 5004dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 5005dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 5006dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 5007dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 5008dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 5009dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 5010dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 5011dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 50120953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!T.hasQualifiers() && "Can't get cv-qualifiers here"); 5013dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 5014dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 5015dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 50161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5017dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 5018dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 5019dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 50201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5021d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 50221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5023d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5024d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5025d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 50261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 5027d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 5028d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5029d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5030d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 50311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5032d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 5033d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 5034d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl) { 5035d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 5036d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 5037d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 5038d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 50391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 5040d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 50413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 50423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 5043d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 5044d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 50451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 50463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 50473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 50483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor II, 50493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 50503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 50513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor ObjectType.getAsOpaquePtr()) 50523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 5053d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 50541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 50561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 5059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 5060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 50651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 5067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SecondExpr == 0 || isPostIncDec) { 5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 50711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 50731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 50771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 5079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 5081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 50821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 50861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 5090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 5091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 50921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 50961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclRefExpr *DRE 50988f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts()); 50991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we have to check 5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // IsAcceptableNonMemberOperatorCandidate for each of these? 51028f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F) 5103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Functions.insert(*F); 51041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 5106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 51081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions); 51111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 51141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 5115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 51201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 51221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 51261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 51291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 51311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 5133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 5134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 5135